Deployment guide

Migrating from Plex to Jellyfin on a VPS: the complete guide

Deploy on a VPS Cloud →

Tutorial

Migrating from Plex to Jellyfin on a VPS: the complete guide

Self-hosting8 min read6 steps

Since July 2026, accessing your own files from outside your local network requires a Plex subscription or a lifetime pass at $749. Jellyfin, its open-source alternative, requires no account, no subscription, and installs on any VPS with root access. This guide covers the complete migration: stopping Plex, deploying Jellyfin, recovering your libraries and configuring remote streaming.

Contents· Why leave Plex now1/8
  1. 01Why leave Plex now
  2. 02What Jellyfin offers compared to Plex
  3. 03Prerequisites before starting
  4. 04Migration step by step
  5. 05Create local user accounts for your family or friends
  6. 06Plex vs Jellyfin: key features after the July 2026 paywall
  7. 07Troubleshooting common errors
  8. 08Going further with your Jellyfin server

Why leave Plex now

Plex long positioned itself as the de facto standard for personal media servers. The freemium model seemed reasonable: the local server worked for free, and advanced features like remote streaming or offline downloads were reserved for subscribers or Lifetime Pass holders.

In July 2026, the Lifetime Pass pricing was revised upward to $749. Simultaneously, remote streaming — the ability to watch your own files from another network — moved behind this paywall. A user who had set up their Plex server to access their library while traveling can no longer do so without paying.

This change reveals a structural dependency: even if your files remain on your own VPS, the features that make remote access usable are controlled by a centralized service. Jellyfin is developed under the GPL-2.0 license, with no mandatory account, no third-party relay server, and no paywalled functionality.

What Jellyfin offers compared to Plex

  • No mandatory account — the Jellyfin server works entirely without creating an account on a third-party service, neither locally nor remotely
  • Remote streaming without subscription — access from outside your local network is a core feature, not a paid option
  • GPL-2.0 license — the source code is auditable; the project cannot be acquired or shut down without the community being able to fork it
  • Compatibility with the same clients — Infuse, Jellyfin for Android TV, Swiftfin (iOS) and web clients cover the same use cases as Plex
  • No telemetry by default — Jellyfin does not send usage data to a central service, unlike Plex which sends playback statistics
  • Metadata from the same sources — TheMovieDB and TheTVDB are used by Jellyfin as by Plex; your libraries will rebuild with the same posters and the same entries
  • Hardware transcoding on VPS — VAAPI, NVENC and QuickSync are supported as long as the VPS processor or graphics card exposes them

Prerequisites before starting

This guide assumes you have a Linux VPS (Debian 12 or Ubuntu 22.04 recommended), root access via SSH, and that your media files are already stored on this server or mounted from network storage. Plan for at least 2 vCPU and 2 GB RAM for solo use; for multiple simultaneous users with transcoding, 4 vCPU and 4 GB are more appropriate.

Docker and Docker Compose must be installed. If not yet done, the official installation command works on both distributions. A domain name pointing to your VPS IP is required to expose Jellyfin via HTTPS — without it, some clients refuse to connect or display security warnings.

Keep your Plex instance running until the end of the migration: you will need to check the structure of your libraries and note the exact paths to your media folders.

Migration step by step

  1. Note the structure of your Plex libraries

    Open the Plex web interface, go to Settings → Libraries and note for each library: its name (Movies, TV Shows, Music...) and the associated folder path(s). These are the same paths you will declare to Jellyfin — no file movement is necessary.

    Also note whether any libraries point to NFS or CIFS-mounted folders: these mounts must be active at Jellyfin startup for the initial scan to succeed.

  2. Create Jellyfin configuration directories

    Connect to your VPS via SSH and create the working directories:

    These two folders will contain respectively the Jellyfin database (accounts, preferences, playback history) and the transcoding cache. Your media remain at their current location — do not move them.

  3. Write the Docker Compose file

    Create /opt/jellyfin/docker-compose.yml with the following content, adapting /mnt/media to the actual path of your files:

    The :ro (read-only) flag on the media volume is good practice: Jellyfin never needs to write to your files. Exposing the port only on 127.0.0.1 prevents the service from being directly accessible without TLS — the reverse proxy will handle public exposure.

  4. Start Jellyfin and create the administrator account

    Start the container:

    Open http://your-ip:8096 in a browser from your local machine (via SSH tunnel if necessary). The wizard asks you to choose a language, create a local administrator account — no external email address or Jellyfin account is required — then to declare your libraries. Point exactly to the same paths noted in step 1.

  5. Configure the HTTPS reverse proxy

    For secure remote access, you need a reverse proxy that terminates TLS and forwards requests to Jellyfin on port 8096. With nginx, create /etc/nginx/sites-available/jellyfin:

    Enable the site and reload nginx. Obtain a Let's Encrypt certificate with certbot --nginx -d media.your-domain.com. Then return to Jellyfin settings (Dashboard → Networking) to declare the public URL https://media.your-domain.com.

  6. Stop Plex and verify the migration

    Once Jellyfin responds correctly from the outside and your libraries are scanned, stop Plex. On a Docker deployment:

    Verify that Jellyfin resolves metadata correctly on a few titles: posters present, synopsis, release date. If files remain without metadata, check their naming — Jellyfin follows the Title (Year).ext convention for movies and Series/Season N/Title S0NE0N.ext for series. Clicking "Scan library files" on the library forces a new scan.

