backup-automation/ansible/roles/borg-client/templates/borg-backup.sh.j2

149 lines
3.5 KiB
Django/Jinja

#!/bin/bash
# Borg Backup Wrapper
# Backup einzelner Komponenten zu {{ backup_repo_server }}:{{ backup_repo_base }}/{{ ansible_hostname }}/
set -e
HOSTNAME="{{ ansible_hostname }}"
REPO_SERVER="{{ backup_repo_server }}"
REPO_BASE="{{ backup_repo_base }}"
REPO_PATH="$REPO_SERVER:$REPO_BASE/$HOSTNAME"
BACKUP_SCRIPT_DIR="{{ backup_script_dir }}"
LOG_DIR="{{ backup_log_dir }}"
LOG_FILE="$LOG_DIR/backup-$(date +%Y%m%d-%H%M%S).log"
# Farben für Output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $*" | tee -a "$LOG_FILE"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $*" | tee -a "$LOG_FILE"
}
# =====================================
# Pre-Backup Hooks
# =====================================
pre_backup() {
log "Running pre-backup hooks..."
# Docker-spezifisch
if command -v docker &> /dev/null; then
log "Docker found. Running docker pre-backup..."
if [ -x "$BACKUP_SCRIPT_DIR/pre-backup-docker.sh" ]; then
"$BACKUP_SCRIPT_DIR/pre-backup-docker.sh" >> "$LOG_FILE" 2>&1 || log_error "Docker pre-backup failed"
fi
fi
}
# =====================================
# Main Backup
# =====================================
run_backup() {
log "Starting Borg backup to $REPO_PATH"
# Verzeichnisse zum Backup
declare -a BACKUP_DIRS=(
/root
/home
/etc
/var/lib
/opt
/srv
)
# Exceptions
declare -a EXCLUDE=(
"*.tmp"
"*.cache"
".cache"
".local/share/Trash"
".thumbnails"
"/var/lib/apt/*"
"/var/cache/*"
)
# Baue exclude Parameter
EXCLUDE_PARAMS=""
for exc in "${EXCLUDE[@]}"; do
EXCLUDE_PARAMS="--exclude '$exc' $EXCLUDE_PARAMS"
done
# Führe Borg aus
log "Backup started at $(date)"
eval borg create \
--stats \
--compression lz4 \
--progress \
--exclude-from /dev/stdin \
"$REPO_PATH::{hostname}-{now:%Y%m%d-%H%M%S}" \
"${BACKUP_DIRS[@]}" \
<< EOF > /tmp/borg_output.txt 2>&1 || {
log_error "Borg backup failed!"
cat /tmp/borg_output.txt >> "$LOG_FILE"
return 1
}
# Hole Größen aus Output
BORG_OUTPUT=$(cat /tmp/borg_output.txt)
log "Backup Statistics:"
echo "$BORG_OUTPUT" | grep -E "Original size|Compressed size|Deduplicated size" | while read line; do
log " $line"
done
# Cleanup alte Backups (behalte letzte 7)
log "Pruning old backups..."
borg prune "$REPO_PATH" \
--keep-daily=7 \
--keep-weekly=4 \
--keep-monthly=12 \
--stats >> "$LOG_FILE" 2>&1 || log_error "Prune failed"
log_success "Borg backup completed successfully"
}
# =====================================
# Error Handler
# =====================================
trap 'log_error "Backup failed with exit code $?"; exit 1' ERR
# =====================================
# Main Execution
# =====================================
log "=== Starting Backup Process ==="
log "Hostname: $HOSTNAME"
log "Repository: $REPO_PATH"
# Check if borg can connect
if ! ssh "$REPO_SERVER" "[ -d $REPO_BASE/$HOSTNAME ]" 2>/dev/null; then
log_error "Cannot connect to backup server or repo not initialized!"
exit 1
fi
# Pre-Backup
pre_backup
# Actual Backup
if run_backup; then
# Status Reporter
if [ -x "$BACKUP_SCRIPT_DIR/backup-status-reporter.sh" ]; then
log "Reporting status..."
"$BACKUP_SCRIPT_DIR/backup-status-reporter.sh" "SUCCESS" "$LOG_FILE" >> "$LOG_FILE" 2>&1
fi
log_success "=== Backup Completed Successfully ==="
exit 0
else
log_error "=== Backup Failed ==="
exit 1
fi