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:
+62
-1
@@ -22,6 +22,51 @@ say() { echo " $*"; }
|
|||||||
|
|
||||||
[[ $EUID -eq 0 ]] || die "要 root:sudo $0"
|
[[ $EUID -eq 0 ]] || die "要 root:sudo $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. 系统依赖 ────────────────────────────────────────────────────
|
# ── 1. 系统依赖 ────────────────────────────────────────────────────
|
||||||
say "装系统包"
|
say "装系统包"
|
||||||
if command -v apt-get >/dev/null; then
|
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"
|
"$APP/live/deploy/live.env.example" "$CONF/live.env"
|
||||||
NEED_FILL=1
|
NEED_FILL=1
|
||||||
else
|
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
|
fi
|
||||||
|
|
||||||
# ── 6. systemd ────────────────────────────────────────────────────
|
# ── 6. systemd ────────────────────────────────────────────────────
|
||||||
|
|||||||
Reference in New Issue
Block a user