#!/usr/bin/env bash set -euo pipefail REPO="/backup/borgrepo" export BORG_PASSPHRASE BORG_PASSPHRASE="$(cat /app/host_vars/repokey)" export BORG_RSH="ssh -o BatchMode=yes" HOSTS_FILE="$(dirname "$0")/host_vars/hosts" TIMESTAMP="$(date +%Y-%m-%dT%H%M%S)" HOSTS=() while read -r host; do [[ -z "$host" || "$host" =~ ^# ]] && continue HOSTS+=("$host") done < "$HOSTS_FILE" echo "Backing up hosts:" printf ' - %s\n' "${HOSTS[@]}" FAILED_HOSTS=() for HOST in "${HOSTS[@]}"; do ARCHIVE="${HOST}-backup-${TIMESTAMP}" echo "--- Backing up $HOST ---" # IMPORTANT: repo is LOCAL, source is REMOTE via SSH if ! borg create \ "$REPO::$ARCHIVE" \ "$HOST:/BACKUP" \ --stats \ --compression lz4; then echo "WARNING: Failed to back up $HOST" FAILED_HOSTS+=("$HOST") fi done echo "Applying retention policy..." for HOST in "${HOSTS[@]}"; do borg prune \ "$REPO" \ --keep-daily=7 \ --keep-weekly=8 \ --glob-archives "${HOST}-backup-*" \ --stats done if [[ ${#FAILED_HOSTS[@]} -gt 0 ]]; then echo "DONE WITH ERRORS:" printf ' - %s\n' "${FAILED_HOSTS[@]}" exit 1 fi echo "Done: all hosts backed up at $TIMESTAMP"