Sanitized mirror from private repository - 2026-03-29 13:33:25 UTC
This commit is contained in:
496
hosts/synology/atlantis/arr-suite/docker-compose.yml
Normal file
496
hosts/synology/atlantis/arr-suite/docker-compose.yml
Normal file
@@ -0,0 +1,496 @@
|
||||
# Arr Suite - Media automation stack
|
||||
# Services: Sonarr, Radarr, Prowlarr, Bazarr, Lidarr, Tdarr, LazyLibrarian, Audiobookshelf
|
||||
# Manages TV shows, movies, music, books, audiobooks downloads and organization
|
||||
# GitOps Test: Stack successfully deployed and auto-updating
|
||||
#
|
||||
# Storage Configuration (2026-02-01):
|
||||
# - Downloads: /volume3/usenet (Synology SNV5420 NVMe RAID1 - 621 MB/s)
|
||||
# - Media: /volume1/data (SATA RAID6 - 84TB)
|
||||
# - Configs: /volume2/metadata/docker2 (Crucial P310 NVMe RAID1)
|
||||
#
|
||||
# Volume 3 created for fast download performance using 007revad's Synology_M2_volume script
|
||||
#
|
||||
# Theming: Self-hosted theme.park (Dracula theme)
|
||||
# - TP_DOMAIN uses docker gateway IP to reach host's theme-park container
|
||||
# - Deploy theme-park stack first: Atlantis/theme-park/theme-park.yaml
|
||||
version: "3.8"
|
||||
|
||||
x-themepark: &themepark
|
||||
TP_SCHEME: "http"
|
||||
TP_DOMAIN: "192.168.0.200:8580"
|
||||
TP_THEME: "dracula"
|
||||
|
||||
networks:
|
||||
media2_net:
|
||||
driver: bridge
|
||||
name: media2_net
|
||||
ipam:
|
||||
config:
|
||||
- subnet: 172.24.0.0/24
|
||||
gateway: 172.24.0.1
|
||||
|
||||
services:
|
||||
|
||||
wizarr:
|
||||
image: ghcr.io/wizarrrr/wizarr:latest
|
||||
container_name: wizarr
|
||||
environment:
|
||||
- PUID=1029
|
||||
- PGID=100
|
||||
- TZ=America/Los_Angeles
|
||||
- DISABLE_BUILTIN_AUTH=true
|
||||
volumes:
|
||||
- /volume2/metadata/docker2/wizarr:/data/database
|
||||
ports:
|
||||
- "5690:5690"
|
||||
networks:
|
||||
media2_net:
|
||||
ipv4_address: 172.24.0.2
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
restart: unless-stopped
|
||||
|
||||
tautulli:
|
||||
image: lscr.io/linuxserver/tautulli:latest
|
||||
container_name: tautulli
|
||||
environment:
|
||||
- PUID=1029
|
||||
- PGID=100
|
||||
- TZ=America/Los_Angeles
|
||||
- UMASK=022
|
||||
- DOCKER_MODS=ghcr.io/themepark-dev/theme.park:tautulli
|
||||
- TP_SCHEME=http
|
||||
- TP_DOMAIN=192.168.0.200:8580
|
||||
- TP_THEME=dracula
|
||||
volumes:
|
||||
- /volume2/metadata/docker2/tautulli:/config
|
||||
ports:
|
||||
- "8181:8181"
|
||||
networks:
|
||||
media2_net:
|
||||
ipv4_address: 172.24.0.12
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
restart: unless-stopped
|
||||
|
||||
prowlarr:
|
||||
image: lscr.io/linuxserver/prowlarr:latest
|
||||
container_name: prowlarr
|
||||
environment:
|
||||
- PUID=1029
|
||||
- PGID=100
|
||||
- TZ=America/Los_Angeles
|
||||
- UMASK=022
|
||||
- DOCKER_MODS=ghcr.io/themepark-dev/theme.park:prowlarr
|
||||
- TP_SCHEME=http
|
||||
- TP_DOMAIN=192.168.0.200:8580
|
||||
- TP_THEME=dracula
|
||||
volumes:
|
||||
- /volume2/metadata/docker2/prowlarr:/config
|
||||
ports:
|
||||
- "9696:9696"
|
||||
networks:
|
||||
media2_net:
|
||||
ipv4_address: 172.24.0.6
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
restart: unless-stopped
|
||||
|
||||
flaresolverr:
|
||||
image: flaresolverr/flaresolverr:latest
|
||||
container_name: flaresolverr
|
||||
environment:
|
||||
- TZ=America/Los_Angeles
|
||||
ports:
|
||||
- "8191:8191"
|
||||
networks:
|
||||
media2_net:
|
||||
ipv4_address: 172.24.0.4
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
restart: unless-stopped
|
||||
|
||||
sabnzbd:
|
||||
image: lscr.io/linuxserver/sabnzbd:latest
|
||||
container_name: sabnzbd
|
||||
network_mode: host
|
||||
environment:
|
||||
- PUID=1029
|
||||
- PGID=100
|
||||
- TZ=America/Los_Angeles
|
||||
- UMASK=022
|
||||
- DOCKER_MODS=ghcr.io/themepark-dev/theme.park:sabnzbd
|
||||
- TP_SCHEME=http
|
||||
- TP_DOMAIN=192.168.0.200:8580
|
||||
- TP_THEME=dracula
|
||||
volumes:
|
||||
- /volume2/metadata/docker2/sabnzbd:/config
|
||||
- /volume3/usenet/incomplete:/data/incomplete
|
||||
- /volume3/usenet/complete:/data/complete
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
restart: unless-stopped
|
||||
|
||||
jackett:
|
||||
image: lscr.io/linuxserver/jackett:latest
|
||||
container_name: jackett
|
||||
environment:
|
||||
- PUID=1029
|
||||
- PGID=100
|
||||
- TZ=America/Los_Angeles
|
||||
- UMASK=022
|
||||
- DOCKER_MODS=ghcr.io/themepark-dev/theme.park:jackett
|
||||
- TP_SCHEME=http
|
||||
- TP_DOMAIN=192.168.0.200:8580
|
||||
- TP_THEME=dracula
|
||||
volumes:
|
||||
- /volume2/metadata/docker2/jackett:/config
|
||||
- /volume1/data:/downloads
|
||||
ports:
|
||||
- "9117:9117"
|
||||
networks:
|
||||
media2_net:
|
||||
ipv4_address: 172.24.0.11
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
restart: unless-stopped
|
||||
|
||||
sonarr:
|
||||
image: lscr.io/linuxserver/sonarr:latest
|
||||
container_name: sonarr
|
||||
environment:
|
||||
- PUID=1029
|
||||
- PGID=100
|
||||
- TZ=America/Los_Angeles
|
||||
- UMASK=022
|
||||
- DOCKER_MODS=ghcr.io/themepark-dev/theme.park:sonarr
|
||||
- TP_SCHEME=http
|
||||
- TP_DOMAIN=192.168.0.200:8580
|
||||
- TP_THEME=dracula
|
||||
volumes:
|
||||
- /volume2/metadata/docker2/sonarr:/config
|
||||
- /volume1/data:/data
|
||||
- /volume3/usenet:/sab
|
||||
- /volume2/torrents:/downloads # Deluge download dir — required for torrent import
|
||||
ports:
|
||||
- "8989:8989"
|
||||
networks:
|
||||
media2_net:
|
||||
ipv4_address: 172.24.0.7
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
restart: unless-stopped
|
||||
|
||||
lidarr:
|
||||
image: lscr.io/linuxserver/lidarr:latest
|
||||
container_name: lidarr
|
||||
environment:
|
||||
- PUID=1029
|
||||
- PGID=100
|
||||
- TZ=America/Los_Angeles
|
||||
- UMASK=022
|
||||
- DOCKER_MODS=ghcr.io/themepark-dev/theme.park:lidarr
|
||||
- TP_SCHEME=http
|
||||
- TP_DOMAIN=192.168.0.200:8580
|
||||
- TP_THEME=dracula
|
||||
volumes:
|
||||
- /volume2/metadata/docker2/lidarr:/config
|
||||
- /volume1/data:/data
|
||||
- /volume3/usenet:/sab
|
||||
# arr-scripts: custom init scripts for Deezer integration via deemix
|
||||
# Config: /volume2/metadata/docker2/lidarr/extended.conf (contains ARL token, not in git)
|
||||
# Setup: https://github.com/RandomNinjaAtk/arr-scripts
|
||||
- /volume2/metadata/docker2/lidarr-scripts/custom-services.d:/custom-services.d
|
||||
- /volume2/metadata/docker2/lidarr-scripts/custom-cont-init.d:/custom-cont-init.d
|
||||
ports:
|
||||
- "8686:8686"
|
||||
networks:
|
||||
media2_net:
|
||||
ipv4_address: 172.24.0.9
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
restart: unless-stopped
|
||||
|
||||
radarr:
|
||||
image: lscr.io/linuxserver/radarr:latest
|
||||
container_name: radarr
|
||||
environment:
|
||||
- PUID=1029
|
||||
- PGID=100
|
||||
- TZ=America/Los_Angeles
|
||||
- UMASK=022
|
||||
- DOCKER_MODS=ghcr.io/themepark-dev/theme.park:radarr
|
||||
- TP_SCHEME=http
|
||||
- TP_DOMAIN=192.168.0.200:8580
|
||||
- TP_THEME=dracula
|
||||
volumes:
|
||||
- /volume2/metadata/docker2/radarr:/config
|
||||
- /volume1/data:/data
|
||||
- /volume3/usenet:/sab
|
||||
- /volume2/torrents:/downloads # Deluge download dir — required for torrent import
|
||||
ports:
|
||||
- "7878:7878"
|
||||
networks:
|
||||
media2_net:
|
||||
ipv4_address: 172.24.0.8
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
restart: unless-stopped
|
||||
|
||||
# Readarr retired - replaced with LazyLibrarian + Audiobookshelf
|
||||
|
||||
lazylibrarian:
|
||||
image: lscr.io/linuxserver/lazylibrarian:latest
|
||||
container_name: lazylibrarian
|
||||
environment:
|
||||
- PUID=1029
|
||||
- PGID=100
|
||||
- TZ=America/Los_Angeles
|
||||
- UMASK=022
|
||||
- DOCKER_MODS=ghcr.io/themepark-dev/theme.park:lazylibrarian|ghcr.io/linuxserver/mods:lazylibrarian-calibre
|
||||
- TP_SCHEME=http
|
||||
- TP_DOMAIN=192.168.0.200:8580
|
||||
- TP_THEME=dracula
|
||||
volumes:
|
||||
- /volume2/metadata/docker2/lazylibrarian:/config
|
||||
- /volume1/data:/data
|
||||
- /volume3/usenet:/sab
|
||||
- /volume2/torrents:/downloads # Deluge download dir — required for torrent import
|
||||
- /volume2/metadata/docker2/lazylibrarian-scripts/custom-cont-init.d:/custom-cont-init.d # patch tracker-less torrent handling
|
||||
ports:
|
||||
- "5299:5299"
|
||||
networks:
|
||||
media2_net:
|
||||
ipv4_address: 172.24.0.5
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
restart: unless-stopped
|
||||
|
||||
audiobookshelf:
|
||||
image: ghcr.io/advplyr/audiobookshelf:latest
|
||||
container_name: audiobookshelf
|
||||
environment:
|
||||
- PUID=1029
|
||||
- PGID=100
|
||||
- TZ=America/Los_Angeles
|
||||
volumes:
|
||||
- /volume2/metadata/docker2/audiobookshelf:/config
|
||||
- /volume1/data/media/audiobooks:/audiobooks
|
||||
- /volume1/data/media/podcasts:/podcasts
|
||||
- /volume1/data/media/ebooks:/ebooks
|
||||
ports:
|
||||
- "13378:80"
|
||||
networks:
|
||||
media2_net:
|
||||
ipv4_address: 172.24.0.16
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
restart: unless-stopped
|
||||
|
||||
# Bazarr - subtitle management for Sonarr and Radarr
|
||||
# Web UI: http://192.168.0.200:6767
|
||||
# Language profile: English (profile ID 1), no mustContain filter
|
||||
# Providers: REDACTED_APP_PASSWORD (vishinator), podnapisi, yifysubtitles, subf2m, subsource, subdl, animetosho
|
||||
# NOTE: OpenSubtitles.com may be IP-blocked — submit unblock request at opensubtitles.com/support
|
||||
# Notifications: Signal API via homelab-vm:8080 → REDACTED_PHONE_NUMBER
|
||||
# API keys stored in: /volume2/metadata/docker2/bazarr/config/config.yaml (not in repo)
|
||||
bazarr:
|
||||
image: lscr.io/linuxserver/bazarr:latest
|
||||
container_name: bazarr
|
||||
environment:
|
||||
- PUID=1029
|
||||
- PGID=100
|
||||
- TZ=America/Los_Angeles
|
||||
- UMASK=022
|
||||
- DOCKER_MODS=ghcr.io/themepark-dev/theme.park:bazarr
|
||||
- TP_SCHEME=http
|
||||
- TP_DOMAIN=192.168.0.200:8580
|
||||
- TP_THEME=dracula
|
||||
volumes:
|
||||
- /volume2/metadata/docker2/bazarr:/config
|
||||
- /volume1/data:/data
|
||||
- /volume3/usenet:/sab
|
||||
ports:
|
||||
- "6767:6767"
|
||||
networks:
|
||||
media2_net:
|
||||
ipv4_address: 172.24.0.10
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
restart: unless-stopped
|
||||
|
||||
whisparr:
|
||||
image: ghcr.io/hotio/whisparr:nightly
|
||||
container_name: whisparr
|
||||
environment:
|
||||
- PUID=1029
|
||||
- PGID=100
|
||||
- TZ=America/Los_Angeles
|
||||
- UMASK=022
|
||||
- TP_HOTIO=true
|
||||
- TP_SCHEME=http
|
||||
- TP_DOMAIN=192.168.0.200:8580
|
||||
- TP_THEME=dracula
|
||||
volumes:
|
||||
- /volume2/metadata/docker2/whisparr:/config
|
||||
- /volume1/data:/data
|
||||
- /volume3/usenet/complete:/sab/complete
|
||||
- /volume3/usenet/incomplete:/sab/incomplete
|
||||
ports:
|
||||
- "6969:6969"
|
||||
networks:
|
||||
media2_net:
|
||||
ipv4_address: 172.24.0.3
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
restart: unless-stopped
|
||||
|
||||
plex:
|
||||
image: lscr.io/linuxserver/plex:latest
|
||||
container_name: plex
|
||||
network_mode: host
|
||||
environment:
|
||||
- PUID=1029
|
||||
- PGID=100
|
||||
- TZ=America/Los_Angeles
|
||||
- UMASK=022
|
||||
- VERSION=docker
|
||||
- DOCKER_MODS=ghcr.io/themepark-dev/theme.park:plex
|
||||
- TP_SCHEME=http
|
||||
- TP_DOMAIN=192.168.0.200:8580
|
||||
- TP_THEME=dracula
|
||||
volumes:
|
||||
- /volume2/metadata/docker2/plex:/config
|
||||
- /volume1/data/media:/data/media
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
restart: unless-stopped
|
||||
|
||||
jellyseerr:
|
||||
image: fallenbagel/jellyseerr:latest
|
||||
container_name: jellyseerr
|
||||
user: "1029:100"
|
||||
environment:
|
||||
- TZ=America/Los_Angeles
|
||||
# Note: Jellyseerr theming requires CSS injection via reverse proxy or browser extension
|
||||
# theme.park doesn't support DOCKER_MODS for non-linuxserver images
|
||||
volumes:
|
||||
- /volume2/metadata/docker2/jellyseerr:/app/config
|
||||
ports:
|
||||
- "5055:5055"
|
||||
networks:
|
||||
media2_net:
|
||||
ipv4_address: 172.24.0.14
|
||||
dns:
|
||||
- 9.9.9.9
|
||||
- 1.1.1.1
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
restart: unless-stopped
|
||||
|
||||
gluetun:
|
||||
image: qmcgaw/gluetun:v3.38.0
|
||||
container_name: gluetun
|
||||
privileged: true
|
||||
devices:
|
||||
- /dev/net/tun:/dev/net/tun
|
||||
|
||||
labels:
|
||||
- com.centurylinklabs.watchtower.enable=false
|
||||
|
||||
environment:
|
||||
- PUID=1029
|
||||
- PGID=100
|
||||
- TZ=America/Los_Angeles
|
||||
|
||||
# --- WireGuard ---
|
||||
- VPN_SERVICE_PROVIDER=custom
|
||||
- VPN_TYPE=wireguard
|
||||
|
||||
- WIREGUARD_PRIVATE_KEY=aAavqcZ6sx3IlgiH5Q8m/6w33mBu4M23JBM8N6cBKEU= # pragma: allowlist secret
|
||||
- WIREGUARD_ADDRESSES=10.2.0.2/32
|
||||
- WIREGUARD_DNS=10.2.0.1
|
||||
|
||||
- WIREGUARD_PUBLIC_KEY=FrVOQ+Dy0StjfwNtbJygJCkwSJt6ynlGbQwZBZWYfhc=
|
||||
- WIREGUARD_ALLOWED_IPS=0.0.0.0/0,::/0
|
||||
|
||||
- WIREGUARD_ENDPOINT_IP=79.127.185.193
|
||||
- WIREGUARD_ENDPOINT_PORT=51820
|
||||
|
||||
volumes:
|
||||
- /volume2/metadata/docker2/gluetun:/gluetun
|
||||
|
||||
ports:
|
||||
- "8112:8112" # Deluge WebUI
|
||||
- "58946:58946" # Torrent TCP
|
||||
- "58946:58946/udp" # Torrent UDP
|
||||
|
||||
networks:
|
||||
media2_net:
|
||||
ipv4_address: 172.24.0.20
|
||||
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "wget -qO /dev/null http://127.0.0.1:9999 2>/dev/null || exit 1"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 6
|
||||
start_period: 30s
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
restart: unless-stopped
|
||||
|
||||
|
||||
deluge:
|
||||
image: lscr.io/linuxserver/deluge:latest
|
||||
container_name: deluge
|
||||
environment:
|
||||
- PUID=1029
|
||||
- PGID=100
|
||||
- TZ=America/Los_Angeles
|
||||
- UMASK=022
|
||||
- DOCKER_MODS=ghcr.io/themepark-dev/theme.park:deluge
|
||||
- TP_SCHEME=http
|
||||
- TP_DOMAIN=192.168.0.200:8580
|
||||
- TP_THEME=dracula
|
||||
volumes:
|
||||
- /volume2/metadata/docker2/deluge:/config
|
||||
- /volume2/torrents:/downloads
|
||||
network_mode: "service:gluetun"
|
||||
depends_on:
|
||||
gluetun:
|
||||
condition: service_healthy
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
restart: unless-stopped
|
||||
|
||||
tdarr:
|
||||
image: ghcr.io/haveagitgat/tdarr:latest
|
||||
container_name: tdarr
|
||||
environment:
|
||||
- PUID=1029
|
||||
- PGID=100
|
||||
- TZ=America/Los_Angeles
|
||||
- UMASK=022
|
||||
- serverIP=0.0.0.0
|
||||
- serverPort=8266
|
||||
- webUIPort=8265
|
||||
- internalNode=true
|
||||
- inContainer=true
|
||||
- ffmpegVersion=6
|
||||
- nodeName=Atlantis
|
||||
volumes:
|
||||
- /volume2/metadata/docker2/tdarr/server:/app/server
|
||||
- /volume2/metadata/docker2/tdarr/configs:/app/configs
|
||||
- /volume2/metadata/docker2/tdarr/logs:/app/logs
|
||||
- /volume1/data/media:/media
|
||||
- /volume3/usenet/tdarr_cache:/temp
|
||||
- /volume3/usenet/tdarr_cache:/cache # Fix: internal node uses /cache path
|
||||
ports:
|
||||
- "8265:8265"
|
||||
- "8266:8266"
|
||||
networks:
|
||||
media2_net:
|
||||
ipv4_address: 172.24.0.15
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
restart: unless-stopped
|
||||
154
hosts/synology/atlantis/arr-suite/install.sh
Executable file
154
hosts/synology/atlantis/arr-suite/install.sh
Executable file
@@ -0,0 +1,154 @@
|
||||
#!/usr/bin/env bash
|
||||
# =============================================================================
|
||||
# Arr-Suite Installer — Atlantis (192.168.0.200)
|
||||
# =============================================================================
|
||||
# One-line install:
|
||||
# bash <(curl -fsSL https://git.vish.gg/Vish/homelab/raw/branch/main/hosts/synology/atlantis/arr-suite/install.sh)
|
||||
#
|
||||
# What this installs:
|
||||
# Sonarr, Radarr, Lidarr, Bazarr, Prowlarr, Jackett, FlaresolverR
|
||||
# SABnzbd, Deluge (via gluetun VPN), Tdarr, LazyLibrarian
|
||||
# Audiobookshelf, Whisparr, Plex, Jellyseerr, Tautulli, Wizarr
|
||||
#
|
||||
# Prerequisites:
|
||||
# - Synology DSM with Container Manager (Docker)
|
||||
# - /volume1/data, /volume2/metadata/docker2, /volume3/usenet, /volume2/torrents
|
||||
# - PUID=1029, PGID=100 (DSM user: vish)
|
||||
# - WireGuard credentials for gluetun (must be set in compose or env)
|
||||
# =============================================================================
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
REPO_URL="https://git.vish.gg/Vish/homelab"
|
||||
COMPOSE_URL="${REPO_URL}/raw/branch/main/hosts/synology/atlantis/arr-suite/docker-compose.yml"
|
||||
DOCKER="${DOCKER_BIN:-/usr/local/bin/docker}"
|
||||
STACK_DIR="/volume2/metadata/docker2/arr-suite"
|
||||
COMPOSE_FILE="${STACK_DIR}/docker-compose.yml"
|
||||
|
||||
# Colours
|
||||
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m'
|
||||
info() { echo -e "${GREEN}[INFO]${NC} $*"; }
|
||||
warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
|
||||
error() { echo -e "${RED}[ERROR]${NC} $*"; exit 1; }
|
||||
|
||||
# ── Preflight ─────────────────────────────────────────────────────────────────
|
||||
|
||||
info "Arr-Suite installer starting"
|
||||
|
||||
[[ $(id -u) -eq 0 ]] || error "Run as root (sudo bash install.sh)"
|
||||
command -v "$DOCKER" &>/dev/null || error "Docker not found at $DOCKER — set DOCKER_BIN env var"
|
||||
|
||||
for vol in /volume1/data /volume2/metadata/docker2 /volume3/usenet /volume2/torrents; do
|
||||
[[ -d "$vol" ]] || warn "Volume $vol does not exist — create it before starting services"
|
||||
done
|
||||
|
||||
# ── Required directories ───────────────────────────────────────────────────────
|
||||
|
||||
info "Creating config directories..."
|
||||
SERVICES=(
|
||||
sonarr radarr lidarr bazarr prowlarr jackett sabnzbd
|
||||
deluge gluetun tdarr/server tdarr/configs tdarr/logs
|
||||
lazylibrarian audiobookshelf whisparr plex jellyseerr
|
||||
tautulli wizarr
|
||||
)
|
||||
for svc in "${SERVICES[@]}"; do
|
||||
mkdir -p "/volume2/metadata/docker2/${svc}"
|
||||
done
|
||||
|
||||
# Download directories
|
||||
mkdir -p \
|
||||
/volume3/usenet/complete \
|
||||
/volume3/usenet/incomplete \
|
||||
/volume3/usenet/tdarr_cache \
|
||||
/volume2/torrents/complete \
|
||||
/volume2/torrents/incomplete
|
||||
|
||||
# Media library
|
||||
mkdir -p \
|
||||
/volume1/data/media/tv \
|
||||
/volume1/data/media/movies \
|
||||
/volume1/data/media/music \
|
||||
/volume1/data/media/audiobooks \
|
||||
/volume1/data/media/podcasts \
|
||||
/volume1/data/media/ebooks \
|
||||
/volume1/data/media/misc
|
||||
|
||||
# Lidarr arr-scripts directories
|
||||
mkdir -p \
|
||||
/volume2/metadata/docker2/lidarr-scripts/custom-cont-init.d \
|
||||
/volume2/metadata/docker2/lidarr-scripts/custom-services.d
|
||||
|
||||
# ── Lidarr arr-scripts bootstrap ──────────────────────────────────────────────
|
||||
|
||||
INIT_SCRIPT="/volume2/metadata/docker2/lidarr-scripts/custom-cont-init.d/scripts_init.bash"
|
||||
if [[ ! -f "$INIT_SCRIPT" ]]; then
|
||||
info "Downloading arr-scripts init script..."
|
||||
curl -fsSL "https://raw.githubusercontent.com/RandomNinjaAtk/arr-scripts/main/lidarr/scripts_init.bash" \
|
||||
-o "$INIT_SCRIPT" || warn "Failed to download arr-scripts init — download manually from RandomNinjaAtk/arr-scripts"
|
||||
chmod +x "$INIT_SCRIPT"
|
||||
fi
|
||||
|
||||
# ── Download compose file ──────────────────────────────────────────────────────
|
||||
|
||||
info "Downloading docker-compose.yml..."
|
||||
mkdir -p "$STACK_DIR"
|
||||
curl -fsSL "$COMPOSE_URL" -o "$COMPOSE_FILE" || error "Failed to download compose file from $COMPOSE_URL"
|
||||
|
||||
# ── Warn about secrets ────────────────────────────────────────────────────────
|
||||
|
||||
warn "==================================================================="
|
||||
warn "ACTION REQUIRED before starting:"
|
||||
warn ""
|
||||
warn "1. Set gluetun WireGuard credentials in:"
|
||||
warn " $COMPOSE_FILE"
|
||||
warn " - WIREGUARD_PRIVATE_KEY"
|
||||
warn " - WIREGUARD_PUBLIC_KEY"
|
||||
warn " - WIREGUARD_ENDPOINT_IP"
|
||||
warn ""
|
||||
warn "2. Set Lidarr Deezer ARL token:"
|
||||
warn " /volume2/metadata/docker2/lidarr/extended.conf"
|
||||
warn " arlToken=\"<your-arl-token>\""
|
||||
warn " Get from: deezer.com -> DevTools -> Cookies -> arl"
|
||||
warn ""
|
||||
warn "3. Set Plex claim token (optional, for initial setup):"
|
||||
warn " https://www.plex.tv/claim"
|
||||
warn " Add to compose: PLEX_CLAIM=<token>"
|
||||
warn "==================================================================="
|
||||
|
||||
# ── Pull images ───────────────────────────────────────────────────────────────
|
||||
|
||||
read -rp "Pull all images now? (y/N): " pull_images
|
||||
if [[ "${pull_images,,}" == "y" ]]; then
|
||||
info "Pulling images (this may take a while)..."
|
||||
"$DOCKER" compose -f "$COMPOSE_FILE" pull
|
||||
fi
|
||||
|
||||
# ── Start stack ───────────────────────────────────────────────────────────────
|
||||
|
||||
read -rp "Start all services now? (y/N): " start_services
|
||||
if [[ "${start_services,,}" == "y" ]]; then
|
||||
info "Starting arr-suite..."
|
||||
"$DOCKER" compose -f "$COMPOSE_FILE" up -d
|
||||
info "Done! Services starting..."
|
||||
echo ""
|
||||
echo "Service URLs:"
|
||||
echo " Sonarr: http://192.168.0.200:8989"
|
||||
echo " Radarr: http://192.168.0.200:7878"
|
||||
echo " Lidarr: http://192.168.0.200:8686"
|
||||
echo " Prowlarr: http://192.168.0.200:9696"
|
||||
echo " SABnzbd: http://192.168.0.200:8080"
|
||||
echo " Deluge: http://192.168.0.200:8112 (password: "REDACTED_PASSWORD"
|
||||
echo " Bazarr: http://192.168.0.200:6767"
|
||||
echo " Tdarr: http://192.168.0.200:8265"
|
||||
echo " Whisparr: http://192.168.0.200:6969"
|
||||
echo " Plex: http://192.168.0.200:32400/web"
|
||||
echo " Jellyseerr: http://192.168.0.200:5055"
|
||||
echo " Audiobookshelf:http://192.168.0.200:13378"
|
||||
echo " LazyLibrarian: http://192.168.0.200:5299"
|
||||
echo " Tautulli: http://192.168.0.200:8181"
|
||||
echo " Wizarr: http://192.168.0.200:5690"
|
||||
echo " Jackett: http://192.168.0.200:9117"
|
||||
fi
|
||||
|
||||
info "Install complete."
|
||||
info "Docs: https://git.vish.gg/Vish/homelab/src/branch/main/docs/services/individual/"
|
||||
18
hosts/synology/atlantis/arr-suite/jellyseerr.yaml
Normal file
18
hosts/synology/atlantis/arr-suite/jellyseerr.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
services:
|
||||
jellyseerr:
|
||||
image: fallenbagel/jellyseerr:latest
|
||||
container_name: jellyseerr
|
||||
user: 1029:65536 #YOUR_UID_AND_GID
|
||||
environment:
|
||||
- TZ=America/Los_Angeles #CHANGE_TO_YOUR_TZ
|
||||
volumes:
|
||||
- /volume1/docker2/jellyseerr:/app/config
|
||||
ports:
|
||||
- 5055:5055/tcp
|
||||
network_mode: synobridge
|
||||
dns: #DNS Servers to help with speed issues some have
|
||||
- 9.9.9.9
|
||||
- 1.1.1.1
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
restart: unless-stopped
|
||||
163
hosts/synology/atlantis/arr-suite/plex.yaml
Normal file
163
hosts/synology/atlantis/arr-suite/plex.yaml
Normal file
@@ -0,0 +1,163 @@
|
||||
# =============================================================================
|
||||
# PLEX MEDIA SERVER - DISASTER RECOVERY CONFIGURATION
|
||||
# =============================================================================
|
||||
#
|
||||
# SERVICE OVERVIEW:
|
||||
# - Primary media streaming server for homelab
|
||||
# - Serves 4K movies, TV shows, music, and photos
|
||||
# - Hardware transcoding enabled via Intel Quick Sync
|
||||
# - Critical service for media consumption
|
||||
#
|
||||
# DISASTER RECOVERY NOTES:
|
||||
# - Configuration stored in /volume1/docker2/plex (CRITICAL BACKUP)
|
||||
# - Media files in /volume1/data/media (128TB+ library)
|
||||
# - Database contains watch history, metadata, user preferences
|
||||
# - Hardware transcoding requires Intel GPU access (/dev/dri)
|
||||
#
|
||||
# BACKUP PRIORITY: HIGH
|
||||
# - Config backup: Daily automated backup required
|
||||
# - Media backup: Secondary NAS sync (Calypso)
|
||||
# - Database backup: Included in config volume
|
||||
#
|
||||
# RECOVERY TIME OBJECTIVE (RTO): 30 minutes
|
||||
# RECOVERY POINT OBJECTIVE (RPO): 24 hours
|
||||
#
|
||||
# DEPENDENCIES:
|
||||
# - Volume1 must be accessible (current issue: SSD cache failure)
|
||||
# - Intel GPU drivers for hardware transcoding
|
||||
# - Network connectivity for remote access
|
||||
# - Plex Pass subscription for premium features
|
||||
#
|
||||
# PORTS USED:
|
||||
# - 32400/tcp: Main Plex web interface and API
|
||||
# - 3005/tcp: Plex Home Theater via Plex Companion
|
||||
# - 8324/tcp: Plex for Roku via Plex Companion
|
||||
# - 32469/tcp: Plex DLNA Server
|
||||
# - 1900/udp: Plex DLNA Server
|
||||
# - 32410/udp, 32412/udp, 32413/udp, 32414/udp: GDM Network discovery
|
||||
#
|
||||
# =============================================================================
|
||||
|
||||
services:
|
||||
plex:
|
||||
# CONTAINER IMAGE:
|
||||
# - linuxserver/plex: Community-maintained, regularly updated
|
||||
# - Alternative: plexinc/pms-docker (official but less frequent updates)
|
||||
# - Version pinning recommended for production: linuxserver/plex:1.32.8
|
||||
image: linuxserver/plex:latest
|
||||
|
||||
# CONTAINER NAME:
|
||||
# - Fixed name for easy identification and management
|
||||
# - Used in monitoring, logs, and backup scripts
|
||||
container_name: plex
|
||||
|
||||
# NETWORK CONFIGURATION:
|
||||
# - host mode: Required for Plex auto-discovery and DLNA
|
||||
# - Allows Plex to bind to all network interfaces
|
||||
# - Enables UPnP/DLNA functionality for smart TVs
|
||||
# - SECURITY NOTE: Exposes all container ports to host
|
||||
network_mode: host
|
||||
|
||||
environment:
|
||||
# USER/GROUP PERMISSIONS:
|
||||
# - PUID=1029: User ID for file ownership (Synology 'admin' user)
|
||||
# - PGID=65536: Group ID for file access (Synology 'administrators' group)
|
||||
# - CRITICAL: Must match NAS user/group for file access
|
||||
# - Find correct values: id admin (on Synology)
|
||||
- PUID=1029 #CHANGE_TO_YOUR_UID
|
||||
- PGID=65536 #CHANGE_TO_YOUR_GID
|
||||
|
||||
# TIMEZONE CONFIGURATION:
|
||||
# - TZ: Timezone for logs, scheduling, and metadata
|
||||
# - Must match system timezone for accurate timestamps
|
||||
# - Format: Area/City (e.g., America/Los_Angeles, Europe/London)
|
||||
- TZ=America/Los_Angeles #CHANGE_TO_YOUR_TZ
|
||||
|
||||
# FILE PERMISSIONS:
|
||||
# - UMASK=022: Default file permissions (755 for dirs, 644 for files)
|
||||
# - Ensures proper read/write access for media files
|
||||
# - 022 = owner: rwx, group: r-x, other: r-x
|
||||
- UMASK=022
|
||||
|
||||
# PLEX VERSION MANAGEMENT:
|
||||
# - VERSION=docker: Use version bundled with Docker image
|
||||
# - Alternative: VERSION=latest (auto-update, not recommended for production)
|
||||
# - Alternative: VERSION=1.32.8.7639-fb6452ebf (pin specific version)
|
||||
- VERSION=docker
|
||||
|
||||
# PLEX CLAIM TOKEN:
|
||||
# - Used for initial server setup and linking to Plex account
|
||||
# - Get token from: https://plex.tv/claim (valid for 4 minutes)
|
||||
# - Leave empty after initial setup
|
||||
# - SECURITY: Remove token after claiming server
|
||||
- PLEX_CLAIM=
|
||||
|
||||
volumes:
|
||||
# CONFIGURATION VOLUME:
|
||||
# - /volume1/docker2/plex:/config
|
||||
# - Contains: Database, metadata, thumbnails, logs, preferences
|
||||
# - SIZE: ~50-100GB depending on library size
|
||||
# - BACKUP CRITICAL: Contains all user data and settings
|
||||
# - RECOVERY: Restore this volume to recover complete Plex setup
|
||||
- /volume1/docker2/plex:/config
|
||||
|
||||
# MEDIA VOLUME:
|
||||
# - /volume1/data/media:/data/media
|
||||
# - Contains: Movies, TV shows, music, photos (128TB+ library)
|
||||
# - READ-ONLY recommended for security (add :ro suffix if desired)
|
||||
# - STRUCTURE: Organized by type (movies/, tv/, music/, photos/)
|
||||
# - BACKUP: Synced to Calypso NAS for redundancy
|
||||
- /volume1/data/media:/data/media
|
||||
|
||||
devices:
|
||||
# HARDWARE TRANSCODING:
|
||||
# - /dev/dri:/dev/dri: Intel Quick Sync Video access
|
||||
# - Enables hardware-accelerated transcoding (H.264, H.265, AV1)
|
||||
# - CRITICAL: Reduces CPU usage by 80-90% during transcoding
|
||||
# - REQUIREMENT: Intel GPU with Quick Sync support
|
||||
# - TROUBLESHOOTING: Check 'ls -la /dev/dri' for render devices
|
||||
- /dev/dri:/dev/dri
|
||||
|
||||
security_opt:
|
||||
# SECURITY HARDENING:
|
||||
# - no-new-privileges: Prevents privilege escalation attacks
|
||||
# - Container cannot gain additional privileges during runtime
|
||||
# - Recommended security practice for all containers
|
||||
- no-new-privileges:true
|
||||
|
||||
# RESTART POLICY:
|
||||
# - always: Container restarts automatically on failure or system reboot
|
||||
# - CRITICAL: Ensures Plex is always available for media streaming
|
||||
# - Alternative: unless-stopped (won't restart if manually stopped)
|
||||
restart: unless-stopped
|
||||
|
||||
# =============================================================================
|
||||
# DISASTER RECOVERY PROCEDURES:
|
||||
# =============================================================================
|
||||
#
|
||||
# BACKUP VERIFICATION:
|
||||
# docker exec plex ls -la /config/Library/Application\ Support/Plex\ Media\ Server/
|
||||
#
|
||||
# MANUAL BACKUP:
|
||||
# tar -czf /volume2/backups/plex-config-$(date +%Y%m%d).tar.gz /volume1/docker2/plex/
|
||||
#
|
||||
# RESTORE PROCEDURE:
|
||||
# 1. Stop container: docker-compose down
|
||||
# 2. Restore config: tar -xzf plex-backup.tar.gz -C /volume1/docker2/
|
||||
# 3. Fix permissions: chown -R 1029:65536 /volume1/docker2/plex/
|
||||
# 4. Start container: docker-compose up -d
|
||||
# 5. Verify: Check http://atlantis.vish.local:32400/web
|
||||
#
|
||||
# TROUBLESHOOTING:
|
||||
# - No hardware transcoding: Check /dev/dri permissions and Intel GPU drivers
|
||||
# - Database corruption: Restore from backup or rebuild library
|
||||
# - Permission errors: Verify PUID/PGID match NAS user/group
|
||||
# - Network issues: Check host networking and firewall rules
|
||||
#
|
||||
# MONITORING:
|
||||
# - Health check: curl -f http://localhost:32400/identity
|
||||
# - Logs: docker logs plex
|
||||
# - Transcoding: Plex Dashboard > Settings > Transcoder
|
||||
# - Performance: Grafana dashboard for CPU/GPU usage
|
||||
#
|
||||
# =============================================================================
|
||||
29
hosts/synology/atlantis/arr-suite/prowlarr_flaresolverr.yaml
Normal file
29
hosts/synology/atlantis/arr-suite/prowlarr_flaresolverr.yaml
Normal file
@@ -0,0 +1,29 @@
|
||||
services:
|
||||
linuxserver-prowlarr:
|
||||
image: linuxserver/prowlarr:latest
|
||||
container_name: prowlarr
|
||||
environment:
|
||||
- PUID=1029 #CHANGE_TO_YOUR_UID
|
||||
- PGID=65536 #CHANGE_TO_YOUR_GID
|
||||
- TZ=America/Los_Angeles #CHANGE_TO_YOUR_TZ
|
||||
- UMASK=022
|
||||
volumes:
|
||||
- /volume1/docker2/prowlarr:/config
|
||||
ports:
|
||||
- 9696:9696/tcp
|
||||
network_mode: synobridge
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
restart: unless-stopped
|
||||
|
||||
flaresolverr:
|
||||
image: flaresolverr/flaresolverr:latest
|
||||
container_name: flaresolverr
|
||||
environment:
|
||||
- TZ=America/Los_Angeles #CHANGE_TO_YOUR_TZ
|
||||
ports:
|
||||
- 8191:8191
|
||||
network_mode: synobridge
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
restart: unless-stopped
|
||||
18
hosts/synology/atlantis/arr-suite/sabnzbd.yaml
Normal file
18
hosts/synology/atlantis/arr-suite/sabnzbd.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
services:
|
||||
sabnzbd:
|
||||
image: linuxserver/sabnzbd:latest
|
||||
container_name: sabnzbd
|
||||
environment:
|
||||
- PUID=1029 #CHANGE_TO_YOUR_UID
|
||||
- PGID=65536 #CHANGE_TO_YOUR_GID
|
||||
- TZ=America/Los_Angeles #CHANGE_TO_YOUR_TZ
|
||||
- UMASK=022
|
||||
volumes:
|
||||
- /volume1/docker2/sabnzbd:/config
|
||||
- /volume1/data/usenet:/data/usenet
|
||||
ports:
|
||||
- 8080:8080/tcp
|
||||
network_mode: synobridge
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
restart: unless-stopped
|
||||
17
hosts/synology/atlantis/arr-suite/tautulli.yaml
Normal file
17
hosts/synology/atlantis/arr-suite/tautulli.yaml
Normal file
@@ -0,0 +1,17 @@
|
||||
services:
|
||||
tautulli:
|
||||
image: linuxserver/tautulli:latest
|
||||
container_name: tautulli
|
||||
environment:
|
||||
- PUID=1029 #CHANGE_TO_YOUR_UID
|
||||
- PGID=65536 #CHANGE_TO_YOUR_GID
|
||||
- TZ=America/Los_Angeles #CHANGE_TO_YOUR_TZ
|
||||
- UMASK=022
|
||||
volumes:
|
||||
- /volume1/docker2/tautulli:/config
|
||||
ports:
|
||||
- 8181:8181/tcp
|
||||
network_mode: synobridge
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
restart: unless-stopped
|
||||
18
hosts/synology/atlantis/arr-suite/whisparr.yaml
Normal file
18
hosts/synology/atlantis/arr-suite/whisparr.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
services:
|
||||
whisparr:
|
||||
image: hotio/whisparr:nightly
|
||||
container_name: whisparr
|
||||
environment:
|
||||
- PUID=1029 #CHANGE_TO_YOUR_UID
|
||||
- PGID=65536 #CHANGE_TO_YOUR_GID
|
||||
- TZ=America/Los_Angeles #CHANGE_TO_YOUR_TZ
|
||||
- UMASK=022
|
||||
volumes:
|
||||
- /volume1/docker2/whisparr:/config
|
||||
- /volume1/data/:/data
|
||||
ports:
|
||||
- 6969:6969/tcp
|
||||
network_mode: synobridge
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
restart: unless-stopped
|
||||
19
hosts/synology/atlantis/arr-suite/wizarr.yaml
Normal file
19
hosts/synology/atlantis/arr-suite/wizarr.yaml
Normal file
@@ -0,0 +1,19 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
wizarr:
|
||||
image: ghcr.io/wizarrrr/wizarr:latest
|
||||
container_name: wizarr
|
||||
environment:
|
||||
- PUID=1029
|
||||
- PGID=65536
|
||||
- TZ=America/Los_Angeles
|
||||
- DISABLE_BUILTIN_AUTH=false
|
||||
volumes:
|
||||
- /volume1/docker2/wizarr:/data/database
|
||||
ports:
|
||||
- 5690:5690/tcp
|
||||
network_mode: synobridge
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
restart: unless-stopped
|
||||
Reference in New Issue
Block a user