Files
cc/app/backup
T
2026-04-21 12:45:18 -03:00

66 lines
1.4 KiB
Bash
Executable File

#!/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"