46 lines
2 KiB
Bash
46 lines
2 KiB
Bash
#!/bin/sh
|
|
set -e
|
|
|
|
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
|
BACKUP_DIR=/backups
|
|
PG_HOST=10.10.10.100
|
|
|
|
mkdir -p "$BACKUP_DIR/postgres/daily" "$BACKUP_DIR/postgres/weekly" "$BACKUP_DIR/volumes"
|
|
|
|
log() { echo "[$(date '+%H:%M:%S')] $1"; }
|
|
|
|
# ── PostgreSQL dumps ──────────────────────────────────────────────────────────
|
|
log "Starting PostgreSQL backups..."
|
|
for DB in $BACKUP_DATABASES; do
|
|
OUTFILE="$BACKUP_DIR/postgres/daily/${DB}_${TIMESTAMP}.sql.gz"
|
|
PGPASSWORD="$PG_SUPERPASS" pg_dump -h "$PG_HOST" -U postgres "$DB" | gzip > "$OUTFILE"
|
|
log " $DB → $(du -sh "$OUTFILE" | cut -f1)"
|
|
done
|
|
|
|
# Weekly full dump on Sundays
|
|
if [ "$(date +%u)" = "7" ]; then
|
|
log "Weekly full dump..."
|
|
PGPASSWORD="$PG_SUPERPASS" pg_dumpall -h "$PG_HOST" -U postgres \
|
|
| gzip > "$BACKUP_DIR/postgres/weekly/full_${TIMESTAMP}.sql.gz"
|
|
fi
|
|
|
|
# ── Retention cleanup ─────────────────────────────────────────────────────────
|
|
find "$BACKUP_DIR/postgres/daily" -name "*.gz" -mtime +7 -delete
|
|
find "$BACKUP_DIR/postgres/weekly" -name "*.gz" -mtime +28 -delete
|
|
log "Retention cleanup done"
|
|
|
|
# ── Rsync to remote ───────────────────────────────────────────────────────────
|
|
if [ -n "$BACKUP_REMOTE" ]; then
|
|
log "Syncing to $BACKUP_REMOTE..."
|
|
rsync -az --delete \
|
|
-e "ssh -i /root/.ssh/id_ed25519 -o StrictHostKeyChecking=no" \
|
|
"$BACKUP_DIR/" "$BACKUP_REMOTE"
|
|
log "Sync complete"
|
|
fi
|
|
|
|
# ── Uptime Kuma heartbeat ─────────────────────────────────────────────────────
|
|
if [ -n "$KUMA_PUSH_URL" ]; then
|
|
wget -qO- "$KUMA_PUSH_URL?status=up&msg=Backup+OK&ping=" > /dev/null 2>&1 || true
|
|
fi
|
|
|
|
log "Backup complete"
|