From 2cbaadd8b13f48f0fd0ceb1d262219324ef0286f Mon Sep 17 00:00:00 2001 From: Urban Modig Date: Tue, 14 Jul 2026 09:17:25 +0200 Subject: [PATCH] Add automated UniFi backup to Biff --- scripts/backup-to-biff.sh | 72 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100755 scripts/backup-to-biff.sh diff --git a/scripts/backup-to-biff.sh b/scripts/backup-to-biff.sh new file mode 100755 index 0000000..d9af97a --- /dev/null +++ b/scripts/backup-to-biff.sh @@ -0,0 +1,72 @@ +#!/usr/bin/env bash +set -Eeuo pipefail + +SOURCE_DIR="/home/urban/docker/unifi/config/data/backup/autobackup" +## SOURCE_DIR="/home/urban/docker/unifi/config/data/backup" +REMOTE_HOST="backupserver" +REMOTE_DIR="/storage/disk3/backup/unifi/daily" +LOG_TAG="unifi-backup" + +log() { + printf '%s [%s] %s\n' \ + "$(date --iso-8601=seconds)" \ + "$LOG_TAG" \ + "$*" +} + +if [[ ! -d "$SOURCE_DIR" ]]; then + log "Fel: backupkatalogen saknas: $SOURCE_DIR" >&2 + exit 1 +fi + +LATEST_BACKUP="$( + find "$SOURCE_DIR" -maxdepth 1 -type f \ + \( -name '*.unf' -o -name '*.unifi' \) \ + -printf '%T@ %p\n' | + sort -nr | + head -n 1 | + cut -d' ' -f2- +)" + +if [[ -z "${LATEST_BACKUP:-}" ]]; then + log "Fel: hittade ingen UniFi-backup i $SOURCE_DIR" >&2 + exit 1 +fi + +if [[ ! -s "$LATEST_BACKUP" ]]; then + log "Fel: backupfilen är tom: $LATEST_BACKUP" >&2 + exit 1 +fi + +TIMESTAMP="$(date '+%Y-%m-%d_%H-%M-%S')" +BASENAME="$(basename "$LATEST_BACKUP")" +REMOTE_NAME="${TIMESTAMP}_${BASENAME}" + +log "Kopierar $LATEST_BACKUP till ${REMOTE_HOST}:${REMOTE_DIR}/${REMOTE_NAME}" + +ssh "$REMOTE_HOST" "mkdir -p '$REMOTE_DIR'" + +rsync \ + --archive \ + --compress \ + --partial \ + --chmod=F600,D700 \ + "$LATEST_BACKUP" \ + "${REMOTE_HOST}:${REMOTE_DIR}/${REMOTE_NAME}" + +log "Verifierar fjärrfilen" + +LOCAL_SIZE="$(stat -c '%s' "$LATEST_BACKUP")" +REMOTE_SIZE="$( + ssh "$REMOTE_HOST" \ + "stat -c '%s' '$REMOTE_DIR/$REMOTE_NAME'" +)" + +if [[ "$LOCAL_SIZE" != "$REMOTE_SIZE" ]]; then + log "Fel: storleken skiljer sig: lokal=$LOCAL_SIZE remote=$REMOTE_SIZE" >&2 + exit 1 +fi + +ssh "$REMOTE_HOST" \ + "find '$REMOTE_DIR' -maxdepth 1 -type f -mtime +90 -delete" +log "Backup klar: ${REMOTE_DIR}/${REMOTE_NAME}"