Jellyfin is a free, open-source media server: it organises your movies, TV shows, music and photos, fetches artwork and metadata, and streams to apps on TVs, phones and browsers. No account with a third party, no subscription, no tracking.
Running it on a VPS gives you a media server that’s reachable everywhere with a stable connection. Before you start, it’s worth understanding where a VPS shines and where it doesn’t.
VPS considerations: transcoding, storage, bandwidth
Transcoding. When a client can’t play a file’s format or bitrate, Jellyfin converts it on the fly. Video transcoding is CPU-heavy, and typical VPS servers have no GPU. A 1080p H.264 transcode takes roughly one to two modern vCPU cores; 4K HEVC transcoding in software is often too slow. The fix is direct play: store media in widely supported formats (H.264/AAC in MP4/MKV) and use clients that play them natively. Then Jellyfin just sends the file and CPU use is minimal.
Storage. Media libraries are large. Plan the disk first — a Storage VPS offers far more space per dollar than a general-purpose plan.
Bandwidth. A 1080p stream is typically 5–10 Mbps. Several simultaneous viewers need a fast port and enough monthly transfer. Check your plan’s allowance against expected use.
1. Install with Docker Compose
With Docker installed:
mkdir -p ~/jellyfin/{config,cache} /srv/media/{movies,shows,music}
cd ~/jellyfin
compose.yaml:
services:
jellyfin:
image: jellyfin/jellyfin:latest
container_name: jellyfin
user: "1000:1000"
restart: unless-stopped
volumes:
- ./config:/config
- ./cache:/cache
- /srv/media:/media:ro
ports:
- "127.0.0.1:8096:8096"
environment:
- JELLYFIN_PublishedServerUrl=https://media.example.com
user: "1000:1000"runs Jellyfin as your regular user (check withid); make sure that user can read/srv/media.- Media is mounted read-only (
:ro) — Jellyfin never needs to modify your files.
docker compose up -d
Native packages are also available (curl https://repo.jellyfin.org/install-debuntu.sh | sudo bash), if you prefer not to use Docker.
2. HTTPS reverse proxy
/etc/nginx/sites-available/jellyfin:
server {
listen 80;
server_name media.example.com;
client_max_body_size 20M;
location / {
proxy_pass http://127.0.0.1:8096;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_buffering off;
}
location /socket {
proxy_pass http://127.0.0.1:8096;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
sudo ln -s /etc/nginx/sites-available/jellyfin /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d media.example.com
Then, in Jellyfin’s Dashboard → Networking, add 127.0.0.1 as a known proxy so it sees real client IPs.
3. First-run wizard
Open https://media.example.com:
- Create the admin user (do this right away).
- Add libraries: Movies →
/media/movies, Shows →/media/shows, Music →/media/music. - Choose metadata language and country.
4. Name your files properly
Jellyfin matches metadata by file names:
/media/movies/Big Buck Bunny (2008)/Big Buck Bunny (2008).mkv
/media/shows/Example Show (2019)/Season 01/Example Show S01E01.mkv
A year in the folder name avoids most mismatches.
5. Uploading media to the VPS
- rsync from your computer:
rsync -avP ~/Videos/ user@server:/srv/media/movies/— resumable, ideal for large files. - An SFTP client like FileZilla or WinSCP.
- A sync tool such as Syncthing.
Only store media you have the rights to use.
6. Limit transcoding on a small server
Dashboard → Playback:
- Set a sensible thread count for FFmpeg, leaving cores for the system.
- In each user’s settings, cap internet streaming bitrate — forcing lower bitrates triggers transcoding, so set it high enough for direct play where possible.
- Under Users → Playback, you can disallow transcoding for users whose devices direct-play everything.
Watch the Dashboard during playback: “Direct Play” is free; “Transcoding” shows which setting forced it.
7. Clients
Official and community apps cover Android, Android TV, iOS, Fire TV, Roku, Kodi, desktop and web. Log in with https://media.example.com.
Backups and updates
Back up ~/jellyfin/config (users, watch history, settings). The cache can be rebuilt. Update with docker compose pull && docker compose up -d.
Jellyfin vs Plex vs Emby
Jellyfin is completely free and open source. Plex has a more polished ecosystem and cloud features but requires an account, and some features need a paid pass. See Jellyfin vs Plex for a full comparison.
For a Jellyfin server, disk space is what matters most: our Storage VPS plans pair large SSD storage with enough CPU for direct play to several viewers.