#!/bin/bash #----------------------------------------------------------------------------------------------- #----------------------------- Master Variables for unRAID scripts ----------------------------- #----------------------------------------------------------------------------------------------- #----------------- User Variables, Please adjust here in Master.conf as needed ----------------- #----------------------------------------------------------------------------------------------- # This is the master.conf file, it contains all the variables used by # all scripts. It is sourced by each script at runtime, so any changes here will # affect all scripts immediately. This is where you should adjust any settings or variables # that you want to apply globally across all your scripts # #This allows for one centralized location for all your configurations, making it easier to manage # and maintain your scripts. You can adjust the variables below as needed. # #-------------------- 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" #--------------------Rsync Script Defaults----------------------- # Network speed limit (KB/s) BW_LIMIT=12500 # Retry logic RETRY_COUNT=3 # Sleep between retries (seconds) SLEEP=300 # Max number of concurrently running rsync processes MAX_RSYNC_PROCS=1 # 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 # Not include logs during transfer EXCLUDE_DIRS=("") #-------------------- unRAID essentail 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 # Profiles declare -A PROFILE_MAX_PROCS=([arrs_stack]=2 [critical-data]=2 [gmer4lfe]=1 [important-data]=2 [emby]=1) 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) 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]="" ) 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) declare -A PROFILE_EXCLUDE_DIRS=([arrs_stack]="logs *.tmp" [critical-data]="logs *.tmp" [gmer4lfe]="logs *.tmp" [important-data]="logs *.tmp" [emby]="logs *.tmp") # ----------------------------- Common Helpers ----------------------------- parse_args() { DRY_RUN=${DRY_RUN:-false} for ARG in "$@"; do if [[ "$ARG" == *=* ]]; then local VAR_NAME="${ARG%%=*}" local VAR_VALUE="${ARG#*=}" if declare -p "$VAR_NAME" &>/dev/null; then printf -v "$VAR_NAME" '%s' "$VAR_VALUE" echo "Overriding $VAR_NAME -> $VAR_VALUE" else echo "Warning: Unknown variable $VAR_NAME, ignoring." fi else case "$ARG" in --dry-run|-n) DRY_RUN=true ;; --help|-h) echo "Usage: script [--dry-run|-n] [VAR=value ...]"; exit 0 ;; *) echo "Warning: Unknown argument $ARG" ;; esac fi done } require_var() { local var="$1" if [[ -z "${!var:-}" ]]; then echo "Error: Required variable $var is not set." exit 1 fi } validate_int() { local name="$1" local value="$2" if ! [[ "${value:-}" =~ ^[0-9]+$ ]]; then echo "Error: $name must be a non-negative integer." exit 1 fi } # ----------------------------- Host Detection & SSH ----------------------------- # Detect local/remote host LOCAL_HOSTNAME="$(hostname)" if [[ "$LOCAL_HOSTNAME" == "$HOST1" ]]; then LOCAL_SERVER_NAME="$HOST1" REMOTE_SERVER_NAME="$HOST2" elif [[ "$LOCAL_HOSTNAME" == "$HOST2" ]]; then LOCAL_SERVER_NAME="$HOST2" REMOTE_SERVER_NAME="$HOST1" else echo "Error: Local hostname ($LOCAL_HOSTNAME) not recognized." exit 1 fi echo "Local server: $LOCAL_SERVER_NAME" echo "Remote server: $REMOTE_SERVER_NAME" # SSH Key Mapping declare -A SSH_KEYS SSH_KEYS["$HOST1|$HOST2"]="$HOST1_SSH_KEY" SSH_KEYS["$HOST2|$HOST1"]="$HOST2_SSH_KEY" KEY_ID="$LOCAL_SERVER_NAME|$REMOTE_SERVER_NAME" SSH_KEY="${SSH_KEYS[$KEY_ID]}" if [[ -z "$SSH_KEY" ]]; then echo "Error: No SSH key defined for $LOCAL_SERVER_NAME → $REMOTE_SERVER_NAME" exit 1 fi echo "Using SSH key: $SSH_KEY" # Remote IP via Tailscale REMOTE_SERVER=$(tailscale ip -4 "$REMOTE_SERVER_NAME" 2>/dev/null) if [[ -z "$REMOTE_SERVER" ]]; then echo "Error: Could not resolve Tailscale IP for $REMOTE_SERVER_NAME" exit 1 fi echo "Remote IP: $REMOTE_SERVER"