#!/usr/bin/env bash # 只回滚 api / player / admin 镜像 tag,不自动恢复数据库。 set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # shellcheck source=scripts/deploy-lib.sh source "$SCRIPT_DIR/deploy-lib.sh" TARGET_TAG="" SKIP_BACKUP=false ALLOW_DEFAULT_SECRETS=false WITH_THEMES="auto" usage() { cat <<'EOF' 用法: scripts/rollback.sh --to TAG [选项] 默认流程: 1. 检查 .env.docker 2. 确认本机存在 thebet365-api/player/admin:TAG 3. 备份 PostgreSQL 与 uploads 到 ./backups 4. 将 api / player / admin 切回指定 TAG 5. 等待健康检查并记录发布状态 注意: 本脚本只回滚镜像,不回滚数据库结构或数据。 如果目标版本涉及不可逆迁移,必须先按备份文件手工恢复数据库。 若当前发布启用了四套 player,默认会一并回滚 player2/3/4;可用 --no-themes 仅回滚单套 player。 选项: --to TAG 目标镜像 tag,必填 --themes 回滚时启用四套 player(player2/3/4) --no-themes 仅回滚单套 player,忽略当前发布的 themes 状态 --no-backup 跳过 PostgreSQL 与 uploads 备份 --allow-default-secrets 允许 .env.docker 使用示例密钥,仅测试环境使用 -h, --help 显示帮助 示例: ./scripts/rollback.sh --to v1.2.2 EOF } while [ $# -gt 0 ]; do case "$1" in --to) TARGET_TAG="${2:?缺少 --to 参数值}" shift 2 ;; --themes) WITH_THEMES=true shift ;; --no-themes) WITH_THEMES=false shift ;; --no-backup) SKIP_BACKUP=true shift ;; --allow-default-secrets) ALLOW_DEFAULT_SECRETS=true shift ;; -h|--help) usage exit 0 ;; *) die "未知参数: $1" ;; esac done [ -n "$TARGET_TAG" ] || die "缺少 --to TAG" set_deploy_image_tag "$TARGET_TAG" cd "$ROOT" require_docker ensure_env_file || exit 1 validate_prod_env "$ALLOW_DEFAULT_SECRETS" if [ "$WITH_THEMES" = true ]; then enable_themes_deploy elif [ "$WITH_THEMES" = false ]; then DEPLOY_WITH_THEMES=false export DEPLOY_WITH_THEMES else load_themes_from_release || true fi require_images_for_current_tag start_infra if [ "$SKIP_BACKUP" = false ]; then backup_database "pre-rollback" backup_uploads "pre-rollback" prune_old_backups else warn "已跳过 PostgreSQL 与 uploads 备份" fi log "回滚 $(stack_app_services) 到 tag: $(current_image_tag)" # shellcheck disable=SC2046 compose up -d $(stack_app_services) wait_for_stack_ready show_prisma_status compose ps persist_image_tag record_release_state "rollback" warn "镜像已回滚;数据库未自动恢复。若此次回滚涉及不可逆迁移,请按备份文件手工恢复数据库。" print_stack_urls