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 with id); 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:

  1. Create the admin user (do this right away).
  2. Add libraries: Movies → /media/movies, Shows → /media/shows, Music → /media/music.
  3. 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.

  • Jellyfin
  • Media Server
  • Self-Hosting