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-stoppedStart Jellyfin and Complete the Setup Wizard
- Run `docker compose up -d` from the directory containing the file.
- Open `http://your-server-ip:8096` in a browser once the container is up.
- Create the admin account — choose a strong username and password, since this account has full server control.
- 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.
| Vendor | Method | What you pass through |
|---|---|---|
| Intel | VAAPI / Quick Sync | /dev/dri render node (e.g. renderD128) + host’s render group GID |
| AMD | VAAPI | /dev/dri render node + host’s render group GID |
| NVIDIA | NVENC | NVIDIA 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.