This is a Docker compose stack to deploy Sonarr, Radarr, Prowlarr, flaresolverr, and qBittorrent, with Prowlarr, flaresolverr, and qBittorrent connecting through Gluetun container.
All apps connect to a shared volume that connects to a NAS SMB share using CIFS.
Previous Versions: docker-arrs-with-nordvpn
- Gluetun: https://github.com/qdm12/gluetun
- qBittorrent: https://hub.docker.com/r/linuxserver/qbittorrent
- linuxserver-io-mod-vuetorrent: https://github.com/arafatamim/linuxserver-io-mod-vuetorrent
- Servarr Wiki: https://wiki.servarr.com/
flaresolverr: https://github.com/FlareSolverr/FlareSolverr(Broken)- Byparr: https://github.com/ThePhaseless/Byparr (Replaces FlareSolver)
Overseerr: https://hub.docker.com/r/linuxserver/overseerr(Deprecated)- Seerr: https://docs.seerr.dev/ (Replaces Overseerr)
- autoheal: https://github.com/willfarrell/docker-autoheal
- Watchtower: https://watchtower.nickfedor.com
The bellow setup is using Proton VPN with Wiregard. Check Gluetun-wiki for your specific VPN provider setup.
This setup assumes your VPN provider suports Port-Fowarding.
| Variable | Notes |
|---|---|
| nasUser | The username on NAS host |
| nasPass | The password on NAS host |
| WIREGUARD_PRIVATE_KEY | Your Wiregard private key |
| UPDATER_PROTONVPN_EMAIL | Your Proton user email |
| UPDATER_PROTONVPN_PASSWORD | Your Proton passord |
| nasMediaPath | Network path to your SMB share Example: //192.168.1.18/Media |
| timezone | Whatever you timezone is, Example: America/New_York |
networks:
proxy-network: # configure your reverse proxy network if needed
external: true
volumes:
qbit_config:
prowlarr_config:
flaresolver_config:
sonarr_config:
radarr_config:
seerr_config:
media:
driver_opts:
type: cifs
# There is weird bug in the Linux kernel CIFS caching layer. Heavy torrent
# I/O to your NAS with cache=strict triggered kernel memory corruption,
# hanging qBittorrent in an unkillable state. Fixed by switching to
# cache=none, at the cost of a slight performance loss for stability.
o: username=$nasUser,password=$nasPass,file_mode=0777,dir_mode=0777,noperm,cache=none
device: $nasMediaPath
services:
gluetun:
image: qmcgaw/gluetun:v3 # Latest stable version. The "latest" is the rolling release and may break at any time.
container_name: gluetun
cap_add:
- NET_ADMIN
devices:
- /dev/net/tun:/dev/net/tun
environment:
- TZ=${timezone:-UTC}
- VPN_SERVICE_PROVIDER=protonvpn # set your vpn provider
- VPN_TYPE=wireguard # set your vpn protocol
- WIREGUARD_PRIVATE_KEY=${WIREGUARD_PRIVATE_KEY:?Private key required} # set your wireguard private key
- SERVER_COUNTRIES=United States # set your preferred server country
- FIREWALL_OUTBOUND_SUBNETS=172.18.0.0/16,192.168.0.0/16 # allow access to you local and docker networks
- UPDATER_PERIOD=24h # frequency of updater checks
- UPDATER_PROTONVPN_EMAIL=${UPDATER_PROTONVPN_EMAIL:?Updater Email Required} # set your protonvpn account email for automatic server updates if needed
- UPDATER_PROTONVPN_PASSWORD=${UPDATER_PROTONVPN_PASSWORD:?Updater Password Required} # set your protonvpn account password for automatic server updates if needed
- PORT_FORWARD_ONLY=on # required to filter server list to only those that support port forwarding
- VPN_PORT_FORWARDING=on # required to enable port forwarding
# Required: Commands to run when port forwarding is set up or taken down. see documentation for details.
- VPN_PORT_FORWARDING_UP_COMMAND=/bin/sh -c 'wget -O- --retry-connrefused --post-data "json={\"listen_port\":{{PORT}},\"current_network_interface\":\"{{VPN_INTERFACE}}\",\"random_port\":false,\"upnp\":false}" http://127.0.0.1:9080/api/v2/app/setPreferences 2>&1'
- VPN_PORT_FORWARDING_DOWN_COMMAND=/bin/sh -c 'wget -O- --retry-connrefused --post-data "json={\"listen_port\":0,\"current_network_interface\":\"lo"}" http://127.0.0.1:9080/api/v2/app/setPreferences 2>&1'
ports:
- 8000:8000 #gluetun http server
- 9080:9080 #qbittorrent UI
- 9696:9696 #prowlarr
- 8192:8192 #Byparr
sysctls:
- net.ipv6.conf.all.disable_ipv6=1 # optional, disable ipv6; recommended if using ipv4 only
networks:
- proxy-network
restart: unless-stopped
labels:
- autoheal="true" # optional, for willfarrell/docker-autoheal. Gluetun has its own healthcheck and restart mechanism, may be redundant.
qbittorrent:
image: linuxserver/qbittorrent:latest
container_name: qbittorrent
network_mode: service:gluetun # IMPORTANT: use gluetun's network stack
depends_on:
gluetun:
condition: service_healthy # wait for gluetun to be healthy before starting
environment:
- PUID=1000
- PGID=997
- TZ=${timezone:-UTC}
- WEBUI_PORT=9080
- DOCKER_MODS=arafatamim/linuxserver-io-mod-vuetorrent # optional, for vuetorrent mod
volumes:
- qbit_config:/config
- media:/media
restart: unless-stopped
stop_grace_period: "10s" # optional, may help with container shutdown issues.
labels:
autoheal: "true"
com.centurylinklabs.watchtower.depends-on: gluetun
healthcheck:
# using the gluetun healthcheck to determine if vpn is up, since qbittorrent won't work without it
test: curl -sL --retry-connrefused -w "%{http_code}" -o /dev/null http://localhost:9999 || exit 1
interval: 10s
timeout: 10s
retries: 3
prowlarr:
image: linuxserver/prowlarr:latest
container_name: prowlarr
network_mode: service:gluetun # IMPORTANT: use gluetun's network stack
depends_on:
gluetun:
condition: service_healthy # wait for gluetun to be healthy before starting
environment:
- PUID=1000
- PGID=1000
- TZ=${timezone:-UTC}
volumes:
- prowlarr_config:/config
restart: unless-stopped
labels:
autoheal: "true"
com.centurylinklabs.watchtower.depends-on: gluetun
healthcheck:
# using the gluetun healthcheck to determine if vpn is up, since prowlarr won't work without it
test: curl -sL --retry-connrefused -w "%{http_code}" -o /dev/null http://localhost:9999 || exit 1
interval: 10s
timeout: 10s
retries: 3
byparr:
image: ghcr.io/thephaseless/byparr:latest
container_name: byparr
network_mode: service:gluetun
depends_on:
gluetun:
condition: service_healthy
environment:
- TZ=${timezone:-UTC}
- PORT=8192
restart: unless-stopped
labels:
autoheal: "true"
com.centurylinklabs.watchtower.depends-on: gluetun
healthcheck:
# using the gluetun healthcheck to determine if vpn is up, since byparr won't work without it
test: curl -sL --retry-connrefused -w "%{http_code}" -o /dev/null http://localhost:9999 || exit 1
interval: 10s
timeout: 10s
retries: 3
sonarr:
image: linuxserver/sonarr:latest
container_name: sonarr
environment:
- PUID=1000
- PGID=997
- TZ=${timezone:-UTC}
volumes:
- sonarr_config:/config
- media:/media
ports:
- 8989:8989
networks:
- proxy-network
restart: unless-stopped
labels:
autoheal: "true"
healthcheck:
test: curl -sL --retry-connrefused -w "%{http_code}" -o /dev/null --ipv4 1.1.1.1 || curl -sL --retry-connrefused -w "%{http_code}" -o /dev/null --ipv4 8.8.8.8 || exit 1
interval: 10s
timeout: 5s
retries: 3
radarr:
image: linuxserver/radarr:latest
container_name: radarr
environment:
- PUID=1000
- PGID=997
- TZ=${timezone:-UTC}
volumes:
- radarr_config:/config
- media:/media
ports:
- 7878:7878
networks:
- proxy-network
restart: unless-stopped
labels:
autoheal: "true"
healthcheck:
test: curl -sL --retry-connrefused -w "%{http_code}" -o /dev/null --ipv4 1.1.1.1 || curl -sL --retry-connrefused -w "%{http_code}" -o /dev/null --ipv4 8.8.8.8 || exit 1
interval: 10s
timeout: 5s
retries: 3
seerr:
image: ghcr.io/seerr-team/seerr:latest
init: true
container_name: seerr
environment:
- LOG_LEVEL=debug
- TZ=${timezone:-UTC}
- PORT=5055 #optional
ports:
- 5055:5055
networks:
- proxy-network
volumes:
- seerr_config:/app/config
labels:
autoheal: "true"
healthcheck:
test: wget --no-verbose --tries=1 --spider http://localhost:5055/api/v1/status || exit 1
start_period: 20s
timeout: 3s
interval: 15s
retries: 3
restart: unless-stopped