diff --git a/deploy/zd-host.sh b/deploy/zd-host.sh index db83122..1e2979b 100644 --- a/deploy/zd-host.sh +++ b/deploy/zd-host.sh @@ -156,20 +156,33 @@ 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 条同因)。 +# 入口自检:探测域名不写死(脱敏时曾把真实域名换成占位符,导致自检去探测 +# 一个路由表里不存在的域名而误判失败)。默认取路由表第一条的 host, +# 也可用 NAVI_CHECK_HOST 指定。apply 触发的 reload 是异步的,先等就绪。 +CHECK_HOST="${NAVI_CHECK_HOST:-}" +if [ -z "$CHECK_HOST" ]; then + CHECK_HOST=$(grep -m1 'host:' "$DATA_DIR/gateway.yml" 2>/dev/null | sed 's/.*host:[[:space:]]*//' | tr -d '"'"'"' | tr -d '\r') +fi +[ -n "$CHECK_HOST" ] || { echo "!! 无法确定自检域名:请传 NAVI_CHECK_HOST=<某个已配置的域名>" >&2; false; } +echo " 自检探测域名: $CHECK_HOST" + 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=$(curl -sk -o /dev/null -w '%{http_code}' -m 3 --resolve "$CHECK_HOST:3080:127.0.0.1" \ + "https://$CHECK_HOST: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; } -CODE=$(curl -sk -o /dev/null -w '%{http_code}' -m 8 --resolve nobody.test:3080:127.0.0.1 https://nobody.test:3080/) + +# 已配置的域名必须可服务:门户可能是 200,受保护的是 302 —— 两者都算正常; +# 000(没监听)/404(不在路由表)/5xx(上游或配置坏了)都算失败。 +CODE=$(curl -sk -o /dev/null -w '%{http_code}' -m 8 --resolve "$CHECK_HOST:3080:127.0.0.1" "https://$CHECK_HOST:3080/") +case "$CODE" in + 200|302) echo " 已配置域名 $CHECK_HOST → $CODE" ;; + *) echo "!! 已配置域名 $CHECK_HOST 应 200/302,实际 $CODE" >&2; false ;; +esac +CODE=$(curl -sk -o /dev/null -w '%{http_code}' -m 8 --resolve nobody.invalid:3080:127.0.0.1 https://nobody.invalid:3080/) [ "$CODE" = "404" ] || { echo "!! 未知域名应 404,实际 $CODE" >&2; false; } -CODE=$(curl -s -o /dev/null -w '%{http_code}' -m 8 -H 'Host: dashy.example.com' http://127.0.0.1:3081/) +CODE=$(curl -s -o /dev/null -w '%{http_code}' -m 8 -H "Host: $CHECK_HOST" http://127.0.0.1:3081/) [ "$CODE" = "302" ] || { echo "!! HTTP 入口应 302 跳转,实际 $CODE" >&2; false; } echo " 入口自检通过(3080/3081)"