DiyMediaServer
Featured image of post How To Install SABnzbd in Docker

How To Install SABnzbd in Docker

Usenet Downloads, Done Right

If you’re getting into Usenet, you’ll run into SABnzbd fast. Radarr and Sonarr decide what to download and when. SABnzbd handles the how. It grabs NZB files from your indexer, repairs and unpacks them, then drops the finished files into your media library.

And the best part? Once it’s configured, it hums quietly in the background and you stop thinking about it.

Why SABnzbd Is a Core Part of Your Media Stack

Here’s why SABnzbd still wins:

  • Free and open source. No premium licenses or paywalls. Fully featured out of the box.
  • Handles everything automatically. Repair, extract, and cleanup using built-in par2 and unrar.
  • Custom categories. Route TV, movies, and music into separate folders so Sonarr, Radarr, and Lidarr each get their own pile.
  • Web interface. Clean, responsive UI for managing and monitoring downloads from any device.
  • API and script support. Post-processing scripts plus first-class integration with the *arr stack.

If you’re on Usenet, this is the download client you want.

Why Run SABnzbd in Docker?

Docker keeps SABnzbd clean and portable:

  • Cleaner installs. No Python dependencies or package conflicts on the host.
  • Effortless updates. Pull the latest image and recreate the container.
  • Easy to move. Switching servers? Copy the config folder and the compose file. Done.
  • Better separation. Your download service stays sandboxed from the rest of the system.

Step 1: Install Docker

You’ll need Docker on your server. If you don’t have it yet, follow this guide: Master the Basics - How to Install Docker

Step 2: Create or Modify Your Docker Compose File

Time to add SABnzbd to your stack. The file below runs SABnzbd on its own. Already running Sonarr and Radarr in a Compose file (say, from my Sonarr guide)? Just drop the sabnzbd: 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:
  #################################
  # SABNZBD
  #################################
  sabnzbd:
    # Official LinuxServer.io SABnzbd image
    image: lscr.io/linuxserver/sabnzbd:latest
    # Friendly name for the container
    container_name: sabnzbd
    # Pulls PUID, PGID, UMASK, TZ, ports, and paths from the .env file
    env_file: .env
    ports:
      # Maps the host port to SABnzbd's web UI (8080) inside the container
      - ${SABNZBD_PORT}:8080
    volumes:
      # SABnzbd's config (persists across restarts)
      - ${CONFIG_PATH}/sabnzbd:/config
      # Shared download folder (must be the same path Sonarr and Radarr use)
      - ${DOWNLOADS_PATH}:/downloads
    healthcheck:
      # Lets `docker ps` show "healthy" once the UI starts answering
      test: wget --no-verbose --tries=1 --spider http://localhost:8080/ || exit 1
      start_period: 30s
      timeout: 3s
      interval: 30s
      retries: 3
    networks:
      # Joins the shared media network
      - 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: Watch the indentation. YAML is picky. Two spaces per level, never a tab.

Step 3: Customize the .env File

Open the .env File

nano /docker/.env

The content of the .env file 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

Update the paths to match your setup:

  • CONFIG_PATH=/docker is the root folder where Docker stores persistent config.
  • DOWNLOADS_PATH=/downloads is where your download client writes both incomplete and finished files.

Sonarr, Radarr, and SABnzbd all need to see the same /downloads path inside their containers. SABnzbd writes finished files there, and Sonarr and Radarr copy them into your library on import. As long as all three mount the download drive at the identical /downloads path, the apps find what SABnzbd finished with no remote path mapping.

Also update the timezone (TZ) to match yours. The full list lives here: valid timezones (Wikipedia).

Step 4: Start SABnzbd

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 container online:

docker compose up -d

Check it’s running:

docker ps

You should see sabnzbd in the list:

CONTAINER ID   IMAGE                                COMMAND   CREATED          STATUS                 PORTS                                         NAMES
d152d14e3fe3   lscr.io/linuxserver/sabnzbd:latest  "/init"   15 seconds ago   Up 11 seconds (healthy) 0.0.0.0:8080->8080/tcp, [::]:8080->8080/tcp   sabnzbd

If the container isn’t there, check what happened:

docker compose logs sabnzbd

Step 5: Fix Permissions (If Needed)

Permissions trip up everyone the first time. The PUID/PGID inside the container have to actually own the host directories, or SABnzbd can’t write to them. Fix it like this:

sudo chown -R `yourusername`:media /docker/ && sudo chmod -R 770 /docker/
sudo chown -R `yourusername`:media /media/ && sudo chmod -R 770 /media/

For the full breakdown of why this works, read this: Master the Basics - Linux Permissions

Step 6: Set Up SABnzbd in Your Browser

Open a web browser and visit:

http://your-server-ip:8080

Follow the setup wizard to:

  • Add your Usenet provider’s server info (host, port, username, password, connections)
  • Set up download folders
  • Create categories like tv and movies so Sonarr and Radarr can route downloads
  • Grab the API key from Config > General for Sonarr and Radarr to talk back

Once that’s done, SABnzbd is the download engine for the rest of the 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

SABnzbd comes back up on the latest image with all your config intact.

In Closing

SABnzbd is the workhorse behind Usenet downloads. Pair it with Sonarr and Radarr and you have a media stack that runs itself. Running it in Docker keeps the install clean, makes upgrades a one-liner, and lets you move the whole thing between servers without rebuilding.

If something breaks after this, the two places to look first are container logs (docker compose logs sabnzbd) and host directory permissions on /docker and /media. Nine times out of ten, that’s where the problem is.

Was this useful?

Last updated on Jun 22, 2026 00:00 UTC