# 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: - 8080:8080 # qbittorrent web interface - 6881:6881 # qbittorrent torrent port - 6789:6789 # nzbget - 9696:9696 # prowlarr - 8191:8191 # flaresolverr - 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: - "3002:3000" environment: - GLUETUN_CONTROL_URL=http://gluetun:8000 - PUID=${PUID} - PGID=${PGID} # Uncomment if Gluetun auth is enabled: #- GLUETUN_API_KEY=yourtoken #- GLUETUN_USER=username #- GLUETUN_PASSWORD=password 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: - PUID=${PUID} - PGID=${PGID} - 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=8080 # 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 - ./qbittorrent/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 - ./nzbget/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 depends_on: gluetun: condition: service_healthy restart: true restart: unless-stopped 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 - ./sonarr/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 - ./radarr/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 - ./lidarr/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 - ./bazarr/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.9 flaresolverr: # DockerHub mirror flaresolverr/flaresolverr:latest image: ghcr.io/flaresolverr/flaresolverr:latest container_name: flaresolverr environment: - LOG_LEVEL=${LOG_LEVEL:-info} - LOG_FILE=${LOG_FILE:-none} - LOG_HTML=${LOG_HTML:-false} - CAPTCHA_SOLVER=${CAPTCHA_SOLVER:-none} - TZ=${TZ} volumes: - ./flaresolver:/config depends_on: gluetun: condition: service_healthy restart: true restart: unless-stopped network_mode: "service:gluetun" # networks: # servarrnetwork: # ipv4_address: 172.39.0.7