β οΈ OUTDATED CONTENT, MIGHT STILL WORK BUT CAUTION
The updated guide was lost during a VPS provider failure.
No backup exists - working to recreate from memory, will take some time because I have been working on other projects and Plex isn't one of them.
This current version was recovered from The Wayback Machine so it might look a little different because I don't have the original markdown text.
π Credit Where Credit is Due: This guide is adapted from Sailarr's Guide by Puks, originally designed for Realdebrid. I've modified it to work with Torbox WebDAV. A big thank you to Puks the Pirate for the original content, with adjustments made to address specific needs and issues encountered.
This comprehensive guide demonstrates how to successfully integrate Torbox with Sonarr, Radarr, and Plex using Saltbox. It's designed to help you set up a powerful, automated media server system that will revolutionize your home entertainment experience.
π§ What is Saltbox?: As described on their website, Saltbox is "an Ansible and Docker based solution for rapidly deploying a cloud media server using LTS releases of Ubuntu Server 20.04, 22.04 or 24.04, running on AMD64. Non-LTS releases of Ubuntu or Desktop installs are not supported. Linux distributions other than Ubuntu are not supported. ARM processors, Raspberry Pi notably, are not supported."
Before diving into the setup, ensure you have the following:
π‘ Pro Tip: Use my referral code
d0ea9c77-cfe0-4f5b-8dfc-21829d48b872
when signing up for Torbox to get an extra 7 days on any plan you choose. I'll get extra time too - it's a win-win!
π― Tip: Choose the "Saltbox" install type for a complete setup that includes all necessary components.
After installation, you'll be able to access Plex, Sonarr, and Radarr via your domain (e.g., https://plex.yourdomain.com
).
π Internal Access: For internal access, use
http://instancename:port
(e.g.,http://sonarr:8989
).
Create the necessary directories for your media:
mkdir -p /mnt/unionfs/Media/{TV,Movies,Anime,Music}
Map these as root folders in your Plex libraries and in Sonarr/Radarr settings.
Set up symlink folders for Sonarr and Radarr:
mkdir -p /mnt/symlinks/{radarr,sonarr}
These directories will be used by Sonarr, Radarr and blackhole.
For optimal Sonarr and Radarr setup, follow the comprehensive Trash Guides. These guides provide best practices for configuring your sonarr and radarr.
β οΈ Important: Ensure you have an active Torbox account before proceeding with this step.
mkdir /opt/torbox && cd /opt/torbox
nano docker-compose.yml
Paste the following content (no edits needed):
services:
torbox:
image: rclone/rclone:latest
container_name: torbox
restart: unless-stopped
environment:
TZ: Europe/Berlin
PUID: 1000
PGID: 1000
UMASK: 002
volumes:
- /mnt/remote/torbox:/data:rshared
- /opt/torbox/rclone.conf:/config/rclone/rclone.conf
- /mnt:/mnt:rslave
cap_add:
- SYS_ADMIN
security_opt:
- apparmor:unconfined
devices:
- /dev/fuse:/dev/fuse:rwm
command: "mount torbox: /data --cache-dir /mnt/remote/cache/torbox --vfs-fast-fingerprint --rc --rc-addr :5573 --rc-no-auth --allow-other --allow-non-empty --async-read=true --dir-cache-time=15s --buffer-size=48M --poll-interval=15s --use-mmap --vfs-read-ahead=96M --vfs-read-chunk-size=32M --vfs-read-chunk-size-limit=32M --vfs-cache-max-age=672h --vfs-cache-mode=full --vfs-cache-poll-interval=15s --vfs-cache-max-size=5G --timeout=10m --umask=002 --log-level INFO --vfs-refresh --gid=1000 --uid=1000"
rclone config
Follow these steps:
torbox
webdav
as the Remote Typerclone
as the Vendorhttps://webdav.torbox.app
as the URLcp ~/.config/rclone/rclone.conf /opt/torbox/rclone.conf
docker compose up -d
Credit to west for the blackhole script.
cd /opt
git clone https://github.com/westsurname/scripts.git blackhole
cd blackhole
nano .env
π API Key Locations: You can find your API keys for Sonarr and Radarr in
Settings > General
. The API key for Torbox is available in the Torbox settings.
# Server Configuration
SERVER_DOMAIN=<your_domain>
# Plex Configuration
PLEX_HOST="https://plex.tv/"
PLEX_METADATA_HOST="https://metadata.provider.plex.tv/"
PLEX_SERVER_HOST=<plex_server_host>
PLEX_SERVER_MACHINE_ID=<plex_server_machine_id>
PLEX_SERVER_API_KEY=<plex_server_api_key>
PLEX_SERVER_MOVIE_LIBRARY_ID="0"
PLEX_SERVER_TV_SHOW_LIBRARY_ID="0"
# Overseerr Configuration
OVERSEERR_HOST="https://overseerr:5055"
OVERSEERR_API_KEY="<your_overseerr_api_key>"
# Sonarr Configuration
SONARR_HOST="http://sonarr:8989"
SONARR_API_KEY="<your_sonarr_api_key>"
SONARR_ROOT_FOLDER="/mnt/unionfs/Media/TV"
# Radarr Configuration
RADARR_HOST="http://radarr:7878"
RADARR_API_KEY="<your_radarr_api_key>"
RADARR_ROOT_FOLDER="/mnt/unionfs/Media/Movies"
# Tautulli Configuration
TAUTULLI_HOST="http://tautulli:8181"
TAUTULLI_API_KEY="<your_tautulli_api_key>"
# Real Debrid Configuration
REALDEBRID_ENABLED=false
REALDEBRID_HOST="https://api.real-debrid.com/rest/1.0/"
REALDEBRID_API_KEY="<your_real_debrid_api_key>"
REALDEBRID_MOUNT_TORRENTS_PATH="/mnt/remote/realdebrid/torrents"
# Torbox Configuration
TORBOX_ENABLED=true
TORBOX_HOST="https://api.torbox.app/v1/api/"
TORBOX_API_KEY="<your_torbox_api_key>"
TORBOX_MOUNT_TORRENTS_PATH="/mnt/remote/torbox"
# Blackhole Configuration
BLACKHOLE_BASE_WATCH_PATH="/mnt/symlinks"
BLACKHOLE_RADARR_PATH="radarr"
BLACKHOLE_SONARR_PATH="sonarr"
BLACKHOLE_FAIL_IF_NOT_CACHED=false
BLACKHOLE_RD_MOUNT_REFRESH_SECONDS=600
BLACKHOLE_WAIT_FOR_TORRENT_TIMEOUT=60
BLACKHOLE_HISTORY_PAGE_SIZE=500
# General Configuration
PYTHONUNBUFFERED=TRUE
PUID=1000
PGID=1000
UMASK=002
DOCKER_NETWORK="saltbox"
DOCKER_NETWORK_EXTERNAL=true
nano docker-compose.yml
Paste the following content:
#-----------------------------------------------------------------------------------#
# created βββββββ βββββββ ββββ βββββββββββ βββββββ ββββββββββββββββ #
# by @west ββββββββββββββββββββββ ββββββββββββββββββββββββββββββββββββββ #
# βββ βββ βββββββββββββββββββββββββ βββββββββββββββββ #
# βββ βββ βββββββββββββββββββββ βββ βββββββββββββββββ #
# β βββββββββββββββββββ βββ ββββββ βββββββββββββββββββββββββ #
# βββββββ βββββββ βββ ββββββ βββββββ ββββββββββββββββ #
# #
# COMMANDS: #
# docker compose --profile {tag} up -d #
# TAGS: #
# all = all containers in the compose #
# blackhole,blackhole_4k,blackhole_anime,blackhole_mux, blackhole_all = blackhole #
# repair, repair_4k, repair_anime, repair_mux repair_all = repair #
#-----------------------------------------------------------------------------------#
x-blackhole: &blackhole
build:
context: .
dockerfile: Dockerfile.blackhole
image: ghcr.io/westsurname/scripts/blackhole:latest
pull_policy: always
user: "${PUID:-}${PGID:+:${PGID}}"
env_file:
- .env
restart: unless-stopped
x-repair: &repair
build:
context: .
dockerfile: Dockerfile.scripts
image: ghcr.io/westsurname/scripts/scripts:latest
user: "${PUID:-}${PGID:+:${PGID}}"
pull_policy: always
command: python3 repair.py --no-confirm
env_file:
- .env
restart: unless-stopped
services:
blackhole:
<<: *blackhole
container_name: blackhole
environment:
- BLACKHOLE_BASE_WATCH_PATH=/${BLACKHOLE_BASE_WATCH_PATH}
volumes:
- ${REALDEBRID_MOUNT_TORRENTS_PATH}:${REALDEBRID_MOUNT_TORRENTS_PATH}:rslave
- ${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null}:${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null}:rslave
- ${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_SONARR_PATH}:/${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_SONARR_PATH}
- ${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_RADARR_PATH}:/${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_RADARR_PATH}
profiles: [blackhole, blackhole_all, all]
blackhole_4k:
<<: *blackhole
container_name: blackhole4k
environment:
- SONARR_HOST=${SONARR_HOST_4K}
- SONARR_API_KEY=${SONARR_API_KEY_4K}
- RADARR_HOST=${RADARR_HOST_4K}
- RADARR_API_KEY=${RADARR_API_KEY_4K}
- BLACKHOLE_BASE_WATCH_PATH=/${BLACKHOLE_BASE_WATCH_PATH}
volumes:
- ${REALDEBRID_MOUNT_TORRENTS_PATH}:${REALDEBRID_MOUNT_TORRENTS_PATH}:rslave
- ${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null}:${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null}:rslave
- ${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_SONARR_PATH}4k:/${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_SONARR_PATH}
- ${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_RADARR_PATH}4k:/${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_RADARR_PATH}
profiles: [blackhole_4k, blackhole_all, all]
blackhole_anime:
<<: *blackhole
container_name: blackholeanime
environment:
- SONARR_HOST=${SONARR_HOST_ANIME}
- SONARR_API_KEY=${SONARR_API_KEY_ANIME}
- RADARR_HOST=${RADARR_HOST_ANIME}
- RADARR_API_KEY=${RADARR_API_KEY_ANIME}
- BLACKHOLE_BASE_WATCH_PATH=/${BLACKHOLE_BASE_WATCH_PATH}
volumes:
- ${REALDEBRID_MOUNT_TORRENTS_PATH}:${REALDEBRID_MOUNT_TORRENTS_PATH}:rslave
- ${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null}:${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null}:rslave
- ${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_SONARR_PATH}anime:/${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_SONARR_PATH}
- ${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_RADARR_PATH}anime:/${BLACKHOLE_BASE_WATCH_PATH}/${BLACKHOLE_RADARR_PATH}
profiles: [blackhole_anime, blackhole_all, all]
repair_service:
<<: *repair
container_name: repair
environment:
- SONARR_HOST=${SONARR_HOST}
- SONARR_API_KEY=${SONARR_API_KEY}
- RADARR_HOST=${RADARR_HOST}
- RADARR_API_KEY=${RADARR_API_KEY}
volumes:
- ${REALDEBRID_MOUNT_TORRENTS_PATH}:${REALDEBRID_MOUNT_TORRENTS_PATH}:rslave
- ${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null}:${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null}:rslave
- ${SONARR_ROOT_FOLDER}:${SONARR_ROOT_FOLDER}
- ${RADARR_ROOT_FOLDER}:${RADARR_ROOT_FOLDER}
- /mnt:/mnt:rslave
profiles: [repair, repair_all, all]
repair_4k:
<<: *repair
container_name: repair4k
environment:
- SONARR_HOST=${SONARR_HOST_4K}
- SONARR_API_KEY=${SONARR_API_KEY_4K}
- RADARR_HOST=${RADARR_HOST_4K}
- RADARR_API_KEY=${RADARR_API_KEY_4K}
volumes:
- ${REALDEBRID_MOUNT_TORRENTS_PATH}:${REALDEBRID_MOUNT_TORRENTS_PATH}:rslave
- ${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null}:${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null}:rslave
- ${SONARR_ROOT_FOLDER_4K}:${SONARR_ROOT_FOLDER}
- ${RADARR_ROOT_FOLDER_4K}:${RADARR_ROOT_FOLDER}
- /mnt:/mnt:rslave
profiles: [repair_4k, repair_all, all]
repair_anime:
<<: *repair
container_name: repairanime
environment:
- SONARR_HOST=${SONARR_HOST_ANIME}
- SONARR_API_KEY=${SONARR_API_KEY_ANIME}
- RADARR_HOST=${RADARR_HOST_ANIME}
- RADARR_API_KEY=${RADARR_API_KEY_ANIME}
volumes:
- ${REALDEBRID_MOUNT_TORRENTS_PATH}:${REALDEBRID_MOUNT_TORRENTS_PATH}:rslave
- ${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null}:${TORBOX_MOUNT_TORRENTS_PATH:-/dev/null}:rslave
- ${SONARR_ROOT_FOLDER_ANIME}:${SONARR_ROOT_FOLDER}
- ${RADARR_ROOT_FOLDER_ANIME}:${RADARR_ROOT_FOLDER}
- /mnt:/mnt:rslave
profiles: [repair_anime, repair_all, all]
watchlist:
build:
context: .
dockerfile: Dockerfile.watchlist
container_name: watchlist_service
image: ghcr.io/westsurname/scripts/watchlist:latest
pull_policy: always
volumes:
- ./shared/tokens.json:/app/shared/tokens.json
env_file:
- .env
restart: unless-stopped
profiles: [watchlist, all]
plex_authentication:
build:
context: .
dockerfile: Dockerfile.plex_authentication
container_name: plex_authentication_service
image: ghcr.io/westsurname/scripts/plex_authentication:latest
pull_policy: always
volumes:
- ./shared/tokens.json:/app/shared/tokens.json
- ./sockets:/app/sockets
ports:
- 8010:8000
env_file:
- .env
restart: unless-stopped
profiles: [plex_authentication, watchlist, plex_request, all]
plex_request:
build:
context: .
dockerfile: Dockerfile.plex_request
container_name: plex_request_service
image: ghcr.io/westsurname/scripts/plex_request:latest
pull_policy: always
volumes:
- ./shared/tokens.json:/app/shared/tokens.json
- ./sockets:/app/sockets
ports:
- 8011:8000
env_file:
- .env
restart: unless-stopped
profiles: [plex_request, all]
plex_request_nginx:
build:
context: .
dockerfile: Dockerfile.plex_request_nginx
container_name: plex_request_nginx_service
image: ghcr.io/westsurname/scripts/plex_request_nginx:latest
pull_policy: always
volumes:
- ${PLEX_REQUEST_SSL_PATH:-/dev/null}:${PLEX_REQUEST_SSL_PATH:-/dev/null}:ro
- ./sockets:/app/sockets
ports:
- 8012:8000
env_file:
- .env
restart: unless-stopped
profiles: [plex_request, all]
depends_on:
- plex_request
networks:
default:
name: ${DOCKER_NETWORK:-scripts_default}
external: ${DOCKER_NETWORK_EXTERNAL:-false}
docker compose --profile blackhole up -d
π‘ Tips:
-d
runs in detached mode- Without
-d
, it launches into terminal logs- Use Ctrl + Z to exit terminal logs
Settings > Download Clients
and add Torrent Blackhole
as a client.Name: blackhole
Enable: Yes
Torrent Folder: /mnt/symlinks/radarr
Watch Folder: /mnt/symlinks/radarr/completed
Save Magnet Files: Yes, with .magnet extension
Read Only: No
Client Priority: As desired
Tags: (optional)
Completed Download Handling: Remove Completed
Sonarr Configuration:
Name: blackhole
Enable: Yes
Torrent Folder: /mnt/symlinks/sonarr
Watch Folder: /mnt/symlinks/sonarr/completed
Save Magnet Files: Yes, with .magnet extension
Read Only: No
Client Priority: As desired
Tags: (optional)
Completed Download Handling: Remove Completed
Autoscan ensures that your Plex library stays up-to-date with the latest changes from Sonarr and Radarr.
sb install autoscan
autoscan.yourdomain.com
and set the Username/Password./mnt/remote/torbox/anchor.txt
and add anything inside it./opt/autoscan/config.yml
to look like this, however make sure to keep your targets
section with the generated link and token:# <- processor ->
minimum-age: 0m
scan-delay: 5s
scan-stats: 1h
anchors:
- /mnt/remote/torbox/anchor.txt
# <- triggers ->
authentication:
username: autoscanusername
password: autoscanpassword
port: 3030
triggers:
sonarr:
- name: sonarr # /triggers/sonarr
priority: 1
radarr:
- name: radarr # /triggers/radarr
priority: 1
targets:
plex:
- url: https://plex.yourdomain.com # plex
token: your_plex_token_here
sb install autoscan
Settings > Connect > + > webhook
Name: autoscan
Notification Triggers:
β On File Import
β On File Upgrade
β On Rename
β On Series Delete
β On Episode File Delete
β On Episode File Delete for Upgrade
Tags: N/A
Webhook URL: http://autoscan:3030/triggers/sonarr
Method: POST
Username: autoscanusername
Password: autoscanpassword
π¬ Radarr Configuration:
Name: autoscan
Notification Triggers:
β On Import
β On Upgrade
β On Rename
β On Movie Delete
β On Movie File Delete
β On Movie File Delete for Upgrade
Webhook URL: http://autoscan:3030/triggers/radarr
Method: POST
Username: autoscanusername
Password: autoscanpassword
π Congratulations! Your Plex library will now automatically update whenever Sonarr or Radarr processes new content.
π With these steps completed, you should have a fully functional setup integrating Torbox with Sonarr, Radarr, Plex, and Saltbox. Enjoy your automated media server!
If you encounter any issues during the setup:
- Double-check all configuration files for typos or missing information.
- Ensure all services are running (
docker ps
to check container status).- Check the logs of individual services for error messages.
- Consult the Saltbox community forums for additional support regarding Saltbox.
This guide provides a comprehensive approach to setting up a powerful media server using Torbox, Sonarr, Radarr, Plex, and Saltbox. While the initial setup may seem complex, the result is a highly automated and efficient system for managing and streaming your media content using Torbox.
Remember to keep your system updated and regularly back up your configurations. Happy streaming!