borg-pull-backup.sh aktualisiert
This commit is contained in:
+32
-28
@@ -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 "============================================"
|
||||||
|
|||||||
Reference in New Issue
Block a user