nzbfast on Synology

One container gives you the full dashboard, the SABnzbd/NZBGet API for Sonarr & Radarr, and the built-in indexer. Search, download, map three folders, done.

nzbfast runs on DSM 7 as a Docker container through Container Manager (on DSM 6 the same app is called Docker). The image is multi-arch, so it runs unchanged on both Intel and ARM Synology models.

Two registries, one image. The identical image lives on Docker Hub as nzbfast/nzbfast (the one Container Manager can search) and on GitHub as ghcr.io/nzbfast/nzbfast. Use whichever you like. This guide uses the Docker Hub name.

First: your PUID / PGID · 30 seconds

The container writes downloads as a specific user ID so the files belong to you, not to root. Find yours once:

  1. Enable SSH

    Control Panel → Terminal & SNMP → tick Enable SSH service.

  2. Read your IDs

    SSH in and run:

    id your_dsm_username

    Note the uid= and gid= numbers. On most Synology boxes the first user is uid=1026 and the group users is gid=100, but use whatever id prints. You can turn SSH back off afterwards.

Route A: Container Manager Project recommended

One file you can back up, re-use, and update with a single click. This is the route to take if you want nzbfast to keep itself up to date.

The quickest version. Download docker-compose.yml, upload it into a folder on your NAS with File Station (e.g. /docker/nzbfast), edit the three values at the top, and create a Project pointing at that folder. The steps below are the same thing done by hand.
  1. Create the project

    File Station → make the project folder, e.g. /docker/nzbfast. Then Container Manager → ProjectCreate, name it nzbfast, path /docker/nzbfast, source Create docker-compose.yml.

  2. Paste this

    services:
      nzbfast:
        image: nzbfast/nzbfast:latest
        container_name: nzbfast
        restart: unless-stopped
        ports:
          - "6789:6789"
        environment:
          - PUID=1026          # your uid  (id your_dsm_username)
          - PGID=100           # your gid
          - TZ=Europe/London   # your timezone
          # - NZBFAST_APIKEY=change-me   # only if you'll connect Sonarr/Radarr
        volumes:
          - ./config:/config          # settings + index database
          - ./downloads:/downloads    # finished files - change this line if you
                                      # also run Sonarr or Radarr, see below
          - ./watch:/watch            # drop an .nzb here to auto-download
        # Takes away powers the container has by default and does not use.
        # The five it does need are added back by name: without them it
        # cannot hand your folders to your DSM user and will not start.
        cap_drop: [ALL]
        cap_add: [CHOWN, DAC_OVERRIDE, FOWNER, SETGID, SETUID]
        security_opt: [no-new-privileges:true]
    
      # Optional: checks nightly for a newer nzbfast image and recreates
      # the container when one ships. Needs the Docker socket; delete this
      # service to update by hand, or on a DSM schedule instead.
      watchtower:
        image: nickfedor/watchtower
        container_name: nzbfast-watchtower
        restart: unless-stopped
        environment:
          - TZ=Europe/London   # same timezone, so the schedule below is your 04:00
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
        command: --cleanup --schedule "0 0 4 * * *" nzbfast   # daily 04:00, nzbfast only

    The ./config, ./downloads and ./watch folders are created for you inside the project folder.

  3. Finish the wizard

    Container Manager pulls the images and starts them. Then jump to First run below.

About that last service. Watchtower is what keeps nzbfast current, and it needs the Docker socket to recreate containers. Mounting /var/run/docker.sock gives that container root-equivalent control of your NAS, so it is a real trade: convenience against handing one container broad power. If you would rather not make it, delete the watchtower block and take the scheduled-task route below instead. It is scoped to the nzbfast container by the name at the end of the command line, so it will never touch your other containers.

Auto-update without the Docker socket

DSM can do the same job on a schedule, and nothing needs the socket mounted. Delete the watchtower service from the compose file, then:

  1. Create the task

    Control Panel → Task SchedulerCreateScheduled TaskUser-defined script. Name it something like nzbfast update and set User to root, which Docker commands need. Schedule it daily, at a quiet hour.

  2. Give it this command

    cd /volume1/docker/nzbfast && docker compose pull && docker compose up -d

    Adjust the path to your project folder. On DSM 7.1 and older the command is docker-compose (with the hyphen) rather than docker compose.

The trade here runs the other way: the task itself runs as root, but nothing gains standing access to the Docker socket, and you can read exactly what it does.

