Split RDTClient: Sonarr Cache-Only vs Radarr Open Slots
Why: Sonarr's automated grabs kept wasting TorBox debrid slots on uncached TV episodes; we wanted to apply the "only download cached" restriction to Sonarr while leaving Radarr (and manual adds) free to use live torrent slots — but RDTClient's cache toggle is global, so you can't split the behavior inside a single instance.
The solution is a second, parallel RDTClient instance. One is the strict bouncer for Sonarr (cache-only, downloads straight to the TV drive), and the other is the open door for Radarr (full slots, downloads straight to the Movies drive). The bonus: by landing downloads directly on the correct media drive from the start, Sonarr and Radarr can perform instant atomic moves rather than cross-drive copies — the file never moves between physical platters.
1. New download directories
Created one inbox folder on each media drive, both owned by the plex user:
/media/plex2/torbox_downloads— RDTClient-TV's download target (Sonarr pipeline)/media/plex1/torbox_downloads— RDTClient-Movies' download target (Radarr pipeline)/home/plex/rdtclient-movies/db— RDTClient-Movies database
2. RDTClient-Movies container
Deployed a second RDTClient instance from /home/plex/rdtclient-movies/docker-compose.yml using docker compose up -d (outside Portainer, since this is a clean new container). It is running on port 6501 (host) → 6500 (container), with its own isolated database. At this point it has no TorBox API key — that must be entered through the web UI.
3. Portainer stack updates still needed
Three existing Portainer stacks need their compose YAML updated to change volume mappings. The key change for Sonarr and Radarr is replacing two separate bind mounts with a single root-of-drive mount — this is what allows the instant atomic move rather than a cross-mount copy. See the complete YAML blocks and UI checklist in the conversation where this work was started.
Summary of volume changes per stack:
- rdtclient (TV):
/media/plex3/Inbox→/data/downloadschanges to/media/plex2/torbox_downloads→/data/downloads - sonarr: replaces
/media/plex2/TV:/tv+/media/plex3/Inbox:/data/downloadswith a single/media/plex2:/datamount - radarr: replaces
/media/plex1/Movies:/movies+/media/plex3/Inbox:/data/downloadswith a single/media/plex1:/datamount
4. In-app UI steps still needed
- RDTClient-Movies (port 6501): Enter TorBox API key; confirm "Only download available files on debrid provider" is unchecked.
- RDTClient (TV, port 6500): Confirm the "only cached" box remains checked; no path change needed inside the app since the container path stays
/data/downloads. - Sonarr: Update root folder from
/tvto/data/TV. Add a Remote Path Mapping: hostrdtclient, remote path/data/downloads, local path/data/torbox_downloads. - Radarr: Update root folder from
/moviesto/data/Movies. Update download client port from 6500 to 6501. Add a Remote Path Mapping: hostrdtclient-movies, remote path/data/downloads, local path/data/torbox_downloads.
Once complete, Sonarr will silently reject all uncached grabs at the rdtclient bouncer, while Radarr (and manual torrent adds) can use all live TorBox slots — and both apps will perform instant moves instead of slow cross-drive copies.
5. Series and movie path migration (follow-up)
After the volume remapping, Sonarr and Radarr still had their per-item paths set to the old container mount points (/tv/Show Name and /movies/Movie Name). Sonarr confirmed this with "Root folder missing" errors on first import. The root folders themselves were correct — it was the 247 series and 7 movie records that still referenced the dead paths.
Fixed by stopping each container and running a direct SQLite update:
- Sonarr:
UPDATE Series SET Path = '/data/TV' || SUBSTR(Path, 4) WHERE Path LIKE '/tv/%'— 247 rows - Radarr:
UPDATE Movies SET Path = '/data/Movies' || SUBSTR(Path, 8) WHERE Path LIKE '/movies/%'— 7 rows
No files were moved. The physical media on /media/plex2/TV and /media/plex1/Movies was untouched — only the path strings in the app databases were corrected. Plex was unaffected throughout.