On this page
Jellyfin is a free, open-source media server that turns a folder of movies and TV files into a polished, streamable library — with no paid tier and no account to buy. It is the natural pick if you want full control and don’t want features like hardware transcoding locked behind a subscription. This guide gets a server installed, through its first-run wizard, and scanning its first library — whether that server is a dedicated NAS or a Proxmox LXC container.
If you’re still weighing it against Plex, see Plex vs Jellyfin — the short version is that Jellyfin trades Plex’s polish and remote-access convenience for being free, open, and fully self-contained. This post assumes you’ve decided on Jellyfin and want it running.
Where to run Jellyfin
Like any media server, Jellyfin reads your files off disk and streams them out. The single most important rule is the same as for Plex: run the server as close to your media as possible. Streaming files across the network to a server that then re-streams them wastes bandwidth and invites stutter.
| Your media lives on… | Run Jellyfin on… | Why |
|---|---|---|
| A NAS (Synology, Asustor, QNAP, TrueNAS) | The NAS itself | Reads the array locally, no network hop |
| Proxmox cluster storage | An LXC container with the media bind-mounted | Lightweight, shares the host kernel |
| A single Linux box | That box | Simplest possible setup |
A VM works too, but an LXC container is lighter and starts faster. The main reason to prefer a VM is GPU passthrough for hardware transcoding, which needs the full device isolation a VM provides — though an unprivileged LXC can pass through an Intel iGPU for QuickSync with a bit of extra config.
Task 1: Install Jellyfin
The commands in this guide use example values: /volume1/... paths (your NAS’s actual volume layout), container ID 120 (any free ID in your cluster), /mnt/media (wherever your media lives on the Proxmox host), and <server-ip> (your Jellyfin machine’s address). If a value looks specific to one machine, it’s a placeholder to change — not a literal to copy.
Most NAS vendors either ship Jellyfin in their app store (Asustor App Central, QNAP App Center) or you run it as a Docker container from the vendor’s container manager. The container route is the most portable and stays current — pull the official jellyfin/jellyfin image or the well-maintained LinuxServer.io image:
# docker-compose.yml
services:
jellyfin:
image: jellyfin/jellyfin
container_name: jellyfin
network_mode: host
volumes:
- /volume1/Docker/jellyfin/config:/config
- /volume1/Docker/jellyfin/cache:/cache
- /volume1/Media:/media:ro
restart: unless-stopped
network_mode: host lets client auto-discovery (DLNA/UDP) work and exposes the web UI on port 8096 directly. Bring it up with docker compose up -d.
Create a Debian LXC container (2 cores, 2 GB RAM is plenty for a small library), then use Jellyfin’s official one-line installer, which adds the APT repository and installs the server so it stays updated with apt:
# Official installer: adds the Jellyfin APT repo and installs the server
curl -fsSL https://repo.jellyfin.org/install-debuntu.sh | sudo bash
# Confirm it is running
sudo systemctl status jellyfin --no-pager
Jellyfin now listens on port 8096. Reach the setup wizard at http://<server-ip>:8096. There’s a copy-paste Jellyfin install playbook with these exact commands plus the manual-repo alternative.
Task 2: Bind-mount your media (LXC only)
If Jellyfin is on a NAS, skip this — the container already sees the array through its volume mount. For a Proxmox LXC container, expose your media folders to the container with a bind mount on the Proxmox host:
# Example: container 120, media on the host at /mnt/media
pct set 120 -mp0 /mnt/media,mp=/media,ro=0
# Restart the container to apply
pct reboot 120
Jellyfin runs as its own jellyfin user inside the container. If it can see the folder but the library scans empty, the files are likely owned by a user Jellyfin cannot read. Check ownership with ls -ln and, if needed, chown or adjust group membership so the jellyfin user has read access. Getting permissions right now saves a lot of “empty library” confusion later.
See the Proxmox storage guide if your media lives on NFS or ZFS and you’re deciding how to present it to the container.
Task 3: Run the first-time wizard
Browse to http://<server-ip>:8096 from any machine on your network. Unlike Plex, there is no server to claim — Jellyfin has no central account service. Instead you:
- Pick a display language
- Create the first administrator user (this account lives only on this server)
- Add media libraries
- Confirm remote-access preferences
Add one library per content type — Movies and TV Shows are separate, because Jellyfin uses a different scanner and metadata provider for each. Point each library at the matching folder:
| Library type | Content type | Points at |
|---|---|---|
| Movies | Movies | /media/Movies |
| TV Shows | Shows | /media/TV |
| Anime | Shows (or a mixed folder) | a separate folder |
Keep movies and TV in physically separate top-level folders. Mixing them in one library confuses the scanner and produces wrong matches. One folder, one content type, one library.
Jellyfin pulls artwork and details from TheMovieDB and TheTVDB by default — no API key needed for basic use. Leave the defaults on for your first library; you can tune provider order and add fanart sources later.
Task 4: Get the file naming right the first time
The scanner identifies files by name. Jellyfin follows the same conventions as most media servers, and matches almost everything automatically when files are named correctly — the official naming docs are the authoritative reference:
Movies/
The Matrix (1999)/
The Matrix (1999).mkv
Blade Runner 2049 (2017)/
Blade Runner 2049 (2017).mkv
TV/
Firefly/
Season 01/
Firefly S01E01.mkv
Firefly S01E02.mkv
The (Year) on movies and the S01E02 on episodes are what disambiguate remakes and multi-season shows. Files that don’t match this pattern land as “unmatched” and need manual fixing. This is the same layout the *arr stack produces automatically if you automate downloads, so a well-run library rarely needs hand-fixing.
Task 5: Hardware transcoding is free — turn it on
This is where Jellyfin’s licensing shines. Hardware-accelerated transcoding — which is a paid Plex Pass feature — is included in Jellyfin at no cost. In Dashboard → Playback, pick your acceleration method (VAAPI or QSV for Intel, NVENC for NVIDIA) and enable the codecs your hardware supports.
Even with hardware acceleration, the smoothest playback is one that avoids transcoding entirely. The rules for keeping files playing directly — codec, container, and subtitle choices — are the same across media servers; the Direct Play and transcoding guide covers the reasoning, and it applies to Jellyfin too.
Task 6: Reach Jellyfin from outside your network
Jellyfin has no relay service of its own, so remote access is on you. Two common approaches:
- A private mesh VPN — put your devices and the server on a Tailscale tailnet and stream over that. Nothing is exposed to the public internet, and it’s the simplest secure option.
- A reverse proxy — front Jellyfin with Traefik or Nginx and a real TLS certificate if you want a public hostname. Only do this if you understand the exposure; a media server open to the internet is a target.
Do not simply port-forward 8096 to the internet. That exposes the login page — and any unpatched vulnerability — to the entire world. The VPN route gives you remote streaming with zero public attack surface.
What’s next
Your server scans, matches, and streams — for free, with hardware transcoding available. From here the two things that shape the experience are playback quality (avoiding forced transcodes that stutter) and library hygiene (correct titles and sort order), plus automating downloads with the *arr stack so new files land already named correctly.
Related posts:
- Plex vs Jellyfin: Which Media Server Should You Run? — decide which server fits your setup
- Install Plex Media Server on a NAS or Proxmox LXC — the Plex equivalent of this guide
- Direct Play and Transcoding on Weak Hardware — smooth playback without a beefy CPU
- Automate Your Media Library with the *arr Stack — Sonarr and Radarr grab and rename files for you
- Creating Your First Proxmox LXC Container — the container this guide installs Jellyfin into
- Tailscale Subnet Router — reach Jellyfin remotely with no port forwarding
Recommended hardware for this setup:
- NAS enclosure — a multi-bay NAS to hold the media array
- NAS hard drives — CMR NAS-rated drives for a media library
- Mini PC — an Intel QuickSync mini PC for free hardware transcoding
This post contains Amazon affiliate links (tag: buildahomelab-20). I earn a small commission on qualifying purchases at no extra cost to you.
Comments
Comments are powered by GitHub Discussions — sign in with a GitHub account to join the conversation.