Jellyfin: Your Own Free Media Server — Watch Your Collection Anywhere
Subscriptions pile up, your own collection scatters
Streaming bills add up quietly: one service for films, another for shows, another for music, and catalogs can change whenever the provider feels like it. Meanwhile your own collection — family films, shows you already bought, music albums — sits scattered across hard drives and folders that are no fun to browse.
Jellyfin was built for that. It is a free, open-source media server: it reads your media folders, pulls metadata (title, poster, synopsis, cast), and presents everything through an interface that feels like a streaming service, with TV, Android, and iOS apps. It all runs on your own server. Nobody logs what you watch for ads, and there is no monthly bill.
There is one concrete reason Jellyfin has been getting more attention lately: since 29 April 2025, Plex requires a Plex Pass or Remote Watch Pass to play your own media remotely (outside your home network). Local streaming on the same network is still free, but if you often watch away from home, that feature now costs money. Jellyfin has no such restriction — remote streaming is part of its free software.
But to be honest up front: you become the admin. If the server goes down, so does your viewing. And Jellyfin only plays the collection you actually own — it is not a replacement for a streaming catalog.
What you need
- A VPS with a practical baseline of 2 CPUs and 4 GB of RAM (not a vendor figure — adjust to your real load). For 1–3 simultaneous viewers with direct play (no transcoding), this is enough. Heavy transcoding — say 4K down to a phone — needs a stronger CPU or hardware acceleration.
- Docker and Docker Compose.
- Enough disk for your media collection. Start from its current size, then leave room to grow.
- Optional but strongly recommended: a domain or subdomain, for example
media.yourdomain.com, so outside access goes over HTTPS.
Commands here use Ubuntu 24.04; on another distro, adapt the package manager — the Jellyfin steps stay the same.
Install Docker
If Docker is not installed yet, install it from Ubuntu's repositories:
sudo apt update
sudo apt install -y docker.io docker-compose-v2
sudo systemctl enable --now docker
sudo usermod -aG docker $USERThe last command adds your user to the docker group so you skip sudo for Docker. Log out and back in, then check:
docker --version
docker compose versionInstall Jellyfin with Docker Compose
We use the official image jellyfin/jellyfin. Jellyfin's web port is 8096. As in earlier Rnevio articles, this port is bound to 127.0.0.1 only — Jellyfin stays off the open internet, reached through the reverse proxy below.
First, prepare the media and configuration folders:
sudo mkdir -p /opt/jellyfin /media/library/movies /media/library/shows /media/library/music
sudo chown "$USER:$USER" /opt/jellyfin
cd /opt/jellyfinThen create docker-compose.yml:
services:
jellyfin:
image: jellyfin/jellyfin:latest
container_name: jellyfin
restart: unless-stopped
ports:
- "127.0.0.1:8096:8096"
volumes:
- jellyfin-config:/config
- jellyfin-cache:/cache
- /media/library:/media:ro
environment:
- JELLYFIN_PublishedServerUrl=https://media.yourdomain.com
volumes:
jellyfin-config:
jellyfin-cache:In short, what that file does:
/configholds the database, user accounts, and metadata — it must persist, so it uses a named volume./cacheholds transcoding cache and temporary images./mediais mounted read-only (:ro) so Jellyfin cannot accidentally change or delete your collection files.JELLYFIN_PublishedServerUrlholds your public address later; replace it with your own domain.
Run it and verify:
docker compose up -d
docker compose ps
curl -s http://127.0.0.1:8096/healthOpen the setup wizard temporarily through an SSH tunnel (ssh -L 8096:127.0.0.1:8096 user@VPS-IP, then open http://127.0.0.1:8096 on your laptop), or directly through the reverse proxy once the HTTPS section is done. On first visit, Jellyfin asks you to create an admin account and pick a metadata language. That account owns the server — use a strong password and keep it in a password manager.
Adding libraries: folder tidiness decides the result
Jellyfin leans heavily on folder structure. The practical rules:
- Films: one folder per film, for example
/media/library/movies/Film Name (2023)/Film Name (2023).mkv. - Shows: show folder, then season folders, for example
/media/library/shows/Show Name/Season 01/Show Name S01E01.mkv. - Music: artist folder, then album folder.
Once folders are ready, add a library from Dashboard → Libraries → Add Media Library, pick the content type, and point it at the matching folder under /media. Jellyfin scans and pulls posters and synopses automatically. If a title is misidentified, fix it with the Identify feature on that item — the cause is usually a filename that does not follow the pattern above.
For family use, create a separate user account per person from Dashboard → Users. You can limit which libraries each account can see — a child's account, for example, only sees the family film folder.
Transcoding: when you need it, when you don't
Jellyfin plays video two ways. Direct play: the file is sent as-is because your device supports its format — light, and barely touches the CPU. Transcoding: the server converts video in real time because the device does not support the format or you asked for lower quality — heavy.
Three habits that save a lot of trouble:
- If most viewers use a modern TV or laptop and your files are in a common format (H.264), direct play handles nearly everything.
- If you often watch from a phone on a mobile connection, set a bitrate limit in the client app so Jellyfin transcodes to a lighter quality — don't let it push a raw 4K file over a mobile connection.
- Hardware acceleration (for example Intel Quick Sync via
/dev/dri) can be added later if your CPU struggles. For a first install, skip it; measure the load from real usage, not from assumptions.
Secure outside access with HTTPS
This part is not optional: never open port 8096 directly to the internet. The right path: put a reverse proxy (Nginx or Caddy) in front of Jellyfin, point a subdomain at the VPS, and enable HTTPS with Let's Encrypt. Since the port is bound to 127.0.0.1, a reverse proxy on the same server can still forward traffic to it; the internet cannot reach it directly.
Cloudflare Tunnel is an equally safe alternative that needs no open firewall ports. Either way, your Jellyfin account must never travel over plain HTTP — credentials can be intercepted in transit.
One more warning: Jellyfin lacks strong built-in two-factor authentication for all clients, so never share the admin account — give each viewer their own. Jellyfin does not open public registration — only the admin can add users from the dashboard.
Jellyfin vs Plex vs streaming services
| Aspect | Jellyfin | Plex | Streaming service |
|---|---|---|---|
| Software cost | Free, open source | Free locally; remote streaming needs Plex Pass/Remote Watch Pass since April 2025 | Monthly subscription per service |
| Collection played | Your own | Your own | Provider catalog, can change |
| Viewing privacy | Data on your server | Centralized Plex account | Tracked by provider |
| TV/phone clients | Available (official and third-party apps) | Available, mature | Available |
| Who runs the server | You | You | Provider |
Jellyfin wins on cost and privacy, Plex wins on client maturity, streaming services win on catalog — but lose on control. Choose by what you actually need, not by what is most popular.
Backup: what must survive
Your media files are your own responsibility — Jellyfin does not back them up. From Jellyfin's side, what must be backed up:
- The
jellyfin-configvolume — database, accounts, and metadata. Losing this means setting up libraries from scratch. - Your media folder structure — simply make sure the
/media/libraryfolder itself is backed up elsewhere.
Copy the config volume periodically while the container is stopped, or use a plugin's scheduled backup feature. Test a restore occasionally in a separate folder; a backup never tested for restore is still just an assumption.
Checklist before you finish
- Docker and Docker Compose installed,
docker compose versionworks. - Jellyfin up via Compose,
docker compose psshows the container running, and/healthresponds. - Admin account created, separate accounts for each viewer.
- Film, show, or music libraries scanned with correct posters and metadata.
- Outside access only over HTTPS (reverse proxy or Tunnel); port 8096 not open directly to the internet.
- Config volume included in the backup schedule.
If every item is checked, you have your own version of a streaming service: the collection is yours, the bill stops at server rent, and no remote feature suddenly locks behind a paywall.
Which collection — films, shows, or music — would you tidy up first?
Read also: Immich: Your Own Google Photos on a VPS, One VPS, Many Services with an Nginx Reverse Proxy, Cloudflare Tunnel: Expose Services Without Opening Ports.


Komentar
Posting Komentar