How to Install Jellyfin Media Server on Ubuntu

Deepak Prasad
Tested on Ubuntu 26.04 LTS (Resolute Raccoon), amd64
Ubuntu 24.04 LTS — same official Jellyfin APT workflow
Package jellyfin 12.2+ubu2604 (metapackage; confirm with apt-cache policy jellyfin)
Install source Official Jellyfin APT repository (repo.jellyfin.org)
Service jellyfin.service on TCP 8096
Applies to Ubuntu 26.04 LTS, 24.04 LTS, and 22.04 LTS (jammy)
Privilege sudo for packages, systemd, and firewall rules
Scope Install Jellyfin from the official installer or manual APT repo, open the setup wizard, add Movies/TV/Music libraries, grant read access without taking ownership of your files, reach the server from LAN clients, update safely across Jellyfin 12.x, and uninstall without wildcard purges. Does not cover Nginx/Certbot reverse proxies, Tailscale, Docker-first homelabs, NAS administration, or media naming conventions.
Related guides apt command
check Ubuntu version
curl command
systemctl command
UFW command
Short on time?Beta Get the gist of this 12-minute read in seconds, then ask follow-up questions

Jellyfin is a free media server for movies, TV, music, and photos. You install it on Ubuntu, point it at folders on disk, then play your library from browsers, phones, and TVs on your network.

On Ubuntu 26.04 and 24.04 LTS, Jellyfin publishes native APT packages for resolute and noble—the same workflow also works on 22.04 (jammy). After install you open http://SERVER-IP:8096, finish the setup wizard, and add libraries under paths Jellyfin can read (not necessarily own). Current stable releases use the 12.x version series; Jellyfin changed numbering in 2026 so the line after 10.11 became 12.x instead of 10.12.


Quick answer

Official Jellyfin APT install on supported Ubuntu LTS:

Download and verify Jellyfin’s installer script:

bash
curl -fsSL https://repo.jellyfin.org/install-debuntu.sh -o install-debuntu.sh
curl -fsSL https://repo.jellyfin.org/install-debuntu.sh.sha256sum -o install-debuntu.sh.sha256sum
sha256sum -c install-debuntu.sh.sha256sum

Run the installer (it adds the signed APT repo and installs jellyfin):

bash
sudo bash install-debuntu.sh

Confirm the service is running:

bash
systemctl is-active jellyfin
output
active

From another machine on your LAN, open the setup wizard:

text
http://SERVER-IP:8096

Replace SERVER-IP with the server’s address (hostname -I | awk '{print $1}' on the host). Confirm the installed build with apt-cache policy jellyfin or dpkg-query -W jellyfin—do not hardcode a version number in your own notes; Jellyfin ships frequent updates.


Jellyfin support on Ubuntu 26.04, 24.04, and 22.04

Jellyfin’s install script recognizes these Ubuntu codenames today: focal, jammy, noble, and resolute (plus amd64, arm64, and armhf). For a normal home or small-office server on current LTS, use native APT—not Docker—as the default path.

Ubuntu Native Jellyfin APT Recommendation
26.04 LTS (resolute) Supported Recommended — tested in this guide
24.04 LTS (noble) Supported Recommended
22.04 LTS (jammy) Supported Same steps; confirm codename with check Ubuntu version
Interim / unsupported release Check Jellyfin downloads Do not point a different codename’s repo at your system; use containers only if upstream lists no suite for your release

Current Jellyfin version and the move from 10.11 to 12.x

Jellyfin 12.x is the current stable line (for example 12.2 on the lab host). The project skipped 10.12 and moved to 12.x in 2026 when it changed version numbering—so guides that still show 10.11.x repository examples are outdated, not “one major behind.”

Record what your host actually installed:

bash
apt-cache policy jellyfin
output
jellyfin:
  Installed: 12.2+ubu2604
  Candidate: 12.2+ubu2604
  Version table:
 *** 12.2+ubu2604 500
        500 https://repo.jellyfin.org/ubuntu resolute/main amd64 Packages

List installed package versions:

bash
dpkg-query -W jellyfin jellyfin-server
output
jellyfin	12.2+ubu2604
jellyfin-server	12.2+ubu2604

Your +ubu2404 or +ubu2604 suffix matches the Ubuntu suite Jellyfin built against.


Prerequisites

