Why Jellyfin in 2026
The personal media server landscape has shifted significantly.Les plateformes de streaming centralisées ont relevé leurs tarifs ces dernières années, poussant de nombreux utilisateurs à explorer l'hébergement autonome. Emby, the other historical alternative, also moved to a freemium model — key features like hardware transcoding and mobile clients now require an Emby Premiere subscription.
Jellyfin was born in 2018 as an Emby fork, specifically to remain free. The GPLv2 license prevents any re-closure of the code — if a contributor reintroduces proprietary code, users can legally fork. This is a structural guarantee that neither Plex nor Emby offers.
On the feature side, Jellyfin 10.10 covers virtually all mainstream use cases: adaptive streaming, software and hardware transcoding, native iOS, Android, Android TV and Roku apps, LiveTV and DVR recording, automatic subtitles, SSO via OIDC and LDAP, and a plugin system that extends the application without modifying the core.
What Jellyfin offers
- DLNA and HLS streaming — serves movies, series and music to all your devices, including TVs without native app support.
- Official apps — iOS, Android, Android TV, Roku, Fire TV, Kodi; a responsive web interface for everything else.
- On-the-fly transcoding — converts the source format if the target device doesn't support it, in software or via GPU.
- LiveTV and DVR recording — connect a USB tuner or IPTV source to watch and record live television.
- OIDC and LDAP SSO — integrate your existing directory or an identity provider like Authentik or Keycloak.
- Automatic subtitles — OpenSubtitles plugin, embedded track extraction, WebVTT rendering.
- Extended plugins — LastFM integrations, scrobbling, music metadata, trailers, collection management.
- No proprietary cloud — no authentication through Plex servers, no playback data sent to third parties.
Requirements by use case
Needs vary considerably depending on your intended use.
SD and 1080p without transcoding (direct play): if your devices natively play the source codec (H.264 or H.265), Jellyfin doesn't transcode — it serves the file like a smart file server. 2 vCPU and 2 GB RAM handle hundreds of titles comfortably. This is the most common VPS use case.
1080p with software transcoding: when the client doesn't support the codec or you limit bandwidth, Jellyfin encodes on the fly. A single 1080p H.264 stream consumes 2 to 4 cores depending on source resolution. Target 4 vCPU / 4 GB RAM minimum for two simultaneous users.
4K HDR with software transcoding: HDR tone-mapping (HDR→SDR conversion for non-HDR screens) is extremely demanding. A single 4K HDR stream can saturate 8 cores. This use case isn't suitable for a standard cloud VPS — prefer 4K direct play (client must support HEVC/HDR) or a dedicated server with GPU.
Hardware GPU transcoding (VAAPI/NVENC): reduces CPU load by 4 to 10x, but requires access to the /dev/dri device or an NVIDIA card. Standard cloud VPS don't expose GPUs; this option is reserved for dedicated servers or specialized GPU VPS.
Installing Jellyfin on VPS Ubuntu/Debian with Docker Compose
Prepare the VPS and install Docker
Connect via SSH to your VPS (Ubuntu 22.04 or Debian 12). Update the system and install Docker:
apt update && apt upgrade -y curl -fsSL https://get.docker.com | sh systemctl enable --now dockerVerify Docker is working:
docker infoCreate the folder structure
Choose where to store Jellyfin configuration and your media:
mkdir -p /opt/jellyfin/{config,cache} mkdir -p /mnt/media/{movies,series,music} chown -R 1000:1000 /opt/jellyfin /mnt/mediaUID 1000 is the default user of the Jellyfin Docker image.
Write the docker-compose.yml file
Create
/opt/jellyfin/docker-compose.yml:services: jellyfin: image: jellyfin/jellyfin:latest container_name: jellyfin user: "1000:1000" network_mode: host volumes: - /opt/jellyfin/config:/config - /opt/jellyfin/cache:/cache - /mnt/media:/media:ro restart: unless-stopped environment: - JELLYFIN_PublishedServerUrl=https://jellyfin.your-domain.comStart the container
cd /opt/jellyfin docker compose up -d docker compose logs -fJellyfin listens on port 8096. Wait for the
Startup completeline in logs.Configure nginx as reverse proxy with HTTPS
Install nginx and certbot:
apt install -y nginx certbot python3-certbot-nginxCreate
/etc/nginx/sites-available/jellyfinwith a server block proxying tohttp://localhost:8096, including theX-Forwarded-For,X-Forwarded-Proto, and WebSocketUpgradeheaders.Activate and get the certificate:
ln -s /etc/nginx/sites-available/jellyfin /etc/nginx/sites-enabled/ certbot --nginx -d jellyfin.your-domain.com nginx -t && systemctl reload nginxInitial setup wizard
Open
https://jellyfin.your-domain.com. The wizard guides you through creating the admin account, adding your library, and choosing metadata agents (TheMovieDB for movies, TheTVDB for series).
Missing plugins — fixing the repository URL
This is one of the most frequently asked questions since migrating to Jellyfin 10.9: the plugin catalog appears empty, even though the instance works perfectly otherwise.
Symptom: Dashboard > Plugins > Catalog = empty list, or "Unable to load plugins" message.
Cause: The official plugin repository URL changed between Jellyfin 10.7 and 10.9 (GitHub issue #16654). Instances installed or updated before the migration still have the old URL releases/plugin/manifest-stable.json in their configuration — it no longer responds.
Fix in three steps:
1. Go to Dashboard > Plugins > Repositories
2. Find the entry pointing to releases/plugin/manifest-stable.json and delete it
3. Add a new repository with the updated URL: https://repo.jellyfin.org/files/plugin/manifest.json
4. Click Save
Clear the cache: after updating the repository, previous metadata may remain cached. Restart Jellyfin to force a reload:
docker compose -f /opt/jellyfin/docker-compose.yml restartThe catalog should appear within seconds of restart.
Storage strategy for Jellyfin on VPS
Storage is often the main constraint. Key size estimates:
- 1080p MKV H.264 movie: 5 to 15 GB depending on duration and bitrate
- 4K HDR H.265 movie: 15 to 60 GB or more for Blu-ray remasters
- 1080p TV episode: 1 to 4 GB
Example: 100 films × 8 GB (average) = 800 GB minimum. For a mixed library of 300 films and 10 complete series, budget 3 to 5 TB.
Option 1 — Additional VPS volume (recommended to start): most VPS providers offer block storage volumes that can be hot-attached, billed per GB/month. Mount it as ext4 on /mnt/media. Advantage: low latency. Disadvantage: linear cost with size.
Option 2 — Hetzner Storage Box (CIFS/Samba): hybrid solution — your VPS stays lean, storage lives on Hetzner Storage Box (up to 20 TB). Mount via CIFS. Latency is acceptable for pre-buffered streaming but not for live transcoding.
Option 3 — Local NAS with Tailscale or Cloudflare Tunnel: if you already have a home NAS, you can expose your library to a remote VPS via an encrypted tunnel. Streaming flows NAS → VPS → user, with 10 to added latency depending on distances.
Break-even point: a 2 TB volume at a typical VPS provider costs roughly €20-40/month. A Hetzner Storage Box 2 TB costs €7.64/month (2026). Beyond 500 GB, the Storage Box is almost always more economical — provided you accept the network latency.
Hardware transcoding — VAAPI and NVENC
Software transcoding handles one or two simultaneous sessions on a decent VPS. Beyond that, or for regular 4K HDR, hardware transcoding is essential.
VAAPI (Intel/AMD): on a dedicated server with Intel Gen 6+ or AMD RDNA processor, the /dev/dri/renderD128 device exposes the integrated encoder. Add it to the Docker service:
devices:
- /dev/dri/renderD128:/dev/dri/renderD128Then enable in Dashboard > Playback > Hardware Acceleration: select "Intel Quick Sync (VAAPI)".
NVENC (NVIDIA): requires the NVIDIA runtime for Docker (nvidia-docker2). Standard cloud VPS do not expose a GPU or /dev/dri device. This mode is reserved for dedicated servers with a graphics card or a processor with an accessible integrated GPU.
Limit simultaneous streams to avoid CPU saturation: Dashboard > Playback > Maximum simultaneous transcoding streams. Set this to 2 or 3 on a 4 vCPU VPS — beyond that, other users experience noticeable degradation.
Troubleshooting — common errors
Empty library after scan: verify the Docker bind mount is correct and permissions match. The container runs as UID 1000; if your files belong to root, Jellyfin can't read them: chown -R 1000:1000 /mnt/media.
HTTPS broken behind nginx: if the interface loads as HTTP despite HTTPS configuration, verify that X-Forwarded-Proto and X-Real-IP headers are forwarded in nginx config.
Slow transcoding or VAAPI error: confirm the container has device access with docker exec jellyfin ls /dev/dri. If the folder is missing, the device isn't passed in docker-compose.yml, or your VPS doesn't expose it.
Mobile apps refusing to connect: verify your TLS certificate is valid and not self-signed. Ensure Let's Encrypt auto-renewal is active: systemctl status certbot.timer.
Plugins installed but inactive after restart: some plugins require a complete Jellyfin restart to activate. Use docker compose restart rather than the interface restart option if the problem persists.
Deploy Jellyfin from the ServOrbit Marketplace
If you prefer a pre-configured installation rather than managing Docker manually, Jellyfin is available in the ServOrbit Marketplace. The installation automatically creates the container, configures the nginx reverse proxy with Let's Encrypt HTTPS, and mounts a dedicated storage volume. You get a production-ready Jellyfin in under five minutes, with storage options (additional volume, Storage Box) available directly from the management panel.
The VPS remains entirely under your control: you can SSH in, modify docker-compose.yml, add volumes, or migrate to another infrastructure at any time.