How To Install SABnzbd in Docker
Usenet Downloads, Done Right

If you’re diving into the world of Usenet, you’ll learn of SABnzbd existence immediately and for good reason. While tools like Radarr and Sonarr handle the what and when part of downloading, SABnzbd takes care of the how. SABnzbd is the download engine that grabs NZB files from your indexer, handles repairs and unpacking, and drops the final product into your media library.
And the best part? It just works. Once configured, SABnzbd hums quietly in the background, handling downloads with zero fuss.
Why SABnzbd Is a Core Part of Your Media Stack
Here’s why SABnzbd remains a fan favorite:
- 100% Free and Open Source – No premium licenses or paywalls. It’s fully featured out of the box.
- Handles Everything Automatically – SABnzbd can repair, extract, and even clean up files after download using built-in tools like par2 and unrar.
- Custom Categories – Create custom routing rules for different media types so that Radarr, Sonarr, and Lidarr can each get their own download folders.
- Web Interface – Clean, responsive UI for managing and monitoring downloads from any device.
- API + Script Support – Want to customize behavior? SABnzbd supports post-processing scripts and integrates easily with tools like Radarr and Sonarr.
If you’re using Usenet, SABnzbd is the no-brainer choice for managing your downloads.
Why Run SABnzbd in Docker?
Docker makes SABnzbd easier to manage and more portable:
- Cleaner Installs – No Python dependencies or package conflicts.
- Effortless Updates – Updating is as easy as pulling the latest image.
- Easy to Move – Need to switch servers? Just copy your config folder and go.
- Better Separation – Keep your download service sandboxed from the rest of your system.
Step 1: Install Docker
To get started, you’ll need Docker installed on your server.
Check out this guide for step-by-step instructions: Master the Basics - How to Install Docker on Ubuntu 24.04.
Step 2: Create or Modify Your Docker Compose File
Let’s define your Radarr container using docker-compose.yml
. In this post we will be adding Radarr to our existing docker-compose.yml
that contains the settings for Sonarr.
Post: 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, copy and paste the Radarr Section:
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 (change this path!)
- ${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}
- 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 (change this path!)
- ${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}
- 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 (change this path!)
- ${CONFIG_PATH}/sabnzbd:/config
# Directory where incomplete downloads are stored
- ${DOWNLOADS_PATH}:/downloads
environment:
- PUID=${PUID}
- PGID=${PGID}
- 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: Make sure the spacing is correct. YAML is very picky about spacing. The key is that each indent is two spaces not 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 SABnzbd file paths as needed. Here’s what to change:
-
CONFIG_PATH=/docker
→ Root folder where Docker stores persistent files. -
DOWNLOADS_PATH=/media/downloads
→ Root folder where your download client stores temp/incomplete files
Make sure the SABnzbd container access to the /downloads
path.
Also update the timezone (TZ) to match yours.
Refer to: this list of valid timezones.
Step 4: Start SABnzbd
Bring your new SABnzbd container online:
docker compose up -d
Check it’s running:
docker ps
You should see sabnzbd
in the list of containers:
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
Step 5: Fix Permissions (If Needed)
Permissions issues are a common snag with media containers. Here’s how to make sure everything plays nice:
sudo chown -R `yourusername`:media /docker/ && sudo chmod -R 770 /docker/
sudo chown -R `yourusername`:media /media/ && sudo chmod -R 770 /media/
Check out this post if you want to learn more about Linux permissions:
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
- Set up download folders
- Create categories like
tv
andmovies
- Configure API keys for Radarr and Sonarr
Once connected, SABnzbd becomes the download engine for your automated stack.
Step 7: Keep Your Docker Software Updated
To updat:
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
Radarr, Sonarr, and SABnzbd will restart with the latest version, no reconfig needed.
In Closing
SABnzbd is the workhorse behind Usenet downloads. It’s reliable, fast, and customizable. When paired with Radarr and Sonarr, it forms the core of an automated media server setup.
By running it in Docker, you keep things clean, portable, and easy to maintain. Once set up, SABnzbd quietly handles the heavy lifting while your media library manages itself. Just how it should be.
If you’re serious about automation and want a hands-off experience with your downloads, SABnzbd is non-negotiable.