docker.recipes

Complete Media Server Stack

intermediate

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:latest
4 container_name: jellyfin
5 restart: unless-stopped
6 ports:
7 - "${JELLYFIN_PORT:-8096}:8096"
8 volumes:
9 - ./jellyfin/config:/config
10 - ./media/movies:/data/movies
11 - ./media/tv:/data/tv
12 - ./media/music:/data/music
13 environment:
14 - PUID=${PUID:-1000}
15 - PGID=${PGID:-1000}
16 - TZ=${TZ:-UTC}
17
18 sonarr:
19 image: lscr.io/linuxserver/sonarr:latest
20 container_name: sonarr
21 restart: unless-stopped
22 ports:
23 - "${SONARR_PORT:-8989}:8989"
24 volumes:
25 - ./sonarr/config:/config
26 - ./media/tv:/tv
27 - ./downloads:/downloads
28 environment:
29 - PUID=${PUID:-1000}
30 - PGID=${PGID:-1000}
31 - TZ=${TZ:-UTC}
32
33 radarr:
34 image: lscr.io/linuxserver/radarr:latest
35 container_name: radarr
36 restart: unless-stopped
37 ports:
38 - "${RADARR_PORT:-7878}:7878"
39 volumes:
40 - ./radarr/config:/config
41 - ./media/movies:/movies
42 - ./downloads:/downloads
43 environment:
44 - PUID=${PUID:-1000}
45 - PGID=${PGID:-1000}
46 - TZ=${TZ:-UTC}
47
48 prowlarr:
49 image: lscr.io/linuxserver/prowlarr:latest
50 container_name: prowlarr
51 restart: unless-stopped
52 ports:
53 - "${PROWLARR_PORT:-9696}:9696"
54 volumes:
55 - ./prowlarr/config:/config
56 environment:
57 - PUID=${PUID:-1000}
58 - PGID=${PGID:-1000}
59 - TZ=${TZ:-UTC}
60
61 qbittorrent:
62 image: lscr.io/linuxserver/qbittorrent:latest
63 container_name: qbittorrent
64 restart: unless-stopped
65 ports:
66 - "${QBIT_PORT:-8080}:8080"
67 - "6881:6881"
68 - "6881:6881/udp"
69 volumes:
70 - ./qbittorrent/config:/config
71 - ./downloads:/downloads
72 environment:
73 - PUID=${PUID:-1000}
74 - PGID=${PGID:-1000}
75 - TZ=${TZ:-UTC}
76 - WEBUI_PORT=8080
77
78 jellyseerr:
79 image: fallenbagel/jellyseerr:latest
80 container_name: jellyseerr
81 restart: unless-stopped
82 ports:
83 - "${JELLYSEERR_PORT:-5055}:5055"
84 volumes:
85 - ./jellyseerr/config:/app/config
86 environment:
87 - TZ=${TZ:-UTC}
88 depends_on:
89 - jellyfin
90 - sonarr
91 - radarr

.env Template

.env
1# Complete Media Server Stack
2JELLYFIN_PORT=8096
3SONARR_PORT=8989
4RADARR_PORT=7878
5PROWLARR_PORT=9696
6QBIT_PORT=8080
7JELLYSEERR_PORT=5055
8
9# User/Group IDs
10PUID=1000
11PGID=1000
12TZ=America/New_York

Usage Notes

  1. 1Jellyfin (media) at http://localhost:8096
  2. 2Jellyseerr (requests) at http://localhost:5055
  3. 3Sonarr (TV) at http://localhost:8989
  4. 4Radarr (Movies) at http://localhost:7878
  5. 5Prowlarr (indexers) at http://localhost:9696
  6. 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 file
2cat > docker-compose.yml << 'EOF'
3services:
4 jellyfin:
5 image: jellyfin/jellyfin:latest
6 container_name: jellyfin
7 restart: unless-stopped
8 ports:
9 - "${JELLYFIN_PORT:-8096}:8096"
10 volumes:
11 - ./jellyfin/config:/config
12 - ./media/movies:/data/movies
13 - ./media/tv:/data/tv
14 - ./media/music:/data/music
15 environment:
16 - PUID=${PUID:-1000}
17 - PGID=${PGID:-1000}
18 - TZ=${TZ:-UTC}
19
20 sonarr:
21 image: lscr.io/linuxserver/sonarr:latest
22 container_name: sonarr
23 restart: unless-stopped
24 ports:
25 - "${SONARR_PORT:-8989}:8989"
26 volumes:
27 - ./sonarr/config:/config
28 - ./media/tv:/tv
29 - ./downloads:/downloads
30 environment:
31 - PUID=${PUID:-1000}
32 - PGID=${PGID:-1000}
33 - TZ=${TZ:-UTC}
34
35 radarr:
36 image: lscr.io/linuxserver/radarr:latest
37 container_name: radarr
38 restart: unless-stopped
39 ports:
40 - "${RADARR_PORT:-7878}:7878"
41 volumes:
42 - ./radarr/config:/config
43 - ./media/movies:/movies
44 - ./downloads:/downloads
45 environment:
46 - PUID=${PUID:-1000}
47 - PGID=${PGID:-1000}
48 - TZ=${TZ:-UTC}
49
50 prowlarr:
51 image: lscr.io/linuxserver/prowlarr:latest
52 container_name: prowlarr
53 restart: unless-stopped
54 ports:
55 - "${PROWLARR_PORT:-9696}:9696"
56 volumes:
57 - ./prowlarr/config:/config
58 environment:
59 - PUID=${PUID:-1000}
60 - PGID=${PGID:-1000}
61 - TZ=${TZ:-UTC}
62
63 qbittorrent:
64 image: lscr.io/linuxserver/qbittorrent:latest
65 container_name: qbittorrent
66 restart: unless-stopped
67 ports:
68 - "${QBIT_PORT:-8080}:8080"
69 - "6881:6881"
70 - "6881:6881/udp"
71 volumes:
72 - ./qbittorrent/config:/config
73 - ./downloads:/downloads
74 environment:
75 - PUID=${PUID:-1000}
76 - PGID=${PGID:-1000}
77 - TZ=${TZ:-UTC}
78 - WEBUI_PORT=8080
79
80 jellyseerr:
81 image: fallenbagel/jellyseerr:latest
82 container_name: jellyseerr
83 restart: unless-stopped
84 ports:
85 - "${JELLYSEERR_PORT:-5055}:5055"
86 volumes:
87 - ./jellyseerr/config:/app/config
88 environment:
89 - TZ=${TZ:-UTC}
90 depends_on:
91 - jellyfin
92 - sonarr
93 - radarr
94EOF
95
96# 2. Create the .env file
97cat > .env << 'EOF'
98# Complete Media Server Stack
99JELLYFIN_PORT=8096
100SONARR_PORT=8989
101RADARR_PORT=7878
102PROWLARR_PORT=9696
103QBIT_PORT=8080
104JELLYSEERR_PORT=5055
105
106# User/Group IDs
107PUID=1000
108PGID=1000
109TZ=America/New_York
110EOF
111
112# 3. Start the services
113docker compose up -d
114
115# 4. View logs
116docker compose logs -f

One-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 | bash

Troubleshooting

  • 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 & Entertainment
Ad Space