chore(release): script database backup runbook

This commit is contained in:
Xiaoxia AI
2026-06-21 13:26:45 +08:00
parent c2e56c6450
commit b7e69c4e0b
4 changed files with 115 additions and 2 deletions
+36
View File
@@ -0,0 +1,36 @@
#!/usr/bin/env bash
set -euo pipefail
BACKUP_ROOT="${BACKUP_ROOT:-/root/xiaoxia-backups}"
POSTGRES_CONTAINER="${POSTGRES_CONTAINER:-xiaoxia-postgres}"
POSTGRES_USER="${POSTGRES_USER:-xiaoxia}"
POSTGRES_DB="${POSTGRES_DB:-xiaoxia_saas}"
TS="$(date +%Y%m%d-%H%M%S)"
BACKUP_DIR="$BACKUP_ROOT/$TS"
DUMP_PATH="$BACKUP_DIR/${POSTGRES_DB}.dump"
VERSION_PATH="$BACKUP_DIR/alembic_version.txt"
MANIFEST_PATH="$BACKUP_DIR/manifest.txt"
mkdir -p "$BACKUP_DIR"
docker exec "$POSTGRES_CONTAINER" pg_dump -U "$POSTGRES_USER" -d "$POSTGRES_DB" -Fc > "$DUMP_PATH"
docker exec "$POSTGRES_CONTAINER" psql -U "$POSTGRES_USER" -d "$POSTGRES_DB" -Atc 'select version_num from alembic_version;' > "$VERSION_PATH" 2>/dev/null || true
if [ ! -s "$DUMP_PATH" ]; then
echo "ERROR: backup dump is empty: $DUMP_PATH" >&2
exit 1
fi
{
echo "created_at=$TS"
echo "postgres_container=$POSTGRES_CONTAINER"
echo "postgres_user=$POSTGRES_USER"
echo "postgres_db=$POSTGRES_DB"
echo "dump_path=$DUMP_PATH"
echo "alembic_version=$(cat "$VERSION_PATH" 2>/dev/null || true)"
echo "dump_size_bytes=$(wc -c < "$DUMP_PATH")"
} > "$MANIFEST_PATH"
ls -lh "$DUMP_PATH"
echo "OK backup created: $BACKUP_DIR"
+39
View File
@@ -0,0 +1,39 @@
#!/usr/bin/env bash
set -euo pipefail
BACKUP_DIR="${1:-}"
POSTGRES_CONTAINER="${POSTGRES_CONTAINER:-xiaoxia-postgres}"
POSTGRES_USER="${POSTGRES_USER:-xiaoxia}"
POSTGRES_DB="${POSTGRES_DB:-xiaoxia_saas}"
if [ -z "$BACKUP_DIR" ]; then
echo "Usage: $0 <backup-dir>" >&2
exit 2
fi
DUMP_PATH="$BACKUP_DIR/${POSTGRES_DB}.dump"
MANIFEST_PATH="$BACKUP_DIR/manifest.txt"
if [ ! -s "$DUMP_PATH" ]; then
echo "ERROR: backup dump not found or empty: $DUMP_PATH" >&2
exit 1
fi
cat <<EOF
Restore plan for $POSTGRES_DB
Backup directory:
$BACKUP_DIR
Manifest:
$(cat "$MANIFEST_PATH" 2>/dev/null || echo ' <missing manifest>')
Manual restore commands (requires maintenance window):
docker stop xiaoxia-api-production xiaoxia-worker-production || true
docker exec $POSTGRES_CONTAINER pg_restore -U $POSTGRES_USER -d $POSTGRES_DB --clean --if-exists --no-owner --no-privileges < $DUMP_PATH
docker start xiaoxia-api-production xiaoxia-worker-production
docker exec $POSTGRES_CONTAINER psql -U $POSTGRES_USER -d $POSTGRES_DB -Atc 'select version_num from alembic_version;'
This script intentionally does not execute restore automatically.
EOF