Files
thebet365/scripts/deploy-first.sh
2026-06-13 17:38:25 +08:00

125 lines
2.8 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
# 首次部署:启动 Docker 栈、执行迁移,并在缺少 admin 时写入生产默认数据。
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck source=scripts/deploy-lib.sh
source "$SCRIPT_DIR/deploy-lib.sh"
NO_BUILD=false
RUN_SEED=true
INIT_DB=false
SKIP_BACKUP=false
ALLOW_DEFAULT_SECRETS=false
IMAGE_TAR=""
usage() {
cat <<'EOF'
用法: scripts/deploy-first.sh [选项]
默认流程:
1. 检查 .env.docker
2. 启动 postgres / redis
3. 构建 api / player / admin 镜像
4. 执行 prisma migrate deploy
5. 启动全栈容器
6. 如果数据库中没有 admin执行一次生产 seed
选项:
--no-build 不构建镜像,直接使用服务器已有镜像
--images PATH 先 docker load 指定镜像 tar并自动跳过本机构建
--no-seed 不执行生产 seed
--init-db 调用 scripts/prod-init-db.sh 清空业务数据并初始化生产数据,仅限全新库或明确重置
--skip-backup 与 --init-db 一起使用,跳过 prod-init-db 的备份
--allow-default-secrets 允许 .env.docker 使用示例密钥,仅测试环境使用
-h, --help 显示帮助
示例:
./scripts/deploy-first.sh
./scripts/deploy-first.sh --images thebet365-images.tar
./scripts/deploy-first.sh --no-build
./scripts/deploy-first.sh --init-db
EOF
}
while [ $# -gt 0 ]; do
case "$1" in
--no-build)
NO_BUILD=true
shift
;;
--images)
IMAGE_TAR="${2:?缺少 --images 参数值}"
NO_BUILD=true
shift 2
;;
--no-seed)
RUN_SEED=false
shift
;;
--init-db)
INIT_DB=true
RUN_SEED=false
shift
;;
--skip-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" ]; then
load_image_tar "$IMAGE_TAR"
fi
start_infra
if [ "$NO_BUILD" = false ]; then
build_app_images
else
log "跳过镜像构建,使用服务器已有镜像"
fi
run_prisma_migrations
if [ "$INIT_DB" = false ] && [ "$RUN_SEED" = true ]; then
seed_production_if_missing_admin
fi
log "启动 api / player / admin"
compose up -d api player admin
wait_for_service_running api 120
if [ "$INIT_DB" = true ]; then
init_args=()
if [ "$SKIP_BACKUP" = true ]; then
init_args+=(--skip-backup)
fi
log "执行生产初始化:这会清空业务数据"
CONFIRM=YES "$ROOT/scripts/prod-init-db.sh" "${init_args[@]}"
compose restart api
wait_for_service_running api 120
fi
show_prisma_status
compose ps
print_stack_urls