#!/usr/bin/env bash set -euo pipefail # === CONFIG === REPO="/backup/borgrepo" export BORG_PASSPHRASE BORG_PASSPHRASE="$(cat /app/host_vars/repokey)" HOSTS_FILE="$(dirname "$0")/host_vars/hosts" TIMESTAMP="$(date +%Y-%m-%dT%H%M%S)" # === BUILD SOURCE LIST === SOURCES=() while read -r host; do [[ -z "$host" || "$host" =~ ^# ]] && continue SOURCES+=("${host}:/BACKUP/") done < "$HOSTS_FILE" if [[ ${#SOURCES[@]} -eq 0 ]]; then echo "ERROR: No hosts found in $HOSTS_FILE" exit 1 fi echo "Backing up hosts:" printf ' - %s\n' "${SOURCES[@]}" # === CREATE BACKUP PER HOST === FAILED_HOSTS=() for src in "${SOURCES[@]}"; do HOST="${src%%:*}" ARCHIVE="${HOST}-backup-${TIMESTAMP}" echo "--- Backing up $HOST ---" borg create \ "$REPO::$ARCHIVE" \ "$src" \ --stats \ --compression lz4 || { echo "WARNING: Failed to back up $HOST" FAILED_HOSTS+=("$HOST") } done # === RETENTION POLICY (per host) === echo "Applying retention policy..." for src in "${SOURCES[@]}"; do HOST="${src%%:*}" borg prune \ "$REPO" \ --keep-daily=7 \ --keep-weekly=8 \ --glob-archives "${HOST}-backup-*" \ --stats done # === FINAL REPORT === if [[ ${#FAILED_HOSTS[@]} -gt 0 ]]; then echo "DONE WITH ERRORS — Failed hosts:" printf ' - %s\n' "${FAILED_HOSTS[@]}" exit 1 fi echo "Done: all hosts backed up at $TIMESTAMP"