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
par2andunrar. - 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=/dockeris the root folder where Docker stores persistent config.DOWNLOADS_PATH=/media/downloadsis 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
tvandmoviesso Sonarr and Radarr can route downloads - Grab the API key from
Config > Generalfor 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.
