Goal
Install Jellyfin on Ubuntu with a setup that’s:
- reliable
- low-maintenance
- friendly to low-power hardware
…and doesn’t turn into a weekend-long troubleshooting session.
What you’ll need
- Ubuntu 22.04+ (server or desktop)
- SSH access to the box
- A media disk/folder (local disk or network share)
- A browser on another machine on the same network
For the rest of this guide we’ll assume:
- your media lives at
/mnt/media - the server’s IP is
192.168.x.x
Adjust paths/IPs as needed.
1. Install Jellyfin on Ubuntu
First, update packages and add the Jellyfin repo.
$ sudo apt update
$ sudo apt install -y apt-transport-https ca-certificates curl gnupg
$ curl -fsSL https://repo.jellyfin.org/jellyfin_team.gpg.key \
| sudo gpg --dearmor -o /usr/share/keyrings/jellyfin.gpg
$ echo "deb [signed-by=/usr/share/keyrings/jellyfin.gpg] https://repo.jellyfin.org/ubuntu \
$(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/jellyfin.list
$ sudo apt update
$ sudo apt install -y jellyfin
Check the service is running
sudo systemctl enable jellyfin
sudo systemctl start jellyfin
sudo systemctl status jellyfin --no-pager
You want to see active (running) in the status output.
If it’s not running, fix that before doing anything else:
- double-check the repo commands
- re-run
sudo apt update && sudo apt install -y jellyfin
2. Access the Jellyfin web UI
On a device on the same network, open a browser and go to:
http://YOUR-SERVER-IP:8096
Example:
http://192.168.1.50:8096
You should see the Jellyfin setup wizard.
Walk through:
- Create an admin user with a strong password.
- Choose your language / region.
- Skip adding libraries for a moment — we’ll set up folders and permissions first.
3. Set up media folders (the future pain-avoidance bit)
The goal: Jellyfin can read your media folders without you fighting permissions on every new drive.
We’ll assume:
- main media mount:
/mnt/media - inside that, you use:
/mnt/media/movies/mnt/media/tv/mnt/media/music(optional)
Create folders (if they don’t exist):
sudo mkdir -p /mnt/media/movies
sudo mkdir -p /mnt/media/tv
sudo mkdir -p /mnt/media/music
Give Jellyfin read access
On Ubuntu, the jellyfin service runs as the jellyfin user and group.
We’ll:
- make the
jellyfingroup own the folder - give group read+execute permissions
# Set group to 'jellyfin'
sudo chgrp -R jellyfin /mnt/media
# Owner: read/write/execute; Group: read/execute; Others: no access
sudo chmod -R 750 /mnt/media
This means:
- your own user can still manage files (if you’re the owner)
- Jellyfin can read everything inside
/mnt/media - the rest of the world on that box gets nothing
If your media comes from a NAS / network share, make sure that share is mounted with permissions that map cleanly to Linux users (or use a dedicated Jellyfin mount later).
4. Point Jellyfin at your media
Back in the Jellyfin web UI:
- Go to Dashboard → Libraries → Add Media Library
- Choose a content type:
- Movies →
/mnt/media/movies - TV Shows →
/mnt/media/tv - Music →
/mnt/media/music
- Movies →
- Save each library.
Jellyfin will start a library scan. Depending on the size of your collection, this may take a while.
5. File naming that “just works”
Jellyfin’s metadata depends heavily on file/folder names.
Movies
Recommended:
Movie Name (Year)/Movie Name (Year).ext
Examples:
movies/Blade Runner (1982)/Blade Runner (1982).mkvmovies/Dune (2021)/Dune (2021).mp4
TV shows
Recommended:
Show Name/Season 01/Show Name - S01E01 - Episode Title.ext
Example:
tv/The Expanse/Season 01/The Expanse - S01E01 - Dulcinea.mkv
You don’t have to be perfect, but this pattern avoids 90% of the “why is metadata wrong?” pain.
6. Optional: hardware-accelerated transcoding (low-power win)
If your box has an Intel iGPU (Quick Sync) or a compatible NVIDIA GPU, you can offload transcoding and keep CPU usage/power down.
6.1 Enable Intel Quick Sync (common small-grid case)
Install extra VAAPI bits:
sudo apt install -y vainfo intel-media-va-driver-non-free
vainfo | grep -i "driver"
vainfo should print something sensible (not just errors).
Then in Jellyfin:
- Go to Dashboard → Playback → Transcoding
- Set Hardware acceleration to:
- VAAPI
- VAAPI device path:
/dev/dri/renderD128(common default)
Start with H.264 hardware decoding/encoding enabled; expand later only if needed.
If this feels flaky or your hardware is weird, it’s perfectly fine to leave hardware acceleration off. For direct play it’s often not needed.
7. Make sure it survives reboots
If you installed via the official repo, Jellyfin is already set to start on boot. To be sure:
sudo systemctl is-enabled jellyfin
If it doesn’t say enabled, run:
sudo systemctl enable jellyfin
Reboot once to confirm:
sudo reboot
After the reboot, visit http://YOUR-SERVER-IP:8096 again and make sure Jellyfin is alive.
8. Next: safe remote access
For SmallGrid-style setups, the default remote access recommendation is:
- no exposed ports
- use a private mesh network like Tailscale to reach Jellyfin from outside your house
See the follow-up guide:
- Remote Access Without Port Forwarding: Jellyfin + Tailscale (
/guides/jellyfin-tailscale-remote-access/)
Recap
By now you should have:
- Jellyfin running on Ubuntu
- media in
/mnt/media/...with sane permissions - libraries set up and scanning
- optional hardware transcoding configured (or safely ignored for now)
From here, you can start refining:
- better metadata
- multiple user accounts for family
- backups of Jellyfin’s config and database
You now have a low-power, low-drama media server instead of a mysterious box that sometimes works.