File indexing completed on 2026-07-21 08:46:24
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 set -uo pipefail
0016
0017 ENV_FILE=${SWF_ENV_FILE:-/opt/swf-monitor/config/env/production.env}
0018 BACKUP_DIR=${SWF_DB_BACKUP_DIR:-/data/swf-shared/db-backups}
0019 LOG_FILE="$BACKUP_DIR/backup.log"
0020 KEEP_DAILY=14
0021 KEEP_MONTHLY=400
0022
0023
0024 MIN_BYTES=20000000
0025 MIN_TABLES=20
0026
0027 mkdir -p "$BACKUP_DIR"
0028 log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"; }
0029 fail() { log "ERROR: $*"; exit 1; }
0030
0031
0032
0033 env_get() { grep -E "^$1=" "$ENV_FILE" | head -1 | cut -d= -f2-; }
0034 [ -r "$ENV_FILE" ] || fail "cannot read $ENV_FILE"
0035 DB_NAME=$(env_get DB_NAME)
0036 DB_USER=$(env_get DB_USER)
0037 DB_HOST=$(env_get DB_HOST)
0038 PGPASSWORD=$(env_get DB_PASSWORD)
0039 export PGPASSWORD
0040 [ -n "$DB_NAME" ] && [ -n "$DB_USER" ] || fail "DB_NAME/DB_USER missing from $ENV_FILE"
0041 DB_HOST=${DB_HOST:-localhost}
0042
0043 STAMP=$(date +%Y%m%d)
0044 DUMP="$BACKUP_DIR/swfdb-$STAMP.dump"
0045 TMP="$DUMP.inprogress"
0046
0047 pg_dump -Fc -h "$DB_HOST" -U "$DB_USER" -d "$DB_NAME" -f "$TMP" \
0048 || fail "pg_dump failed for $DB_NAME@$DB_HOST"
0049
0050
0051 ITEMS=$(pg_restore --list "$TMP" 2>/dev/null | grep -c "TABLE DATA")
0052 [ "${ITEMS:-0}" -ge "$MIN_TABLES" ] \
0053 || fail "verification failed: only ${ITEMS:-0} TABLE DATA entries in $TMP"
0054 SIZE=$(stat -c%s "$TMP")
0055 [ "$SIZE" -ge "$MIN_BYTES" ] \
0056 || fail "dump suspiciously small: $SIZE bytes in $TMP"
0057
0058 mv "$TMP" "$DUMP"
0059
0060
0061 find "$BACKUP_DIR" -name 'swfdb-*.dump' ! -name 'swfdb-????01.dump' -mtime +"$KEEP_DAILY" -delete
0062 find "$BACKUP_DIR" -name 'swfdb-????01.dump' -mtime +"$KEEP_MONTHLY" -delete
0063 find "$BACKUP_DIR" -name '*.inprogress' -mtime +1 -delete
0064
0065 log "OK swfdb-$STAMP.dump: $SIZE bytes, $ITEMS tables verified"