DiyMediaServer
Featured image of post Prowlarr Docker Compose Setup Guide (2026)

Prowlarr Docker Compose Setup Guide (2026)

Prowlarr Docker Compose setup — port 9696, one config feeds indexers to Sonarr, Radarr, Lidarr, and Readarr. Working compose file and first-run setup.

💭
TL;DR: Run Prowlarr in Docker with one Compose service, point it at your existing media stack, and let it sync indexers and downloaders to Sonarr, Radarr, Lidarr, and Readarr through the API. Configure once, never again.
💡
Tip: Default port: Prowlarr runs on port 9696. Access the web UI at 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.

Need a new HDD to keep up with your downloads?

Seagate Barracuda 24TB Internal Hard Drive

Seagate Barracuda 24TB Internal Hard Drive

Contains affiliate links. I may earn a commission at no cost to you.

Was this useful?

Last updated on May 20, 2026 06:56 MDT