fix(deploy): 默认不改门户口令 + apply 后等待监听就绪
两个问题,都由本轮真实部署暴露: 1) 口令轮换不该默认执行 集成明文 env 清理时顺手加了"重置为强随机口令",但重置会让所有受保护域名 (含用户访问 agent 界面的入口)立即要求新口令,用户若没读到日志就等于被锁在门外。 而生效凭据本是数据卷里的加盐哈希(/app/data/portal-auth.json),删掉明文 env 对登录毫无影响。→ 改为仅清理 env,轮换必须显式 NAVI_ROTATE_PORTAL_PASSWORD=1。 2) apply 触发的 nginx reload 是异步的 本次部署因此误判失败:受保护域名探测到 404(旧配置仍在生效),脚本判定 "应 302 实际 404" 并回滚。→ apply 之后、入口自检之前加入轮询等待就绪(最多 10s), 与 README「接口注意事项」第 4 条同一原因。
This commit is contained in:
@ -156,6 +156,14 @@ w200 "http://127.0.0.1:18080/healthz"
|
||||
w200 "http://127.0.0.1:18080/conf.yml"
|
||||
w200 "http://127.0.0.1:18080/admin"
|
||||
|
||||
# apply 触发的 nginx reload 是异步的:不等就绪直接探测会拿到 404,
|
||||
# 造成"明明升级成功却判失败"(本次真实踩到,与 README 接口注意事项第 4 条同因)。
|
||||
for _w in $(seq 1 20); do
|
||||
_c=$(curl -sk -o /dev/null -w "%{http_code}" -m 3 --resolve "$CHECK_HOST:${ENTRY_PORT:-3080}:127.0.0.1" \
|
||||
"https://$CHECK_HOST:${ENTRY_PORT:-3080}/" 2>/dev/null || echo 000)
|
||||
[ "$_c" != "000" ] && break
|
||||
sleep 0.5
|
||||
done
|
||||
# 入口自检:受保护域名应 302、公开域名应非 5xx、未知域名应 404(自定义页)
|
||||
CODE=$(curl -sk -o /dev/null -w '%{http_code}' -m 8 --resolve dashy.example.com:3080:127.0.0.1 https://dashy.example.com:3080/conf.yml)
|
||||
[ "$CODE" = "302" ] || { echo "!! 受保护域名应 302,实际 $CODE" >&2; false; }
|
||||
@ -175,7 +183,13 @@ if [ -n "$ADMIN_TOK" ]; then
|
||||
|
||||
# ③ 旧容器用过明文 PORTAL_PASSWORD 时,换成强随机口令并只打印一次
|
||||
# (失败不影响升级:可在后台「统一登录账号」自行设置)
|
||||
if [ "${CLEAN_PORTAL_PW:-0}" = "1" ]; then
|
||||
# 只清理明文 env(生效凭据来自数据卷 portal-auth.json,删掉 env 不影响登录)。
|
||||
# 重置口令会造成"所有受保护域名都要用新口令登录",属高风险操作,
|
||||
# 因此必须显式开启 NAVI_ROTATE_PORTAL_PASSWORD=1 才执行。
|
||||
if [ "${CLEAN_PORTAL_PW:-0}" = "1" ] && [ "${NAVI_ROTATE_PORTAL_PASSWORD:-0}" != "1" ]; then
|
||||
echo " 已丢弃旧容器 env 里的明文 PORTAL_PASSWORD;门户口令保持不变(如确需更换,后台可改,或传 NAVI_ROTATE_PORTAL_PASSWORD=1)"
|
||||
fi
|
||||
if [ "${CLEAN_PORTAL_PW:-0}" = "1" ] && [ "${NAVI_ROTATE_PORTAL_PASSWORD:-0}" = "1" ]; then
|
||||
NEWPW="$( (openssl rand -base64 24 2>/dev/null || head -c 24 /dev/urandom | base64) | tr -d '/+=' | cut -c1-20)"
|
||||
RESP=$(curl -s -X POST -H "Authorization: Bearer $ADMIN_TOK" -H 'Content-Type: application/json' \
|
||||
-d "{\"username\":\"admin\",\"password\":\"$NEWPW\"}" http://127.0.0.1:3005/api/portal-auth || true)
|
||||
|
||||
Reference in New Issue
Block a user