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

Prowlarr Docker Compose Setup Guide (2026)

Prowlarr Docker Compose setup on 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. The file below runs Prowlarr on its own. Already running the rest of the stack (say, from my Sonarr guide)? Just drop the prowlarr: service into your existing services: block and reuse the same media_network instead of pasting the whole thing.

Open the Compose File

Open your existing docker-compose.yml or create a new one:

nano /docker/docker-compose.yml

Paste this in:

services:
  #################################
  # PROWLARR
  #################################
  prowlarr:
    # Official LinuxServer.io Prowlarr image
    image: lscr.io/linuxserver/prowlarr:latest
    # Friendly name for the container
    container_name: prowlarr
    # Pulls PUID, PGID, UMASK, TZ, ports, and paths from the .env file
    env_file: .env
    ports:
      # Maps the host port to Prowlarr's web UI (9696) inside the container
      - ${PROWLARR_PORT}:9696
    volumes:
      # Prowlarr's config and database (persists across restarts)
      # Prowlarr only manages indexers, so it needs no media or downloads mounts
      - ${CONFIG_PATH}/prowlarr:/config
    healthcheck:
      # Lets `docker ps` show "healthy" once the UI starts answering
      test: wget --no-verbose --tries=1 --spider http://localhost:9696/ping || exit 1
      start_period: 30s
      timeout: 3s
      interval: 30s
      retries: 3
    networks:
      # Joins the shared media network so it can reach Sonarr/Radarr by name
      - media_network
    # Restart automatically unless you stop it yourself
    restart: unless-stopped

#################################
# NETWORK
#################################
networks:
  media_network:
    # Shared network, created once with: docker network create media_network
    name: media_network
    external: true

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
# Main group ID:
PGID=1001
# File permission mask
UMASK=0007

# Timezone (Ensures correct scheduling and logs)
TZ=America/Denver

# Define Ports (Ports for each container are defined here)
RADARR_PORT=7878
SONARR_PORT=8989
SABNZBD_PORT=8080
PROWLARR_PORT=9696
BAZARR_PORT=6767

# Data Directories (Keeps storage paths centralized)
CONFIG_PATH=/docker
DOWNLOADS_PATH=/downloads
MEDIA_PATH=/media/Storage

Step 4: Start Prowlarr

The Compose file attaches to an external network called media_network, so create it once before you bring the stack up:

docker network create media_network

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
604d2ed3850c   lscr.io/linuxserver/prowlarr:latest   "/init"   6 seconds ago   Up 5 seconds  (healthy)   0.0.0.0:9696->9696/tcp, [::]:9696->9696/tcp   prowlarr

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

Prowlarr comes 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.

Building the whole automation stack rather than one app at a time? The complete arr stack Docker Compose guide wires Prowlarr, Radarr, Sonarr, and Bazarr together in a single file.

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 Jun 22, 2026 00:00 UTC