From 142d27efea6eecc29c084831c79b1d9c9dc89962 Mon Sep 17 00:00:00 2001 From: yml Date: Thu, 18 Jun 2026 12:12:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=A4=87=E4=BB=BD=E6=81=A2?= =?UTF-8?q?=E5=A4=8D=E8=B7=AF=E5=BE=84=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/backup-prod.sh | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/scripts/backup-prod.sh b/scripts/backup-prod.sh index 2280c3b..3c309ee 100755 --- a/scripts/backup-prod.sh +++ b/scripts/backup-prod.sh @@ -6,6 +6,9 @@ COMPOSE_FILE="${ROOT_DIR}/deploy/docker-compose.prod.yml" BACKEND_ENV="${ROOT_DIR}/backend/.env" BACKUP_ROOT="${BACKUP_ROOT:-${ROOT_DIR}/backups}" HELPER_IMAGE="${BACKUP_HELPER_IMAGE:-redis:7.4-alpine}" +if [[ "${BACKUP_ROOT}" != /* ]]; then + BACKUP_ROOT="${ROOT_DIR}/${BACKUP_ROOT}" +fi RED='\033[0;31m' GREEN='\033[0;32m' @@ -36,6 +39,14 @@ need_cmd() { fi } +absolute_dir() { + local dir="$1" + ( + cd "${dir}" + pwd -P + ) +} + show_help() { cat << EOF 用法: ./scripts/backup-prod.sh <命令> [选项] @@ -416,6 +427,7 @@ restore_all() { need_cmd docker local backup_dir="$1" local yes="$2" + local restore_ok=0 if [[ -z "${backup_dir}" || ! -d "${backup_dir}" ]]; then log_error "备份目录不存在:${backup_dir}" @@ -425,6 +437,18 @@ restore_all() { log_error "restore 会覆盖当前生产数据库、MinIO、Redis、Caddy volume 和配置文件。确认执行请追加 --yes" exit 1 fi + backup_dir="$(absolute_dir "${backup_dir}")" + + restore_failure_cleanup() { + local exit_code=$? + trap - ERR + if [[ "${restore_ok}" != "1" ]]; then + log_warn "恢复失败,尝试启动当前配置下的服务,便于继续排查" + compose up -d || true + fi + exit "${exit_code}" + } + trap restore_failure_cleanup ERR prepare_restore_env "${backup_dir}" log_warn "即将从 ${backup_dir} 恢复,当前生产数据会被覆盖。" @@ -439,6 +463,8 @@ restore_all() { log "启动生产服务" compose up -d + restore_ok=1 + trap - ERR log_success "恢复完成。建议立刻执行健康检查并抽查图片/二维码/订单数据。" }