完善数据库备份恢复链路

This commit is contained in:
yml2213
2026-08-23 14:39:30 +08:00
parent 0dfc1ef0df
commit d56189fe59
10 changed files with 1535 additions and 5 deletions
+64
View File
@@ -16,6 +16,8 @@ HEALTH_URL=""
READY_TIMEOUT="${READY_TIMEOUT:-120}"
RESET_DB=false
RESET_DB_CONFIRM="${RESET_DB_CONFIRM:-}"
SKIP_BACKUP="${SKIP_BACKUP:-false}"
RESET_PRE_BACKUP_DONE=false
log() {
printf '\033[1;34m[deploy]\033[0m %s\n' "$*"
@@ -38,6 +40,7 @@ print_usage() {
参数:
--reset-db 删除 Compose PostgreSQL 数据卷 postgres_data,再按 migrations 目录全量重建(001 基线 + 全部增量)。
--skip-backup 跳过部署过程中的自动数据库备份(备份失败时确认为可接受后可用它紧急部署)。
--yes 跳过 --reset-db 的交互确认,也可使用环境变量 RESET_DB_CONFIRM=1。
-h, --help 显示帮助。
@@ -47,6 +50,8 @@ print_usage() {
它不会删除 apps/backend/data 下的平台 JSON 配置,也不会删除 Caddy 证书卷。
图片存储使用阿里云 OSS.env 的 STORAGE_OSS_*),生产编排不含 MinIO。
每次部署在执行数据库迁移前会自动备份到 OSSdeploy/backup-db.sh);
--reset-db 在删除数据卷前也会先抓一份最后备份。备份与恢复见 docs/数据库备份与恢复.md。
EOF
}
@@ -56,6 +61,9 @@ parse_args() {
--reset-db)
RESET_DB=true
;;
--skip-backup)
SKIP_BACKUP=true
;;
--yes)
RESET_DB_CONFIRM=1
;;
@@ -340,12 +348,68 @@ restart_web() {
fail "Web 启动失败,请根据上面的日志排查。"
}
run_scheduled_backup() {
local label="$1"
if [[ "${SKIP_BACKUP}" == "true" ]]; then
warn "已指定 --skip-backup,跳过${label}前的数据库备份。"
return
fi
log "${label}前自动备份数据库到 OSS"
if bash "${PROJECT_ROOT}/deploy/backup-db.sh"; then
log "${label}前备份完成"
return
fi
fail "${label}前备份失败,已停止部署。确认为可接受的失败后可用 --skip-backup 继续。"
}
backup_before_reset() {
if [[ "${RESET_DB}" != "true" ]]; then
return
fi
if [[ "${SKIP_BACKUP}" == "true" ]]; then
warn "已指定 --skip-backup,跳过删除数据卷前的最后一份备份。"
return
fi
local container_id status
container_id="$(docker compose ps -q postgres 2>/dev/null | head -n 1 || true)"
status=""
[[ -n "${container_id}" ]] && status="$(docker inspect -f '{{.State.Status}}' "${container_id}" 2>/dev/null || true)"
if [[ "${status}" != "running" ]]; then
local volume_name
volume_name="$(resolve_postgres_volume_name)"
if docker volume inspect "${volume_name}" >/dev/null 2>&1; then
warn "检测到已有 PostgreSQL 数据卷但容器未运行,先启动数据库以完成重置前备份。"
start_postgres
else
warn "未检测到已有 PostgreSQL 数据卷,跳过重置前备份(首次部署属正常现象)。"
return
fi
fi
run_scheduled_backup "重置数据库"
RESET_PRE_BACKUP_DONE=true
}
backup_before_migrate() {
if [[ "${RESET_PRE_BACKUP_DONE}" == "true" ]]; then
log "已在重置数据库前完成最后备份,跳过重置后的空库备份。"
return
fi
run_scheduled_backup "执行迁移"
}
deploy_stack() {
check_compose_config
pull_base_images
build_images
backup_before_reset
reset_database
start_postgres
backup_before_migrate
run_database_migrations
restart_backend
restart_web