Create local user accounts for your family or friends

Jellyfin supports multiple user accounts, each with its own visible libraries, playback history and quality preferences. Create one account per person under Dashboard → Users: none of these accounts requires an email address or external validation. Each user installs the Jellyfin app on their TV or phone, enters the URL of your server and their local credentials — that is all.

Plex vs Jellyfin: key features after the July 2026 paywall

Scroll the table

FeaturePlex (free tier)Jellyfin
Local streaming (local network)IncludedIncluded
Remote streaming (outside local network)$749 Lifetime Pass requiredIncluded at no extra cost
Mandatory accountYes (Plex.tv)No
LicenseProprietaryGPL-2.0 (open source)
Offline downloadsLifetime Pass requiredIncluded
Hardware transcodingLifetime Pass required for some formatsIncluded (VAAPI, NVENC, QuickSync)
Available clientsiOS, Android, TV, webiOS (Swiftfin), Android, TV, web, Infuse
Data sent to a third partyPlayback statistics to Plex.tvNone by default

Troubleshooting common errors

Port 8096 does not respond after docker compose up. Check that the container is running with docker ps and review logs with docker logs jellyfin. The most common error is a port conflict if a previous Jellyfin installation existed.

Metadata fails to load. The initial scan can take from ten minutes to several hours depending on library size. Monitor progress under Dashboard → Activity. If files remain without posters after several hours, the issue is almost always file naming: rename according to the convention and relaunch a scan.

Remote access fails while the server responds locally. Check three points in order: the firewall allows port 443 (ufw allow 443), DNS points to the correct VPS IP, and the JELLYFIN_PublishedServerUrl variable in Docker Compose matches exactly the URL declared in Jellyfin network settings.

CPU transcoding saturates at 100%. Without hardware acceleration, a single 4K stream can saturate several cores. Enable VAAPI if your processor supports it: under Dashboard → Playback, select "Video Acceleration API (VAAPI)" and map the /dev/dri/renderD128 device in your Compose file. Also encourage your users to enable Direct Play in their client settings when bandwidth allows.

The steps above cover a standard deployment on Debian or Ubuntu with Docker. If you use a different distribution or container manager (Podman, for example), the logic remains the same — only the Docker installation commands change. The official Jellyfin documentation (docs.jellyfin.org) maintains installation guides for each environment, including native Debian packages and official Docker images.

Going further with your Jellyfin server

Once Jellyfin is stable, a few extensions are worth exploring. The Jellyseerr plugin (a fork of Overseerr) adds a content request interface: your users submit what they want to watch, and you can approve requests from a centralized dashboard.

For music collections, the Musicbrainz plugin enriches metadata well beyond cover art: genre tags, release dates, related artists. Playback on connected speakers is possible via the built-in DLNA plugin or via Chromecast from the web application.

Finally, if you host other services on the same VPS, Jellyfin integrates naturally into a multi-container Docker stack with its own internal network — it never exposes its port directly; only the reverse proxy is visible from outside. This is a clean architecture that scales from a single user to a dozen.

A VPS with root access for your Jellyfin server

Jellyfin requires root access to configure Docker, the reverse proxy and media volumes. A VPS with a dedicated IPv4 gives you full control over your infrastructure, with no bandwidth restrictions imposed by the software.

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