Why self-host Jellyfin on a VPS
Jellyfin is the only major media server that is fully free and paywall-free: no feature reserved for a subscription, unlike some alternatives. Deploying it on a VPS rather than on a home machine offers a decisive advantage: an address accessible from anywhere, symmetrical upload bandwidth often far higher than a residential connection, and continuous availability. The tricky point is video transcoding: converting a 4K stream to a bitrate compatible with a mobile on 4G consumes CPU. On a VPS, you therefore have to either favor Direct Play (devices read the file without conversion) or size the processor correctly. You keep full control: library organization, family accounts, subtitles and metadata.
Why Jellyfin on your own server
- 100% free software, with no subscription or feature locked behind a paywall.
- Access to your media library from anywhere via an HTTPS URL and native apps.
- Multi-user accounts with parental controls, progress tracking and dedicated libraries.
- Automatic retrieval of metadata, posters, subtitles and chapters for your media.
- The VPS's upload bandwidth is higher than a home router for remote streaming.
- Clients available on Android, iOS, Android TV, web browser and third-party apps.
Hardware and software requirements
Sizing depends entirely on transcoding. In Direct Play, where devices read the file as-is, 2 vCPUs and 2 GB of RAM are enough to serve several streams. As soon as 1080p software transcoding is needed, plan for 4 vCPUs and 4 GB of RAM per simultaneous stream, because Jellyfin heavily taxes the CPU without GPU hardware acceleration. Storage is the major item: a movie library quickly weighs several terabytes, so favor a VPS with expandable disk or mounted object storage. On the software side: Docker and docker compose v2, a domain (media.yourcompany.com), and good outbound bandwidth, a critical point for smooth remote streaming.
Deploy Jellyfin step by step
Prepare the VPS and the media folders
Install Docker, then create /opt/jellyfin/config, /opt/jellyfin/cache and a media folder /mnt/media/films and /mnt/media/series. A clear directory tree makes automatic library detection easier.
Declare the Jellyfin service
In docker-compose.yml, use the jellyfin/jellyfin:latest image, mount the config, cache and media volumes, and expose port 8096 internally. Set JELLYFIN_PublishedServerUrl to your public domain.
Launch and run the initial wizard
Start with docker compose up -d, open the interface and follow the wizard: language selection, administrator account creation, then adding the libraries by pointing to /media/films and /media/series as mounted in the container.
Upload your media
Copy your files into the mounted folders via rsync or SFTP, following a clean naming convention (Film (2021).mkv). Then run a library scan so Jellyfin retrieves posters and metadata.
Secure with a reverse proxy and SSL
Place Nginx or Caddy in front of Jellyfin for media.yourcompany.com, with a Let's Encrypt certificate. Enable WebSocket support and increase the proxy timeouts, because streaming keeps long-lived connections.
Optimize transcoding
In Dashboard > Playback, set the transcoding limits and favor Direct Play when possible. If your VPS exposes a compatible GPU, enable hardware acceleration to offload video conversions from the CPU.
To save the VPS's CPU, encode your files beforehand in widely compatible formats (H.264, AAC, MP4 or MKV container) so that most clients do Direct Play without transcoding. Reserve software transcoding for cases where an old device or a slow connection truly requires it. This way you will divide the processor load by several times and be able to serve more simultaneous streams on a modest VPS.