环境配置统一以 .env 为单一事实来源,移除 .ctms-env

- 删除 .ctms-env:环境名由 .env 的 COMPOSE_PROJECT_NAME 反推
  (ctms_detect_env),健康检查地址改存 .env 的 CTMS_BASE_URL
- prepare_env_file 由“已存在则整体跳过”改为逐项探测补全:
  身份类缺失补目标值、密钥类缺失/空才生成、已有值一律不动
- resolve_effective_config 放宽为“冲突才致命”:身份类缺失交给
  补全,仅 COMPOSE_PROJECT_NAME/ENV 与目标环境冲突时报错停止
  (防止覆盖后孤立旧环境容器)
- 新增 ctms_env_has_key 区分“键缺失”与“键存在但空值”
  (dev 的 LOGIN_RSA_PRIVATE_KEY= 是合法空值)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Cheng Zhou
2026-06-24 10:48:27 +08:00
parent 24d5b7445f
commit f9a9f7eafe
4 changed files with 94 additions and 81 deletions
+19
View File
@@ -261,6 +261,17 @@ ctms_key_id() {
esac
}
# 从 .env 的 COMPOSE_PROJECT_NAME 反推环境名(dev/main/release)。
# .env 是部署环境的唯一事实来源(main/release 均为 production,仅项目名可区分)。
# 无 .env 或无法识别时输出空字符串,由调用方决定回退策略。
ctms_detect_env() {
case "$(ctms_read_env_value COMPOSE_PROJECT_NAME)" in
ctms_dev) printf 'dev' ;;
ctms_main) printf 'main' ;;
ctms_release) printf 'release' ;;
esac
}
# 默认健康检查地址;release 无默认值(必须显式提供 HTTPS)
ctms_default_base_url() {
ctms_require_env "$1"
@@ -399,6 +410,14 @@ ctms_read_env_value() {
' "$CTMS_ENV_FILE"
}
# 判断 .env 中是否存在某个键(区分“键缺失”与“键存在但值为空”:
# dev 的 LOGIN_RSA_PRIVATE_KEY= 是合法空值,不能当作缺失去重新生成)。
ctms_env_has_key() {
local key="$1"
[[ -f "$CTMS_ENV_FILE" ]] || return 1
grep -q "^${key}=" "$CTMS_ENV_FILE"
}
ctms_upsert_env_value() {
local key="$1" value="$2"
local temp_file