Before you install:

  • A user with sudo for packages, systemctl, and optional UFW rules.
  • Disk space for Jellyfin’s database and cache under /var/lib/jellyfin (a few gigabytes; libraries are separate).
  • A stable path for media (see below)—not a desktop automount that disappears after logout.
  • curl and gnupg for the official script or manual repo setup.
        Ubuntu server
              |
              v
   Official Jellyfin APT repo
              |
              v
      jellyfin.service
              |
              v
     http://SERVER-IP:8096
              |
              v
      First-run wizard
              |
              v
   Media folder permissions
              |
              v
   Movie / TV / Music library
              |
              v
      Clients on your LAN

Choose a stable media mount path

Prefer fixed server paths such as /srv/media or /mnt/media with an /etc/fstab entry for USB disks or NAS mounts. Avoid tying your library to /media/username/... on a desktop session—automounts can vanish after reboot or logout, and Jellyfin then sees an empty library.

Jellyfin’s application data (/var/lib/jellyfin, config under /etc/jellyfin) should stay on suitable local storage—the installer warns about NFS/Ceph for that directory and about COW filesystem quirks. Your movie and music files can live on a NAS mount as long as the mount is stable and the jellyfin user can traverse every parent directory and read the files.


Install Jellyfin on Ubuntu

Download and verify the official installer

Fetch the script and checksum file separately so you can verify before bash runs as root:

bash
curl -fsSL https://repo.jellyfin.org/install-debuntu.sh -o install-debuntu.sh
curl -fsSL https://repo.jellyfin.org/install-debuntu.sh.sha256sum -o install-debuntu.sh.sha256sum
sha256sum -c install-debuntu.sh.sha256sum

A successful check prints install-debuntu.sh: OK. Avoid piping curl straight into sudo bash when you can verify the file first.

Run the Jellyfin installer

Run the verified script as root:

bash
sudo bash install-debuntu.sh

The script detects your codename (resolute on 26.04, noble on 24.04), installs /etc/apt/keyrings/jellyfin.gpg, writes /etc/apt/sources.list.d/jellyfin.sources, and runs apt install jellyfin. On the lab host it pulled jellyfin-server, jellyfin-web, and jellyfin-ffmpeg8 as dependencies.

Verify the Jellyfin service

Enable and check the unit with systemctl:

bash
sudo systemctl enable --now jellyfin
sudo systemctl status jellyfin --no-pager

Look for Active: active (running). A quick check:

bash
systemctl is-active jellyfin
output
active

Optional: Add the Jellyfin APT repository manually

Use this when you want the same result as the script without running it—for example automation that already manages APT sources.

Set your release codename:

bash
CODENAME="$(. /etc/os-release && echo "$VERSION_CODENAME")"
ARCH="$(dpkg --print-architecture)"

Install tooling for HTTPS repos (no apt-transport-https on current Ubuntu):

bash
sudo apt update
sudo apt install curl gnupg ca-certificates

Import the signing key Jellyfin publishes today:

bash
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://repo.jellyfin.org/jellyfin_team.gpg.key \
  | sudo gpg --dearmor -o /etc/apt/keyrings/jellyfin.gpg
sudo chmod 644 /etc/apt/keyrings/jellyfin.gpg

Write the Deb822 source (architecture follows your CPU—amd64, arm64, or armhf):

bash
sudo tee /etc/apt/sources.list.d/jellyfin.sources <<EOF
Types: deb
URIs: https://repo.jellyfin.org/ubuntu
Suites: ${CODENAME}
Components: main
Architectures: ${ARCH}
Signed-By: /etc/apt/keyrings/jellyfin.gpg
EOF

Remove a legacy one-line list file if an old guide left one behind:

bash
sudo rm -f /etc/apt/sources.list.d/jellyfin.list

Refresh indexes and confirm a candidate before you install:

bash
sudo apt update
apt-cache policy jellyfin

Install when the candidate comes from repo.jellyfin.org:

bash
sudo apt install jellyfin

Package installs use the apt command with Jellyfin’s signed repository.


Access the Jellyfin web interface

On the server or another machine on the same LAN, open:

text
http://SERVER-IP:8096

Jellyfin listens on TCP 8096 by default. Optional 8920/tcp is for HTTPS when you configure it in the dashboard; most home LAN setups start with plain HTTP on the private network.


Complete the Jellyfin setup wizard

