221 lines
7.8 KiB
Bash
221 lines
7.8 KiB
Bash
#!/bin/bash
|
|
# ----------------------------------------------------------------------------------------------
|
|
# ---------------------------- Master Variables for unRAID scripts -----------------------------
|
|
# ----------------------------------------------------------------------------------------------
|
|
|
|
# ━━━ Host Configuration ━━━
|
|
# List the Hostnames of both servers
|
|
HOST1="unRAID-Gmer4Lfe"
|
|
HOST2="unRAID-Jayred365"
|
|
# Assign SSH keys for each host pair (adjust paths as needed) HOST1 from above
|
|
# Must have its key added to HOST1_SSH_Key same applies for HOST2
|
|
HOST1_SSH_KEY="/root/.ssh/Gmer4Lfe-rsync-key"
|
|
HOST2_SSH_KEY="/root/.ssh/Jayred365-rsync-key"
|
|
|
|
# ━━━ Logging ━━━
|
|
ENABLE_LOGGING=true # false = only echo user-facing messages
|
|
|
|
# ━━━ Notifications ━━━
|
|
# unRAID native notification system — set to true to enable
|
|
# Configure unRAID to send errors only: Settings → Notification Settings
|
|
NOTIFY_UNRAID=true
|
|
# Discord webhook URL — leave blank to disable
|
|
DISCORD_WEBHOOK=""
|
|
|
|
# ━━━ Git, Pull & Execute Script ━━━
|
|
REPO_SSH="git@192.168.50.2:FailedProxy/Unraid_Scripts.git"
|
|
TARGET_DIR="/mnt/user/appdata/unraid_scripts"
|
|
GITEA_SSH_KEY="/root/.ssh/id_gitea_rsync"
|
|
SSH_PORT=221
|
|
|
|
# ━━━ Rsync Script Defaults ━━━
|
|
# These are the fallback values used when no matching profile is found.
|
|
# Any share whose directory basename does not match a profile key below
|
|
# will use these globals for all rsync behaviour.
|
|
BW_LIMIT=12500
|
|
# Retry logic
|
|
RETRY_COUNT=3
|
|
# Sleep between retries (seconds)
|
|
SLEEP=300
|
|
# Container start/stop/restart before and after rsync
|
|
CRITICAL_CONTAINER_NAMES=()
|
|
# Containers that need delayed before starting
|
|
DELAYED_CONTAINERS=()
|
|
# Delay in seconds between starting containers, useful for things like Authelia
|
|
CONTAINER_DELAY=5
|
|
# Directories to exclude during transfer
|
|
EXCLUDE_DIRS=()
|
|
# Default global rsync options
|
|
DEFAULT_RSYNC_OPTS=(-av --info=progress2 --human-readable --bwlimit="$BW_LIMIT" --delete --inplace --no-whole-file)
|
|
|
|
# ━━━ Remote Health Checks ━━━
|
|
# Abort if remote rootfs usage is at or above this percentage.
|
|
# Protects against rsync writing to rootfs when the remote array is down or drives are missing.
|
|
# Recommended: 75 — gives headroom before the server becomes unstable
|
|
ROOTFS_WARN=75
|
|
|
|
# ━━━ Daily Sync Shares ━━━
|
|
# Shares synced once daily by Orchestrators/daily_sync.sh
|
|
# Add or remove paths here to manage what gets synced.
|
|
# These shares have no profile entry and fall through to DEFAULT_RSYNC_OPTS above.
|
|
DAILY_SYNC_SHARES=(
|
|
/mnt/user/Anime_Movies-Old
|
|
/mnt/user/Anime_Shows-Old
|
|
/mnt/user/Anime_Shows
|
|
/mnt/user/Books
|
|
/mnt/user/Intros
|
|
/mnt/user/Kids_Movies
|
|
/mnt/user/Kids_Tv_Shows
|
|
/mnt/user/Movies
|
|
/mnt/user/Music_Videos
|
|
/mnt/user/Nextcloud
|
|
/mnt/user/stand-up_comedy
|
|
/mnt/user/Tv_Shows
|
|
)
|
|
|
|
# ━━━ unRAID Essential Scripts ━━━
|
|
# unRAID reboot script user warning time (seconds)
|
|
REBOOT_SLEEP=300
|
|
# unRAID mover stop script timeout (seconds)
|
|
MOVER_STOP_TIMEOUT=300
|
|
# docker_syslog_filter.sh filter file path
|
|
FILTER_FILE="/etc/rsyslog.d/ignore-docker-veth.conf"
|
|
# php_fpm_max_children.sh php-fpm config file path
|
|
PHP_CONF="/etc/php-fpm.d/www.conf"
|
|
# php_fpm_max_children.sh max children value
|
|
PHP_MAX_CHILDREN=250
|
|
# clear_logs.sh system log file paths
|
|
LOG_FILES=(/var/log/syslog /var/log/messages /var/log/dmesg)
|
|
|
|
# ━━━ Docker Daily Restart ━━━
|
|
# Containers to restart daily — space-separated, case-sensitive
|
|
# These are the same containers as critical-data and other rsync profiles
|
|
DAILY_RESTART_CONTAINERS=(
|
|
"NginxProxyManager"
|
|
"Authelia"
|
|
"Dispatcharr-Iptv-Users"
|
|
"Dispatcharr"
|
|
"Dispatcharr-Basic"
|
|
"Code-Server"
|
|
)
|
|
|
|
# ━━━ Docker Watchdog ━━━
|
|
# Containers to monitor with their memory hard limits in MB
|
|
# 20GB=20480 16GB=16384 14GB=14336 12GB=12288 10GB=10240 8GB=8192 6GB=6144 4GB=4096 1GB=1024
|
|
declare -A WATCHDOG_CONTAINERS=(
|
|
["Emby"]=16384
|
|
["jellyfin_with_request"]=12288
|
|
["LidaTube"]=6144
|
|
["Tdarr"]=6144
|
|
["Code-Server"]=1024
|
|
)
|
|
|
|
# Containers to check for HTTP responsiveness — omit a container to skip its check
|
|
declare -A WATCHDOG_CONTAINER_URLS=(
|
|
["Emby"]="http://localhost:8096"
|
|
["Jellyfin-Gmer4Lfe"]="http://localhost:8095"
|
|
)
|
|
|
|
# State file for tracking CPU and responsiveness strikes between runs
|
|
# Lives in /tmp — resets on reboot which is correct behaviour for strike tracking
|
|
WATCHDOG_STATE_FILE="/tmp/container_watchdog_state.db"
|
|
|
|
# CPU thresholds — normalised against total core count automatically at runtime
|
|
SOFT_CPU_THRESHOLD=80 # warn at this % of total system CPU
|
|
HARD_CPU_THRESHOLD=85 # strike at this % of total system CPU
|
|
CPU_FAIL_LIMIT=2 # consecutive strikes before restart
|
|
|
|
# Memory threshold
|
|
SOFT_MEM_THRESHOLD=80 # warn at this % of per-container hard limit
|
|
|
|
# Responsiveness check settings
|
|
RESP_FAIL_LIMIT=2 # consecutive failures before restart
|
|
CURL_TIMEOUT=5 # seconds before curl gives up
|
|
|
|
# ━━━ Profile System ━━━
|
|
# Profiles are matched by directory basename (lowercased).
|
|
# Example: /mnt/user/appdata-Failover/Arrs_Stack → profile key = arrs_stack
|
|
#
|
|
# How fallthrough works:
|
|
# - If a key exists in a profile array, that value is used
|
|
# - If a key is missing, the global default above is used instead
|
|
# - Shares in DAILY_SYNC_SHARES have no profile and always use globals
|
|
#
|
|
# To add a new profile:
|
|
# 1. Add a key to each array below with your chosen profile name
|
|
# 2. Call rsync.sh with a directory whose basename matches that key
|
|
# 3. Any array you omit will fall back to its global default
|
|
#
|
|
# Note: PROFILE_RSYNC_OPTS does NOT inherit from DEFAULT_RSYNC_OPTS —
|
|
# if you define it for a profile you must list all desired options explicitly
|
|
|
|
# SPACE-SEPARATED STRINGS
|
|
declare -A PROFILE_RSYNC_OPTS=(
|
|
[arrs_stack]="-av --info=progress2 --human-readable --bwlimit=$BW_LIMIT --delete --inplace"
|
|
[critical-data]="-av --human-readable --bwlimit=$BW_LIMIT --delete"
|
|
[gmer4lfe]="-av --info=progress2 --bwlimit=$BW_LIMIT"
|
|
[important-data]="-av --human-readable --bwlimit=$BW_LIMIT"
|
|
[emby]="-av --human-readable --bwlimit=$BW_LIMIT"
|
|
)
|
|
|
|
declare -A PROFILE_BW_LIMIT=(
|
|
[arrs_stack]=5000
|
|
[critical-data]=9500
|
|
[gmer4lfe]=8000
|
|
[important-data]=9500
|
|
[emby]=8000
|
|
)
|
|
|
|
declare -A PROFILE_RETRY_COUNT=(
|
|
[arrs_stack]=3
|
|
[critical-data]=3
|
|
[gmer4lfe]=3
|
|
[important-data]=3
|
|
[emby]=3
|
|
)
|
|
|
|
declare -A PROFILE_SLEEP=(
|
|
[arrs_stack]=300
|
|
[critical-data]=300
|
|
[gmer4lfe]=300
|
|
[important-data]=300
|
|
[emby]=300
|
|
)
|
|
|
|
# SPACE-SEPARATED STRINGS
|
|
declare -A PROFILE_CRITICAL_CONTAINER_NAMES=(
|
|
[arrs_stack]="Sonarr Lidarr Readarr Radarr Prowlarr Bazarr Pinchflat"
|
|
[critical-data]="Mariadb-Authelia Redis-Authelia Lldap-Gmer4Lfe NginxProxyManager Authelia"
|
|
[gmer4lfe]="Organizrv2-Gmer4Lfe UptimeKuma-Gmer4Lfe VaultWarden-Gmer4Lfe"
|
|
[important-data]="Postgres-NextCloud NextCloud"
|
|
[emby]=""
|
|
)
|
|
|
|
# SPACE-SEPARATED STRINGS — containers that need a delay before starting
|
|
declare -A PROFILE_DELAYED_CONTAINERS=(
|
|
[arrs_stack]=""
|
|
[critical-data]="Authelia"
|
|
[gmer4lfe]=""
|
|
[important-data]="NextCloud"
|
|
[emby]=""
|
|
)
|
|
|
|
declare -A PROFILE_CONTAINER_DELAY=(
|
|
[arrs_stack]=5
|
|
[critical-data]=10
|
|
[gmer4lfe]=5
|
|
[important-data]=10
|
|
[emby]=5
|
|
)
|
|
|
|
# SPACE-SEPARATED STRINGS
|
|
declare -A PROFILE_EXCLUDE_DIRS=(
|
|
[arrs_stack]="logs *.tmp"
|
|
[critical-data]="logs *.tmp"
|
|
[gmer4lfe]="logs *.tmp"
|
|
[important-data]="logs *.tmp"
|
|
[emby]="logs *.tmp"
|
|
)
|
|
# ----------------------------------------------------------------------------------------------
|
|
# ---------------------- End Of User Variables, Please adjust above as needed ------------------
|
|
# ---------------------------------------------------------------------------------------------- |