Complete Media Server Stack
Jellyfin media server with Sonarr, Radarr, Prowlarr, qBittorrent, and Jellyseerr for requests
Overview
Jellyfin is a completely free and open-source media server that puts you in control of your content without any tracking, premium features, or subscriptions. Originally forked from Emby in 2018, Jellyfin has grown into a robust alternative to Plex, offering hardware transcoding, live TV support, and mobile apps while maintaining complete privacy. Unlike commercial solutions, Jellyfin never phones home or collects user data, making it ideal for privacy-conscious users who want to stream their media collection anywhere.
This media automation stack combines Jellyfin's streaming capabilities with a complete *arr suite for automated content management. Sonarr monitors and downloads TV episodes, Radarr handles movie acquisition, Prowlarr manages indexers across both services, qBittorrent serves as the download client, and Jellyseerr provides a Netflix-style request interface for users. The integration creates a hands-off media pipeline where users can request content through Jellyseerr, which triggers Sonarr or Radarr to search via Prowlarr's indexers, download through qBittorrent, and automatically organize files for Jellyfin streaming.
This stack is perfect for cord-cutters building a home media server, families wanting centralized entertainment, or anyone tired of managing multiple streaming subscriptions. The automation eliminates manual downloading and organizing, while Jellyfin's robust streaming ensures smooth playback across phones, tablets, smart TVs, and browsers. With proper setup, family members can request shows like they would add to a Netflix queue, but everything streams from your own hardware with no monthly fees.
Key Features
- Complete privacy with no tracking, telemetry, or premium features - Jellyfin never phones home
- Automated TV and movie acquisition through Sonarr and Radarr with quality profiles and release monitoring
- Centralized indexer management via Prowlarr supporting 500+ torrent trackers and Usenet indexers
- Netflix-style request interface through Jellyseerr with user management and approval workflows
- Hardware-accelerated transcoding for smooth streaming across devices with different capabilities
- Automatic file organization and renaming with metadata fetching for clean library presentation
- Failed download handling and automatic re-searching when releases are corrupted or incomplete
- Multi-user profiles with individual watch history, parental controls, and personalized recommendations
Common Use Cases
- 1Home media server for families wanting to cut cable and stream personal collections
- 2Automated downloading setup for users tired of manually searching and organizing media files
- 3Privacy-focused streaming solution for users who don't trust commercial platforms with viewing data
- 4Centralized media management for households with multiple users requesting different content
- 5Remote streaming server allowing access to home media library while traveling
- 6Backup streaming solution when internet is slow or commercial services are unavailable
- 7Media archival system for preserving digital collections with automated organization
Prerequisites
- Minimum 4GB RAM recommended (Jellyfin needs 2GB+, other services 512MB each)
- At least 100GB free storage space for downloads and processed media
- Ports 5055, 6881, 7878, 8080, 8096, 8989, and 9696 available on your system
- Basic understanding of BitTorrent, indexers, and media file organization
- Access to private trackers or Usenet indexers for quality content sources
- Knowledge of video codecs and transcoding if serving multiple device types
For development & testing. Review security settings, change default credentials, and test thoroughly before production use. See Terms
docker-compose.yml
docker-compose.yml
1services: 2 jellyfin: 3 image: jellyfin/jellyfin:latest4 container_name: jellyfin5 restart: unless-stopped6 ports: 7 - "${JELLYFIN_PORT:-8096}:8096"8 volumes: 9 - ./jellyfin/config:/config10 - ./media/movies:/data/movies11 - ./media/tv:/data/tv12 - ./media/music:/data/music13 environment: 14 - PUID=${PUID:-1000}15 - PGID=${PGID:-1000}16 - TZ=${TZ:-UTC}1718 sonarr: 19 image: lscr.io/linuxserver/sonarr:latest20 container_name: sonarr21 restart: unless-stopped22 ports: 23 - "${SONARR_PORT:-8989}:8989"24 volumes: 25 - ./sonarr/config:/config26 - ./media/tv:/tv27 - ./downloads:/downloads28 environment: 29 - PUID=${PUID:-1000}30 - PGID=${PGID:-1000}31 - TZ=${TZ:-UTC}3233 radarr: 34 image: lscr.io/linuxserver/radarr:latest35 container_name: radarr36 restart: unless-stopped37 ports: 38 - "${RADARR_PORT:-7878}:7878"39 volumes: 40 - ./radarr/config:/config41 - ./media/movies:/movies42 - ./downloads:/downloads43 environment: 44 - PUID=${PUID:-1000}45 - PGID=${PGID:-1000}46 - TZ=${TZ:-UTC}4748 prowlarr: 49 image: lscr.io/linuxserver/prowlarr:latest50 container_name: prowlarr51 restart: unless-stopped52 ports: 53 - "${PROWLARR_PORT:-9696}:9696"54 volumes: 55 - ./prowlarr/config:/config56 environment: 57 - PUID=${PUID:-1000}58 - PGID=${PGID:-1000}59 - TZ=${TZ:-UTC}6061 qbittorrent: 62 image: lscr.io/linuxserver/qbittorrent:latest63 container_name: qbittorrent64 restart: unless-stopped65 ports: 66 - "${QBIT_PORT:-8080}:8080"67 - "6881:6881"68 - "6881:6881/udp"69 volumes: 70 - ./qbittorrent/config:/config71 - ./downloads:/downloads72 environment: 73 - PUID=${PUID:-1000}74 - PGID=${PGID:-1000}75 - TZ=${TZ:-UTC}76 - WEBUI_PORT=80807778 jellyseerr: 79 image: fallenbagel/jellyseerr:latest80 container_name: jellyseerr81 restart: unless-stopped82 ports: 83 - "${JELLYSEERR_PORT:-5055}:5055"84 volumes: 85 - ./jellyseerr/config:/app/config86 environment: 87 - TZ=${TZ:-UTC}88 depends_on: 89 - jellyfin90 - sonarr91 - radarr.env Template
.env
1# Complete Media Server Stack2JELLYFIN_PORT=80963SONARR_PORT=89894RADARR_PORT=78785PROWLARR_PORT=96966QBIT_PORT=80807JELLYSEERR_PORT=505589# User/Group IDs10PUID=100011PGID=100012TZ=America/New_YorkUsage Notes
- 1Jellyfin (media) at http://localhost:8096
- 2Jellyseerr (requests) at http://localhost:5055
- 3Sonarr (TV) at http://localhost:8989
- 4Radarr (Movies) at http://localhost:7878
- 5Prowlarr (indexers) at http://localhost:9696
- 6qBittorrent at http://localhost:8080 (admin/adminadmin)
Individual Services(6 services)
Copy individual services to mix and match with your existing compose files.
jellyfin
jellyfin:
image: jellyfin/jellyfin:latest
container_name: jellyfin
restart: unless-stopped
ports:
- ${JELLYFIN_PORT:-8096}:8096
volumes:
- ./jellyfin/config:/config
- ./media/movies:/data/movies
- ./media/tv:/data/tv
- ./media/music:/data/music
environment:
- PUID=${PUID:-1000}
- PGID=${PGID:-1000}
- TZ=${TZ:-UTC}
sonarr
sonarr:
image: lscr.io/linuxserver/sonarr:latest
container_name: sonarr
restart: unless-stopped
ports:
- ${SONARR_PORT:-8989}:8989
volumes:
- ./sonarr/config:/config
- ./media/tv:/tv
- ./downloads:/downloads
environment:
- PUID=${PUID:-1000}
- PGID=${PGID:-1000}
- TZ=${TZ:-UTC}
radarr
radarr:
image: lscr.io/linuxserver/radarr:latest
container_name: radarr
restart: unless-stopped
ports:
- ${RADARR_PORT:-7878}:7878
volumes:
- ./radarr/config:/config
- ./media/movies:/movies
- ./downloads:/downloads
environment:
- PUID=${PUID:-1000}
- PGID=${PGID:-1000}
- TZ=${TZ:-UTC}
prowlarr
prowlarr:
image: lscr.io/linuxserver/prowlarr:latest
container_name: prowlarr
restart: unless-stopped
ports:
- ${PROWLARR_PORT:-9696}:9696
volumes:
- ./prowlarr/config:/config
environment:
- PUID=${PUID:-1000}
- PGID=${PGID:-1000}
- TZ=${TZ:-UTC}
qbittorrent
qbittorrent:
image: lscr.io/linuxserver/qbittorrent:latest
container_name: qbittorrent
restart: unless-stopped
ports:
- ${QBIT_PORT:-8080}:8080
- "6881:6881"
- 6881:6881/udp
volumes:
- ./qbittorrent/config:/config
- ./downloads:/downloads
environment:
- PUID=${PUID:-1000}
- PGID=${PGID:-1000}
- TZ=${TZ:-UTC}
- WEBUI_PORT=8080
jellyseerr
jellyseerr:
image: fallenbagel/jellyseerr:latest
container_name: jellyseerr
restart: unless-stopped
ports:
- ${JELLYSEERR_PORT:-5055}:5055
volumes:
- ./jellyseerr/config:/app/config
environment:
- TZ=${TZ:-UTC}
depends_on:
- jellyfin
- sonarr
- radarr
Quick Start
terminal
1# 1. Create the compose file2cat > docker-compose.yml << 'EOF'3services:4 jellyfin:5 image: jellyfin/jellyfin:latest6 container_name: jellyfin7 restart: unless-stopped8 ports:9 - "${JELLYFIN_PORT:-8096}:8096"10 volumes:11 - ./jellyfin/config:/config12 - ./media/movies:/data/movies13 - ./media/tv:/data/tv14 - ./media/music:/data/music15 environment:16 - PUID=${PUID:-1000}17 - PGID=${PGID:-1000}18 - TZ=${TZ:-UTC}1920 sonarr:21 image: lscr.io/linuxserver/sonarr:latest22 container_name: sonarr23 restart: unless-stopped24 ports:25 - "${SONARR_PORT:-8989}:8989"26 volumes:27 - ./sonarr/config:/config28 - ./media/tv:/tv29 - ./downloads:/downloads30 environment:31 - PUID=${PUID:-1000}32 - PGID=${PGID:-1000}33 - TZ=${TZ:-UTC}3435 radarr:36 image: lscr.io/linuxserver/radarr:latest37 container_name: radarr38 restart: unless-stopped39 ports:40 - "${RADARR_PORT:-7878}:7878"41 volumes:42 - ./radarr/config:/config43 - ./media/movies:/movies44 - ./downloads:/downloads45 environment:46 - PUID=${PUID:-1000}47 - PGID=${PGID:-1000}48 - TZ=${TZ:-UTC}4950 prowlarr:51 image: lscr.io/linuxserver/prowlarr:latest52 container_name: prowlarr53 restart: unless-stopped54 ports:55 - "${PROWLARR_PORT:-9696}:9696"56 volumes:57 - ./prowlarr/config:/config58 environment:59 - PUID=${PUID:-1000}60 - PGID=${PGID:-1000}61 - TZ=${TZ:-UTC}6263 qbittorrent:64 image: lscr.io/linuxserver/qbittorrent:latest65 container_name: qbittorrent66 restart: unless-stopped67 ports:68 - "${QBIT_PORT:-8080}:8080"69 - "6881:6881"70 - "6881:6881/udp"71 volumes:72 - ./qbittorrent/config:/config73 - ./downloads:/downloads74 environment:75 - PUID=${PUID:-1000}76 - PGID=${PGID:-1000}77 - TZ=${TZ:-UTC}78 - WEBUI_PORT=80807980 jellyseerr:81 image: fallenbagel/jellyseerr:latest82 container_name: jellyseerr83 restart: unless-stopped84 ports:85 - "${JELLYSEERR_PORT:-5055}:5055"86 volumes:87 - ./jellyseerr/config:/app/config88 environment:89 - TZ=${TZ:-UTC}90 depends_on:91 - jellyfin92 - sonarr93 - radarr94EOF9596# 2. Create the .env file97cat > .env << 'EOF'98# Complete Media Server Stack99JELLYFIN_PORT=8096100SONARR_PORT=8989101RADARR_PORT=7878102PROWLARR_PORT=9696103QBIT_PORT=8080104JELLYSEERR_PORT=5055105106# User/Group IDs107PUID=1000108PGID=1000109TZ=America/New_York110EOF111112# 3. Start the services113docker compose up -d114115# 4. View logs116docker compose logs -fOne-Liner
Run this command to download and set up the recipe in one step:
terminal
1curl -fsSL https://docker.recipes/api/recipes/complete-media-server/run | bashTroubleshooting
- Sonarr/Radarr shows 'No indexers available': Configure indexers in Prowlarr first, then sync to applications
- qBittorrent login fails with default credentials: Check logs for generated password or reset in config file
- Jellyfin shows empty libraries after adding content: Verify folder permissions match PUID/PGID values and trigger library scan
- Downloads stuck in qBittorrent: Check that download and complete paths match volume mounts in Sonarr/Radarr
- Jellyseerr requests not triggering downloads: Ensure Sonarr/Radarr are properly configured in Jellyseerr settings with correct API keys
- Transcoding fails or stutters during playback: Enable hardware acceleration in Jellyfin dashboard if GPU is available, or reduce quality profiles
Community Notes
Loading...
Loading notes...
Download Recipe Kit
Get all files in a ready-to-deploy package
Includes docker-compose.yml, .env template, README, and license
Components
jellyfinsonarrradarrprowlarrqbittorrentjellyseerr
Tags
#jellyfin#sonarr#radarr#prowlarr#qbittorrent#media-automation
Category
Media & EntertainmentAd Space
Shortcuts: C CopyF FavoriteD Download