From e586ffb79e37b2d5beb7fc4124dde02542e3be2b Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 6 Jul 2026 21:07:40 +0800 Subject: [PATCH] =?UTF-8?q?chore(deploy):=20pip=20install=20=E5=8A=A0=20-q?= =?UTF-8?q?=20=E7=B2=BE=E7=AE=80=E9=83=A8=E7=BD=B2=E8=BE=93=E5=87=BA(bump?= =?UTF-8?q?=200.42.2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 日常部署依赖基本没变,全量 "Requirement already satisfied" 纯刷屏; 装新包 / 报错仍会输出,不影响排障。RUN.md SOP 说明同步。 Co-Authored-By: Claude Fable 5 --- PROGRESS.md | 3 ++- RUN.md | 2 +- core/__init__.py | 2 +- deploy/update.sh | 5 +++-- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/PROGRESS.md b/PROGRESS.md index 1dbca79..d8da114 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -2,7 +2,7 @@ > 配合 `DESIGN.md`。本文件只记 phase 状态、决策偏差、文件量、下一步。每条 1-2 句:做了啥 + 关键判断;细节查 `git log` / `git diff` / `DESIGN §7.9`。 -最后更新:2026-07-06(修蓝绿脚本 wait_health unbound variable,bump 0.42.1) +最后更新:2026-07-06(部署 pip 输出精简,bump 0.42.2) --- @@ -23,6 +23,7 @@ ### 2026-07 +- **07-06 / 0.42.2**:部署脚本 pip install 加 `-q`——日常部署依赖没变,整屏 "already satisfied" 纯刷屏;装新包/报错仍输出。 - **07-06 / 0.42.1**:修 `update_bluegreen.sh` wait_health 首次真跑就崩——`local a="$1" b="...$a..."` 同行赋值,bash 先展开整行再执行 local,`$a` 展开时无值,`set -u` 报 unbound;拆多行。 - **07-06 / 0.42.0 broker 外置 Redis(用户量上升重评落地)**:`web/broker.py` 拆 LocalRunBroker(原进程内实现)/ RedisRunBroker 同接口双实现,`ZCBOT_REDIS_URL` env 开关(不设 = 进程内,dev/单实例零影响)。Redis 版:event 走 PUBLISH + 单条 async pubsub reader 路由本地 queue,done = SETEX(60s)+publish 双通道(订阅先挂 channel 再查 key 不漏),cancel = key GET poll 跨实例可达——蓝绿切换窗口「刷新丢直播/停止失灵」两边缘消失,稳态双实例分流从此只差 nginx 配置。容错:启动 ping fail-fast、运行中降级丢帧(10s 节流 log)、reader 1s 退避重连。`tests/test_broker_redis.py` 9 例(fakeredis,含跨实例/晚订阅/降级);deploy bootstrap 加 redis-server 步骤。关键判断:排除 PG LISTEN/NOTIFY(token delta 耦主库)与 nginx sticky(部署窗 hash 重排),Redis 只管跨进程一跳、fan-out 最后一公里仍在进程内。 - **07-06 / 0.41.1 蓝绿端口方案反转**:nginx 接管原对外端口 8765(客户端 / platform 嵌入零改动),实例挪 8766(blue)/ 8767(green) 只绑本机——对外契约(URL:8765)不动优先于"实例沿用旧端口"的省事;顺带把「切换窗口内对旧实例 run 点停止送达不到」补进已知边缘文档。 diff --git a/RUN.md b/RUN.md index 8fc70e6..630f07d 100644 --- a/RUN.md +++ b/RUN.md @@ -397,7 +397,7 @@ sudo bash /opt/zcbot/deploy/update.sh - **平台渲染层 `rendering/`(2026-06-23 起)**:各 skill 出 docx/pdf 调 `python /sandbox/rendering/render.py --profile {brief,paper,proposal} --format {docx,pdf}`(不再各自带 render_docx.py)。`rendering/` 随 `pool.py` **bind-mount 进 `/sandbox/rendering`**(restart 重建容器才挂上),pdf 依赖 `markdown`(已进 requirements,镜像重建才内置)+ 镜像自带 chromium。**这次升级要整体重建镜像 + restart 一并 deploy**——旧 render_docx 路径已删,只推代码不重建会让 brief/paper/proposal/patent/standard 渲染失败。沙盒 chromium 渲 pdf 的冒烟探针:`deploy/sandbox/probe_chromium_pdf.sh`(服务器上跑,用法见脚本头)。 - **sandbox build 每次都跑没关系**:layer cache 让重活(pip ~1G / chromium / 字体 / mermaid,都在 `COPY tools/` 之上)在改代码部署时秒过;只有 `requirements.txt` 变了才整体重建(~5-10min,正好也是该重建的时候)。host backend 机器 / 临时不想动 docker:`sudo bash deploy/update.sh --skip-build`。 - **镜像源默认:pip+apt 清华、npm 腾讯**(`PIP_INDEX_URL=pypi.tuna.tsinghua.edu.cn/simple/` / `APT_MIRROR=mirrors.tuna.tsinghua.edu.cn` / `NPM_REGISTRY=mirrors.cloud.tencent.com/npm/`)。pip 选清华是因为**腾讯 PyPI 曾返回损坏的 litellm wheel**(index hash 对、文件字节不对 → pip `DO NOT MATCH THE HASHES`),且**阿里 PyPI 又一度滞后**(litellm 只到 1.82.6,卡死 `>=1.83.0`);清华境内稳 + 同步及时。npm 用腾讯是因为**清华不提供 npm registry**、npmmirror 访问不稳,腾讯 npm 历来 OK(坏 wheel 只是腾讯 PyPI 的事,npm 不受影响;备选华为 / USTC npm 源)。要命中 docker cache 就别多组源来回换(换源从 pip 层炸开全重跑)。想用官方源:`PIP_INDEX_URL= sudo -E bash deploy/update.sh`(置空即回落 Dockerfile 官方默认)。host venv 的 step 2 pip 也吃这个源(脚本显式 `--index-url`,不靠 host pip.conf)。 -- **进度可见**:step 2 pip 不带 `-q`,部署时能看到装包进度;step 4 docker build 走默认 TTY 进度 UI(分层折叠刷新,直观)。 +- **输出精简**:step 2 pip 带 `-q`(日常部署依赖没变,省掉整屏 "already satisfied";装新包/报错仍输出);step 4 docker build 走默认 TTY 进度 UI(分层折叠刷新,直观)。 - **脚本会自更新重跑**:`git pull` 若动了 `deploy/update.sh` 本身,脚本会 `exec` 新版本从头重跑(旧脚本的变量默认值在 pull 前就求值了、bash 又按字节偏移边读边跑,不重跑会跑出过期行为 —— 这是首次拉到改 update.sh 的提交时"改了源还报旧错"的根因)。日志出现「update.sh 自身有更新 —— 用新版本重跑」即正常;`ZCBOT_UPDATE_REEXEC=1` 防死循环。 - **migration 取 DB URL**:`db/migrations/env.py` 直接读 `os.environ['ZCBOT_DB_URL']`(不读 .env),脚本从 `.env` 抠出来显式 `env ZCBOT_DB_URL=... ` 喂进 `main.py db upgrade`。 - **前置守卫**:非 root / 不是 git 仓库 / 工作区脏(已跟踪文件有未提交改动)/ 缺 .env → 直接中止。`/healthz` 15s 内不返回 `ok` → dump `journalctl -n 50` 并以非零退出。 diff --git a/core/__init__.py b/core/__init__.py index f89a476..19b008f 100644 --- a/core/__init__.py +++ b/core/__init__.py @@ -1,3 +1,3 @@ # zcbot 版本号单一事实源:web/app.py 的 FastAPI version、/healthz 返回、前端展示都引这里。 # 改版本只动这一行。 -__version__ = "0.42.1" +__version__ = "0.42.2" diff --git a/deploy/update.sh b/deploy/update.sh index 6cc0352..aac69ff 100755 --- a/deploy/update.sh +++ b/deploy/update.sh @@ -116,8 +116,9 @@ fi # ── 2) 依赖 ─────────────────────────────────────────────────── # host venv 的 pip 也走同一镜像源 —— 经 sudo -u 后 PIP_INDEX_URL env 会被洗掉, # 不显式 --index-url 的话 host 用自己的 pip.conf(可能仍指阿里,撞 litellm>=1.83 缺版本)。 -# 不带 -q:依赖装包是耗时步骤,留输出让部署时能看到进度(下载哪个包 / 卡在哪)。 -pip_args=(-r "$APP_DIR/requirements.txt" --timeout 60) +# 带 -q:日常部署依赖基本没变,全量 "Requirement already satisfied" 纯刷屏; +# 真装新包 / 装挂了(报错)仍会输出,不影响排障。 +pip_args=(-q -r "$APP_DIR/requirements.txt" --timeout 60) [ -n "${PIP_INDEX_URL:-}" ] && pip_args+=(--index-url "${PIP_INDEX_URL}") [ -n "${PIP_TRUSTED_HOST:-}" ] && pip_args+=(--trusted-host "${PIP_TRUSTED_HOST}") log "pip install -r requirements.txt(源:${PIP_INDEX_URL:-官方默认})..."