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