diff --git a/deploy/zd.sh b/deploy/zd.sh index 5850ad7..833eec8 100755 --- a/deploy/zd.sh +++ b/deploy/zd.sh @@ -91,6 +91,10 @@ CONF_BAK="${PORTAL_CONF}.bak-${STAMP}" cp -a "$PORTAL_CONF" "$CONF_BAK" gzip -dc "$REMOTE_TAR" | docker load >/dev/null +# 记录切换前的历史条数,切换后用于对比(同步接口只累加不删除, +# 所以"变少"就是异常;写死条数则会把用户自己删记录误判成失败) +OLD_HIST=$(curl -s "http://127.0.0.1:${CUR_PORT}/admin/api/history" 2>/dev/null | grep -o '"url"' | wc -l) +OLD_HIST=${OLD_HIST:-0} docker inspect navi --format '{{range .Config.Env}}{{println .}}{{end}}' \ | grep -E '^(NAVI_ADMIN_TOKEN|NAVI_SYNC_TOKEN|SEARXNG_BASE_URL|DEBIAN_FRONTEND)=' > "/tmp/navi-${STAMP}.env" @@ -119,7 +123,9 @@ w200 "http://127.0.0.1:${NEW_PORT}/navi.js" # /search 会真正跑一次搜索:既确认 SearXNG 可用,也顺带把它预热, # 这样切过去之后用户不会撞上"nginx 就绪但 SearXNG 还在启动"的 502。 w200 "http://127.0.0.1:${NEW_PORT}/search?q=linux" -echo " 新容器全绿,开始切换上游" +HIST=$(curl -s "http://127.0.0.1:${NEW_PORT}/admin/api/history" | grep -o '"url"' | wc -l) +[ "$HIST" -ge "$OLD_HIST" ] || { echo "!! 历史条数从 $OLD_HIST 掉到 $HIST(疑似丢数据)" >&2; false; } +echo " 新容器全绿(历史 ${OLD_HIST} → ${HIST} 条),开始切换上游" sed "s#\\(${UPSTREAM_HOST//./\\.}\\s*http://127\\.0\\.0\\.1:\\)${CUR_PORT};#\\1${NEW_PORT};#" "$PORTAL_CONF" > /tmp/portal.conf.new # 关键:必须同 inode 覆写(cat > 而不是 sed -i / mv)。