diff --git a/app/backup b/app/backup index 7f9e767..f432bb1 100755 --- a/app/backup +++ b/app/backup @@ -2,12 +2,11 @@ set -euo pipefail REPO="/backup/borgrepo" +MOUNT_BASE="/tmp/borg-sshfs" export BORG_PASSPHRASE BORG_PASSPHRASE="$(cat /app/host_vars/repokey)" -export BORG_RSH="ssh -o BatchMode=yes" - HOSTS_FILE="$(dirname "$0")/host_vars/hosts" TIMESTAMP="$(date +%Y-%m-%dT%H%M%S)" @@ -24,20 +23,42 @@ FAILED_HOSTS=() for HOST in "${HOSTS[@]}"; do ARCHIVE="${HOST}-backup-${TIMESTAMP}" + MOUNT_DIR="${MOUNT_BASE}/${HOST}" echo "--- Backing up $HOST ---" - # IMPORTANT: repo is LOCAL, source is REMOTE via SSH + mkdir -p "$MOUNT_DIR" + + # Pull mode: mount client's /BACKUP locally via SSHFS + if ! sshfs "${HOST}:/BACKUP" "$MOUNT_DIR" \ + -o BatchMode=yes,reconnect,ServerAliveInterval=15,ServerAliveCountMax=3; then + echo "WARNING: Failed to mount $HOST:/BACKUP via SSHFS" + FAILED_HOSTS+=("$HOST") + rmdir "$MOUNT_DIR" + continue + fi + + # SSHFS (FUSE/SFTP) does not guarantee stable inode numbers, + # so instruct borg to use ctime+size for file change detection instead. if ! borg create \ "$REPO::$ARCHIVE" \ - "$HOST:/BACKUP" \ + "$MOUNT_DIR" \ + --pattern "+ sh:*/current*" \ + --pattern "- *" \ + --files-cache ctime,size \ --stats \ --compression lz4; then echo "WARNING: Failed to back up $HOST" FAILED_HOSTS+=("$HOST") fi + + # Unmount and clean up regardless of borg exit status + umount "$MOUNT_DIR" + rmdir "$MOUNT_DIR" done +rmdir "$MOUNT_BASE" 2>/dev/null || true + echo "Applying retention policy..." for HOST in "${HOSTS[@]}"; do