Route B: Container Manager, search and click

No text files at all. The trade-off: a container built this way cannot auto-update, because Container Manager's volume picker only browses shared folders and so cannot mount the Docker socket that Watchtower needs. You update it by hand, a few clicks each release.

  1. Make the folders

    File Station → create a shared folder or sub-tree for the container's data, e.g.:

    /docker/nzbfast/configsettings + index database
    /docker/nzbfast/downloadsfinished files land here (but see Sonarr and Radarr if you run them)
    /docker/nzbfast/watchdrop an .nzb here to auto-download it
  2. Get the image

    Container Manager → Registry → search nzbfast → select nzbfast/nzbfastDownload → tag latest.

  3. Create the container

    Container Manager → Image → select nzbfast/nzbfast:latestRun. In the wizard:

    • General: turn on Enable auto-restart.
    • Port: map local 6789 → container 6789 (change the local side only if 6789 is taken).
    • Volumes: add three folder mounts:
    Folder (on your NAS)Mount path
    /docker/nzbfast/config/config
    /docker/nzbfast/downloads/downloads
    /docker/nzbfast/watch/watch
    • Environment: add these variables:
    VariableValue
    PUIDyour uid (e.g. 1026)
    PGIDyour gid (e.g. 100)
    TZyour timezone, e.g. Europe/London
  4. Run it

    Then jump to First run below.

First run: add your provider

There is no config file to edit. Open http://YOUR_NAS_IP:6789. A Welcome panel asks for your Usenet server. Enter the host, username, password and connection count from your provider's welcome email and save. It applies immediately, no restart. Drop an .nzb on the dashboard (or into the watch folder) and it downloads.

Sonarr and Radarr: where downloads have to live

Skip this if you do not run them. If you do, it decides whether every import is instant or is a full copy of a 5-50 GB release, and on NAS hardware a copy is the slowest thing in the chain.

An arr imports by renaming the files into your library when downloads and library share a filesystem, and by copying then deleting when they do not. Docker decides that more bluntly than the disk does: two separate mounts look like two filesystems to a container even when one volume sits underneath. On a DiskStation /docker and your media share are different shared folders by construction, so the folders above produce the copy case by default.

Put both under one shared folder instead. If your library lives in a shared folder called data:

/volume1/data/usenetnzbfast downloads here
/volume1/data/mediayour Sonarr/Radarr library

Mount it into nzbfast at the same path on both sides - in the compose file, - /volume1/data/usenet:/volume1/data/usenet in place of the downloads line, plus - NZBFAST_OUT=/volume1/data/usenet under environment:.

Both halves matter. The shared root is what makes the import a rename. The identical path is what makes it happen at all: nzbfast tells your *arr where a finished job is, so that path has to mean the same thing inside their container as inside nzbfast's. Map it somewhere else and the download just sits in the queue while the *arr reports a remote path mapping error, with nothing actually wrong with the files.

Give nzbfast usenet only, not the whole data folder - it has no business in your library, and the rename still works because it is your *arr that moves the files and it sees both sides. There is no incomplete folder to make: SABnzbd needs one because it writes there and moves everything when a job finishes, while nzbfast writes at the final path from the first article on. A SAB migrant has two filesystem boundaries to get right here and you have exactly one. TRaSH keep a DSM-specific guide too: trash-guides.info.

Connecting Sonarr / Radarr

nzbfast speaks the SABnzbd API. In your *arr app, add a SABnzbd download client: Host = your NAS IP, Port = 6789, API Key = the value you set in NZBFAST_APIKEY. It also exposes the NZBGet JSON-RPC API for NZBGet remotes such as LunaSea; nzb360 connects with the same SABnzbd settings as the *arrs.

Updating

The image is the update channel: nzbfast in a container never swaps its own binary, you move it forward by pulling a newer image. Your config and downloads survive, because they live in your NAS folders and not inside the container.

Check your image tag first. All of the above assumes your container is on nzbfast/nzbfast:latest. If it is pinned to a version, say :1.0.3, then neither Watchtower nor a re-pull will ever move it: both fetch the tag the container was created with. Container Manager → ContainerDetails shows which one you have.

Troubleshooting

Which models? Any DSM 7 unit with Container Manager (most DSM 6 units with Docker), Intel or ARM64. Very low-end ARMv7/32-bit models aren't supported. Same image also runs on Unraid, TrueNAS SCALE and QNAP Container Station.