fix(deploy): 修掉远端引号嵌套导致切换中途崩溃 + 补最终名字断言
真实事故:探测域名提取用了 `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) 保留。
This commit is contained in:
@ -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
|
||||
|
||||
Reference in New Issue
Block a user