Self-Hosted Media Stack, Part 4: Prowlarr, One Place for All Your Indexers
*Part 4 of Media Stack from Scratch. The arrs have a wanted list (Part 2) and download clients (Part 3) — this part gives them eyes, and the whole pipeline runs for the first time.
Before Prowlarr existed, every indexer had to be added to Sonarr and Radarr separately, and every indexer change meant editing it everywhere. Prowlarr inverts that: indexers live in one app, and it pushes them to every *arr you connect. Add an indexer once, it appears everywhere seconds later.
Summary
- Prowlarr is a catalog, not a downloader — it never touches files.
- FlareSolverr rides along for the handful of indexers behind Cloudflare challenges.
- Connect Sonarr and Radarr under Settings → Apps and every indexer syncs across in one go.
- This is the part where your first request completes end to end — and where the classic import failures show up, so they're covered here too.
The compose
services:
prowlarr:
image: linuxserver/prowlarr:latest
container_name: prowlarr
restart: unless-stopped
environment:
- PUID=1001
- PGID=100
- TZ=Europe/Amsterdam
volumes:
- /path/to/appdata/prowlarr:/config
ports:
- "9696:9696"
security_opt:
- no-new-privileges:true
flaresolverr:
image: flaresolverr/flaresolverr:latest
container_name: flaresolverr
restart: unless-stopped
environment:
- TZ=Europe/Amsterdam
ports:
- "8191:8191"
Note what Prowlarr doesn't mount: /Media. It's the only app in the stack so far
with no business near your files.
Setup, in order
- Add your indexers — Indexers → Add Indexer. Public ones need nothing; private ones want your API key from the indexer's own site.
- Wire in FlareSolverr — Settings → Indexer Proxies → Add → FlareSolverr, host
http://flaresolverr:8191. Tag it (e.g.cf), then put that tag on the indexers that need it — only the ones that fail with a Cloudflare error. Routing everything through FlareSolverr makes every search slower for no benefit. - Test everything — the Test All Indexers button. A red indexer here is one Sonarr would silently fail on later, when it's much harder to see why.
- *Connect the arrs — Settings → Apps → Add: Sonarr at
http://sonarr:8989with its API key, Radarr athttp://radarr:7878with its key (both noted in Part 2). Sync — every indexer appears in both apps, correctly categorized.
What that buys you permanently: add an indexer once → everywhere; rotate a key once → everywhere; an indexer dies → disable it in one place.
The first end-to-end run
Everything is now connected. Go to a wanted item from Part 2 and hit Search, then watch the pipeline do its thing: Prowlarr's indexers answer → the *arr scores the releases and picks one → hands it to qBittorrent or SABnzbd → progress appears in the *arr's queue (not the downloader UI — you've stopped opening those) → import → a renamed file sitting in the library. When that works once, it works forever.
When it doesn't: the three import failures
"It downloaded but nothing imported" is the classic first-run failure, and it's one of three things nearly every time:
- Different paths — the downloader reports a path the *arr can't see (mounts
differ between containers). Symptom: a red import error in the queue naming a path
that doesn't exist in the *arr's container. Fix: identical
/Mediamounts everywhere, exactly as the compose files in this series do. - Permissions — the file landed as a user the *arr's PUID can't modify. Symptom:
"access denied" in the import error. Fix: same
PUID/PGIDin every service. - A stalled or fake release — nothing arrived at all. Queue → remove and blocklist teaches the app not to grab that release again, then search again. The blocklist half matters: without it, the *arr happily re-grabs the same dead release.
Checkpoint
- All indexers green in Prowlarr, synced into both *arrs
- One show and one movie fetched end to end, imported and renamed
- You did all of it from the *arr UIs, never touching a downloader
The stack now works. The remaining parts make it pleasant: a front door for the household (Part 5), subtitles (Part 6), and taste (Part 7).
Next: Part 5 — Seerr, the request front-end your family actually uses. Previous: Part 3 — the download layer.
If this saved you some time, a coffee keeps the lights on and the posts coming.
☕ Buy me a coffee