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. This post assumes you already have a docker-compose.yml with Sonarr and Radarr in it. If you don’t, start here first: 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 add the SABnzbd block. Here’s the full file with Sonarr, Radarr, and SABnzbd together so you can see how it fits:

services:

  #################################
  ##  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 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: 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
# 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

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

Update the paths to match your setup:

  • CONFIG_PATH=/docker is the root folder where Docker stores persistent config.
  • DOWNLOADS_PATH=/media/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. That’s how hardlinks and atomic moves work without re-copying files across filesystems.

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

Step 4: Start SABnzbd

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
c8d2c60a955b   lscr.io/linuxserver/sonarr:latest   "/init"   54 seconds ago   Up 53 seconds   0.0.0.0:8989->8989/tcp, [::]:8989->8989/tcp   sonarr
ff12a474a4fe   lscr.io/linuxserver/radarr:latest   "/init"   54 seconds ago   Up 53 seconds   0.0.0.0:7878->7878/tcp, [::]:7878->7878/tcp   radarr
d152d14e3fe3   lscr.io/linuxserver/sabnzbd:latest  "/init"   15 seconds ago   Up 11 seconds   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

Sonarr, Radarr, and SABnzbd come back up on the latest images 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 May 20, 2026 06:56 MDT