JianFeeeee
aae3fb7065
fix(deploy): 历史条数不再假报 0,明文令牌的 /tmp env 文件必删
两处都是「看起来成功、实际给了错误信息/留下凭据」的问题。
A. 历史条数假数据(行为变化)
旧逻辑:ADMIN_TOK=$(grep ... || true) 取不到时仍发一个空的 `Bearer `
请求;第 1 步把 history-server 改成 fail-closed 后它必然回 401 JSON,
而 `grep -o '"url"' | wc -l` 对错误响应数出 0,再被 HIST=${HIST:-0}
兜一层,于是对外打印「历史条数 0」—— 一个假数据,看起来像历史被清空。
现在抽成 human_history_count(),三条路径分开:
· 未配置 NAVI_ADMIN_TOKEN → 「未知(未配置…跳过探测)」,不发任何请求
· 非 200(401/502/连不上的 000) → 「未知(HTTP xxx)」,不数 body
· 只有 200 才数 '"url"' 出现次数
⚠️ 行为变化:token 取不到时历史条数显示「未知」而不是「0」;
真实的 0 条(200 + 空列表)仍然显示 0。仍旧绝不阻断升级。
B. 明文令牌的 env 文件残留
/tmp/navi-host-<stamp>.env 含 NAVI_ADMIN_TOKEN / NAVI_SYNC_TOKEN 明文,
chmod 600 只防别的用户读,不防它一直躺在 /tmp。现在:
· 统一为 $ENV_FILE(含 .t / .new 中间文件),不再散落字面量路径
· 新增 cleanup_env_file(),同时删三个文件
· 注册 trap ... EXIT(任何 exit 都删)+ fail() 回滚路径显式调用
+ 成功收尾显式调用(三处)
删它不影响已起容器:docker run 已在启动时把值注入容器 env。
顺带确认(未改动,仅补注释):重置门户口令后打印一次 $NEWPW 是有意设计
——那是管理员唯一一次拿到它的机会(数据卷只存哈希),注释已写明
「只打印这一次」,且不写日志文件、不进任何 env。
新增 deploy/zd-host_test.sh(bash deploy/zd-host_test.sh,退出码 0=全绿):
1. bash -n 语法检查;
2. 静态护栏:轮换只打印 ${#VAR} 长度、无 set -x、无 HIST=${HIST:-0}、
无「grep url | wc -l || echo 0」旧写法、必须校验 HTTP 状态码、
env 文件在 fail() 与 EXIT trap 与成功路径上都有删除、中间文件也删;
3. 用 BEGIN/END 标记把 human_history_count 原样抠出来,配 stub curl 单测
空 token / 401 / 502 / 连接失败 / 200 三条 / 200 空列表 六种情形,
并断言空 token 时根本没发请求、有 token 时带了 Authorization 头。
反向验证:把历史条数换回旧写法并删掉三处 env 文件清理后,
测试从 26 通过 / 0 失败变成 10 通过 / 16 失败(列出「仍有 HIST=${HIST:-0}」
「fail() 回滚路径没有删 env 文件」「空 token 时仍然调用了 curl」等)。
另外用第 1 步的真实 history-server + 模拟两层鉴权的反代做了端到端复核,
旧写法在 401/连接失败下都报 0,新写法分别报「未知(HTTP 401)」「未知(HTTP 000)」,
200 + 3 条报 3,200 + 空列表报 0。
2026-10-22 23:25:26 +08:00
..
2026-10-04 08:52:47 +08:00
2026-10-04 08:02:41 +08:00
2026-10-03 08:37:54 +08:00
2026-09-12 10:10:52 +08:00
2026-09-12 10:10:52 +08:00
2026-10-02 11:24:55 +08:00
2026-10-02 11:24:55 +08:00
2026-09-12 10:10:52 +08:00
2026-09-12 10:10:52 +08:00
2026-10-22 23:25:26 +08:00
2026-10-22 23:25:26 +08:00
2026-09-12 10:38:17 +08:00