149 lines
3.5 KiB
Django/Jinja
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
|