#!/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"