From 6ce2a0b70dd8c5d3fb34a6c004b94025658eb286 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Sat, 11 Jul 2026 09:54:16 +0800 Subject: [PATCH] =?UTF-8?q?feat(sandbox):=20chromium=20=E7=A7=92=E5=B4=A9?= =?UTF-8?q?=20round-3=20=E6=8E=A2=E9=92=88:FATAL=20=E6=8A=93=E5=8F=96=20+?= =?UTF-8?q?=20headless-shell=20=E4=BF=AE=E6=B3=95=E9=AA=8C=E8=AF=81(bump?= =?UTF-8?q?=200.58.5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bisect 全 case FAIL(含无 hardening baseline 与 seccomp=unconfined)+ 宿主 overcommit/ulimit 数据干净 → 嫌疑收敛为 trixie chromium 150 构建 × 本宿主 组合本身跑不了。round-3 脚本: 1/2. 抓崩溃真实 FATAL 行(此前被 head 截断)+ gdb backtrace(best-effort) 3. 实测 Google 官方 chrome-headless-shell(npmmirror 下载)+ mmdc 接上出图, 直接验证「镜像弃发行版 chromium、改装 puppeteer pinned headless shell」 修法可行性,PASS 即定案动 Dockerfile Co-Authored-By: Claude Fable 5 --- PROGRESS.md | 3 +- core/__init__.py | 2 +- deploy/sandbox/probe_chromium_round3.sh | 69 +++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 deploy/sandbox/probe_chromium_round3.sh diff --git a/PROGRESS.md b/PROGRESS.md index 050cbdf..2d8f234 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-11(chromium 秒崩第二根因 bisect 探针,bump 0.58.4) +最后更新:2026-07-11(chromium 秒崩 round-3 探针:FATAL 抓取 + headless-shell 修法验证,bump 0.58.5) --- @@ -23,6 +23,7 @@ ### 2026-07 +- **07-11 / 0.58.5**:**chromium 秒崩 round-3 探针**:bisect 结果全 case FAIL(含 baseline 无 hardening、seccomp=unconfined)→ hardening 全部无罪,宿主 overcommit/ulimit 数据也干净——嫌疑收敛为 trixie chromium 150 构建 × 本宿主组合本身跑不了。新 `deploy/sandbox/probe_chromium_round3.sh`:①抓崩溃 FATAL 行(此前日志被 head 截断)+ gdb backtrace(best-effort);②实测 Google 官方 chrome-headless-shell(npmmirror 下载,puppeteer 生态对着它测试)在本宿主能否跑 + mmdc 接上出图——直接验证「镜像弃发行版 chromium 改 pinned headless shell」修法可行性,PASS 即定案动 Dockerfile。 - **07-11 / 0.58.4**:**mermaid 崩塌第二根因排查工具 `deploy/sandbox/probe_chromium_bisect.sh`**:pids-limit 1024 部署后复测(同 task 9dcae061,green 实例全新容器)仍首调秒崩——排除 pids 打满,根因在 hardening flag × chromium 150 交互。探针把线上 docker run 全款 hardening 逐 flag 开关(no-new-privileges / read-only / cap-drop / mem·cpu / seccomp=unconfined),每 case 跑 mmdc + 裸 chromium 两条,忠实复现 exec 路径(--user zcbot + HOME=/tmp),尾部带判读表;RUN.md 故障兜底条目同步。 - **07-11 / 0.58.3**:**admin 用量表默认时间范围 all→近7天**:`admin.js` 「按模型」「各用户用量」两表初始 range 从"全部"改"近7天"(下拉仍可切全部/30天);API 端 `range` 默认值不动。 - **07-11 / 0.58.2**:**sandbox `pids_limit` 256→1024,修容器内 mermaid 渲染必崩**(task 9dcae061 排查):DB 全量扫描证实近 90 天 mmdc 渲图 0 成功(26 次 launch fail + 67 次 timeout),根因 `--pids-limit` 把线程也计数——chromium headless 一次启动 ~150-200 线程,叠加 shell 超时只杀 host 侧 docker CLI、容器内 mmdc+chromium 树残留(executor_docker 已知 Cancel limitation),256 打满 → `pthread_create EAGAIN` → chromium SIGTRAP(dbus 报错是干扰项)。改 agent.yaml + pool.py 默认值两处;RUN.md 故障兜底补条目。**待服务器验证**:重启 web + 容器回收后跑 `probe_mermaid.sh`,若 chromium 150(07-08 镜像重建带进)仍秒崩则另查宿主 docker/seccomp;彻底修法是 Step 3b PGID kill 协议(超时清残留),此次未动。附带 4 个 diag 脚本(scripts/diag_task_9dcae061.py 等)未入库。**unifyllm 文本模型再加 2 个进 pro 档**——`gpt55`(gpt-5.5)/`gpt54_mini`(gpt-5.4-mini),参数照 gpt56_sol 模板(temp 硬约束 1.0),mini 档 tool_calling/code_quality 记 good、max_iterations 100;网关 `GET /v1/models` 确认模型 ID + diag 冒烟(tool-calling)两模型均过 + `ModelCapabilities.load` 线上路径验证;`diag_unifyllm.py` 默认清单 5→7 个(RUN.md 同步)。 diff --git a/core/__init__.py b/core/__init__.py index 9647bd2..e292870 100644 --- a/core/__init__.py +++ b/core/__init__.py @@ -1,3 +1,3 @@ # zcbot 版本号单一事实源:web/app.py 的 FastAPI version、/healthz 返回、前端展示都引这里。 # 改版本只动这一行。 -__version__ = "0.58.4" +__version__ = "0.58.5" diff --git a/deploy/sandbox/probe_chromium_round3.sh b/deploy/sandbox/probe_chromium_round3.sh new file mode 100644 index 0000000..44fa545 --- /dev/null +++ b/deploy/sandbox/probe_chromium_round3.sh @@ -0,0 +1,69 @@ +#!/usr/bin/env bash +# Round 3(前情:probe_chromium_bisect.sh 证明 hardening 全部无罪,case 0 也崩; +# overcommit/ulimit 数据干净)。两件事: +# 1/2. 拿到崩溃的真实 FATAL 行 + gdb backtrace(此前日志被 head 截断,一直没见到) +# 3. 实测 Google 官方 chrome-headless-shell 在本宿主能否跑 —— 直接验证 +# 「镜像弃发行版 chromium、改装 puppeteer pinned headless shell」修法的可行性 +# 用法(服务器 repo 根): bash deploy/sandbox/probe_chromium_round3.sh [镜像名] +set -u +IMG="${1:-zcbot-sandbox:latest}" + +echo "===== 1. 崩溃日志尾部(找 FATAL/CHECK 行) =====" +docker run --rm --user zcbot -e HOME=/tmp --entrypoint bash "$IMG" -c ' + /usr/lib/chromium/chromium --no-sandbox --headless --disable-gpu --disable-dev-shm-usage \ + --enable-logging=stderr --v=1 --dump-dom about:blank >/tmp/c.log 2>&1; echo "rc=$?" + echo "--- FATAL/CHECK grep ---" + grep -aE "FATAL|Check failed|SIG|assert" /tmp/c.log | head -10 + echo "--- tail 30(去 dbus 噪音) ---" + grep -aviE "dbus" /tmp/c.log | tail -30 + echo "--- cpu 安全特性 flags(pku/shstk/ibt,供对照) ---" + grep -oE "pku|user_shstk|ibt" /proc/cpuinfo | sort -u | tr "\n" " "; echo' + +echo +echo "===== 2. gdb backtrace(best-effort:apt 现装 gdb,网络不通自动跳过) =====" +docker run --rm --entrypoint bash "$IMG" -c ' + export DEBIAN_FRONTEND=noninteractive + if apt-get update -qq >/dev/null 2>&1 && apt-get install -y -qq gdb >/dev/null 2>&1; then + HOME=/tmp gdb -batch -ex run -ex "bt 12" \ + --args /usr/lib/chromium/chromium --no-sandbox --headless --disable-gpu \ + --disable-dev-shm-usage --dump-dom about:blank 2>&1 | grep -aviE "dbus" | tail -25 + else + echo "[SKIP] apt 装 gdb 失败(容器网络不通?)" + fi' + +echo +echo "===== 3. Google 官方 chrome-headless-shell 实测(验证修法 A) =====" +docker run --rm --user zcbot -e HOME=/tmp --entrypoint bash "$IMG" -c ' + set -u + cd /tmp + MIRROR="https://cdn.npmmirror.com/binaries/chrome-for-testing" + echo "[download] chrome-headless-shell@stable via npmmirror ..." + if ! npx -y @puppeteer/browsers install chrome-headless-shell@stable \ + --path /tmp/pptr --base-url "$MIRROR" >/tmp/dl.log 2>&1; then + echo "[download] npmmirror 失败,改试官方源 ..." + npx -y @puppeteer/browsers install chrome-headless-shell@stable \ + --path /tmp/pptr >/tmp/dl.log 2>&1 \ + || { echo "[FAIL] 两个源都下不动"; tail -5 /tmp/dl.log; exit 1; } + fi + BIN=$(find /tmp/pptr -type f -name chrome-headless-shell | head -1) + [ -n "$BIN" ] || { echo "[FAIL] 下载完成但没找到二进制"; exit 1; } + echo "BIN=$BIN" + "$BIN" --no-sandbox --disable-dev-shm-usage --dump-dom about:blank >/tmp/s.log 2>&1; rc=$? + if [ $rc -eq 0 ]; then + echo "[PASS] headless-shell 裸跑 rc=0" + else + echo "[FAIL] headless-shell 裸跑 rc=$rc"; grep -aviE "dbus" /tmp/s.log | tail -5 + fi + printf "{\"executablePath\":\"%s\",\"args\":[\"--no-sandbox\",\"--disable-dev-shm-usage\"]}" "$BIN" > /tmp/pc.json + printf "flowchart TB\n A-->B\n" > /tmp/d.mmd + if timeout 60 mmdc -i /tmp/d.mmd -o /tmp/d.png -p /tmp/pc.json >/tmp/m.log 2>&1 && [ -s /tmp/d.png ]; then + echo "[PASS] mmdc + headless-shell 出图:"; ls -l /tmp/d.png + else + echo "[FAIL] mmdc + headless-shell 没出图"; tail -5 /tmp/m.log + fi' + +echo +echo "===== 判读 =====" +echo "3 两条 PASS => 修法定案:Dockerfile 弃 apt chromium,build 时装 puppeteer pinned chrome-headless-shell" +echo "3 同样 SIGTRAP => 宿主级问题(内核/CPU x 新版 chromium 通杀),看 1/2 的 FATAL 与 backtrace 再定" +echo "3 下载失败 => 网络问题,先解决容器出网/换 mirror 再跑"