#!/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 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. 等待健康检查并记录发布状态 注意: 本脚本只回滚镜像,不回滚数据库结构或数据。 如果目标版本涉及不可逆迁移,必须先按备份文件手工恢复数据库。 选项: --to TAG 目标镜像 tag,必填 --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 ;; --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" 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 "回滚 api / player / admin 到 tag: $(current_image_tag)" compose up -d api player admin wait_for_stack_ready show_prisma_status compose ps persist_image_tag record_release_state "rollback" warn "镜像已回滚;数据库未自动恢复。若此次回滚涉及不可逆迁移,请按备份文件手工恢复数据库。" print_stack_urls