Skip to content

Prowlarr

Servarr Wiki GitHub · Quick start guide


Prowlarr is the indexer manager for the *arr apps. You add each indexer or tracker once in Prowlarr, and it pushes ("syncs") them to Radarr and Sonarr as their indexers. When you change an API key or add a tracker, you change it in one place.

It never downloads anything itself. Radarr/Sonarr search through the indexers Prowlarr gave them, then hand the release to qBittorrent.

Container

From the stack compose:

  #Prowlarr - manages your Sonarr, Radarr and download client
  prowlarr:
    image: lscr.io/linuxserver/prowlarr:2.6.5.5623-ls164 # pinned; Renovate bumps it
    container_name: prowlarr
    environment:
      - PUID=${PUID}
      - PGID=${PGID}
      - TZ=${TZ}
    volumes:
      - ${APPDATA_PATH}/prowlarr/config:/config
    ports:
      - 9696:9696
    restart: always
    # Servarr apps expose /ping specifically for this
    healthcheck:
      test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:9696/ping"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 30s

There is no /data mount: Prowlarr only talks to indexers and to the other apps' APIs, so it doesn't need access to media or downloads.

Prowlarr is not behind the VPN

Only qBittorrent runs inside Gluetun. Prowlarr's indexer searches go out over the normal connection. Some indexers care which IP your API calls come from; check their rules. If you need it, Prowlarr can route individual indexers through a proxy (Settings → Indexers → Indexer Proxies).

Setup

Browse to http://<YOUR_SERVER_IP>:9696.

  1. Authentication. On first start Prowlarr asks you to set it up. Choose Forms, and set Authentication Required to Enabled. Don't pick "Disabled for local addresses" if you'll ever put it behind a reverse proxy: proxied requests come from a private address and count as local.
  2. Indexers. Indexers → Add Indexer, search for your tracker/indexer, fill in its API key or credentials, and Test.
  3. Apps. Settings → Apps → +, add Radarr and Sonarr:
    • Prowlarr Server: http://prowlarr:9696
    • Radarr Server: http://radarr:7878, Sonarr Server: http://sonarr:8989
    • API Key: from each app's Settings → General.
    • Sync Level: Full Sync keeps the indexers in Radarr/Sonarr identical to Prowlarr. You then manage them only in Prowlarr.
  4. Download client (optional). Only needed if you want to grab releases from Prowlarr's own search page. Add qBittorrent at host gluetun, port 8080 (qBittorrent shares Gluetun's network, so that's where its API lives).
  5. Sync. Settings → Apps → Sync App Indexers, then check that the indexers show up in Radarr/Sonarr under Settings → Indexers with a (Prowlarr) suffix.

The containers sit on the same compose network, so they reach each other by service name.

Seeding goals

Per-indexer seed ratio / seed time goes in Prowlarr's indexer settings (Show Advanced), and Prowlarr syncs it to the apps. TRaSH recommends doing seeding limits there or in qbit_manage, not globally in qBittorrent.

Gotchas

Searches time out, Resource temporarily unavailable

Prowlarr (like Radarr and Sonarr) is a .NET app. If your DNS server hands out IPv6 (AAAA) records but the host has no IPv6 route, .NET's HttpClient doesn't fall back to IPv4 the way curl does. Every indexer test fails with SocketException (11): Resource temporarily unavailable, the UI hangs, and the health page says "Indexers unavailable due to failures". Prowlarr's own log suggests the cause: "This is typically caused by DNS/SSL issues. Check DNS settings, ensure IPv6 is working or disabled."

Fix it at the host (disable IPv6 on a host that has no IPv6 route) or per app (DOTNET_SYSTEM_NET_DISABLEIPV6=true). Both are explained in AAAA records with no IPv6 route. My hosts use the host-level fix, so the compose above has no extra variable.

Every indexer fails at once after a reboot

If all external lookups fail from inside the container but work from the host, Docker's embedded DNS (127.0.0.11) is stuck. That happens when the container started before the host's DNS was ready. Check with:

docker exec prowlarr cat /etc/resolv.conf
docker exec prowlarr getent hosts prowlarr.servarr.com

docker restart prowlarr clears it. The permanent fix is on the host. See Containers can't resolve names after a reboot.

A 429 in Sonarr/Radarr is usually Prowlarr's backoff

When an indexer keeps failing, Prowlarr puts it in a failure backoff and answers the apps with HTTP 429. Sonarr then logs a 429 from http://prowlarr:9696/... that looks like rate limiting. Look at Prowlarr's System → Status health warnings for the real error one layer up.

Sources & further reading