How the stack fits together
Before deploying anything, it helps to understand what each piece does and how they talk to each other. The whole system is automated — once configured, you just request a movie and it handles everything.
The flow
- 1You add a movie to Radarr (or it's requested via Jellyfin)
- 2Radarr asks Prowlarr to search for it across all your indexers
- 3Prowlarr finds a match and returns the torrent info
- 4Radarr sends the torrent to qBittorrent to download
- 5When the download completes, Radarr moves it to your movies folder and renames it properly
- 6Jellyfin picks it up and it appears in your library
Create your folder structure
Before deploying any containers, create the folders they'll use for media and downloads. Getting this right now saves a lot of headaches later.
Proxmox/Linux users: run these in your LXC console. Windows users: create these folders manually in File Explorer, then adjust the paths in the compose file below to match Windows-style paths (e.g. C:\media\movies).
/mnt/media. For example if your drive is at /mnt/bigdrive, use /mnt/bigdrive/movies etc. The important thing is consistency — use the same paths in the compose file below.
Set permissions so Docker can read/write these folders:
Deploy the stack via Portainer
You'll deploy everything at once using a Docker Compose file — a single config file that defines all your containers, their settings, and how they connect.
-
1
Open Portainer in your browser (
https://[your-ip]:9443), log in, and click on your local environment. - 2 In the left sidebar, click Stacks, then click Add stack.
-
3
Name it
media-stack. - 4 In the web editor, paste the entire compose file below. Then click Deploy the stack.
YOUR_TIMEZONE with your timezone (e.g. America/Los_Angeles or America/New_York). Replace 1000 in PUID/PGID with your user ID if needed — on most Linux setups 1000 is correct. Windows users should remove or ignore the PUID/PGID lines.
Portainer will pull all the images and start the containers. This takes a few minutes depending on your internet speed. You can watch progress in Portainer under Containers.
Configure Prowlarr
Prowlarr manages your indexers — the sites that list available torrents. You need at least one indexer added before Radarr and Sonarr can find anything.
-
1
Open Prowlarr at
http://[your-ip]:9696. On first launch it will ask you to set up authentication — set a username and password. - 2 Click Indexers in the top menu, then Add Indexer.
- 3 Search for 1337x or RARBG — these are public indexers that don't require accounts. Select one and click Test, then Save if the test passes.
- 4 Add a few more public indexers for better coverage. Popular ones: YTS (great for movies), EZTV (great for TV), The Pirate Bay.
- 5 Now connect Prowlarr to Radarr and Sonarr. Go to Settings → Apps and click the + button.
-
6
Add Radarr: set the server URL to
http://radarr:7878and paste in Radarr's API key (you'll get this from Radarr → Settings → General in the next step). For now, note this step and come back after Step 05. -
7
Repeat for Sonarr with URL
http://sonarr:8989.
Configure Radarr
Radarr monitors your movie library and automatically searches for and downloads movies you want.
-
1
Open Radarr at
http://[your-ip]:7878. Set up authentication if prompted. -
2
Go to Settings → Media Management. Under Root Folders click Add Root Folder and enter
/movies. This is where Radarr will put downloaded movies. -
3
Go to Settings → Download Clients and click the + button. Select qBittorrent. Set:
— Host:qbittorrent
— Port:8080
— Username:admin
— Password: check qBittorrent's web UI for the temporary password (it shows on first launch)
Click Test then Save. - 4 Go to Settings → General and copy your API Key. Go back to Prowlarr and paste it in when adding Radarr as an app (from Step 04).
- 5 Go to Settings → Profiles. The default quality profiles work fine to start — "Any" means grab whatever's available, "HD-1080p" means only grab 1080p content.
Add your first movie
- 1Click Movies → Add New in the top menu.
- 2Search for a movie title.
- 3Select the quality profile and root folder, then click Add Movie.
- 4Radarr will immediately search for it. Check the Activity tab to see the search and download progress.
Configure Sonarr
Sonarr works exactly like Radarr but for TV shows. The configuration steps are nearly identical.
-
1
Open Sonarr at
http://[your-ip]:8989. -
2
Go to Settings → Media Management → Root Folders and add
/tv. -
3
Go to Settings → Download Clients, click +, and add qBittorrent with the same settings as Radarr (host:
qbittorrent, port:8080). - 4 Go to Settings → General, copy the API Key, and go back to Prowlarr to add Sonarr as an app.
- 5 Add a TV show: click Series → Add New, search for a show, select your quality profile, and add it. Sonarr will grab existing episodes and automatically download new ones as they air.
Set up Jellyfin
Jellyfin is your streaming frontend — it reads your media library and lets you watch on any device through a Netflix-style interface.
-
1
Open Jellyfin at
http://[your-ip]:8096. You'll be walked through a first-time setup wizard. - 2 Set your display language and create an admin account — this is your Jellyfin login, separate from everything else.
-
3
When asked to set up your media library, add two libraries:
— Click Add Media Library → Type: Movies → Folder:/data/movies
— Click Add Media Library → Type: Shows → Folder:/data/tv - 4 Complete the setup wizard. Jellyfin will scan your library — any movies already downloaded will appear.
- 5 Install the Jellyfin app on your devices: it's available on Android, iOS, Apple TV, Fire TV, Roku, Android TV, and most smart TVs. Search for "Jellyfin" in your device's app store.
-
6
In the Jellyfin app, enter your server address:
http://[your-server-ip]:8096and log in with your admin credentials.
Your first download
Your media server is fully operational. Here's a quick recap of what you now have running:
Your stack at a glance
- ✓Prowlarr at :9696 — indexer manager
- ✓Radarr at :7878 — movie automation
- ✓Sonarr at :8989 — TV show automation
- ✓qBittorrent at :8080 — download client
- ✓Jellyfin at :8096 — streaming frontend
What to do next
- →Add more indexers in Prowlarr — more indexers means better coverage and faster downloads.
- →Set up Bazarr — automatically downloads subtitles for everything in your library. Deploy it the same way as the rest of the stack.
- →Add Overseerr/Jellyseerr — a nice request portal where friends can browse and request content without needing access to Radarr/Sonarr directly.
- →Configure quality profiles — once you're comfortable, dial in your preferred quality settings in Radarr and Sonarr. 1080p is the sweet spot for most setups.
- →Enable hardware transcoding in Jellyfin — if your server has an Intel GPU or Nvidia card, enabling hardware transcoding dramatically reduces CPU load when streaming to devices that can't play files natively.
Common issues
Downloads not starting
- ?No indexers found: Check Prowlarr is running and has at least one indexer added. Go to Prowlarr → Indexers and confirm the test passes.
- ?qBittorrent connection refused: In Radarr/Sonarr download client settings, make sure the host is
qbittorrent(the container name), notlocalhostor an IP. Inside Docker, containers talk to each other by name. - ?Download completes but file doesn't appear in Radarr/Sonarr: This is usually a path mismatch. Make sure the
/downloadspath in Radarr/Sonarr settings matches where qBittorrent saves files. They should all point to the same/mnt/media/downloadsfolder on the host. - ?Permission denied errors: Run
chmod -R 755 /mnt/mediaandchown -R 1000:1000 /mnt/mediaon your server to fix permissions.
Jellyfin issues
- ?Library not showing movies: Go to Dashboard → Libraries and click the scan button. Jellyfin doesn't always auto-detect new files immediately.
- ?Can't connect from app: Make sure you're using
http://nothttps://for local access, and that the IP is your server's IP, notlocalhost. - ?Buffering or stuttering: The file might be transcoding. Check Jellyfin → Dashboard → Active Sessions to see if it says "Transcoding." Enable hardware transcoding in Dashboard → Playback if your GPU supports it, or set your clients to "Direct Play" in their settings.
- ?Something else: Copy the error and paste it into Claude or ChatGPT. Describe what you were trying to do and what happened.