On first load, Jellyfin 12.x may show a brief loading screen (the Jellyfin logo on a dark background), then the server picker or Welcome to Jellyfin—choose your local server (or Add Server with http://SERVER-IP:8096) before the language and admin steps.

The wizard then walks through:

  1. Preferred language.
  2. Administrator username and password.
  3. Media libraries—add at least one folder (for example /srv/media/movies with content type Movies).
  4. Metadata language and remote-access preference (leave remote access off until you understand exposure).
  5. Finish—land on the dashboard.

You can add libraries later under Administration → Dashboard → Libraries → Add Media Library. Match the content type (Movies, Shows, Music) to what is on disk; TV episodes expect season folders for best metadata matching.

Create the administrator account

Pick a strong password—this account controls libraries, users, and playback settings. You sign in with it after the wizard completes.

Add a media library

Choose Movies, Shows, or Music, then set the folder path Jellyfin should scan. The path must exist and be readable by the jellyfin service account before the scan finds files.


Give Jellyfin access to your media

Jellyfin needs traverse permission on every parent directory and read permission on media files. It does not need to own your entire library.

Grant read access without changing media ownership

Example library tree:

bash
sudo mkdir -p /srv/media/{movies,tv,music}

Install ACL tools if setfacl is missing:

bash
sudo apt install acl

Grant the jellyfin user read and directory traverse on the tree:

bash
sudo setfacl -R -m u:jellyfin:rX /srv/media

Optional default ACL so new files under /srv/media stay readable (useful when another app writes into the tree):

bash
sudo setfacl -R -d -m u:jellyfin:rX /srv/media

Do not run chmod -R 777 on a library. Do not chown -R jellyfin:… on large personal archives unless you have a deliberate ownership model—ACLs or a shared group are usually safer.

Verify access as the jellyfin user

Confirm the service account can list the library:

bash
sudo -u jellyfin ls /srv/media/movies

If that fails, check every parent—Jellyfin cannot read /srv/media/movies/film.mkv when /srv or /srv/media blocks traverse:

bash
namei -l /srv/media/movies

Fix permissions or ACLs on the first directory in the chain that denies jellyfin execute (x) for directories.


Access Jellyfin from other devices

Install clients from jellyfin.org/downloads or use a browser. Point phones and TVs at:

text
http://SERVER-IP:8096

Jellyfin documents 8096/tcp as the default HTTP port. Exposing that port directly to the public Internet is not recommended—use a VPN or reverse proxy with TLS when you need access outside the LAN. This guide stops at a working LAN server; it does not walk through Nginx or Let’s Encrypt.

Allow Jellyfin through UFW on your LAN

If UFW is active, allow the web UI from your home subnet—not the whole world:

bash
sudo ufw allow from 192.168.1.0/24 to any port 8096 proto tcp

Replace 192.168.1.0/24 with your LAN CIDR. Confirm SSH stays allowed before you enable UFW (sudo ufw allow OpenSSH).

bash
sudo ufw status

Optional client discovery

Some clients discover servers with UDP 7359 on the LAN. You do not need it to browse to http://SERVER-IP:8096. If you want auto-discovery on the private network only:

bash
sudo ufw allow from 192.168.1.0/24 to any port 7359 proto udp

Do not forward 7359 or 8096 to the Internet without understanding the risk.


Optional: Configure hardware transcoding

Verify direct play works first. When the server must transcode, enable the acceleration path that matches your GPU (Intel QSV, VA-API, NVIDIA NVENC, and others) in Dashboard → Playback → Transcoding. The official Debian/Ubuntu package ships Jellyfin’s recommended FFmpeg build—follow Jellyfin’s hardware acceleration documentation for your hardware instead of pasting one-size-fits-all driver commands here.


Optional: Run Jellyfin with Docker

Use Docker when you already run containers or want app isolation. On 26.04 and 24.04, native APT is simpler—systemd and apt upgrade stay integrated.

bash
docker run -d \
  --name jellyfin \
  --restart unless-stopped \
  --publish 8096:8096 \
  --volume /path/to/config:/config \
  --volume /path/to/cache:/cache \
  --volume /path/to/media:/media:ro \
  jellyfin/jellyfin:latest

Map /path/to/media to the same stable library you would use for an APT install. Hardware transcoding needs extra device flags—see Jellyfin’s container documentation.


Update Jellyfin

Update Jellyfin 12.x (minor releases)

Within the 12.x line, refresh indexes and upgrade like any APT package:

bash
sudo apt update
sudo apt install --only-upgrade jellyfin

Restart if the packaging postinst did not already:

bash
sudo systemctl restart jellyfin

Back up before a major Jellyfin upgrade

Moving from 10.11.x (or 10.10.7) to 12.x runs database migrations on first start. Jellyfin documents that rollback after migration requires restoring a backup—do not treat apt upgrade as reversible once migrations run.

Before a major jump:

bash
sudo systemctl stop jellyfin
sudo cp -a /var/lib/jellyfin /path/to/backup/jellyfin-data
sudo cp -a /etc/jellyfin /path/to/backup/jellyfin-etc

Run sudo apt update and upgrade jellyfin, then start the service:

bash
sudo systemctl start jellyfin

The first 12.x start can take several minutes while migrations run—watch journalctl -u jellyfin -f instead of assuming the service hung.


Uninstall Jellyfin

Remove the server packages

Stop the service, then purge the metapackage explicitly—no wildcard:

bash
sudo systemctl stop jellyfin
sudo apt purge jellyfin

Preview orphaned dependencies before you autoremove:

bash
sudo apt-get -s autoremove

Remove only packages you recognize as Jellyfin-related leftovers. Remove the repo if you will not reinstall:

bash
sudo rm -f /etc/apt/sources.list.d/jellyfin.sources /etc/apt/keyrings/jellyfin.gpg
sudo apt update

Broader cleanup habits: how to remove software on Ubuntu.

Keep or remove Jellyfin server data

Purging packages does not delete:

  • /var/lib/jellyfin — database, metadata, transcode cache
  • /etc/jellyfin — configuration

Delete those directories only when you intend to wipe users, watch history, and libraries from this server. Your media files under /srv/media remain unless you remove them separately.

Docker: docker stop jellyfin && docker rm jellyfin, then delete mounted config/cache volumes when you no longer need them.


Troubleshooting

Symptom Likely cause Fix
jellyfin not active Failed start or port bind journalctl -u jellyfin -n 50 --no-pager; fix config permissions under /var/lib/jellyfin
Browser cannot reach :8096 UFW, wrong IP, or service down systemctl is-active jellyfin; allow 8096/tcp from your LAN subnet in UFW
Library scan finds nothing Wrong type or empty path Match Movies/Shows/Music; confirm files exist on disk
sudo -u jellyfin ls fails Parent dir not traversable namei -l /path/to/file; fix ACL or mode on first blocking directory
apt-cache policy shows no candidate Unsupported codename or missing repo Re-run the official installer or fix jellyfin.sources; do not fake another Ubuntu suite
Long hang after 10.11 → 12 upgrade Database migration Wait; watch journalctl -u jellyfin -f; restore backup if you must roll back
Transcoding errors Software decode only or GPU not configured Enable hardware acceleration per Jellyfin docs; check playback logs

Summary

Install Jellyfin on Ubuntu 26.04 or 24.04 with Jellyfin’s official APT repository—the install script on repo.jellyfin.org is the fastest supported path. Verify with systemctl is-active jellyfin, open http://SERVER-IP:8096, and finish the wizard with real library paths.

Grant access with ACLs or group read permission instead of chown -R jellyfin on your media. Keep libraries on stable mount paths, open 8096/tcp to your LAN in UFW when needed, and back up /var/lib/jellyfin before jumping from 10.11.x to 12.x. Docker remains optional; native packages are the default on current LTS.


References


Frequently Asked Questions

Does Jellyfin support Ubuntu 26.04?

Yes. Jellyfin’s installer lists resolute as a supported Ubuntu release and publishes jellyfin packages for it. Use the official APT repository on 26.04 LTS.

Does this work on Ubuntu 24.04?

Yes. Noble uses the same workflow as 26.04—official script or manual jellyfin.sources, then apt install jellyfin.

What port does Jellyfin use?

TCP 8096 for the HTTP web UI by default. Optional HTTPS may use 8920 when configured. UDP 7359 is optional for LAN client discovery.

Do I need Docker to run Jellyfin on Ubuntu?

No on 26.04, 24.04, or 22.04 LTS. Native APT is the recommended path. Docker is optional when you prefer containers.

Where does Jellyfin store its configuration and database?

/etc/jellyfin for configuration and /var/lib/jellyfin for the database, metadata, and cache. Media libraries live wherever you point the dashboard—commonly /srv/media.

Should Jellyfin own my media files?

Usually no. Jellyfin needs read and traverse permission—ACLs or a shared group are enough. Avoid recursive chown on large libraries unless you intend to change ownership.

Do I need a GPU for Jellyfin?

No for direct play. A GPU or supported hardware acceleration helps when clients require transcoding—configure that after basic playback works.

Finished reading?Beta Get the key takeaways in seconds, then ask follow-up questions
Omer Cakmak

Linux Administrator

Highly skilled at managing Debian, Ubuntu, CentOS, Oracle Linux, and Red Hat servers. Proficient in bash scripting, Ansible, and AWX central server management, he handles server operations on OpenStack, KVM, Proxmox, and VMware.

  • Debian
  • Ubuntu
  • Linux
  • Red Hat Enterprise Linux
  • Shell Script
  • System Administration