Blog / Tutorials / How to Install Jellyfin: Docker Compose Setup Guide

How to Install Jellyfin: Docker Compose Setup Guide

Jellyfin is a free, open-source media server — a no-paywall alternative to Plex — that streams your own movies, TV, and music library to nearly any device. This guide covers installing it with Docker Compose, completing first-run setup, and turning on hardware transcoding. What Is…

5 min read

Jellyfin is a free, open-source media server — a no-paywall alternative to Plex — that streams your own movies, TV, and music library to nearly any device. This guide covers installing it with Docker Compose, completing first-run setup, and turning on hardware transcoding.

What Is Jellyfin?

Jellyfin is free and open source with no telemetry and no subscription tiers — every feature, including hardware transcoding, works without a paywall, which is the single biggest practical difference from Plex. Client apps cover the web, iOS, Android, Roku, Fire TV, Kodi, and most smart TVs, so the server side is usually the only part that needs deliberate setup.

System Requirements

  • Modest CPU and RAM for the application itself — Jellyfin isn’t resource-hungry at rest.
  • Storage sized for where your library is headed, not where it starts — keep the app’s config/cache separate from the media library itself.
  • Whether your host can expose a GPU for hardware transcoding is the detail that actually determines how smooth playback feels — covered in its own section below.

Step-by-Step: Installing Jellyfin with Docker Compose

Create the Compose File

services:
  jellyfin:
    image: jellyfin/jellyfin
    container_name: jellyfin
    volumes:
      - ./config:/config
      - ./cache:/cache
      - /path/to/media:/media
    ports:
      - "8096:8096"
    restart: unless-stopped

Start Jellyfin and Complete the Setup Wizard

  1. Run `docker compose up -d` from the directory containing the file.
  2. Open `http://your-server-ip:8096` in a browser once the container is up.
  3. Create the admin account — choose a strong username and password, since this account has full server control.
  4. Add your media library folders and let Jellyfin match metadata from TMDB/TVDB automatically based on filenames.

Enabling Hardware Transcoding

Transcoding — converting video on the fly to match a device’s supported format or bandwidth — is expensive on CPU alone, especially for 4K content; a modest server can max out its CPU on a single stream. Jellyfin’s real advantage over Plex is that GPU-accelerated transcoding is free on any hardware that supports it, not locked behind a subscription.

Hardware Transcoding Setup by GPU Vendor Requires a host that can expose a GPU/iGPU to the container — see the bare-metal note below.
VendorMethodWhat you pass through
IntelVAAPI / Quick Sync/dev/dri render node (e.g. renderD128) + host’s render group GID
AMDVAAPI/dev/dri render node + host’s render group GID
NVIDIANVENCNVIDIA Container Toolkit + –gpus all (or the Compose deploy block)

One thing worth being clear-eyed about: this only works if the host can actually expose a GPU or integrated GPU to the container in the first place. A standard virtualized Cloud VPS generally can’t pass through a GPU to the guest — genuine bare-metal hardware can. A Dedicated Server built on a CPU with integrated graphics (several current AMD Ryzen desktop chips include one) gives Linux direct access to that hardware for VAAPI, which a virtualized instance simply doesn’t have available to offer.

Planning Storage for a Growing Library

Keep the config/cache volume and the media library on separate volumes — they have very different growth patterns and backup needs. Size storage for where the library is headed rather than where it starts; media libraries only grow, and running out of space mid-library is more disruptive to fix than over-provisioning a bit up front.

Accessing Jellyfin Remotely

Reaching your library away from home is one of the main reasons to self-host it on a server rather than a home NAS, but exposing port 8096 directly to the internet with no protection in front of it isn’t the way to do that safely. A VPN or a zero-trust tunnel is the safer path — Contabo’s guide to Pangolin covers setting one up in detail.

Why Self-Host Jellyfin on Contabo

Core VPS or Performance VPS comfortably runs Jellyfin itself for most libraries — storage and network throughput matter more here than raw CPU. If hardware transcoding on real hardware is the priority, a Dedicated Server gives Linux direct access to the CPU’s integrated graphics, which a virtualized VPS can’t offer. Once Jellyfin is running, Contabo’s Tracearr guides cover monitoring it, and the homelab planning guide covers how it fits alongside everything else you might self-host.

FAQ: Installing Jellyfin

Does Jellyfin support hardware transcoding?

Yes, for Intel and AMD via VAAPI/Quick Sync and for NVIDIA via NVENC, and it’s free on every tier — unlike Plex, which gates hardware transcoding behind a paid plan.

Is Jellyfin free?

Yes, entirely — open source, no subscription tiers, no feature paywalls. You only pay for the server it runs on.

Can I access Jellyfin outside my home network?

Yes — the recommended way is a VPN or a zero-trust tunnel rather than opening the port directly to the internet. Self-hosting Jellyfin on a VPS with a public IP avoids the home-router port-forwarding step entirely.

How do I see who’s watching what on my Jellyfin server?

Jellyfin doesn’t include this natively — Contabo’s guide to self-hosting Tracearr covers setting up a monitoring dashboard for Jellyfin (and Plex or Emby, if you run more than one) with real-time streams and watch-history analytics.

Disclaimer: Product specifications, features, and prices mentioned in this article are subject to change and may vary by region, billing term, and active promotions. Please check each provider’s or brand’s official website for current figures, pricing, and local currency rates.