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
AMD VAAPI Transcoding (MS-S1 MAX)¶
The Strix Halo iGPU exposes hardware video encode/decode through VAAPI. The Compose snippet above (/dev/dri passthrough + video/render groups) is the right setup — turn on VAAPI in the Jellyfin dashboard (see Transcoding Configuration).
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:
- VAAPI for the MS-S1 MAX (AMD Strix Halo iGPU)
- Enable hardware decoding for supported codecs
Codec Support (VAAPI on Strix Halo)¶
| Codec | Decode | Encode |
|---|---|---|
| H.264 | Yes | Yes |
| HEVC | Yes | Yes |
| AV1 | Yes | Yes |
| VP9 | Yes | No |
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 the GPU device is accessible
docker exec jellyfin ls -la /dev/dri
# Check VAAPI (the path used on the MS-S1 MAX)
docker exec jellyfin vainfo