Overview#
This is my full Arr Stack — a collection of containers that work together to automate media downloading, management, and subtitles.
The stack includes all the core Arr applications plus a VPN layer, torrent client, subtitle automation, and metadata support.
Components#
- Prowlarr – Central indexer management that integrates with Sonarr and Radarr.
- Sonarr – TV show management and automation.
- Radarr – Movie management and automation.
- Bazarr – Subtitle downloading and syncing for Sonarr/Radarr media.
- Lidarr (optional) – Music management (currently disabled).
- Readarr (optional) – Book management (currently disabled).
- FlareSolverr – Solves Cloudflare or CAPTCHA-protected search indexer pages.
- Gluetun – VPN container providing network privacy and port forwarding.
- qBittorrent – Torrent client running inside the Gluetun VPN network.
- Huntarr – Search aggregator with an intuitive UI for manual searches.
- Unpackerr – Extracts and moves completed downloads for Radarr and Sonarr.
Environment Variables Required#
The following variables are required for the stack to function properly:
| Variable | Purpose |
|---|---|
PIA_USERNAME | Private Internet Access VPN username |
PIA_PASSWORD | Private Internet Access VPN password |
UNPACKERR_SONARR_API_KEY | API key from Sonarr for Unpackerr integration |
UNPACKERR_RADARR_API_KEY | API key from Radarr for Unpackerr integration |
These are stored securely in an .env file and referenced by the compose file.
Docker Compose Configuration#
services:
prowlarr:
image: linuxserver/prowlarr:latest
container_name: arr-suite-prowlarr
environment:
- PUID=1000
- PGID=1000
- TZ=America/Chicago
volumes:
- ${DOCKER_VOLUME_STORAGE:-/mnt/docker-volumes}/arr-suite/configs/prowlarr:/config
expose:
- 9696/tcp
ports:
- 9696:9696
restart: unless-stopped
sonarr:
image: linuxserver/sonarr:latest
container_name: arr-suite-sonarr
environment:
- PUID=1000
- PGID=1000
- TZ=America/Chicago
volumes:
- ${DOCKER_VOLUME_STORAGE:-/mnt/docker-volumes}/arr-suite/configs/sonarr:/config
- /mnt/media:/mnt/media
expose:
- 8989/tcp
ports:
- 8989:8989
restart: unless-stopped
radarr:
image: linuxserver/radarr:latest
container_name: arr-suite-radarr
environment:
- PUID=1000
- PGID=1000
- TZ=America/Chicago
volumes:
- ${DOCKER_VOLUME_STORAGE:-/mnt/docker-volumes}/arr-suite/configs/radarr:/config
- /mnt/media:/mnt/media
expose:
- 7878/tcp
ports:
- 7878:7878
restart: unless-stopped
# lidarr:
# image: linuxserver/lidarr:latest
# container_name: arr-suite-lidarr
# environment:
# - PUID=1000
# - PGID=1000
# - TZ=America/Chicago
# volumes:
# - ${DOCKER_VOLUME_STORAGE:-/mnt/docker-volumes}/arr-suite/configs/lidarr:/config
# - /mnt/media:/mnt/media
# expose:
# - 8686/tcp
# ports:
# - 8686:8686
# restart: unless-stopped
# readarr:
# image: linuxserver/readarr:develop
# container_name: arr-suite-readarr
# environment:
# - PUID=1000
# - PGID=1000
# - TZ=America/Chicago
# volumes:
# - ${DOCKER_VOLUME_STORAGE:-/mnt/docker-volumes}/arr-suite/configs/readarr:/config
# - /mnt/media:/mnt/media
# expose:
# - 8787/tcp
# ports:
# - 8787:8787
# restart: unless-stopped
bazarr:
image: lscr.io/linuxserver/bazarr:latest
container_name: arr-suite-bazarr
environment:
- PUID=1000
- PGID=1000
- TZ=America/Chicago
volumes:
- ${DOCKER_VOLUME_STORAGE:-/mnt/docker-volumes}/arr-suite/configs/bazarr:/config
- /mnt/media:/mnt/media
expose:
- 6767/tcp
ports:
- 6767:6767
restart: unless-stopped
jellyseerr:
image: fallenbagel/jellyseerr:latest
container_name: jellyseerr
environment:
- LOG_LEVEL=debug
- TZ=Asia/Tashkent
ports:
- 5055:5055
volumes:
- /path/to/appdata/config:/app/config
restart: unless-stopped
flaresolverr:
image: flaresolverr/flaresolverr:latest
container_name: arr-suite-flaresolverr
environment:
- LOG_LEVEL=info
- LOG_HTML=false
- CAPTCHA_SOLVER=none
- TZ=America/Chicago
expose:
- 8191/tcp # optional — allows other containers to talk to it
ports:
- "8191:8191" # host:container mapping for direct access
restart: unless-stopped
gluetun:
image: qmcgaw/gluetun:latest
container_name: arr-suite-gluetun
cap_add:
- NET_ADMIN
ports:
- 8080:8080 # qBittorrent WebUI forwarded
dns:
- 1.1.1.1
- 9.9.9.9
environment:
- VPN_SERVICE_PROVIDER=private internet access
- VPN_TYPE=openvpn
- OPENVPN_USER=${PIA_USERNAME}
- OPENVPN_PASSWORD=${PIA_PASSWORD}
- TZ=America/Chicago
- SERVER_REGIONS=CA Montreal
- BLOCK_MALICIOUS=off
- BLOCK_ADS=off
- BLOCK_SURVEILLANCE=off
- VPN_PORT_FORWARDING=on
# - VPN_PORT_FORWARDING_STATUS_FILE=/gluetun/forwarded_port
volumes:
- ${DOCKER_VOLUME_STORAGE:-/mnt/docker-volumes}/arr-suite/configs/gluetun:/gluetun
- ${DOCKER_VOLUME_STORAGE:-/mnt/docker-volumes}/arr-suite/configs/gluetun:/tmp/gluetun
restart: unless-stopped
qbittorrent:
image: linuxserver/qbittorrent:5.0.2-libtorrentv1
container_name: arr-suite-qbittorrent
environment:
- PUID=1000
- PGID=1000
- UMASK_SET=0000
- TZ=America/Chicago
- WEBUI_PORT=8080
volumes:
- ${DOCKER_VOLUME_STORAGE:-/mnt/docker-volumes}/arr-suite/configs/qbittorrent:/config
- /mnt/media/downloads:/mnt/media/downloads
depends_on:
- gluetun
network_mode: container:arr-suite-gluetun
restart: unless-stopped
huntarr:
image: huntarr/huntarr:latest
container_name: arr-suite-huntarr
environment:
- TZ=America/Chicago
volumes:
- ${DOCKER_VOLUME_STORAGE:-/mnt/docker-volumes}/arr-suite/configs/huntarr:/config
ports:
- 9705:9705
restart: unless-stopped
unpackerr:
image: golift/unpackerr:latest
container_name: arr-suite-unpackerr
environment:
- TZ=America/Chicago
- UN_LOG_FILE=/downloads/unpackerr.log
- UN_SONARR_0_URL=http://10.0.40.130:8989
- UN_SONARR_0_API_KEY=${UNPACKERR_SONARR_API_KEY}
- UN_RADARR_0_URL=http://10.0.40.130:7878
- UN_RADARR_0_API_KEY=${UNPACKERR_RADARR_API_KEY}
- UN_DIR_MODE=0777
- UN_FILE_MODE=0666
volumes:
- /mnt/media/downloads:/downloads
user: "1001:100"
restart: unless-stopped
