This commit is contained in:
oliver
2026-04-21 12:45:18 -03:00
parent 1b64bdc08d
commit ba5ad005a6
2 changed files with 49 additions and 28 deletions
+42 -20
View File
@@ -2,42 +2,64 @@
set -euo pipefail set -euo pipefail
# === CONFIG === # === CONFIG ===
REPO="/backups/borgrepo" REPO="/backup/borgrepo"
HOSTS_FILE="host_vars/hosts" export BORG_PASSPHRASE
ARCHIVE_NAME="backup-$(date +%Y-%m-%d)" 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 === # === BUILD SOURCE LIST ===
SOURCES=() SOURCES=()
while read -r host; do while read -r host; do
[[ -z "$host" || "$host" =~ ^# ]] && continue [[ -z "$host" || "$host" =~ ^# ]] && continue
SOURCES+=("${host}:/") SOURCES+=("${host}:/BACKUP/")
done < "$HOSTS_FILE" done < "$HOSTS_FILE"
if [[ ${#SOURCES[@]} -eq 0 ]]; then
echo "ERROR: No hosts found in $HOSTS_FILE"
exit 1
fi
echo "Backing up hosts:" echo "Backing up hosts:"
printf ' - %s\n' "${SOURCES[@]}" printf ' - %s\n' "${SOURCES[@]}"
# === CREATE BACKUP (ONLY current*) === # === CREATE BACKUP PER HOST ===
borg create \ FAILED_HOSTS=()
"$REPO::$ARCHIVE_NAME" \
"${SOURCES[@]}" \
--patterns-from <(cat <<'EOF'
R sh:**
+ sh:**/current*
- sh:**
EOF
) \
--stats \
--compression lz4
# === RETENTION POLICY === 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..." echo "Applying retention policy..."
borg prune \ for src in "${SOURCES[@]}"; do
HOST="${src%%:*}"
borg prune \
"$REPO" \ "$REPO" \
--keep-daily=7 \ --keep-daily=7 \
--keep-weekly=8 \ --keep-weekly=8 \
--prefix "backup-" \ --glob-archives "${HOST}-backup-*" \
--stats --stats
done
echo "Done: $ARCHIVE_NAME" # === 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"
+1 -2
View File
@@ -25,7 +25,7 @@ template templates/.profile /home/4server/.profile
### PACKAGES ### PACKAGES
template templates/repositories /etc/apk/repositories template templates/repositories /etc/apk/repositories
rex "doas apk update && doas apk upgrade" rex "doas apk update && doas apk upgrade"
rex doas apk add iperf linux-lts openssh ufw python3 build-base python3-dev linux-headers py3-pip gcc g++ musl-dev libffi-dev make jq rsync mc vim docker docker-compose htop linux-lts sqlite bash postgresql16-client rex doas apk add borgbackup iperf linux-lts openssh ufw python3 build-base python3-dev linux-headers py3-pip gcc g++ musl-dev libffi-dev make jq rsync mc vim docker docker-compose htop linux-lts sqlite bash postgresql16-client
rex doas pip install --root-user-action ignore --break-system-packages --no-cache-dir "uvicorn[standard]" fastapi pydantic psutil gdown rex doas pip install --root-user-action ignore --break-system-packages --no-cache-dir "uvicorn[standard]" fastapi pydantic psutil gdown
@@ -94,4 +94,3 @@ prsync -h "/app/host_vars/hosts" -avz ./etc/traefik/certs/* /4server/data/traefi
template templates/docker-compose.yml /4server/docker-compose.yml template templates/docker-compose.yml /4server/docker-compose.yml
rex doas docker-compose -f /4server/docker-compose.yml up -d --force-recreate rex doas docker-compose -f /4server/docker-compose.yml up -d --force-recreate