How to Install Jellyfin Media Server on Ubuntu (Complete Administrator & Beginner Guide)
Last Updated: July 11th, 2026
This comprehensive tutorial shows you how to install, configure, secure, and maintain the Jellyfin media server on Ubuntu Server or Desktop. Jellyfin is a 100% free, open-source application that lets you organize your movies, TV shows, music, and photos into a beautiful interface and stream those media files across your local network or over the Internet.
What Is Jellyfin?
Jellyfin is an independent fork of the Emby media server, created as a completely free and open-source alternative to proprietary platforms like Plex and Emby. Unlike its commercial counterparts, Jellyfin has no hidden paywalls, no streaming limits on mobile applications, and no advertisements or third-party telemetry tracking your viewing behavior.
Jellyfin Features
- 100% Free and Open Source: No licensing tiers or locked playback features.
- Automated Metadata Fetching: Pulls high-resolution posters, backdrops, and descriptive details from TheTVDB, TheMovieDB, The Open Movie Database, and Rotten Tomatoes.
- Live TV and DVR: Watch and record live television broadcasts using compatible digital tuners.
- Hardware Acceleration: Supports offloading video encoding and decoding tasks to your system's GPU via FFmpeg.
- DLNA Support: Easily broadcast media to supported smart devices on your local network.
Requirements & Prerequisites
You will need a system running Ubuntu (22.04, 24.04 LTS, or newer) with administrative sudo privileges. For remote web access or secure streaming outside your home network, configuring a reverse proxy (via Nginx or Apache) along with a valid domain name and TLS certificate is strongly recommended.
Step 1: Add the Jellyfin Repository and GPG Key
Jellyfin is not included in the default Ubuntu package repositories, but it maintains an official repository. First, ensure the required transport packages are installed:
sudo apt install -y apt-transport-https ca-certificates curl gnupg
Import the official Jellyfin GPG signing key so your system can verify software integrity:
wget --quiet -O - https://repo.jellyfin.org/jellyfin_team.gpg.key | sudo tee /etc/apt/keyrings/jellyfin_team.gpg.key
Add the repository source definition to your system configuration:
echo "deb [signed-by=/etc/apt/keyrings/jellyfin_team.gpg.key arch=$( dpkg --print-architecture )] https://repo.jellyfin.org/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/jellyfin.list
Step 2: Install Jellyfin Media Server
Update your local package index and install the main Jellyfin package bundle:
sudo apt update
sudo apt install -y jellyfin
This installation automatically pulls in three core dependencies: jellyfin-ffmpeg (for media transcoding), jellyfin-server (the backend engine), and jellyfin-web (the web user interface).
Step 3: Manage the Jellyfin Service
Verify that the Jellyfin service is active and running on your system:
systemctl status jellyfin
If the service is not running, start it and enable it to launch automatically at system startup:
sudo systemctl start jellyfin
sudo systemctl enable jellyfin
Step 4: Initial Setup Wizard
Jellyfin listens locally on port 8096. Open a web browser on the same machine or local network and navigate to:
http://127.0.0.1:8096
Follow the interactive setup wizard to select your display language, create an administrator account, and configure your media library directories.
Step 5: Managing File Permissions for Media Folders
The system user jellyfin needs proper permissions to read your media storage directories (for instance, an external drive mounted at /media/ubuntu/storage/). Grant read and execute permissions securely using access control lists (ACLs):
sudo setfacl -m u:jellyfin:rx /media/ubuntu/storage/
sudo setfacl -m u:jellyfin:rx /media/ubuntu/storage/movies
Step 6: Setting Up a Reverse Proxy (Nginx)
To safely access Jellyfin from a remote device or custom domain name (e.g., jellyfin.example.com) via standard web ports, install and configure Nginx as a reverse proxy:
sudo apt install -y nginx
sudo nano /etc/nginx/conf.d/jellyfin.conf
Add a standard server block directing HTTP traffic to your local Jellyfin port while disabling buffering for high-bitrate video streams:
server {
listen 80;
server_name jellyfin.example.com;
location / {
proxy_pass http://127.0.0.1:8096;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_buffering off;
}
location /socket {
proxy_pass http://127.0.0.1:8096;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
Test the configuration and reload Nginx:
sudo nginx -t
sudo systemctl reload nginx
Step 7: Enabling HTTPS via Let’s Encrypt
Secure your external media stream by installing Certbot and applying a free TLS certificate:
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx --agree-tos --redirect --email [email protected] -d jellyfin.example.com
Step 8: Maintenance and Troubleshooting
To upgrade your Jellyfin server when new releases become available, simply update and upgrade your package index:
sudo apt update
sudo apt upgrade
sudo systemctl restart jellyfin
If you need to reset the initial setup wizard due to a misconfiguration, edit /etc/jellyfin/system.xml, change <IsStartupWizardCompleted>true</IsStartupWizardCompleted> to false, and restart the service.