Enterprise hosting · Built for gamers
Jellyfin – Installation and Setup
Jellyfin is a free, open-source media server that lets you stream your own movies, series and music – without any subscription fees. You retain full control over your data, as everything runs locally on your NexoraHost VPS or root server. This guide walks you through the complete installation and basic setup.
Note: Detailed subpages on hardware transcoding, reverse proxy and advanced settings can be found in the left navigation.
Why self-host Jellyfin?
- No monthly costs or hidden subscriptions
- Full control over your media library, no third-party tracking
- Apps available for smart TVs, smartphones (Android/iOS), PC, Xbox and more
- Automatic organization and metadata retrieval for your media
- Hardware transcoding for smooth playback on all devices
- Live TV support with tuner or IPTV
Requirements
- A VPS or root server with Ubuntu 22.04/24.04 (other Linux distributions work similarly)
- SSH access with root privileges
- Sufficient storage space for your media – HD movies require about 2-4 GB per hour
- Your own domain with SSL (recommended for secure access from outside)
Step 1: Install Docker
Docker is the cleanest method, as all dependencies are isolated in the container:
# Install Docker (Ubuntu/Debian)
sudo apt update
sudo apt install docker.io docker-compose -y
# Enable Docker on system startup
sudo systemctl enable --now docker
# Add current user to the Docker group (saves sudo on every command)
sudo usermod -aG docker $USER
After adding to the group, log out and log back in.
Step 2: Prepare folder structure
A clean folder structure makes backups and updates easier:
# Main directory for Jellyfin
mkdir -p ~/jellyfin/{config,cache,media}
# Subfolders for different media types (optional, but recommended)
mkdir -p ~/jellyfin/media/{Movies,Series,Music,Photos}
The subfolders help Jellyfin automatically recognize and organize your media.
Step 3: Start Jellyfin with Docker-Compose
Docker-Compose makes the configuration clearer than a long Docker command. Create the file:
nano ~/jellyfin/docker-compose.yml
Add the following content:
version: '3.8'
services:
jellyfin:
image: jellyfin/jellyfin:latest
container_name: jellyfin
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Berlin
ports:
- 8096:8096 # HTTP (Web interface)
- 8920:8920 # HTTPS (optional, when SSL is configured)
volumes:
- ./config:/config
- ./cache:/cache
- ./media:/media:ro # :ro = read-only, protects against accidental deletion
restart: unless-stopped
Start the container:
cd ~/jellyfin
docker-compose up -d
Step 4: Set up Jellyfin in the browser
- Open
http://your-server-ip:8096in your browser - The setup wizard starts automatically
- Choose language: English or your preferred language
- Create user: Set a username and a secure password. This account will be your admin account
Step 5: Add media libraries
- Click Libraries → Add Media Library
- Select the content type:
- Movies: For feature films – expects a folder with movie files
- Series: For TV shows – expects a folder structure like
SeriesName/Season 01/Episode01.mkv - Music: For music files – automatically recognizes albums and artists
- Photos: For photo collections
- Enter a display name (e.g. "My Movies")
- Select the folder – here
/media/Movies(the path in the container, not on the host) - Repeat the process for additional libraries (Series, Music, etc.)
Step 6: Configure metadata
Jellyfin automatically downloads covers, descriptions and ratings from the internet. Configure the sources:
- Go to Dashboard → Libraries → [Your Library] → Manage
- Under "Metadata Downloaders" you can prioritize the sources:
- TheMovieDb: For movies and series (default, very good)
- TheAudioDb: For music
- OMDb: For additional ratings
- Click Save and then Scan Library
Step 7: Hardware transcoding (optional, but recommended)
Transcoding converts videos in real time to a format that your end device can play. Without a GPU, the CPU has to do the work – with GPU support it runs more smoothly:
# Add Intel QuickSync support to Docker-Compose
# In docker-compose.yml under "volumes:" add:
devices:
- /dev/dri:/dev/dri
In Jellyfin under Dashboard → Playback → Transcoding, select the appropriate hardware (e.g. Intel QuickSync or VA-API).
Step 8: Secure external access with SSL
So you can securely access Jellyfin from outside, a reverse proxy with Nginx and Let's Encrypt is recommended:
# Install Nginx
sudo apt install nginx certbot python3-certbot-nginx -y
# Create Nginx configuration
sudo nano /etc/nginx/sites-available/jellyfin
server {
listen 80;
server_name jellyfin.your-domain.com;
location / {
proxy_pass http://localhost: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;
}
}
# Enable the site
sudo ln -s /etc/nginx/sites-available/jellyfin /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
# Get SSL certificate
sudo certbot --nginx -d jellyfin.your-domain.com
Step 9: Apps and clients
Jellyfin offers official apps for almost all platforms:
- Android / iOS: Free in the respective app store
- Smart TV: Available for LG webOS, Samsung Tizen and Android TV
- Desktop: Jellyfin Media Player for Windows, macOS and Linux
- Xbox / PlayStation: Via the integrated browser or via DLNA
Simply enter your server URL in the app (e.g. https://jellyfin.your-domain.com) and log in.
Step 10: Updates and maintenance
# Pull latest version and restart container
cd ~/jellyfin
docker-compose pull
docker-compose up -d
# Clean up old Docker images
docker image prune -f
Common problems
Media not recognized:
- Check the folder structure: Movies directly in the Movies folder, series with subfolders per season
- File names should be descriptive (e.g.
The Godfather (1972).mkv) - Manual scanning: Dashboard → Libraries → [Library] → Scan Now
Playback stutters:
- Check if transcoding is active – the server is converting the video in real time
- If CPU load is too high: Set up hardware transcoding (Step 7)
- Alternative: In the Jellyfin app, set playback quality to "Original" to avoid transcoding
No access from outside:
- Check if port 8096 (or 443 for Nginx) is open in the firewall
- Check the reverse proxy: Is Nginx running? Does
sudo nginx -tshow errors?
Detailed guides on plugins, live TV and advanced settings can be found in the articles in the left navigation.
NexoraHost
Need hosting?
Game servers, VPS & webspace at Maincubes FRA01 – 1 Tbit/s DDoS, 99.9% uptime SLA.
nexorahost.com · Maincubes FRA01 · 1 Tbit/s DDoS · 99,9 % Uptime