From 700775866afe68b0b8182a3c3ee1d6559b74cb81 Mon Sep 17 00:00:00 2001 From: HomeDash Bot Date: Sat, 12 Sep 2026 10:46:09 +0800 Subject: [PATCH] =?UTF-8?q?fix(deploy):=20=E4=BF=AE=E6=8E=89=E8=BF=9C?= =?UTF-8?q?=E7=AB=AF=E5=BC=95=E5=8F=B7=E5=B5=8C=E5=A5=97=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E4=B8=AD=E9=80=94=E5=B4=A9=E6=BA=83=20+=20?= =?UTF-8?q?=E8=A1=A5=E6=9C=80=E7=BB=88=E5=90=8D=E5=AD=97=E6=96=AD=E8=A8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 真实事故:探测域名提取用了 `tr -d '"'"'"'` 这种引号嵌套,远端 bash 报 "unexpected EOF while looking for matching `'`",脚本在"停旧容器→起新容器→ 改名"的改名之前中断,容器留在 navi-next(服务正常但名字不对, 且验收里 docker inspect navi 全为空,看起来像数据丢失)。 修复: - 改用无引号的字符类提取域名(grep -oE '[A-Za-z0-9][A-Za-z0-9.-]*\.[A-Za-z]{2,}'), 彻底避开引号嵌套 - 收尾加断言:docker inspect navi 必须成功;若发现仍在 navi-next, 明确提示可直接改名,而不是静默"成功" 现场已手动补齐:navi-next 完整核验(healthz/conf.yml/admin/schema 200、 入口 302/404/200/200/200、22 条路由、端口 3080/3081、门户标题与备案号完整、 env COOKIE_DOMAIN=1 明文 PASSWORD=0、数据卷凭据文件在)后改名为 navi, 回滚点 navi-prev-20260912104324(ui-v53) 保留。 --- deploy/zd-host.sh | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/deploy/zd-host.sh b/deploy/zd-host.sh index 1e2979b..7c9925a 100644 --- a/deploy/zd-host.sh +++ b/deploy/zd-host.sh @@ -161,7 +161,8 @@ w200 "http://127.0.0.1:18080/admin" # 也可用 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') + # 只用无引号的字符类提取域名,避免 tr/sed 的引号嵌套把远端脚本打断 + CHECK_HOST=$(grep -m1 'host:' "$DATA_DIR/gateway.yml" 2>/dev/null | grep -oE '[A-Za-z0-9][A-Za-z0-9.-]*\.[A-Za-z]{2,}' | head -1 || true) fi [ -n "$CHECK_HOST" ] || { echo "!! 无法确定自检域名:请传 NAVI_CHECK_HOST=<某个已配置的域名>" >&2; false; } echo " 自检探测域名: $CHECK_HOST" @@ -218,6 +219,14 @@ docker rename navi-next navi trap - ERR docker rm -f "$PREV" >/dev/null 2>&1 || true rm -f "$REMOTE_TAR" +# 收尾断言:名字必须回到 navi。中途异常中断曾导致容器留在 navi-next, +# 而脚本"看起来"跑完了(本轮真实事故),所以这里显式检查。 +if ! docker inspect navi >/dev/null 2>&1; then + if docker inspect navi-next >/dev/null 2>&1; then + echo "!! 容器仍名为 navi-next(切换未收尾):已核验可直接 docker rename navi-next navi" >&2 + fi + false +fi echo "DEPLOY_OK tag=homedash:ui-${VER} mode=host health=$(docker inspect navi --format '{{if .State.Health}}{{.State.Health.Status}}{{else}}{{.State.Status}}{{end}}')" echo "闪断结束(旧容器已删除;镜像 ${OLD_IMAGE} 仍可用于手动回滚)" REMOTE