Files
Momento/scripts/backup/offsite-sync.sh
Antigravity 2db12adffc
Some checks failed
CI / Deploy production (on server) (push) Has been cancelled
CI / Lint, Test & Build (push) Has been cancelled
chore(prod): support .env.docker in crons, fix WAL mapping and add canvas copy in Dockerfile
2026-05-20 19:21:49 +00:00

64 lines
1.8 KiB
Bash
Executable File

#!/bin/bash
set -euo pipefail
# Load environment variables from .env.docker if it exists
if [ -f "/opt/memento/.env.docker" ]; then
set -a
source "/opt/memento/.env.docker"
set +a
fi
SNAPSHOT_DIR="/opt/memento/backups/snapshots"
SSH_KEY="/root/.ssh/memento-nas"
NAS1="sepehr@192.168.1.132"
NAS1_PATH="/volume1/backups/memento"
NAS2="sepehr@192.168.1.146"
NAS2_PATH="/volume1/backups/memento"
LOG_FILE="/opt/memento/backups/backup.log"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
TELEGRAM_BOT_TOKEN="${TELEGRAM_BOT_TOKEN:-}"
TELEGRAM_CHAT_ID="${TELEGRAM_CHAT_ID:-}"
send_alert() {
if [ -n "$TELEGRAM_BOT_TOKEN" ] && [ -n "$TELEGRAM_CHAT_ID" ]; then
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
-d chat_id="$TELEGRAM_CHAT_ID" -d text="$1" >/dev/null 2>&1 || true
fi
}
log "=== Offsite backup sync ==="
LATEST=$(ls -t "$SNAPSHOT_DIR"/*.sql.gz 2>/dev/null | head -1)
if [ -z "$LATEST" ]; then
log "ERROR: No snapshots to sync"
send_alert "🚨 MEMENTO: Offsite backup failed - no snapshots found!"
exit 1
fi
for NAS_ADDR in "$NAS1" "$NAS2"; do
if [ "$NAS_ADDR" = "$NAS1" ]; then
NAS_PATH="$NAS1_PATH"
NAS_NAME="NAS1 (192.168.1.132)"
else
NAS_PATH="$NAS2_PATH"
NAS_NAME="NAS2 (192.168.1.146)"
fi
log "Syncing to $NAS_NAME..."
ssh -i "$SSH_KEY" -o StrictHostKeyChecking=no "$NAS_ADDR" "mkdir -p $NAS_PATH" 2>/dev/null
scp -O -i "$SSH_KEY" -o StrictHostKeyChecking=no "$SNAPSHOT_DIR"/*.sql.gz "${NAS_ADDR}:${NAS_PATH}/" 2>&1 | tee -a "$LOG_FILE"
if [ $? -eq 0 ]; then
log "$NAS_NAME: sync complete"
else
log "ERROR: $NAS_NAME sync failed!"
send_alert "🚨 MEMENTO: Offsite backup FAILED for $NAS_NAME!"
fi
done
log "=== All offsite syncs complete ==="