One place to manage your indexers. Add them here once and Prowlarr pushes them to Sonarr, Radarr and Lidarr automatically. Install this first.
Tracks series and seasons, grabs new episodes as they air, renames and files them.
Same idea as Sonarr.
Follows artists and albums, tags the files, and keeps a music library tidy.
You'll need a download client already running like qBittorrent, SABnzbd or NZBGet. The Arr apps don't download anything themselves; they decide what to fetch and hand the job off. And you'll need indexers to add in Prowlarr. Sourcing those is outside the scope of this guide.
Step 1 — Pick your platform
These compose blocks use the linuxserver.io images. Put them all in one docker-compose.yml and bring the stack up in a single command.
Set PUID/PGID to the user that owns your media (id -u and id -g), and change TZ to your timezone.
Mount your media and downloads under a single root (e.g. /data/media and /data/downloads) and mount that same root into every container.
source: wiki.servarr.com — Docker guide
Servarr maintains one install script that covers all four apps. Install the dependencies, then run it once per app:
sudo apt install -y curl mediainfo sqlite3
curl -sL https://raw.githubusercontent.com/Servarr/Wiki/master/scripts/install.sh -o install.sh
sudo bash install.shThe script prompts for which app to install — run it four times, once each for prowlarr, sonarr, radarr and lidarr. It sets each one up as a systemd service that starts on boot.
sudo systemctl status prowlarr
sudo systemctl status sonarr
sudo systemctl status radarr
sudo systemctl status lidarrApps live in /opt/Prowlarr, /opt/Sonarr, /opt/Radarr, /opt/Lidarr. Each service runs as its own user — those users need read/write access to your media and download folders.
Open the ports if ufw is on:
sudo ufw allow 9696/tcp # Prowlarr
sudo ufw allow 8989/tcp # Sonarr
sudo ufw allow 7878/tcp # Radarr
sudo ufw allow 8686/tcp # Lidarrsource: wiki.servarr.com — installation
Each app ships a Windows installer. Grab them from the official download pages and run them in this order — Prowlarr first:
- Prowlarr →
http://localhost:9696 - Sonarr →
http://localhost:8989 - Radarr →
http://localhost:7878 - Lidarr →
http://localhost:8686
Each installer asks whether to run as a service or a tray app.
The service runs as LocalSystem, which can't see mapped network drives and often can't write to network shares. Tray-app mode runs as your user and avoids the whole class of "access denied" import failures — the trade-off is it only runs while you're logged in.
Config lives in %ProgramData%\Prowlarr and %AppData%\Sonarr / Radarr / Lidarr.
There's no first-party macOS installer for the Arr apps and no maintained Homebrew formula for all four. The supported path on a Mac is Docker Desktop — switch to the Docker tab above and use those compose files as-is.
The Arr apps are built around Linux/Windows service management. Running them in containers on macOS gets you the same app, the same ports, and config that transfers cleanly if you later move the stack to a real server — which, for something that should run 24/7, you probably will.
Once Docker Desktop is installed, everything in the Docker tab works unchanged — just point the volume paths at folders under your home directory and set PUID/PGID to 501/20 (the defaults for the first macOS user).
Step 2 — Prowlarr
Prowlarr is the indexer manager. Every indexer you add here gets pushed to the other three apps automatically, so it's much less work than configuring each app separately.
services:
prowlarr:
image: lscr.io/linuxserver/prowlarr:latest
container_name: prowlarr
environment:
- PUID=1000
- PGID=1000
- TZ=America/New_York
volumes:
- ./prowlarr/config:/config
ports:
- "9696:9696"
restart: unless-stoppedsudo bash install.sh # choose: prowlarr
sudo systemctl status prowlarrRun the Prowlarr installer, then open http://localhost:9696.
Use the Docker compose block from the Docker tab, then open http://localhost:9696.
Open http://SERVER_IP:9696. On first launch Prowlarr asks you to set an authentication method and create a username and password — do it, don't skip it.
Then:
- Settings → Indexers → Add Indexer — add whichever indexers you use. This guide doesn't name or recommend any; that part's on you.
- Settings → General — copy the API Key. You'll need it, and you'll need each other app's key too.
- Leave Settings → Apps alone for now — you'll come back to it in Step 6 once Sonarr, Radarr and Lidarr exist.
source: wiki.servarr.com — Prowlarr
Step 3 — Sonarr (TV)
services:
sonarr:
image: lscr.io/linuxserver/sonarr:latest
container_name: sonarr
environment:
- PUID=1000
- PGID=1000
- TZ=America/New_York
volumes:
- ./sonarr/config:/config
- /path/to/tv:/tv
- /path/to/downloads:/downloads
ports:
- "8989:8989"
restart: unless-stoppedsudo bash install.sh # choose: sonarr
sudo systemctl status sonarrRun the Sonarr installer, then open http://localhost:8989.
Use the Docker compose block from the Docker tab, then open http://localhost:8989.
Open http://SERVER_IP:8989, set up authentication, then:
- Settings → Media Management → Root Folders — add your TV folder (
/tvon Docker, the real path elsewhere). Turn on Rename Episodes so files land in the naming scheme Jellyfin expects. - Settings → Download Clients — add qBittorrent / SABnzbd / NZBGet with its host, port and credentials. Test before saving.
- Settings → Profiles — set a quality profile so it isn't grabbing 40 GB remuxes of a sitcom.
- Settings → General — copy the API key for Step 6.
source: wiki.servarr.com — Sonarr
Step 4 — Radarr (movies)
services:
radarr:
image: lscr.io/linuxserver/radarr:latest
container_name: radarr
environment:
- PUID=1000
- PGID=1000
- TZ=America/New_York
volumes:
- ./radarr/config:/config
- /path/to/movies:/movies
- /path/to/downloads:/downloads
ports:
- "7878:7878"
restart: unless-stoppedsudo bash install.sh # choose: radarr
sudo systemctl status radarrRun the Radarr installer, then open http://localhost:7878.
Use the Docker compose block from the Docker tab, then open http://localhost:7878.
Open http://SERVER_IP:7878. The setup is identical to Sonarr — root folder (/movies), download client, quality profile, and grab the API key from Settings → General.
source: wiki.servarr.com — Radarr
Step 5 — Lidarr (music)
services:
lidarr:
image: lscr.io/linuxserver/lidarr:latest
container_name: lidarr
environment:
- PUID=1000
- PGID=1000
- TZ=America/New_York
volumes:
- ./lidarr/config:/config
- /path/to/music:/music
- /path/to/downloads:/downloads
ports:
- "8686:8686"
restart: unless-stoppedsudo bash install.sh # choose: lidarr
sudo systemctl status lidarrRun the Lidarr installer, then open http://localhost:8686.
Use the Docker compose block from the Docker tab, then open http://localhost:8686.
Open http://SERVER_IP:8686. Same pattern again — root folder (/music), download client, quality profile, API key.
source: wiki.servarr.com — Lidarr
Step 6 — Wire them together
Four apps running is not a stack. This is the part that makes it one.
Prowlarr → the other three
In Prowlarr: Settings → Apps → +, add Sonarr, Radarr and Lidarr one at a time. For each, enter:
- Prowlarr Server — the URL the other app uses to reach Prowlarr
- Server — that app's URL, e.g.
http://sonarr:8989on Docker,http://192.168.1.50:8989otherwise - API Key — from that app's Settings → General
Hit Test, then Save. Your indexers sync across immediately, and any indexer you add to Prowlarr later shows up in all three on its own.
If all the containers are in the same compose file they share a network, so use the container name as the hostname (http://sonarr:8989) — not localhost. Inside a container, localhost means that container, not the host.
Sonarr / Radarr / Lidarr → download client
Settings → Download Clients in each app — point at qBittorrent, SABnzbd or NZBGet with host, port and API key or credentials. Test each one; a green test here is what stops the "downloads finish but nothing imports" problem later.
Sonarr / Radarr / Lidarr → Jellyfin
Settings → Connect → + → Jellyfin in each app. Enter your Jellyfin host, port 8096, and a Jellyfin API key (Jellyfin: Dashboard → API Keys). Enable On Import and On Upgrade so the library refreshes the moment a file lands, instead of on the next scheduled scan.
No Jellyfin yet? → Set up Jellyfin first.
source: wiki.servarr.com — Prowlarr applications
Ports reference
| App | Port | URL |
|---|---|---|
| Prowlarr | 9696 | http://SERVER_IP:9696 |
| Sonarr | 8989 | http://SERVER_IP:8989 |
| Radarr | 7878 | http://SERVER_IP:7878 |
| Lidarr | 8686 | http://SERVER_IP:8686 |
| Jellyfin | 8096 | http://SERVER_IP:8096 |
Config paths by OS
These are the folders to back up — lose them and you rebuild every profile, indexer and library from scratch.
| App | Docker | Linux (native) | Windows |
|---|---|---|---|
| Prowlarr | ./prowlarr/config | /opt/Prowlarr | %ProgramData%\Prowlarr |
| Sonarr | ./sonarr/config | /opt/Sonarr | %AppData%\Sonarr |
| Radarr | ./radarr/config | /opt/Radarr | %AppData%\Radarr |
| Lidarr | ./lidarr/config | /opt/Lidarr | %AppData%\Lidarr |
| Jellyfin | ./config | /etc/jellyfin, /var/lib/jellyfin | C:\ProgramData\Jellyfin\Server |
When something doesn't work
- Downloads complete but never import — almost always paths. The path the download client reports must be reachable at the same path inside the Arr app. Same mounts, same spelling, same case.
- "Test" fails between apps on Docker — you used
localhost. Use the container name. - Permission denied on import —
PUID/PGIDdon't match the owner of the media folder. Check withls -lnon the host. - Indexers don't appear in Sonarr — the app wasn't added under Prowlarr → Settings → Apps, or the API key is wrong. Sync is one-way: Prowlarr pushes, the others don't pull.
- Jellyfin doesn't show new files — the Connect entry is missing or On Import is off. A manual Scan All Libraries proves whether it's a connection problem or a naming one.
Quick reference
# Docker — bring the whole stack up
docker compose up -d
docker compose logs -f prowlarr
# Linux — run once per app: prowlarr, sonarr, radarr, lidarr
sudo apt install -y curl mediainfo sqlite3
curl -sL https://raw.githubusercontent.com/Servarr/Wiki/master/scripts/install.sh -o install.sh
sudo bash install.sh
# Web UIs
# Prowlarr http://SERVER_IP:9696 (install + configure FIRST)
# Sonarr http://SERVER_IP:8989
# Radarr http://SERVER_IP:7878
# Lidarr http://SERVER_IP:8686
# Wiring order
# 1. Prowlarr -> Settings -> Apps (add Sonarr/Radarr/Lidarr + API keys)
# 2. Each app -> Settings -> Download Clients
# 3. Each app -> Settings -> Connect (add Jellyfin, enable On Import)