install.sh 报出模板新增的配置项,并给 --sync-env 追加

live.env 装着密钥,所以安装时刻意不覆盖。但这样一来,往 live.env.example
里加配置,已有部署会永远拿不到、且毫无提示——静默漂移,等到某个开关根本
没生效才发现。这次加 TG_TOKEN 就撞上了。

现在重复安装会 diff 两边的变量名:报模板多出的项(提示跑 --sync-env),
也报配置里已被模板删掉的项(可能已废弃)。

--sync-env 独立成一个模式而不是塞进安装流程:追加要改一个装着密钥的文件,
这种事应当由人显式发起。只追加缺的项、连它上面的注释一起,不动已有任何
一行,先备份。实测原有内容逐行未变且重复跑幂等。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
jack
2026-08-28 17:45:48 +08:00
co-authored by Cursor
parent 15f4aa088e
commit 999ad924ad
+62 -1
View File
@@ -22,6 +22,51 @@ say() { echo " $*"; }
[[ $EUID -eq 0 ]] || die "要 rootsudo $0"
# ── --sync-env:把模板新增的项追加到已有配置 ────────────────────────
# 独立成一个模式而不是塞进安装流程:追加会改一个装着密钥的文件,这种事应当
# 由你显式发起。只追加缺的项(连它上面的注释一起),**不动**已有任何一行。
if [[ "${1:-}" == "--sync-env" ]]; then
EX="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/live.env.example"
[[ -f "$EX" ]] || die "找不到模板 $EX"
[[ -f "$CONF/live.env" ]] || die "$CONF/live.env 还不存在,先跑一次 sudo $0"
cp -a "$CONF/live.env" "$CONF/live.env.bak.$(date +%Y%m%d%H%M%S)"
python3 - "$EX" "$CONF/live.env" <<'PY'
import re
import sys
ex_path, live_path = sys.argv[1], sys.argv[2]
ex = open(ex_path, encoding="utf-8").read().splitlines()
live = open(live_path, encoding="utf-8").read()
KEY = re.compile(r"^([A-Z_][A-Z0-9_]*)=")
have = set(KEY.match(x).group(1) for x in live.splitlines() if KEY.match(x))
add, block = [], []
for line in ex:
if KEY.match(line):
k = KEY.match(line).group(1)
if k not in have:
add += block + [line]
block = []
elif line.startswith("#") or (not line.strip() and block):
block.append(line)
else:
block = []
if not add:
print(" 配置已是最新,无需追加")
raise SystemExit(0)
with open(live_path, "a", encoding="utf-8") as f:
f.write("\n\n# ── 以下由 install.sh --sync-env 追加 ──\n")
f.write("\n".join(add) + "\n")
n = sum(1 for x in add if KEY.match(x))
print(f" 追加了 {n} 项:" +
" ".join(KEY.match(x).group(1) for x in add if KEY.match(x)))
PY
say "原文件已备份为 $CONF/live.env.bak.*"
say "追加的项多半是空值,逐项填完再重启:sudo systemctl restart chan-live-exec"
exit 0
fi
# ── 1. 系统依赖 ────────────────────────────────────────────────────
say "装系统包"
if command -v apt-get >/dev/null; then
@@ -104,7 +149,23 @@ if [[ ! -f "$CONF/live.env" ]]; then
"$APP/live/deploy/live.env.example" "$CONF/live.env"
NEED_FILL=1
else
say "$CONF/live.env 已存在,不"
say "$CONF/live.env 已存在,不覆盖(里面是密钥)"
# 但要报出模板新增的项。不报的话,以后往 example 里加配置,已有部署会
# **永远拿不到且毫无提示**——静默漂移,等到出事才发现某个开关根本没生效
keys() { grep -oE '^[A-Z_][A-Z0-9_]*=' "$1" | tr -d '=' | sort -u; }
MISSING="$(comm -23 <(keys "$APP/live/deploy/live.env.example") \
<(keys "$CONF/live.env") | tr '\n' ' ')"
if [[ -n "${MISSING// }" ]]; then
say "⚠ 模板比你的配置多了这些项:$MISSING"
say " 逐项看说明:$APP/live/deploy/live.env.example"
say " 要把缺的那几行连注释一起追加过去,跑:"
say " sudo $APP/live/deploy/install.sh --sync-env"
NEED_FILL=1
fi
OBSOLETE="$(comm -13 <(keys "$APP/live/deploy/live.env.example") \
<(keys "$CONF/live.env") | tr '\n' ' ')"
[[ -n "${OBSOLETE// }" ]] && \
say " 另有模板里已没有的项(可能已废弃):$OBSOLETE"
fi
# ── 6. systemd ────────────────────────────────────────────────────