borg-pull-backup.sh aktualisiert

This commit is contained in:
2026-05-31 13:58:11 +00:00
parent 9ca8028020
commit 469279d3ce
+32 -28
View File
@@ -37,27 +37,28 @@ EXCLUDES=(
"--exclude" "*.log" "--exclude" "*.log"
) )
# Aufbewahrungsrichtlinie # Aufbewahrungsrichtlinie
KEEP_DAILY=7 KEEP_DAILY=7
KEEP_WEEKLY=4 KEEP_WEEKLY=4
KEEP_MONTHLY=6 KEEP_MONTHLY=6
LOG="/var/log/borg-pull-backup.log" LOG="/var/log/borg-pull-backup.log"
# ============================================================================= # =============================================================================
# FUNKTIONEN # FUNKTIONEN
# ============================================================================= # =============================================================================
log() { log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG" echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG"
} }
error_exit() { error_exit() {
log "FEHLER: $*" log "FEHLER: $*"
cleanup cleanup
exit 1 exit 1
} }
cleanup() { cleanup() {
log "Aufräumen..." log "Aufräumen..."
if mountpoint -q "$MOUNT_POINT" 2>/dev/null; then if mountpoint -q "$MOUNT_POINT" 2>/dev/null; then
@@ -65,35 +66,35 @@ cleanup() {
fusermount -u "$MOUNT_POINT" || umount "$MOUNT_POINT" || true fusermount -u "$MOUNT_POINT" || umount "$MOUNT_POINT" || true
fi fi
} }
# Cleanup auch bei unerwarteten Fehlern # Cleanup auch bei unerwarteten Fehlern
trap cleanup EXIT ERR trap cleanup EXIT ERR
# ============================================================================= # =============================================================================
# HAUPTPROGRAMM # HAUPTPROGRAMM
# ============================================================================= # =============================================================================
log "============================================" log "============================================"
log "Starte Pull-Backup von ${REMOTE_USER}@${REMOTE_HOST}" log "Starte Pull-Backup von ${REMOTE_USER}@${REMOTE_HOST}"
log "============================================" log "============================================"
# --- 1. Voraussetzungen prüfen --- # --- 1. Voraussetzungen prüfen ---
for cmd in borg sshfs fusermount ssh; do for cmd in borg sshfs fusermount ssh; do
command -v "$cmd" &>/dev/null || error_exit "Programm nicht gefunden: $cmd" command -v "$cmd" &>/dev/null || error_exit "Programm nicht gefunden: $cmd"
done done
[ -f "$SSH_KEY" ] || error_exit "SSH-Key nicht gefunden: $SSH_KEY" [ -f "$SSH_KEY" ] || error_exit "SSH-Key nicht gefunden: $SSH_KEY"
[ -d "$BORG_REPO" ] || error_exit "Borg-Repo nicht gefunden: $BORG_REPO erst initialisieren!" [ -d "$BORG_REPO" ] || error_exit "Borg-Repo nicht gefunden: $BORG_REPO erst initialisieren!"
# --- 2. Mountpunkt vorbereiten --- # --- 2. Mountpunkt vorbereiten ---
mkdir -p "$MOUNT_POINT" mkdir -p "$MOUNT_POINT"
if mountpoint -q "$MOUNT_POINT"; then if mountpoint -q "$MOUNT_POINT"; then
log "Vorheriger Mount gefunden, unmounte zuerst..." log "Vorheriger Mount gefunden, unmounte zuerst..."
fusermount -u "$MOUNT_POINT" || true fusermount -u "$MOUNT_POINT" || true
sleep 2 sleep 2
fi fi
# --- 3. Docker-Host mounten (read-only!) --- # --- 3. Docker-Host mounten (read-only!) ---
log "Mounte ${REMOTE_HOST} nach ${MOUNT_POINT} (read-only)..." log "Mounte ${REMOTE_HOST} nach ${MOUNT_POINT} (read-only)..."
sshfs \ sshfs \
@@ -107,9 +108,9 @@ sshfs \
"${REMOTE_USER}@${REMOTE_HOST}:/" \ "${REMOTE_USER}@${REMOTE_HOST}:/" \
"$MOUNT_POINT" \ "$MOUNT_POINT" \
|| error_exit "sshfs-Mount fehlgeschlagen" || error_exit "sshfs-Mount fehlgeschlagen"
log "Mount erfolgreich." log "Mount erfolgreich."
# --- 4. Backup-Pfade zusammenbauen --- # --- 4. Backup-Pfade zusammenbauen ---
FULL_PATHS=() FULL_PATHS=()
for p in "${BACKUP_PATHS[@]}"; do for p in "${BACKUP_PATHS[@]}"; do
@@ -121,13 +122,15 @@ for p in "${BACKUP_PATHS[@]}"; do
log " WARNUNG: Pfad nicht gefunden, wird übersprungen: $full" log " WARNUNG: Pfad nicht gefunden, wird übersprungen: $full"
fi fi
done done
[ ${#FULL_PATHS[@]} -gt 0 ] || error_exit "Keine gültigen Backup-Pfade gefunden!" [ ${#FULL_PATHS[@]} -gt 0 ] || error_exit "Keine gültigen Backup-Pfade gefunden!"
# --- 5. Borg-Backup erstellen --- # --- 5. Borg-Backup erstellen ---
ARCHIVE_NAME="${REMOTE_HOST}-$(date '+%Y-%m-%dT%H-%M-%S')" ARCHIVE_NAME="${REMOTE_HOST}-$(date '+%Y-%m-%dT%H-%M-%S')"
log "Erstelle Archiv: ${ARCHIVE_NAME}" log "Erstelle Archiv: ${ARCHIVE_NAME}"
# set -e kurz deaktivieren damit rc 1 (Warnung) den Script nicht abbricht
set +e
borg create \ borg create \
--verbose \ --verbose \
--filter AME \ --filter AME \
@@ -140,26 +143,27 @@ borg create \
"${BORG_REPO}::${ARCHIVE_NAME}" \ "${BORG_REPO}::${ARCHIVE_NAME}" \
"${FULL_PATHS[@]}" \ "${FULL_PATHS[@]}" \
2>&1 | tee -a "$LOG" 2>&1 | tee -a "$LOG"
BORG_EXIT=${PIPESTATUS[0]} BORG_EXIT=${PIPESTATUS[0]}
set -e
case $BORG_EXIT in case $BORG_EXIT in
0) log "Backup erfolgreich abgeschlossen." ;; 0) log "Backup erfolgreich abgeschlossen." ;;
1) log "WARNUNG: Backup mit Warnungen abgeschlossen (Exit 1)." ;; 1) log "WARNUNG: Backup mit Warnungen abgeschlossen (rc 1 geänderte Dateien o.ä., kein Fehler)." ;;
*) error_exit "Backup fehlgeschlagen (Exit ${BORG_EXIT})." ;; *) error_exit "Backup fehlgeschlagen (Exit ${BORG_EXIT})." ;;
esac esac
# --- 6. Unmounten --- # --- 6. Unmounten ---
log "Unmounte ${MOUNT_POINT}..." log "Unmounte ${MOUNT_POINT}..."
fusermount -u "$MOUNT_POINT" fusermount -u "$MOUNT_POINT"
log "Unmount erfolgreich." log "Unmount erfolgreich."
# Trap zurücksetzen, da wir selbst gemountet haben # Trap zurücksetzen, da wir selbst gemountet haben
trap - EXIT ERR trap - EXIT ERR
# --- 7. Alte Archive bereinigen --- # --- 7. Alte Archive bereinigen ---
log "Bereinige alte Archive (daily=${KEEP_DAILY}, weekly=${KEEP_WEEKLY}, monthly=${KEEP_MONTHLY})..." log "Bereinige alte Archive (daily=${KEEP_DAILY}, weekly=${KEEP_WEEKLY}, monthly=${KEEP_MONTHLY})..."
borg prune \ borg prune \
--list \ --list \
--glob-archives "${REMOTE_HOST}-*" \ --glob-archives "${REMOTE_HOST}-*" \
@@ -168,11 +172,11 @@ borg prune \
--keep-monthly "$KEEP_MONTHLY" \ --keep-monthly "$KEEP_MONTHLY" \
"$BORG_REPO" \ "$BORG_REPO" \
2>&1 | tee -a "$LOG" 2>&1 | tee -a "$LOG"
# --- 8. Repo komprimieren --- # --- 8. Repo komprimieren ---
log "Komprimiere Repository..." log "Komprimiere Repository..."
borg compact "$BORG_REPO" 2>&1 | tee -a "$LOG" borg compact "$BORG_REPO" 2>&1 | tee -a "$LOG"
log "============================================" log "============================================"
log "Pull-Backup abgeschlossen: ${ARCHIVE_NAME}" log "Pull-Backup abgeschlossen: ${ARCHIVE_NAME}"
log "============================================" log "============================================"