Jellyfin¶
Jellyfin is a free, open-source media server for streaming your personal media library.
Docker Compose Setup¶
Basic Setup¶
services:
jellyfin:
image: jellyfin/jellyfin:latest
container_name: jellyfin
restart: unless-stopped
user: 1000:1000
environment:
- TZ=Europe/Oslo
volumes:
- ./config:/config
- ./cache:/cache
- /data/media:/media:ro
ports:
- "8096:8096"
networks:
- proxy
networks:
proxy:
external: true
With Hardware Transcoding¶
services:
jellyfin:
image: jellyfin/jellyfin:latest
container_name: jellyfin
restart: unless-stopped
user: 1000:1000
environment:
- TZ=Europe/Oslo
volumes:
- ./config:/config
- ./cache:/cache
- /data/media:/media:ro
ports:
- "8096:8096"
# Intel Quick Sync
devices:
- /dev/dri:/dev/dri
group_add:
- "video"
- "render"
networks:
- proxy
NVIDIA GPU Transcoding¶
services:
jellyfin:
image: jellyfin/jellyfin:latest
container_name: jellyfin
restart: unless-stopped
environment:
- TZ=Europe/Oslo
- NVIDIA_VISIBLE_DEVICES=all
runtime: nvidia
volumes:
- ./config:/config
- ./cache:/cache
- /data/media:/media:ro
ports:
- "8096:8096"
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu, video]
Initial Setup¶
- Access Jellyfin at
http://localhost:8096 - Create admin account
- Add media libraries:
- Movies:
/media/movies - TV Shows:
/media/tv - Music:
/media/music
Library Organization¶
Recommended Structure¶
/media/
├── movies/
│ ├── Movie Name (2020)/
│ │ ├── Movie Name (2020).mkv
│ │ └── Movie Name (2020).srt
│ └── Another Movie (2021)/
│ └── Another Movie (2021).mp4
├── tv/
│ └── Show Name/
│ ├── Season 01/
│ │ ├── Show Name - S01E01 - Episode Title.mkv
│ │ └── Show Name - S01E02 - Episode Title.mkv
│ └── Season 02/
│ └── ...
└── music/
└── Artist/
└── Album/
├── 01 - Track.flac
└── 02 - Track.flac
Transcoding Configuration¶
Enable Hardware Transcoding¶
- Go to Dashboard > Playback > Transcoding
- Select hardware acceleration:
- Intel QSV for Intel CPUs
- NVENC for NVIDIA GPUs
- VAAPI for AMD/Intel
- Enable hardware decoding for supported codecs
Codec Support¶
| Codec | Intel QSV | NVENC | VAAPI |
|---|---|---|---|
| H.264 | Yes | Yes | Yes |
| HEVC | Gen 6+ | GTX 10+ | Yes |
| AV1 | Gen 12+ | RTX 40+ | Limited |
| VP9 | Gen 9+ | GTX 10+ | Yes |
User Management¶
Create Users¶
- Go to Dashboard > Users > Add User
- Configure permissions:
- Library access
- Download permission
- Remote access
Parental Controls¶
- Edit user > Access
- Set content restrictions:
- Maximum parental rating
- Block unrated content
Plugins¶
Recommended Plugins¶
- Open Subtitles - Auto-download subtitles
- Trakt - Sync watch history
- Fanart - Enhanced artwork
- TMDb - Better metadata
Install Plugins¶
- Go to Dashboard > Plugins > Catalog
- Find and install plugins
- Restart Jellyfin if required
Open Subtitles Setup¶
- Install plugin
- Go to Dashboard > Plugins > Open Subtitles
- Enter your OpenSubtitles credentials
- Configure languages
Remote Access¶
Direct Access¶
Forward port 8096 on your router.
With Reverse Proxy (Recommended)¶
# Traefik labels
labels:
- "traefik.enable=true"
- "traefik.http.routers.jellyfin.rule=Host(`media.example.com`)"
- "traefik.http.routers.jellyfin.entrypoints=https"
- "traefik.http.routers.jellyfin.tls.certresolver=letsencrypt"
- "traefik.http.services.jellyfin.loadbalancer.server.port=8096"
Configure in Jellyfin: 1. Dashboard > Networking 2. Set "Base URL" if using path routing 3. Enable "Allow remote connections"
Clients¶
Official Apps¶
- Web browser
- Android / Android TV
- iOS / tvOS
- Roku
Third-Party Apps¶
- Infuse (iOS/tvOS) - Premium player
- Swiftfin (iOS) - Native Swift client
- Findroid (Android) - Material Design
- Jellyfin Media Player (Desktop)
Performance Tuning¶
Cache Settings¶
Memory Limits¶
SSD for Metadata¶
Store config on SSD for faster library scans:
Backup¶
What to Backup¶
/config- All settings, users, metadata- Database:
/config/data/jellyfin.db
Backup Script¶
#!/bin/bash
BACKUP_DIR="/backups/jellyfin"
DATE=$(date +%Y%m%d)
# Stop container
docker stop jellyfin
# Backup config
tar -czvf "$BACKUP_DIR/jellyfin-$DATE.tar.gz" /path/to/config
# Start container
docker start jellyfin
# Keep last 7 backups
find "$BACKUP_DIR" -name "jellyfin-*.tar.gz" -mtime +7 -delete
Troubleshooting¶
Check Logs¶
Common Issues¶
- No hardware transcoding
- Check device permissions
- Verify drivers installed on host
-
Check container has access to
/dev/dri -
Library not scanning
- Check file permissions
- Verify mount paths
-
Check naming convention
-
Playback issues
- Try direct play instead of transcoding
- Check client bandwidth settings
- Verify codec support
Verify Hardware Access¶
# Check if GPU is accessible
docker exec jellyfin ls -la /dev/dri
# Check Intel QSV
docker exec jellyfin vainfo
# Check NVIDIA
docker exec jellyfin nvidia-smi