Homelab Haven

Self-Hosted Media Stack, Part 2: Sonarr and Radarr, the Brains of the Operation

July 11, 20264 min read

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 /Media path 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)

  1. Root folderSettings → Media Management → Add Root Folder: /Media/Series in Sonarr, /Media/Movies in Radarr.
  2. Enable renamingMedia 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.
  3. Note the API keySettings → 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