NzbDAV (Core Service)¶
NzbDAV is a combined backend + frontend WebDAV service for Usenet workflows. In DUMB it runs as a single service that exposes a Web UI, a WebDAV endpoint for browsing/serving content, and a backend API used for automation.
Workflow diagram¶
%%{ init: { "flowchart": { "curve": "basis" } } }%%
flowchart TD
A([Request Sources:<br/>Seerr, Trakt,<br/>Plex Watchlist,<br/>NeutArr])
B[Arr Services:<br/>Sonarr, Radarr,<br/>Lidarr,<br/>Whisparr]
C[[Prowlarr / Indexers]]
D[NzbDAV]
E@{shape: cloud, label: "Usenet Providers"}
F[[Rclone]]
G[(WebDAV Mount Root:<br/>/mnt/debrid/<br/>nzbdav)]
H[(QBit Download Symlinks:<br/>/mnt/debrid/nzbdav/<br/>completed-symlinks)]
I[Arr Rename + Link Step:<br/>Hard Link / Symlink]
J[(Final Symlink Root:<br/>/mnt/debrid/<br/>nzbdav-symlinks)]
K([Media Servers:<br/>Plex, Jellyfin,<br/>Emby])
E === D
D === F
linkStyle 0 stroke:transparent,stroke-width:0;
linkStyle 1 stroke:transparent,stroke-width:0;
A ==> B
C <==> B
B <==> D
D e1@==> E
F e2@==> D
F e3@==> G
D ==> H
H ==> G
H ==> B
B ==> I
I ==> J
J e4@==> G
K e5@<==> J
classDef animate stroke-dasharray: 9,5,stroke-dashoffset: 900,animation: dash 25s linear infinite;
class e1,e2,e3,e4,e5 animate
Service Relationships¶
| Classification | Role |
|---|---|
| Core Service | NZB WebDAV gateway |
| Depends On | rclone |
| Optional | Sonarr, Radarr, Lidarr, Whisparr, Prowlarr, NeutArr |
| Exposes UI | Yes (Web UI + WebDAV) |
What NzbDAV provides¶
| Endpoint | Purpose | Default |
|---|---|---|
| Web UI + WebDAV | Primary UI and WebDAV endpoint | http://<host>:3000/ |
| Backend API | Internal API for DUMB automation | http://127.0.0.1:8080/ |
NzbDAV also exposes a Usenet download client path in Arr by emulating a Sabnzbd-compatible API. DUMB registers this client automatically when core_service: nzbdav (or core_service includes nzbdav) is set on Arr instances.
WebDAV endpoint
rclone and Arr download clients point at the WebDAV endpoint on the frontend port.
Configuration in dumb_config.json¶
"nzbdav": {
"enabled": false,
"process_name": "NzbDAV",
"repo_owner": "nzbdav-dev",
"repo_name": "nzbdav",
"release_version_enabled": false,
"release_version": "latest",
"branch_enabled": false,
"branch": "main",
"suppress_logging": false,
"log_level": "INFO",
"frontend_port": 3000,
"backend_port": 8080,
"auto_update": false,
"auto_update_interval": 24,
"clear_on_update": false,
"exclude_dirs": [],
"platforms": [
"pnpm",
"dotnet"
],
"command": [],
"config_dir": "/nzbdav",
"log_file": "/log/nzbdav.log",
"webdav_password": "",
"env": {}
},
Key Configuration Fields¶
enabled: Toggle to run NzbDAV via DUMB.frontend_port: Port for the Web UI and WebDAV endpoint.backend_port: Port for the backend API.webdav_password: Default WebDAV password (overridden byWEBDAV_PASSWORD).config_dir: Path where NzbDAV data is stored.log_file: Path for the consolidated NzbDAV log.env: Optional environment variables (see below).
WebDAV credentials
If webdav_password is blank, DUMB generates one at startup and stores it in the config.
Change the password before exposing NzbDAV outside your trusted network.
Environment Variables¶
LOG_LEVEL: Logging level for NzbDAV (defaults toINFO).WEBDAV_USER: Override the WebDAV username (defaults toadmin).WEBDAV_PASSWORD: Override the WebDAV password.CONFIG_PATH: Override the NzbDAV config path (defaults toconfig_dir).FRONTEND_BACKEND_API_KEY: Backend API key shared with the frontend.ASPNETCORE_URLS: Backend bind address (defaults tohttp://+:<backend_port>).PORT: Frontend port (defaults tofrontend_port).BACKEND_URL: Frontend-to-backend URL (defaults tohttp://127.0.0.1:<backend_port>).
Protect API keys
FRONTEND_BACKEND_API_KEY grants backend access. Treat it like a secret and avoid committing it to source control.
Integration with DUMB¶
When NzbDAV starts, DUMB performs several automation steps:
- Syncs Arr instance details into the NzbDAV database
- Ensures API categories exist for Arr integrations
- Creates
/mnt/debrid/nzbdav-symlinks/<category>roots - Updates Arr permissions and root folders
- Adds or updates a download client named
nzbdavin Arr
The Arr instance list is stored in NzbDAV’s SQLite config under arr.instances, so DUMB can merge user edits with auto-detected instances.
Startup timing
If the NzbDAV backend is not reachable yet, DUMB retries the download-client setup shortly after startup.
Arr core_service setting¶
For Sonarr/Radarr/Lidarr/Whisparr instances you want wired to NzbDAV, set
core_service to nzbdav or include it in a list:
"core_service": "nzbdav"
"core_service": ["decypharr", "nzbdav"]
This tells DUMB to auto-configure Arr integration around NzbDAV’s WebDAV and download-client workflows.
See Core Service Routing for how core_service affects automation.
1. rclone WebDAV Mount¶
Create a dedicated rclone instance for NzbDAV and point it at the WebDAV endpoint:
"rclone": {
"instances": {
"NzbDAV": {
"enabled": true,
"core_service": "nzbdav",
"process_name": "rclone w/ NzbDAV",
"suppress_logging": false,
"log_level": "INFO",
"key_type": "NzbDAV",
"zurg_enabled": false,
"decypharr_enabled": false,
"mount_dir": "/mnt/debrid",
"mount_name": "nzbdav",
"config_dir": "/config",
"config_file": "/config/rclone.config",
"log_file": "/log/rclone_w_nzbdav.log",
"zurg_config_file": "",
"cache_dir": "/cache",
"command": [],
"api_key": ""
}
}
}
When key_type is set to NzbDAV, DUMB configures rclone to use:
http://127.0.0.1:<frontend_port>/as the WebDAV URLWEBDAV_USER/WEBDAV_PASSWORD(or the values stored in the NzbDAV DB)
Default rclone mount path (if not overridden) is:
/mnt/debrid/nzbdav
2. Arr Integration (Sonarr/Radarr)¶
Set core_service to nzbdav (or include nzbdav in a list) for the Sonarr and
Radarr instances you want wired to NzbDAV:
"sonarr": {
"instances": {
"Default": {
"enabled": true,
"core_service": "nzbdav",
"port": 8989
}
}
},
"radarr": {
"instances": {
"Default": {
"enabled": true,
"core_service": "nzbdav",
"port": 7878
}
}
}
DUMB will:
- Create symlink roots at
/mnt/debrid/nzbdav-symlinks/<category> - Configure NzbDAV to recognize these paths
- Update Arr permissions (enable chmod + set folder/file modes)
- Attempt to add an
nzbdavdownload client in the Arrs using their API keys
When core_service includes both decypharr and nzbdav, the root folder base
shifts to /mnt/debrid/combined_symlinks/<category>.
Automatic vs manual wiring
When core_service is set to nzbdav (or includes it), DUMB
automatically configures download clients, root folders, and permissions.
If core_service includes both decypharr and nzbdav, the Arr root folder
base switches to /mnt/debrid/combined_symlinks/<category>.
Manual setup is only needed when core_service is blank or you want to override
the combined workflow wiring.
Category mapping¶
By default, DUMB maps Arr types to categories:
| Arr service | Default category |
|---|---|
| Radarr | movies |
| Sonarr | tv |
| Lidarr | music |
| Whisparr | whisparr |
Instance names are slugified into categories if present (for example, Radarr 4K becomes radarr-4k).
Accessing the UI¶
- Navigate to:
http://<host>:<frontend_port>(default port3000) - WebDAV endpoint:
http://<host>:<frontend_port>/
Port conflicts and auto-shift
NzbDAV defaults (3000/8080) overlap with Riven defaults. DUMB can auto-shift
conflicting ports at container startup or during the onboarding core-service
start flow, updating dumb_config.json accordingly.
Per-service stop/start/restart does not re-run port conflict resolution, so fix
conflicts manually before restarting a single service.
Troubleshooting Tips¶
Permission changes
DUMB updates Arr media-management permissions to enable chmod operations (folder 777, file 666).
If you manage permissions manually, review these settings after integration.
- If rclone fails to authenticate, verify
WEBDAV_USER/WEBDAV_PASSWORDand restart the container. - If Arr download clients are not created, confirm each Arr instance is enabled and has a readable
config.xmlfor API key discovery. - If Arr root folders are missing, verify
core_serviceincludesnzbdavand the Arr API is reachable. - Check
/logfor NzbDAV startup errors, and ensurefrontend_port/backend_portare not already in use.