From 3d1a1d6caf835d4b94f4ac93f681d4e35ff07d9b Mon Sep 17 00:00:00 2001 From: jeremymigonis Date: Wed, 18 Mar 2026 15:34:18 -0500 Subject: [PATCH] Add arr-stack/docker-compose.yml --- arr-stack/docker-compose.yml | 270 +++++++++++++++++++++++++++++++++++ 1 file changed, 270 insertions(+) create mode 100644 arr-stack/docker-compose.yml diff --git a/arr-stack/docker-compose.yml b/arr-stack/docker-compose.yml new file mode 100644 index 0000000..5708cc4 --- /dev/null +++ b/arr-stack/docker-compose.yml @@ -0,0 +1,270 @@ +# Compose file for the *arr stack. Configuration files are stored in the +# directory you launch the compose file on. Change to bind mounts if needed. +# All containers are ran with user and group ids of the main user and +# group to aviod permissions issues of downloaded files, please refer +# the read me file for more information. + +############################################################################# +# NOTICE: We recently switched to using a .env file. PLEASE refer to the docs. +# https://github.com/TechHutTV/homelab/tree/main/media#docker-compose-and-env +############################################################################# + +networks: + servarrnetwork: + name: servarrnetwork + ipam: + config: + - subnet: 172.39.0.0/24 +# Gluetun container, connects to the VPN of your choice. +services: + # airvpn recommended (referral url: https://airvpn.org/?referred_by=673908) + gluetun: + image: qmcgaw/gluetun + container_name: gluetun + cap_add: + - NET_ADMIN + devices: + - /dev/net/tun:/dev/net/tun # If running on an LXC see readme for more info. + networks: + servarrnetwork: + ipv4_address: 172.39.0.2 + ports: + - 8085:8080 # qbittorrent web interface + - 6881:6881 # qbittorrent torrent port + - 6789:6789 # nzbget + - 9696:9696 # prowlarr + - 8888:8888/tcp # HTTP proxy + - 8388:8388/tcp # Shadowsocks + - 8388:8388/udp # Shadowsocks + volumes: + - ./gluetun:/gluetun + # Make a '.env' file in the same directory. + env_file: + - .env + healthcheck: + test: ping -c 1 www.google.com || exit 1 + interval: 20s + timeout: 10s + retries: 5 + restart: unless-stopped + +# WebUI for Gluetun + gluetun-webui: + image: scuzza/gluetun-webui:latest + container_name: gluetun-webui + ports: + - "127.0.0.1:3002:3000" + environment: + - GLUETUN_CONTROL_URL=http://gluetun:8000 + # Uncomment if Gluetun auth is enabled: + #- GLUETUN_API_KEY=yourtoken + #- GLUETUN_USER=username + #- GLUETUN_PASSWORD=password + networks: + - servarrnetwork: + ipv4_address: 172.39.0.8 + restart: unless-stopped + read_only: true + tmpfs: + - /tmp + security_opt: + - no-new-privileges:true + cap_drop: + - ALL + healthcheck: + test: ["CMD", "wget", "-qO-", "http://localhost:3002/api/health"] + interval: 30s + timeout: 5s + start_period: 10s + retries: 3 + + gluetun-monitor: + image: ghcr.io/csmarshall/gluetun-monitor:latest + # Or from Docker Hub: chasmarshall/gluetun-monitor:latest + container_name: gluetun-monitor + restart: unless-stopped + environment: + - TZ=${TZ} + - GLUETUN_CONTAINER=gluetun + - DEPENDENT_CONTAINERS=auto # auto-discovery (default) + - CHECK_INTERVAL=30 # seconds between checks + - TIMEOUT=10 # seconds per site test + - FAIL_THRESHOLD=2 # consecutive failures to trigger restart + - HEALTHY_WAIT_TIMEOUT=120 # seconds to wait for healthy status + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./sites.conf:/config/sites.conf:ro + - ./logs:/logs + +# Containers run through Gluetun. Qbittorrent is on 8085, nzbget is on port 6789, Prowlarr is on port 9696 + + qbittorrent: + image: lscr.io/linuxserver/qbittorrent:latest + container_name: qbittorrent + restart: unless-stopped + labels: + - deunhealth.restart.on.unhealthy=true + environment: + - PUID=${PUID} + - PGID=${PGID} + - TZ=${TZ} + - WEBUI_PORT=8085 # must match "qbittorrent web interface" port number in gluetun's service above + - TORRENTING_PORT=${FIREWALL_VPN_INPUT_PORTS} # airvpn forwarded port, pulled from .env + volumes: + - ./qbittorrent:/config + - /data:/data + depends_on: + gluetun: + condition: service_healthy + restart: true + network_mode: "service:gluetun" + healthcheck: + test: ping -c 1 www.google.com || exit 1 + interval: 60s + retries: 3 + start_period: 20s + timeout: 10s + + # See the 'qBittorrent Stalls with VPN Timeout' section for more information. + deunhealth: + image: qmcgaw/deunhealth + container_name: deunhealth + network_mode: "none" + environment: + - LOG_LEVEL=info + - HEALTH_SERVER_ADDRESS=127.0.0.1:9999 + - TZ=${TZ} + restart: always + volumes: + - /var/run/docker.sock:/var/run/docker.sock + + nzbget: + image: lscr.io/linuxserver/nzbget:latest + container_name: nzbget + environment: + - PUID=${PUID} + - PGID=${PGID} + - TZ=${TZ} + volumes: + - /etc/localtime:/etc/localtime:ro + - ./nzbget:/config + - /data:/data + depends_on: + gluetun: + condition: service_healthy + restart: true + restart: unless-stopped + network_mode: "service:gluetun" + + prowlarr: + image: lscr.io/linuxserver/prowlarr:latest + container_name: prowlarr + environment: + - PUID=${PUID} + - PGID=${PGID} + - TZ=${TZ} + volumes: + - /etc/localtime:/etc/localtime:ro + - ./prowlarr:/config + restart: unless-stopped + depends_on: + gluetun: + condition: service_healthy + restart: true + network_mode: "service:gluetun" + + sonarr: + image: lscr.io/linuxserver/sonarr:latest + container_name: sonarr + restart: unless-stopped + environment: + - PUID=${PUID} + - PGID=${PGID} + - TZ=${TZ} + volumes: + - /etc/localtime:/etc/localtime:ro + - ./sonarr:/config + - /data:/data + ports: + - 8989:8989 + networks: + servarrnetwork: + ipv4_address: 172.39.0.3 + + radarr: + image: lscr.io/linuxserver/radarr:latest + container_name: radarr + restart: unless-stopped + environment: + - PUID=${PUID} + - PGID=${PGID} + - TZ=${TZ} + volumes: + - /etc/localtime:/etc/localtime:ro + - ./radarr:/config + - /data:/data + ports: + - 7878:7878 + networks: + servarrnetwork: + ipv4_address: 172.39.0.4 + + lidarr: + container_name: lidarr + image: lscr.io/linuxserver/lidarr:latest + restart: unless-stopped + volumes: + - /etc/localtime:/etc/localtime:ro + - ./lidarr:/config + - /data:/data + environment: + - PUID=${PUID} + - PGID=${PGID} + - TZ=${TZ} + ports: + - 8686:8686 + networks: + servarrnetwork: + ipv4_address: 172.39.0.5 + + bazarr: + image: lscr.io/linuxserver/bazarr:latest + container_name: bazarr + restart: unless-stopped + environment: + - PUID=${PUID} + - PGID=${PGID} + - TZ=${TZ} + volumes: + - /etc/localtime:/etc/localtime:ro + - ./bazarr:/config + - /data:/data + ports: + - 6767:6767 + networks: + servarrnetwork: + ipv4_address: 172.39.0.6 + + seerr: + container_name: seerr + image: ghcr.io/seerr-team/seerr:latest + environment: + - LOG_LEVEL=debug + - PUID=${PUID} + - PGID=${PGID} + - TZ=${TZ} + 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 + volumes: + - ./seerr:/app/config + ports: + - 5055:5055 + + networks: + servarrnetwork: + ipv4_address: 172.39.0.7 \ No newline at end of file