59 lines
1.2 KiB
Bash
Executable File
59 lines
1.2 KiB
Bash
Executable File
#!/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"
|