From 58accb927637a956043f1a89daeee0d02ca788cf Mon Sep 17 00:00:00 2001 From: Michael Housh Date: Fri, 28 Nov 2025 21:24:53 -0500 Subject: [PATCH] feat: Try a different arr stack. --- compose.yaml | 324 ++++++++++++++++++++++++++++++--------------------- example.env | 31 ++++- 2 files changed, 220 insertions(+), 135 deletions(-) diff --git a/compose.yaml b/compose.yaml index f9932d9..40a0f5d 100644 --- a/compose.yaml +++ b/compose.yaml @@ -1,3 +1,21 @@ +# 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 + services: jellyfin: image: jellyfin/jellyfin @@ -9,171 +27,217 @@ services: volumes: - ./jellyfin-config:/config - ./jellyfin-cache:/cache - - ${DATA_LOCATION}:/data + - ${DATA_MOUNT}:/data restart: 'unless-stopped' environment: - TZ=${TIMEZONE} - /dev/dri:/dev/dri + # 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 - ports: # Expose qBittorrent's web UI and torrent ports through VPN - # - 8700:8096 # Jellyfin - - 8701:8701 # qBittorrent Web UI - - 6881:6881 # torrent port - - 6881:6881/udp - - 7878:7878 # Radarr - - 8989:8989 # Sonarr - - 8686:8686 # Lidarr - - 6767:6767 # Bazarr - - 9696:9696 # Prowlarr - - 8191:8191 # FlareSolverr - # - 5055:5055 # Jellyseerr + - /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: + - 8701:8701 # qbittorrent web interface + - 6881:6881 # qbittorrent torrent port + - 6789:6789 # nzbget + - 9696:9696 # prowlarr volumes: - ./gluetun:/gluetun - # - ./gluetun/us-den.conf:/gluetun/wireguard/wg0.conf - environment: - - VPN_TYPE=wireguard - - VPN_SERVICE_PROVIDER=protonvpn - - WIREGUARD_PRIVATE_KEY=${WIREGUARD_PRIVATE_KEY} - # - OPENVPN_USER=${OPENVPN_USER} - # - OPENVPN_PASSWORD=${OPENVPN_PASSWORD} - - VPN_PORT_FORWARDING=on - - SERVER_COUNTRIES=United States - - TZ=${TIMEZONE} + # 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 qbittorrent: - image: lscr.io/linuxserver/qbittorrent + image: lscr.io/linuxserver/qbittorrent:latest container_name: qbittorrent - network_mode: "service:gluetun" # Routes all traffic through Gluetun - depends_on: - - gluetun + restart: unless-stopped + labels: + - deunhealth.restart.on.unhealthy=true environment: - - PUID=1000 - - PGID=1000 - - TZ=${TIMEZONE} - - WEBUI_PORT=8701 - - WEBUI_ADDRESS=0.0.0.0 - - WEBUI_EXTERNAL_ACCESS=true + - PUID=${PUID} + - PGID=${PGID} + - TZ=${TZ} + - WEBUI_PORT=8701 # 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_LOCATION}:/data - restart: unless-stopped - - radarr: - image: lscr.io/linuxserver/radarr - container_name: radarr - restart: unless-stopped - network_mode: "service:gluetun" # Routes all traffic through Gluetun + - ${DATA_MOUNT}:/data depends_on: - - gluetun - # ports: - # - 7878:7878 - environment: - - PUID=1000 - - PGID=1000 - - TZ=${TIMEZONE} - volumes: - - ./radarr:/config - - ${DATA_LOCATION}:/data + 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 - sonarr: - image: lscr.io/linuxserver/sonarr - container_name: sonarr - restart: unless-stopped - network_mode: "service:gluetun" # Routes all traffic through Gluetun - depends_on: - - gluetun - # ports: - # - 8989:8989 + # See the 'qBittorrent Stalls with VPN Timeout' section for more information. + deunhealth: + image: qmcgaw/deunhealth + container_name: deunhealth + network_mode: "none" environment: - - PUID=1000 - - PGID=1000 - - TZ=${TIMEZONE} + - LOG_LEVEL=info + - HEALTH_SERVER_ADDRESS=127.0.0.1:9999 + - TZ=${TZ} + restart: always volumes: - - ./sonarr:/config - - ${DATA_LOCATION}:/data + - /var/run/docker.sock:/var/run/docker.sock - lidarr: - image: lscr.io/linuxserver/lidarr:latest - container_name: lidarr - network_mode: "service:gluetun" # Routes all traffic through Gluetun - depends_on: - - gluetun - # ports: - # - 8686:8686 + nzbget: + image: lscr.io/linuxserver/nzbget:latest + container_name: nzbget environment: - - PUID=1000 - - PGID=1000 - - TZ=${TIMEZONE} + - PUID=${PUID} + - PGID=${PGID} + - TZ=${TZ} volumes: - - ./lidarr:/config - - ${DATA_LOCATION}:/data - restart: unless-stopped - - bazarr: - image: lscr.io/linuxserver/bazarr - container_name: bazarr - restart: unless-stopped - network_mode: "service:gluetun" # Routes all traffic through Gluetun + - /etc/localtime:/etc/localtime:ro + - ./nzbget:/config + - ${DATA_MOUNT}:/data depends_on: - - gluetun - # ports: - # - 6767:6767 - environment: - - PUID=1000 - - PGID=1000 - - TZ=${TIMEZONE} - volumes: - - ./bazarr:/config - - ${DATA_LOCATION}:/data + gluetun: + condition: service_healthy + restart: true + restart: unless-stopped + network_mode: service:gluetun prowlarr: - image: lscr.io/linuxserver/prowlarr + image: lscr.io/linuxserver/prowlarr:latest container_name: prowlarr - restart: unless-stopped - network_mode: "service:gluetun" # Routes all traffic through Gluetun - depends_on: - - gluetun - # ports: - # - 9696:9696 environment: - - PUID=1000 - - PGID=1000 - - TZ=${TIMEZONE} + - PUID=${PUID} + - PGID=${PGID} + - TZ=${TZ} volumes: + - /etc/localtime:/etc/localtime:ro - ./prowlarr:/config - - flaresolverr: - image: ghcr.io/flaresolverr/flaresolverr:latest - container_name: flaresolverr - network_mode: "service:gluetun" # Routes all traffic through Gluetun - environment: - - TZ=${TIMEZONE} - depends_on: - - gluetun - # ports: - # - 8191:8191 restart: unless-stopped + depends_on: + gluetun: + condition: service_healthy + restart: true + network_mode: service:gluetun - jellyseerr: - image: fallenbagel/jellyseerr:latest - container_name: jellyseerr + sonarr: + image: lscr.io/linuxserver/sonarr:latest + container_name: sonarr + restart: unless-stopped environment: - - TZ=${TIMEZONE} - - LOG_LEVEL=info - ports: - - "5055:5055" + - PUID=${PUID} + - PGID=${PGID} + - TZ=${TZ} volumes: - - ./jellyseerr:/app/config + - /etc/localtime:/etc/localtime:ro + - ./sonarr:/config + - ${DATA_MOUNT}:/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 - depends_on: - - gluetun - - jellyfin - - sonarr - - radarr + environment: + - PUID=${PUID} + - PGID=${PGID} + - TZ=${TZ} + volumes: + - /etc/localtime:/etc/localtime:ro + - ./radarr:/config + - ${DATA_MOUNT}:/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_MOUNT}:/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_MOUNT}:/data + ports: + - 6767:6767 + networks: + servarrnetwork: + ipv4_address: 172.39.0.6 + +# Newer additions to this stack feel. Remove the '#' to add the service. +# +# ytdl-sub: +# image: ghcr.io/jmbannon/ytdl-sub:latest +# container_name: ytdl-sub +# environment: +# - PUID=${PUID} +# - PGID=${PGID} +# - TZ=${TZ} +# - DOCKER_MODS=linuxserver/mods:universal-cron +# volumes: +# - ./ytdl-sub:/config +# - /data/youtube:/youtube +# networks: +# servarrnetwork: +# ipv4_address: 172.39.0.8 +# restart: unless-stopped +# +# jellyseerr: +# container_name: jellyseerr +# image: fallenbagel/jellyseerr:latest +# environment: +# - PUID=${PUID} +# - PGID=${PGID} +# - TZ=${TZ} +# volumes: +# - ./jellyseerr:/app/config +# ports: +# - 5055:5055 +# networks: +# servarrnetwork: +# ipv4_address: 172.39.0.9 +# restart: unless-stopped diff --git a/example.env b/example.env index 6347998..dbd5f7e 100644 --- a/example.env +++ b/example.env @@ -1,6 +1,27 @@ -TIMEZONE="America/New_York" -DATA_LOCATION=/mnt/media +# General UID/GIU and Timezone +TZ=America/New_York +PUID=1000 +PGID=1000 -OPENVPN_USER="fixme" -OPENVPN_PASSWORD="super-secret" -WIREGUARD_PRIVATE_KEY="super-secret" +# Input your VPN provider and type here +VPN_SERVICE_PROVIDER=protonvpn +VPN_TYPE=wireguard + +# Mandatory, airvpn forwarded port +FIREWALL_VPN_INPUT_PORTS=port + +# Copy all these varibles from your generated configuration file +WIREGUARD_PUBLIC_KEY=key +WIREGUARD_PRIVATE_KEY=key +WIREGUARD_PRESHARED_KEY=key +WIREGUARD_ADDRESSES=ip + +# Optional location varbiles, comma seperated list,no spaces after commas, make sure it matches the config you created +SERVER_COUNTRIES=United States +SERVER_CITIES=city + +# Heath check duration +HEALTH_VPN_DURATION_INITIAL=120s + +# Data Mount +DATA_MOUNT=/mnt/media