Files
thebet365/scripts/deploy-update.sh
2026-06-13 22:16:14 +08:00

132 lines
3.1 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# 后续更新:可选拉代码/加载镜像,备份数据,构建或使用新镜像,执行迁移并滚动到新容器。
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck source=scripts/deploy-lib.sh
source "$SCRIPT_DIR/deploy-lib.sh"
PULL_CODE=false
NO_BUILD=false
SKIP_BACKUP=false
ALLOW_DEFAULT_SECRETS=false
IMAGE_TAR=""
usage() {
cat <<'EOF'
用法: scripts/deploy-update.sh [选项]
默认流程:
1. 检查 .env.docker
2. 启动并等待 postgres / redis
3. 备份 PostgreSQL 与 uploads 到 ./backups
4. 构建 api / player / admin 镜像
5. 使用新 api 镜像执行 prisma migrate deploy
6. 启动/替换 api、player、admin 容器
7. 检查 prisma migrate status
选项:
--pull 先执行 git pull --ff-only
--images PATH 先 docker load 指定镜像 tar并自动跳过本机构建
--tag TAG 使用指定镜像 tag并写入 .env.docker 的 IMAGE_TAG
--no-build 不构建镜像,直接使用服务器已有镜像
--no-backup 跳过 PostgreSQL 与 uploads 备份
--allow-default-secrets 允许 .env.docker 使用示例密钥,仅测试环境使用
-h, --help 显示帮助
示例:
./scripts/deploy-update.sh --pull
./scripts/deploy-update.sh --images thebet365-images-v1.2.3.tar --tag v1.2.3
./scripts/deploy-update.sh --no-build
EOF
}
while [ $# -gt 0 ]; do
case "$1" in
--pull)
PULL_CODE=true
shift
;;
--images)
IMAGE_TAR="${2:?缺少 --images 参数值}"
NO_BUILD=true
shift 2
;;
--tag)
set_deploy_image_tag "${2:?缺少 --tag 参数值}"
shift 2
;;
--no-build)
NO_BUILD=true
shift
;;
--no-backup)
SKIP_BACKUP=true
shift
;;
--allow-default-secrets)
ALLOW_DEFAULT_SECRETS=true
shift
;;
-h|--help)
usage
exit 0
;;
*)
die "未知参数: $1"
;;
esac
done
cd "$ROOT"
require_docker
ensure_env_file || exit 1
validate_prod_env "$ALLOW_DEFAULT_SECRETS"
if [ -n "$IMAGE_TAR" ] && [ -z "${DEPLOY_IMAGE_TAG:-}" ]; then
inferred_tag="$(infer_image_tag_from_tar "$IMAGE_TAR")"
if [ -n "$inferred_tag" ]; then
set_deploy_image_tag "$inferred_tag"
log "从镜像包文件名推断 tag: $inferred_tag"
fi
fi
if [ "$PULL_CODE" = true ]; then
require_command git
log "拉取代码: git pull --ff-only"
git pull --ff-only
fi
if [ -n "$IMAGE_TAR" ]; then
load_image_tar "$IMAGE_TAR"
fi
start_infra
if [ "$SKIP_BACKUP" = false ]; then
backup_database "pre-update"
backup_uploads "pre-update"
prune_old_backups
else
warn "已跳过 PostgreSQL 与 uploads 备份"
fi
if [ "$NO_BUILD" = false ]; then
build_app_images
else
log "跳过镜像构建,使用服务器已有镜像"
require_images_for_current_tag
fi
run_prisma_migrations
log "启动/更新 api / player / admin"
compose up -d api player admin
wait_for_stack_ready
show_prisma_status
compose ps
persist_image_tag
record_release_state "update"
print_stack_urls