Deployment guide

Self-Hosting Jellyfin on a VPS: Complete 2026 Guide

Deploy on a VPS Cloud →

Tutorial

Self-Hosting Jellyfin on a VPS: Complete 2026 Guide

Self-hosting10 min read6 steps

Jellyfin is the media server that Plex should have been — no subscription, no central authentication server, no data collection. Just your library, on your machine, accessible from any screen. This guide takes you from Docker installation to nginx configuration, covering the two issues most discussed in forums: plugins disappearing after an update, and storage strategy as your library grows.

Contents· Why Jellyfin in 20261/9
  1. 01Why Jellyfin in 2026
  2. 02What Jellyfin offers
  3. 03Requirements by use case
  4. 04Installing Jellyfin on VPS Ubuntu/Debian with Docker Compose
  5. 05Missing plugins — fixing the repository URL
  6. 06Storage strategy for Jellyfin on VPS
  7. 07Hardware transcoding — VAAPI and NVENC
  8. 08Troubleshooting — common errors
  9. 09Deploy Jellyfin from the ServOrbit Marketplace

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

  1. 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 docker

    Verify Docker is working: docker info

  2. Create 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/media

    UID 1000 is the default user of the Jellyfin Docker image.

  3. 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.com
  4. Start the container

    cd /opt/jellyfin
    docker compose up -d
    docker compose logs -f

    Jellyfin listens on port 8096. Wait for the Startup complete line in logs.

  5. Configure nginx as reverse proxy with HTTPS

    Install nginx and certbot: apt install -y nginx certbot python3-certbot-nginx

    Create /etc/nginx/sites-available/jellyfin with a server block proxying to http://localhost:8096, including the X-Forwarded-For, X-Forwarded-Proto, and WebSocket Upgrade headers.

    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 nginx
  6. Initial 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 restart

The 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/renderD128

Then 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.

Your Jellyfin in production in 5 minutes

Deploy Jellyfin from the ServOrbit Marketplace: automated installation, HTTPS included, configurable storage, VPS under your full control.

Need help?

Browse our help center and FAQ, or reach our team — callback, WhatsApp or email. Support in French, English and Arabic.

Message us on WhatsAppopens in a new tab