diff --git a/Master.conf b/Master.conf index c411638..431232e 100644 --- a/Master.conf +++ b/Master.conf @@ -24,11 +24,18 @@ # ── RSYNC ────────────────────────────────────────────────────────────────────────────────── # RSYNC DEFAULTS Global fallback rsync settings # REMOTE HEALTH CHECKS Rootfs threshold for pre-flight abort -# DAILY SYNC SHARES Media shares synced by media_shares_sync.sh +# DAILY SYNC SHARES Media shares synced by media_shares_sync.sh (per-host) +# PERSONAL ENCRYPTED SHARES Per-user private shares — ZFS encrypted, synced separately # RSYNC PROFILE SYSTEM Per-profile overrides (appdata profiles) # # ── FAILOVER ─────────────────────────────────────────────────────────────────────────────── # FAILOVER Mutual container failover between two servers +# FAILOVER TEST Simulated outage settings for failover_test.sh +# DDNS Script-controlled DDNS — absolute rules +# INTERNET LOSS Containers to stop when internet is lost +# TIERED CONTAINER LISTS What each server runs for the other per tier +# TIER DELAY SETTINGS How long before each tier activates (minutes) +# RSYNC WRITEBACK JOBS Appdata synced back to primary on handback # # ── DOCKER ESSENTIALS ────────────────────────────────────────────────────────────────────── # DOCKER DAILY RESTART Containers restarted daily @@ -49,9 +56,11 @@ # MEDIA CLEANER Anime and media folder lists and file patterns # MEDIA MANAGEMENT Orchestrator job list for media_management.sh # ARR CLEANUP Lidarr, Sonarr, Radarr orphan file cleanup +# ARR FAILED/STALLED RECOVERY Auto blocklist + re-search failed imports and stalled downloads # # ── TRANSCODES ───────────────────────────────────────────────────────────────────────────── # TRANSCODE MANAGER Ramdisk and SSD fallback transcode management +# TRANSCODE SERVER ARRAY Multi-server session monitoring (Emby, Jellyfin, Plex) # # ── MONITORS ─────────────────────────────────────────────────────────────────────────────── # CERTIFICATE MONITOR SSL certificate expiry monitoring @@ -60,6 +69,8 @@ # ZFS MEMORY SNAPSHOT Weekly ZFS health and memory diagnostic report # BANDWIDTH MONITOR Daily rsync transfer logging and weekly summary # HEALTH DIGEST Aggregated system health digest — always/smart/weekly +# CRITICAL SHARES MAINTENANCE Weekly clean sync + container updates (Emby + auth stack) +# EMBY Emby URL and API key — used by multiple scripts # EMBY SESSION REPORT Weekly Emby usage statistics via API # # ── SYSTEM WATCHDOG ──────────────────────────────────────────────────────────────────────── @@ -177,15 +188,15 @@ HOST1_DAILY_SYNC_SHARES=( /mnt/user/stand-up_comedy /mnt/user/Sports /mnt/user/Tv_Shows + /mnt/user/Anime_Shows-Old + /mnt/user/Anime_Movies-Old ) # HOST2 truth shares — pushed from HOST2 to HOST1 nightly # HOST2 is source of truth for anime — his arrs manage these shares HOST2_DAILY_SYNC_SHARES=( /mnt/user/Anime_Movies - /mnt/user/Anime_Movies-Old /mnt/user/Anime_Shows - /mnt/user/Anime_Shows-Old ) # ━━━ Personal Encrypted Shares ━━━ @@ -472,11 +483,11 @@ HOST2_DDNS_CONTAINERS=( # Own DDNS handled separately above — list additional containers here if needed # These stop when this server loses internet — regardless of remote state FAILOVER_HOST1_STOP_ON_NO_NET=( - # "container-name" # add containers that should stop without internet + "Gmer4Lfe.com" # stop when HOST1 loses internet ) FAILOVER_HOST2_STOP_ON_NO_NET=( - # "container-name" + "Gmer4Lfe.us" # stop when HOST2 loses internet ) # ━━━ HOST1 runs these for HOST2 when HOST2 goes down ━━━ @@ -515,13 +526,6 @@ FAILOVER_HOST1_RUNS_FOR_HOST2_18HR=( FAILOVER_HOST2_RUNS_FOR_HOST1_IMMEDIATE=( "Gmer4Lfe.com" # HOST1's DDNS — start first, covers HOST1's domain "Emby" # media server — users are actively watching - "NginxProxyManager" # reverse proxy — all services route through this - "Lldap-Gmer4Lfe" # auth directory — required by Authelia - "Mariadb-Authelia" # auth database — required by Authelia - "Redis-Authelia" # auth cache — required by Authelia - "Authelia" # authentication — required for all proxied services - "Authelia-Secondary" # auth redundancy - "Redis-Authelia-Secondary" # auth secondary cache "VaultWarden-Gmer4Lfe" # password manager — critical, immediate access needed "Dispatcharr" # Live TV — people are watching, cannot wait "Dispatcharr-Basic" # Live TV basic profile @@ -536,18 +540,13 @@ FAILOVER_HOST2_RUNS_FOR_HOST1_2HR=( "NextCloud" # file access and collaboration "PostgreSQL_Immich" # Immich database "Immich-Gmer4Lfe" # photo management - "Jellyseerr" # media request management # "container-placeholder" ) # Tier 3 — starts after HOST1_TIER3_DELAY minutes # Secondary services — useful but not immediately critical FAILOVER_HOST2_RUNS_FOR_HOST1_6HR=( - "Organizrv2-Gmer4Lfe" # dashboard — nice to have - "AdGuard-Home" # DNS filtering - "UptimeKuma-Gmer4Lfe" # uptime monitoring "Gitea" # git server - "Collabora-CODE" # document editing for NextCloud # "container-placeholder" ) @@ -576,14 +575,14 @@ FAILOVER_HOST2_RUNS_FOR_HOST1_18HR=( # Adjust based on your tolerance for resource usage on the covering server # Delays for HOST1's containers running on HOST2 (HOST1 is down) -HOST1_TIER2_DELAY=120 # 2 hours — NextCloud, Immich can wait -HOST1_TIER3_DELAY=360 # 6 hours — dashboard, monitoring, Gitea -HOST1_TIER4_DELAY=1080 # 18 hours — full workflow, arrs and downloaders +HOST1_TIER2_DELAY=240 # 4 hours — NextCloud, Immich can wait +HOST1_TIER3_DELAY=720 # 12 hours — secondary services +HOST1_TIER4_DELAY=1440 # 24 hours — full workflow, arrs and downloaders # Delays for HOST2's containers running on HOST1 (HOST2 is down) -HOST2_TIER2_DELAY=120 -HOST2_TIER3_DELAY=360 -HOST2_TIER4_DELAY=1080 +HOST2_TIER2_DELAY=240 +HOST2_TIER3_DELAY=720 +HOST2_TIER4_DELAY=1440 # ━━━ Rsync Writeback Jobs ━━━ # Run during handback — syncs critical appdata back to primary before containers restart. @@ -630,8 +629,8 @@ HOST2_TIER1_WRITEBACK_DELAY=60 # minutes — skip Tier 1 writeback if outage un # HOST1 writeback tiers — run by HOST2 during HOST1 handback FAILOVER_HOST1_WRITEBACK_TIER1=( - "/mnt/user/Media_Server/Emby" # Emby userdata, playstates, metadata - "/mnt/user/appdata-Failover/Critical-Data" # auth stack — Authelia, Mariadb, Redis, LLDAP, NPM + "/mnt/user/Media_Server/Emby" # Emby userdata, playstates, metadata + # "location-placeholder" ) FAILOVER_HOST1_WRITEBACK_TIER2=( @@ -639,15 +638,13 @@ FAILOVER_HOST1_WRITEBACK_TIER2=( ) FAILOVER_HOST1_WRITEBACK_TIER3=( - "/mnt/user/appdata-Failover/Gmer4Lfe" # server specific appdata — Organizr, UptimeKuma + # "location-placeholder" ) FAILOVER_HOST1_WRITEBACK_TIER4=( # Edge case paths outside of normal HOST1_DAILY_SYNC_SHARES # Tier 4 automatically syncs HOST1_DAILY_SYNC_SHARES back — add extras here only - # Examples: a share that exists but isn't in the daily sync list, - # a special appdata path only relevant after extended outage - # "/mnt/user/SomeSpecialShare" + "/mnt/user/appdata-Failover/Arrs_Stack" ) # HOST2 writeback tiers — run by HOST1 during HOST2 handback @@ -661,13 +658,13 @@ FAILOVER_HOST2_WRITEBACK_TIER2=( ) FAILOVER_HOST2_WRITEBACK_TIER3=( - # "/mnt/user/appdata-Failover/Jayred365" + # "location-placeholder" ) FAILOVER_HOST2_WRITEBACK_TIER4=( # Edge case paths outside of normal HOST2_DAILY_SYNC_SHARES # Tier 4 automatically syncs HOST2_DAILY_SYNC_SHARES back — add extras here only - # "/mnt/user/SomeSpecialShare" + "/mnt/user/appdata-Failover/Arrs_Stack" ) # ============================================================================================== @@ -818,7 +815,8 @@ NETWORK_CONNECT_CONTAINERS=( ) NETWORK_CONNECT_NETWORKS=( - "nextcloud-aio" # Docker network name — must exist before array start + "high-availability" # Docker network name — must exist before array start + # containers needing their own network but accessible from main custom network ) # ============================================================================================== @@ -1022,7 +1020,7 @@ RADARR_PROTECTED_PATTERNS=("*.jpg" "*.jpeg" "*.png" "*.nfo" "*.srt" "*.sub" "*.a # ━━━ Arr Import Recovery ━━━ # Automatically blocklists and re-searches failed imports and stalled downloads. -# Runs every 6 hrs +# Runs daily at 5am — by this time overnight downloads are complete and any # failures have had time to surface. Items under ARR_IMPORT_RECOVERY_AGE are # skipped — gives the arr time to retry on its own before we intervene. # @@ -1040,7 +1038,7 @@ RADARR_PROTECTED_PATTERNS=("*.jpg" "*.jpeg" "*.png" "*.nfo" "*.srt" "*.sub" "*.a # detect_hosts() selects correct URL and API key per server at runtime # Lidarr runs on HOST1 only — exits cleanly on HOST2 -ARR_IMPORT_RECOVERY_AGE=6 # hours — skip items newer than this, give arr time to retry +ARR_IMPORT_RECOVERY_AGE=12 # hours — skip items newer than this, give arr time to retry # Per-arr enable/disable HOST1_SONARR_RECOVERY=true # Tv_Shows import recovery @@ -1070,13 +1068,13 @@ HOST2_RADARR_RECOVERY=true # Anime_Movies import recovery # and new sessions land on SSD permanently for that container run. RAMDISK_PATH="/mnt/ramdisk_transcodes" # tmpfs mount point created at array start - RAMDISK_SIZE="10G" # ceiling — tmpfs only uses RAM actually needed + RAMDISK_SIZE="8G" # ceiling — tmpfs only uses RAM actually needed TRANSCODE_LINK="/mnt/ram-transcode" # symlink Emby points at — location never changes TRANSCODE_SSD="/mnt/cache/Temp_Storage/Emby/Transcodes/" # SSD fallback location # Usage thresholds in GB — hysteresis gap between WARN and LOW prevents flip-flop - RAMDISK_WARN_GB=8.8 # flip symlink to SSD at or above this usage - RAMDISK_LOW_GB=6.5 # flip symlink back to ramdisk when usage drops here + RAMDISK_WARN_GB=6.8 # flip symlink to SSD at or above this usage + RAMDISK_LOW_GB=5.5 # flip symlink back to ramdisk when usage drops here RAMDISK_SSD_MIN_GB=20 # minimum free GB on SSD required before allowing flip to SSD # Cleanup age thresholds — files must be older than these AND not open by any process @@ -1252,10 +1250,12 @@ ZFS_REPORT_IGNORE_POOLS=( CRITICAL_SYNC_UPDATES=true # pull container updates locally during maintenance CRITICAL_SYNC_UPDATES_REMOTE=true # pull container updates on remote via SSH -# ━━━ Emby Session Report ━━━ -# No persistent writes — queries fresh each run. +# ━━━ Emby ━━━ +# Emby URL and API key used by multiple scripts: +# transcode_manager.sh, emby_session_report.sh, emby_database_repair.sh # Each server has its own Emby instance with its own API key. # detect_hosts() selects the correct URL and key at runtime. +# API key found in Emby Dashboard → API Keys → + New Key HOST1_EMBY_URL="http://localhost:8096" HOST1_EMBY_API_KEY="0c27448d93a7431f9ac63569f7655829" @@ -1263,6 +1263,8 @@ HOST1_EMBY_API_KEY="0c27448d93a7431f9ac63569f7655829" HOST2_EMBY_URL="http://localhost:8096" # same port — different server, different key HOST2_EMBY_API_KEY="your-host2-emby-api-key" +# ━━━ Emby Session Report ━━━ +# No persistent writes — queries fresh each run. EMBY_REPORT_DAYS=7 # number of days to include in the report period EMBY_REPORT_TOP_N=10 # number of top content items to show in report