Docker Compose Media Server: Jellyfin, Sonarr, Radarr Stack
Build the ultimate self-hosted media server with Docker Compose. Deploy Jellyfin, Sonarr, Radarr, Prowlarr, and qBittorrent for automated media management.
Posted by
Related reading
Private Cloud vs Public Cloud: When to Self-Host and When Not To
Understand when self-hosting makes sense and when public cloud is better. A practical guide to choosing between private cloud homelab and AWS/GCP/Azure services.
Homelab Documentation: Wiki.js vs BookStack for Self-Hosted Wikis
Document your homelab setup with self-hosted wikis. Compare Wiki.js and BookStack for creating searchable documentation of your infrastructure and procedures.
Docker Security Scanning: Trivy and Dockle for Safe Containers
Scan your Docker images for vulnerabilities before deploying. Learn to use Trivy and Dockle to secure your self-hosted homelab container infrastructure.

The Ultimate Media Stack
Cancel Netflix, Disney+, and all those streaming subscriptions. With this self-hosted media stack, you'll have a better experience with your own content library - all running on Docker Compose.
Stack Components
- Jellyfin: Media server (streams to all devices)
- Sonarr: TV show management
- Radarr: Movie management
- Prowlarr: Indexer management
- qBittorrent: Download client
Docker Compose Configuration
version: "3.8"
services:
jellyfin:
image: jellyfin/jellyfin:latest
container_name: jellyfin
environment:
- PUID=1000
- PGID=1000
volumes:
- ./jellyfin/config:/config
- ./media/movies:/data/movies
- ./media/tv:/data/tv
ports:
- "8096:8096"
restart: unless-stopped
sonarr:
image: linuxserver/sonarr:latest
container_name: sonarr
environment:
- PUID=1000
- PGID=1000
volumes:
- ./sonarr:/config
- ./media/tv:/tv
- ./downloads:/downloads
ports:
- "8989:8989"
restart: unless-stopped
radarr:
image: linuxserver/radarr:latest
container_name: radarr
environment:
- PUID=1000
- PGID=1000
volumes:
- ./radarr:/config
- ./media/movies:/movies
- ./downloads:/downloads
ports:
- "7878:7878"
restart: unless-stopped
prowlarr:
image: linuxserver/prowlarr:latest
container_name: prowlarr
environment:
- PUID=1000
- PGID=1000
volumes:
- ./prowlarr:/config
ports:
- "9696:9696"
restart: unless-stopped
qbittorrent:
image: linuxserver/qbittorrent:latest
container_name: qbittorrent
environment:
- PUID=1000
- PGID=1000
- WEBUI_PORT=8080
volumes:
- ./qbittorrent:/config
- ./downloads:/downloads
ports:
- "8080:8080"
- "6881:6881"
restart: unless-stoppedSetup Steps
- 1. Deploy the stack with docker compose up -d
- 2. Configure Prowlarr with your indexers
- 3. Connect Sonarr/Radarr to Prowlarr
- 4. Add qBittorrent as download client
- 5. Add media libraries to Jellyfin
Hardware Transcoding
For smooth 4K playback, enable hardware transcoding in Jellyfin. Intel Quick Sync is recommended for most homelabs.
# Add to jellyfin service for Intel GPU devices: - /dev/dri:/dev/dri
