release(main): 修复云端台账保存与备份重开
Storage Persistence Guard / storage-persistence-audit (push) Has been cancelled
Client Quality Gates / Shared client and Web (pull_request) Has been cancelled
Client Quality Gates / macOS Desktop (pull_request) Has been cancelled
Storage Persistence Guard / storage-persistence-audit (pull_request) Has been cancelled
Storage Persistence Guard / storage-persistence-audit (push) Has been cancelled
Client Quality Gates / Shared client and Web (pull_request) Has been cancelled
Client Quality Gates / macOS Desktop (pull_request) Has been cancelled
Storage Persistence Guard / storage-persistence-audit (pull_request) Has been cancelled
This commit is contained in:
+43
-7
@@ -62,9 +62,9 @@ ${C_BOLD}环境:${C_RESET}
|
||||
${C_CYAN}release${C_RESET} 生产环境(强制 HTTPS,自动生成密钥对)
|
||||
|
||||
${C_BOLD}选项:${C_RESET}
|
||||
${C_WHITE}--base-url <url>${C_RESET} 健康检查使用的访问地址
|
||||
${C_WHITE}--base-url <url>${C_RESET} 对外访问基址(同时用于健康检查与 ONLYOFFICE 回调校验)
|
||||
dev/main 默认 http://127.0.0.1:8888
|
||||
release 必须通过此参数或交互输入提供
|
||||
已有环境优先复用 .env;首次 release 安装必须提供
|
||||
${C_WHITE}--yes${C_RESET} 跳过所有交互确认,适合 CI/CD 自动化执行
|
||||
${C_WHITE}--skip-build${C_RESET} 跳过镜像构建,仍会启动容器(docker compose up -d)
|
||||
${C_WHITE}--skip-migrate${C_RESET} 跳过数据库迁移(alembic upgrade head)
|
||||
@@ -179,16 +179,25 @@ generate_onlyoffice_instance_id() {
|
||||
|
||||
# ── 地址解析 ─────────────────────────────────
|
||||
resolve_base_url() {
|
||||
if [[ -z "$BASE_URL" && -f "$ENV_FILE" ]]; then
|
||||
BASE_URL="$(read_env_value CTMS_BASE_URL || true)"
|
||||
[[ -n "$BASE_URL" ]] || BASE_URL="$(read_env_value FRONTEND_PUBLIC_URL || true)"
|
||||
fi
|
||||
[[ -z "$BASE_URL" ]] && BASE_URL="$(default_base_url)"
|
||||
|
||||
if [[ "$TARGET_ENV" == "release" && -z "$BASE_URL" && "$ASSUME_YES" -eq 0 ]]; then
|
||||
printf ' %s▸%s 请输入 release 健康检查域名(例如 https://ctms.example.com): ' \
|
||||
printf ' %s▸%s 请输入 release 对外访问基址(例如 https://ctms.example.com): ' \
|
||||
"${C_YELLOW}${C_BOLD}" "${C_RESET}"
|
||||
read -r BASE_URL || true
|
||||
fi
|
||||
|
||||
[[ -n "$BASE_URL" ]] || fail "release 环境必须通过 --base-url 或交互输入提供 HTTPS 地址"
|
||||
|
||||
BASE_URL="${BASE_URL%/}"
|
||||
if [[ ! "$BASE_URL" =~ ^https?://[^/?#]+$ || "$BASE_URL" == *"@"* ]]; then
|
||||
fail "对外访问基址必须是仅包含协议和主机的 HTTP(S) origin,例如 https://ctms.example.com"
|
||||
fi
|
||||
|
||||
if [[ "$TARGET_ENV" == "release" && "$BASE_URL" != https://* ]]; then
|
||||
fail "release 环境的访问地址必须使用 HTTPS"
|
||||
fi
|
||||
@@ -222,7 +231,7 @@ confirm_install() {
|
||||
row "目标环境" "$TARGET_ENV" "${CC_INFO}${C_BOLD}"
|
||||
row "运行模式" "$runtime_env"
|
||||
row "Compose 项目" "$project_name"
|
||||
row "健康检查地址" "$BASE_URL" "${CC_INFO}"
|
||||
row "对外访问基址" "$BASE_URL" "${CC_INFO}"
|
||||
row ".env 文件" "$env_status"
|
||||
row "pg_data 目录" "$pg_status"
|
||||
row "ONLYOFFICE" "标准组件(自动安装)" "${CC_INFO}"
|
||||
@@ -376,6 +385,23 @@ run_backend_init() {
|
||||
fi
|
||||
}
|
||||
|
||||
check_onlyoffice_active_sessions() {
|
||||
step "检查 ONLYOFFICE 在线编辑会话"
|
||||
local running output
|
||||
running="$(compose_cmd ps --services --filter status=running 2>/dev/null || true)"
|
||||
if ! printf '%s\n' "$running" | grep -qx "onlyoffice"; then
|
||||
ok "ONLYOFFICE 尚未运行,跳过在线编辑会话检查"
|
||||
return 0
|
||||
fi
|
||||
if output="$(compose_cmd run --rm --no-deps backend-init \
|
||||
python scripts/check_onlyoffice_active_sessions.py 2>&1)"; then
|
||||
ok "$output"
|
||||
return 0
|
||||
fi
|
||||
printf '%s\n' "$output" >&2
|
||||
fail "部署前置检查未通过;为避免在线文件保存失败,尚未重启任何业务服务"
|
||||
}
|
||||
|
||||
run_build_and_start() {
|
||||
if [[ "$SKIP_BUILD" -eq 1 ]]; then
|
||||
step "启动服务(跳过镜像构建)"
|
||||
@@ -423,7 +449,7 @@ check_container_status() {
|
||||
|
||||
check_backend_environment() {
|
||||
step "校验后端运行时环境变量"
|
||||
local expected_env="$1" expected_key_id="$2" expect_rsa="$3"
|
||||
local expected_env="$1" expected_key_id="$2" expect_rsa="$3" expected_public_url="$4"
|
||||
local check_code
|
||||
check_code=$(cat <<'PY'
|
||||
import os, sys
|
||||
@@ -433,6 +459,7 @@ from app.core.login_crypto import _normalize_pem
|
||||
expected_env = os.environ["EXPECTED_ENV"]
|
||||
expected_key_id = os.environ["EXPECTED_KEY_ID"]
|
||||
expect_rsa = os.environ["EXPECT_RSA"] == "1"
|
||||
expected_public_url = os.environ["EXPECTED_PUBLIC_URL"].rstrip("/")
|
||||
|
||||
if settings.ENV != expected_env:
|
||||
sys.exit(f"ENV 不匹配: {settings.ENV} != {expected_env}")
|
||||
@@ -448,6 +475,11 @@ if settings.ONLYOFFICE_JWT_SECRET == settings.JWT_SECRET_KEY:
|
||||
sys.exit("ONLYOFFICE_JWT_SECRET 不得复用登录 JWT 密钥")
|
||||
if not settings.ONLYOFFICE_INSTANCE_ID:
|
||||
sys.exit("ONLYOFFICE_INSTANCE_ID 未配置")
|
||||
if settings.FRONTEND_PUBLIC_URL.rstrip("/") != expected_public_url:
|
||||
sys.exit(
|
||||
"FRONTEND_PUBLIC_URL 不匹配;ONLYOFFICE 公开缓存地址会被保存回调拒绝: "
|
||||
f"{settings.FRONTEND_PUBLIC_URL} != {expected_public_url}"
|
||||
)
|
||||
if expect_rsa:
|
||||
if not settings.LOGIN_RSA_PRIVATE_KEY:
|
||||
sys.exit("LOGIN_RSA_PRIVATE_KEY 未配置")
|
||||
@@ -462,6 +494,7 @@ PY
|
||||
-e EXPECTED_ENV="$expected_env" \
|
||||
-e EXPECTED_KEY_ID="$expected_key_id" \
|
||||
-e EXPECT_RSA="$expect_rsa" \
|
||||
-e EXPECTED_PUBLIC_URL="$expected_public_url" \
|
||||
backend python -c "$check_code"
|
||||
}
|
||||
|
||||
@@ -508,7 +541,7 @@ run_health_checks() {
|
||||
[[ "$runtime_env" == "production" ]] && expect_rsa=1
|
||||
check_container_status
|
||||
check_dev_nginx_mode
|
||||
check_backend_environment "$runtime_env" "$login_key_id" "$expect_rsa"
|
||||
check_backend_environment "$runtime_env" "$login_key_id" "$expect_rsa" "$BASE_URL"
|
||||
step "探测 HTTP 接口可用性"
|
||||
check_http_endpoint "/health"
|
||||
check_http_endpoint "/readyz"
|
||||
@@ -555,10 +588,13 @@ main() {
|
||||
confirm_install "$EFFECTIVE_PROJECT_NAME" "$EFFECTIVE_RUNTIME_ENV"
|
||||
prepare_env_file "$project_name" "$runtime_env" "$login_key_id"
|
||||
sync_frontend_build_env "$runtime_env"
|
||||
# 健康检查地址持久化到 .env(单一事实来源);独立 upsert,绕开 prepare_env_file 对已存在 .env 的跳过。
|
||||
# 对外访问基址同时用于健康检查和后端校验 ONLYOFFICE 返回的公开缓存 URL。
|
||||
# 两项必须同步;否则生产域名下的最终保存回调会被当作不受信任地址拒绝。
|
||||
ctms_upsert_env_value CTMS_BASE_URL "$BASE_URL"
|
||||
ctms_upsert_env_value FRONTEND_PUBLIC_URL "$BASE_URL"
|
||||
run_compose_config
|
||||
run_backend_init
|
||||
check_onlyoffice_active_sessions
|
||||
run_build_and_start
|
||||
run_migrations
|
||||
resolve_effective_config "$project_name" "$runtime_env" "$login_key_id"
|
||||
|
||||
Reference in New Issue
Block a user