完善数据库备份恢复链路
This commit is contained in:
@@ -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。
|
||||
每次部署在执行数据库迁移前会自动备份到 OSS(deploy/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
|
||||
|
||||
Reference in New Issue
Block a user