TutorialsAugust 4, 20265 min read

How to Self-Host Jellyfin (Media Server) on a VPS

A completely free, no-account media server. Install Jellyfin on a VPS with Docker, secure it with HTTPS, and stream your library to any device.

NBy Nxeon

Jellyfin is a free, open-source media server with no subscriptions, no accounts and no paywalled features. This guide runs it on a VPS with Docker so you can stream your own movies, TV and music from anywhere. Note the bandwidth reality up front: transcoding 4K over a VPS uses real CPU and network, so this suits libraries you stream at sensible bitrates.

Is a VPS the right home for Jellyfin?

Jellyfin loves CPU when it transcodes. A VPS is ideal when your files are already on the server (or on attached block storage) and you stream direct-play or 1080p. If you host huge 4K remuxes for many simultaneous viewers, size up the CPU. For a comparison of where each media server fits, see how to self-host Plex on a Linux VPS.

Prerequisites

  • A VPS running Ubuntu with Docker installed — the run Docker on a VPS guide covers it.
  • A domain with an A record for something like media.example.com.
  • Some media uploaded to the server, e.g. under /srv/media.

Deploy Jellyfin with Compose

mkdir -p ~/jellyfin && cd ~/jellyfin
services:
  jellyfin:
    image: jellyfin/jellyfin:latest
    container_name: jellyfin
    restart: unless-stopped
    user: 1000:1000
    ports:
      - "8096:8096"
    volumes:
      - ./config:/config
      - ./cache:/cache
      - /srv/media:/media:ro
    environment:
      - JELLYFIN_PublishedServerUrl=https://media.example.com

Bring it up:

docker compose up -d

Visit http://your-server-ip:8096 and walk through the setup wizard: create an admin user, then add your media libraries pointing at /media.

The Nxeon game-server control panel — live console, player slots, and TPS
The Nxeon game-server control panel — live console, player slots, and TPS

Put it behind HTTPS

Exposing 8096 in the clear is fine for a quick test but not for daily use. Front it with Caddy for automatic TLS:

media.example.com {
    reverse_proxy 127.0.0.1:8096
}

Then lock the firewall so only 80/443 and SSH are open:

sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

If you prefer Caddy's zero-config approach in general, set up Caddy for automatic HTTPS has the full pattern.

Hardware transcoding (optional)

Most VPS plans don't expose a GPU, so Jellyfin transcodes on the CPU. Keep loads sane by:

  • Encouraging direct play: match your client's supported formats so no transcode happens.
  • Capping remote bitrate: in each user's settings, set a streaming bitrate limit.
  • Pre-converting large files to H.264/H.265 MP4 so most clients play them directly.

Keep it updated

cd ~/jellyfin
docker compose pull
docker compose up -d

That pulls the latest image and recreates the container while keeping your config volume intact.

Organise your library so metadata just works

Jellyfin identifies films and shows by matching folder and file names against online metadata providers. Get the structure right and posters, summaries and cast fill in automatically; get it wrong and you'll be correcting entries by hand. Use this layout:

  • Movies: one folder per film, named Title (Year), e.g. /media/movies/Inception (2010)/Inception (2010).mkv.
  • TV: Show Name/Season 01/Show Name S01E02.mkv.

After a big import, trigger a library scan from the dashboard and check the *Metadata* tab for anything marked unidentified — you can search and correct those individually in a few clicks.

Users, parental controls and clients

Create a separate user for each person under *Administration → Users*. Per-user settings let you:

  • Set a remote-streaming bitrate cap so one person's stream can't overload the server.
  • Apply parental controls and content ratings for kids' accounts.
  • Grant or restrict access to specific libraries.

On the client side, Jellyfin has native apps for phones, tablets, Android TV, Kodi and more, plus a clean web player. For the smoothest playback on a VPS, match your files to formats your main devices play natively so streams direct-play instead of transcoding — that single factor matters more than any server setting.

Getting media onto the server

Your library has to live on the VPS (or attached storage) for Jellyfin to serve it. The tidy way to move files up is rsync, which resumes and only copies what changed:

rsync -avP ~/Movies/ user@your-server-ip:/srv/media/movies/

For an ongoing collection, keep media on a dedicated block storage volume mounted at /srv/media so you can grow capacity without rebuilding the container. If you manage your library with an automation stack, run those containers alongside Jellyfin and point them at the same media directory so new files appear automatically. Jellyfin can also fetch subtitles if you add a subtitle plugin and set your preferred languages in the library settings.

Whatever you do, only host content you have the right to — Jellyfin is a tool for streaming media you legally own. After adding files, trigger a scan and Jellyfin fetches artwork and metadata for the new titles.

FAQ

Is Jellyfin really free?

Yes — it's fully open source with no premium tier. Every feature, including mobile sync and hardware transcoding, is free. That's the main reason people move to it from Plex.

How much bandwidth does streaming use?

Roughly 4–8 Mbps per 1080p stream and 15–25 Mbps for 4K. Multiply by concurrent viewers and make sure your VPS bandwidth allowance covers it.

Can Jellyfin transcode without a GPU?

Yes, on the CPU, but it's expensive. On a VPS, favour direct play and sensible bitrates over relying on transcoding.

Jellyfin vs Plex — which should I self-host?

Jellyfin if you want zero cost and no account. Plex if you value a more polished app ecosystem and don't mind the Plex Pass. Read the trade-offs in the Plex on a Linux VPS guide.

Ready to stream your own library? Deploy Jellyfin on a fast NVMe VPS with generous bandwidth, or size a plan on the pricing page.

#jellyfin#media-server#docker#self-hosting#vps#seobatch

Deploy your first server in under a minute

Creating an account is free and takes no card details. You pay when you deploy — choose a billing term and pay from your wallet or by card at checkout.