http://your-server-ip:9696 once the container is running.I run this exact Compose stack on a Debian 12 box with the LinuxServer.io images, alongside Sonarr, Radarr, and SABnzbd on the same media_network bridge. The config below is what’s actually running, not a copy-paste from someone’s gist.
What is Prowlarr?
Prowlarr is the index and download manager for your media server. It’s the glue between your torrent and Usenet sources and the Arr apps (Sonarr, Radarr, Lidarr, Readarr). Set up your indexers and downloaders once in Prowlarr, and it pushes them out to every Arr app over the API.
Here’s what it does day to day:
- Connects to public and private torrent trackers, plus Usenet indexers.
- Wires your local downloaders (qBittorrent, SABnzbd, NZBGet) into the Arr apps.
- Centralizes every connection and monitors them for availability.
- Syncs indexers to your other Arr apps automatically.
- Categorizes indexers by media type (TV, movies, music) and sends them to the right app.
- Gives you one dashboard for every source your automation relies on. And when an indexer dies, Prowlarr tells you before Sonarr does.
Why You Should Use Prowlarr
Running a media server without Prowlarr means logging into Sonarr, then Radarr, then Lidarr, pasting the same API key into each one, then doing it all again when an indexer changes its URL. Fine for a weekend. Painful by month three.
Here’s what you get:
- Saves time. Add an indexer or downloader once. No more copy-pasting API keys and login info across three or four apps.
- Reduces errors. When one app works and another doesn’t, the culprit is usually a stale or misconfigured indexer. Prowlarr keeps them aligned.
- Monitors health. You find out an indexer went offline today, not a week later when you’re missing the new episode of your show.
- Supports everything. Private trackers, paid Usenet, free public indexers. Prowlarr handles all of them.
One messy manual setup becomes one clean, scalable system.
Step 1: Install Docker
You’ll need Docker installed on your server first.
Walkthrough: Master the Basics - How to Install Docker
Step 2: Create or Modify Your Docker Compose File
Define the Prowlarr container in docker-compose.yml. This post adds Prowlarr to the existing Compose file from the Sonarr guide, so the full media stack lives in one place.
Reference: How to Install Sonarr in Docker
Open the Compose File
Open your existing docker-compose.yml or create a new one:
nano /docker/docker-compose.yml
Then paste the Prowlarr section into your services: block:
services:
#################################
## PROWLARR ##
#################################
prowlarr:
# Official Linuxserver.io Prowlarr image
image: lscr.io/linuxserver/prowlarr:latest
# Sets a custom name for the container
container_name: prowlarr
# Name and location of the .env file
env_file: .env
# Ensures the container restarts if it crashes
restart: unless-stopped
ports:
- ${PROWLARR_PORT}:9696
volumes:
# Stores Sonarr's configuration data
- ${CONFIG_PATH}/prowlarr:/config
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
networks:
# Connects the container to the custom media network
- media_network
#################################
## SONARR ##
#################################
sonarr:
# Official LinuxServer.io Sonarr image
image: lscr.io/linuxserver/sonarr:latest
# Sets a custom name for the container
container_name: sonarr
# Name and location of the .env file
env_file: .env
# Ensures the container restarts if it crashes
restart: unless-stopped
ports:
- ${SONARR_PORT}:8989
volumes:
# Stores Sonarr's configuration data
- ${CONFIG_PATH}/sonarr:/config
# Directory where downloaded TV shows are stored
- ${MEDIA_PATH}/Shows:/tv
# Directory where incomplete downloads are stored
- ${DOWNLOADS_PATH}:/downloads
environment:
- PUID=${PUID}
- PGID=${PGID}
- UMASK=0007
- TZ=${TZ}
networks:
# Connects the container to the custom media network
- media_network
#################################
## RADARR ##
#################################
radarr:
# Official LinuxServer.io Radarr image
image: lscr.io/linuxserver/radarr:latest
# Sets a custom name for the container
container_name: radarr
# Name and location of the .env file
env_file: .env
# Ensures the container restarts if it crashes
restart: unless-stopped
ports:
- ${RADARR_PORT}:7878
volumes:
# Stores Radarr's configuration data
- ${CONFIG_PATH}/radarr:/config
# Directory where downloaded Movies are stored
- ${MEDIA_PATH}/Movies:/movies
# Directory where incomplete downloads are stored
- ${DOWNLOADS_PATH}:/downloads
environment:
- PUID=${PUID}
- PGID=${PGID}
- UMASK=0007
- TZ=${TZ}
networks:
# Connects the container to the custom media network
- media_network
#################################
## SABnzbd ##
#################################
sabnzbd:
# Official LinuxServer.io SABnzbd image
image: lscr.io/linuxserver/sabnzbd:latest
# Sets a custom name for the container
container_name: sabnzbd
# Name and location of the .env file
env_file: .env
# Ensures the container restarts if it crashes
restart: unless-stopped
ports:
- ${SABNZBD_PORT}:8080
volumes:
# Stores SABnzbd's configuration data
- ${CONFIG_PATH}/sabnzbd:/config
# Directory where incomplete downloads are stored
- ${DOWNLOADS_PATH}:/downloads
environment:
- PUID=${PUID}
- PGID=${PGID}
- UMASK=0007
- TZ=${TZ}
networks:
# Connects the container to the custom media network
- media_network
#################################
## NETWORK ##
#################################
# Creates an isolated Docker network for media containers
networks:
media_network:
driver: bridge
Tip: Spacing matters. YAML is picky. Two-space indents only. No tabs.
Step 3: Customize the .env File
Open the .env File
nano /docker/.env
The contents should look like this:
# User and Group ID (Prevents permission issues)
# Main user ID
PUID=1000
# Our media group:
PGID=1001
# Timezone (Ensures correct scheduling and logs)
TZ=America/Denver
# Define Ports (Ports for each container are defined here)
# Maps Radarr’s web UI to port 7878 on the host
RADARR_PORT=7878
# Maps Sonarr’s web UI to port 8989 on the host
SONARR_PORT=8989
# Maps SABnzbd’s web UI to port 8080 on the host
SABNZBD_PORT=8080
# Maps Prowlarr's web UI to 9696
PROWLARR_PORT=9696
# Data Directories (Keeps storage paths centralized)
CONFIG_PATH=/docker
DOWNLOADS_PATH=/media/downloads
MEDIA_PATH=/media
Step 4: Start Prowlarr
Bring the stack online:
docker compose up -d
Confirm the container is running:
docker ps
You should see prowlarr in the list:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
65470f79b320 lscr.io/linuxserver/radarr:latest "/init" 6 seconds ago Up 5 seconds 0.0.0.0:7878->7878/tcp, [::]:7878->7878/tcp radarr
3e96643b0ba9 lscr.io/linuxserver/sabnzbd:latest "/init" 6 seconds ago Up 5 seconds 0.0.0.0:8080->8080/tcp, [::]:8080->8080/tcp sabnzbd
604d2ed3850c lscr.io/linuxserver/prowlarr:latest "/init" 6 seconds ago Up 5 seconds 0.0.0.0:9696->9696/tcp, [::]:9696->9696/tcp prowlarr
52c78c78f541 lscr.io/linuxserver/sonarr:latest "/init" 6 seconds ago Up 5 seconds 0.0.0.0:8989->8989/tcp, [::]:8989->8989/tcp sonarr
If the container exits a few seconds after up -d, check the logs:
docker logs prowlarr
Permission errors on /config are the usual culprit. Step 5 fixes that.
Step 5: Fix Permissions (If Needed)
Permissions are the number-one snag with media containers. Make sure your user and the media group own everything the containers touch:
sudo chown -R `yourusername`:media /docker/ && sudo chmod -R 770 /docker/
sudo chown -R `yourusername`:media /media/ && sudo chmod -R 770 /media/
Want the full background on Linux permissions and why PUID/PGID matter?
Master the Basics - Linux Permissions
Step 6: Access and Set Up Prowlarr in Your Browser
Open a browser and go to:
http://your-server-ip:9696
The setup wizard walks you through:
- Adding your Usenet and torrent indexers
- Linking your downloader (qBittorrent, SABnzbd, or NZBget) via API
- Linking Sonarr, Radarr, Lidarr via API
- Setting categories (movies to Radarr, TV to Sonarr, and so on)
- Turning on Sync so Prowlarr pushes indexers automatically
Once that’s wired up, Prowlarr becomes the single place to update every indexer in your stack.
Step 7: Keep Your Docker Software Updated
To update:
docker compose pull # Fetches the latest image
docker compose down # Stops and removes the running container
docker compose up -d # Starts a fresh container with the new image
Radarr, Sonarr, SABnzbd, and Prowlarr come back up on the latest image. No reconfig needed.
In Closing
Prowlarr plugs the biggest gap in the Arr automation chain. It keeps indexers and downloaders consistent, online, and in sync with the rest of your stack. Run it in Docker and stop touching it.
Next move: pin the LinuxServer.io image to a known-good tag (e.g. lscr.io/linuxserver/prowlarr:1.21) once you’re happy with the setup. latest is convenient until the day it isn’t.

