#!/bin/bash set -euo pipefail echo "--- Initializing Restic Backup Script ---" # Source environment variables if the file exists # This script expects RESTIC_ENV_FILE to be set in the environment # The environment file includes rclone throttling settings to prevent timeouts # shellcheck source=/dev/null if [ -f "$RESTIC_ENV_FILE" ]; then source "$RESTIC_ENV_FILE" echo "Environment variables loaded from $RESTIC_ENV_FILE" else echo "Error: RESTIC_ENV_FILE not found. Please run setup.sh first." >&2 exit 1 fi # Source common functions # shellcheck source=/dev/null source "$(dirname "$0")/common.sh" # --- Pre-warm rclone connection --- pre_warm_connection "Restic Backup" # --- Exit Trap --- # This will call notify with the script's final exit code upon termination. trap 'notify "Restic Backup ($(whoami)@$(hostname))" "Restic backup script finished with exit code $?" $?' EXIT # --- Main Backup Logic --- echo "--- Starting Restic Backup at $(date) ---" # Perform the Restic backup echo "Starting Restic backup to repository: $RESTIC_REPOSITORY" restic backup \ --repo "${RESTIC_REPOSITORY}" \ --files-from "${CONFIG_DIR}/paths" \ --exclude-file "${CONFIG_DIR}/excludes" \ --password-file "${RESTIC_PASSWORD_FILE}" \ --option rclone.timeout=20m \ --lock-retry-after 5m \ --lock-stale-timeout 24h \ --tag daily || { echo "Error: Restic backup failed." >&2 notify "Restic Backup ($(whoami)@$(hostname))" "Backup phase failed!" 8 exit 1 } # Prune old snapshots - only on specific hours to avoid conflicts HOUR=$(date +%H) # Only prune between 2-4 AM to reduce multi-device conflicts if [ $HOUR -ge 2 ] && [ $HOUR -lt 4 ]; then # Add random delay to stagger multiple devices sleep $(shuf -i 0-1800 -n 1) # 0-30 minutes random delay echo "Applying Restic retention policy and pruning old snapshots..." restic forget \ --repo "${RESTIC_REPOSITORY}" \ --password-file "${RESTIC_PASSWORD_FILE}" \ --option rclone.timeout=20m \ --lock-retry-after 5m \ --lock-stale-timeout 24h \ --keep-daily 7 \ --keep-weekly 4 \ --keep-monthly 6 \ --keep-yearly 6 \ --prune || { echo "Warning: Restic forget/prune failed (another device might be pruning)." >&2 notify "Restic Backup ($(whoami)@$(hostname))" "Prune phase failed!" 6 # Don't exit on prune failure - backup was successful } else echo "Skipping prune - only running between 2-4 AM to avoid multi-device conflicts" fi echo "--- Restic Backup finished at $(date) ---"