#!/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 \ --tag daily || { echo "Error: Restic backup failed." >&2 notify "Restic Backup ($(whoami)@$(hostname))" "Backup phase failed!" 8 exit 1 } # Prune old snapshots echo "Applying Restic retention policy and pruning old snapshots..." restic forget \ --repo "${RESTIC_REPOSITORY}" \ --password-file "${RESTIC_PASSWORD_FILE}" \ --keep-daily 7 \ --keep-weekly 4 \ --keep-monthly 6 \ --keep-yearly 6 \ --option rclone.timeout=20m \ --prune || { echo "Error: Restic forget/prune failed." >&2 notify "Restic Backup ($(whoami)@$(hostname))" "Prune phase failed!" 8 exit 1 } echo "--- Restic Backup finished at $(date) ---"