Self-Hosted Media Stack, Part 2: Sonarr and Radarr, the Brains of the Operation
Part 2 of Media Stack from Scratch. You'll need the
folder layout from Part 1 — everything below assumes one /Media mount with Series/,
Movies/ and downloads/ inside it.
Sonarr and Radarr are the same design pointed at different media: you tell them what you want, and they handle everything else — watching for releases, picking the best one by your rules, sending it to a download client, and importing the finished file with a clean name. TV in Sonarr, movies in Radarr.
We install them first, before anything they depend on. That sounds backwards, but they're the center of the stack — the downloaders (Part 3) and indexers (Part 4) plug into them, and setting the center up first means every later part is a five-minute "connect and done" instead of a re-configuration pass.
Summary
- Both apps mount the same
/Mediapath that the downloaders will use later — this is what makes imports instant hardlinks instead of copies. - Root folders:
/Media/Series(Sonarr),/Media/Movies(Radarr). - Pick your quality ceiling now — it's one decision, and un-downloading is harder than upgrading.
- At the end of this part, your wanted list exists but nothing downloads. That's expected: no muscle, no eyes yet.
The compose
services:
sonarr:
image: linuxserver/sonarr:latest
container_name: sonarr
restart: unless-stopped
environment:
- PUID=1001 # run `id <your user>` on the host; use your values
- PGID=100
- TZ=Europe/Amsterdam
volumes:
# What /path/to/... is on your box (Synology, generic Linux) is defined once
# in Part 1 - the right side of these lines never changes per environment.
- /path/to/appdata/sonarr:/config
- /path/to/Media:/Media # the ONE mount, identical in every service
ports:
- "8989:8989"
radarr:
image: linuxserver/radarr:latest
container_name: radarr
restart: unless-stopped
environment:
- PUID=1001
- PGID=100
- TZ=Europe/Amsterdam
volumes:
- /path/to/appdata/radarr:/config
- /path/to/Media:/Media
ports:
- "7878:7878"
That repeated volume line — /path/to/Media:/Media, identical in every service in
this series — is the entire hardlink story from Part 1. When a finished download at
/Media/downloads/... gets imported to /Media/Series/..., both paths live on one
filesystem inside one mount, so the "move" is a hardlink: instant, no extra disk, and
a torrent keeps seeding from the original.
Setup (same steps in both apps)
- Root folder — Settings → Media Management → Add Root Folder:
/Media/Seriesin Sonarr,/Media/Moviesin Radarr. - Enable renaming — Media Management → Rename Episodes/Movies. The defaults produce names Plex parses perfectly; the point is consistency, not the exact format. Every file the stack ever imports will follow this scheme, so decide once, now, while the library is small.
- Note the API key — Settings → General → API Key, in both apps. Parts 3 through 7 all introduce themselves with it; you'll be back here often enough that it's worth knowing where it lives.
Quality: one decision, not twenty
Settings → Profiles ships with sane defaults. The only decision that matters on day
one: pick the profile ceiling you actually watch. If your TV is 1080p and your
disks are not infinite, a 1080p profile with upgrades enabled beats a 4K profile
that quadruples storage for pixels you can't see. You can always upgrade a library
later; un-downloading 40 TB is harder.
What the built-in profiles can't express is taste — preferring a good encode over a bloated one, avoiding release groups that mislabel. That's Part 7 (Profilarr), and it layers on top of the choice you make here without redoing it.
Add what you actually want
Add a show in Sonarr, a movie in Radarr — search by name, pick the root folder and profile you just set, done. They'll go on the wanted list and sit there.
Nothing downloads yet, and nothing should. The apps have no download client and no indexers — they know what you want but have no way to look for it, let alone fetch it. If the queue stays empty, that's not a bug; that's the current shape of the stack:
- Part 3 gives them muscle: qBittorrent behind a VPN, plus SABnzbd.
- Part 4 gives them eyes: Prowlarr delivers every indexer in one sync, and the pipeline runs end to end for the first time.
Checkpoint
- Both UIs up, root folders green under Media Management
- Renaming enabled, both API keys noted
- A few wanted items sitting patiently in each app
Next: Part 3 — the download layer: qBittorrent behind a VPN, plus SABnzbd. Previous: Part 1 — the map.
If this saved you some time, a coffee keeps the lights on and the posts coming.
☕ Buy me a coffee