diff --git a/ATRI My Dear Moments/questions/2026-04-29.md b/ATRI My Dear Moments/questions/2026-04-29.md new file mode 100644 index 0000000..a9269e4 --- /dev/null +++ b/ATRI My Dear Moments/questions/2026-04-29.md @@ -0,0 +1,154 @@ +# 🐞 群分析T2I渲染超时排查记录 + +**日期**:2026-04-29 +**主人**:☭Kronecker +**排查者**:ATRI 🥕 + +--- + +## 📋 问题描述 + +执行 `/群分析` 命令生成群聊分析报告后,尝试通过T2I服务将其渲染为图片时失败,返回 `500 Internal Server Error`。QQ收到内容为 `Internal Server Error` 的21字节文件。 + +--- + +## 🔍 排查过程 + +### Step 1: 查看T2I服务日志 + +通过 `journalctl -u t2i` 排查T2I服务端日志,发现以下错误: + +``` +playwright._impl._errors.TimeoutError: Page.goto: Timeout 100000ms exceeded. +Call log: + - navigating to "file:///opt/astrbot-t2i-service/data/rendered_xxx.html", waiting until "load" +``` + +**结论**:Playwright浏览器在打开HTML文件时,等待 `load` 事件超时(100秒)。 + +### Step 2: 分析超时HTML文件 + +| 属性 | 值 | +|:---|:---| +| HTML文件路径 | `/opt/astrbot-t2i-service/data/rendered_xxx.html` | +| 文件大小 | 153KB | +| 行数 | 2856行 | + +### Step 3: 确认外部字体是罪魁祸首 + +HTML模板中引用了 **3个LXGW WenKai (霞鹜文楷) web字体文件**: + +| 字体文件 | CDN地址 | +|:---|:---| +| LXGW WenKai Regular | `https://tc.ciallo.ccwu.cc/file/...LXGWWenKai-Regular.woff2` | +| LXGW WenKai Medium | `https://tc.ciallo.ccwu.cc/file/...LXGWWenKai-Medium.woff2` | +| LXGW WenKai Mono | `https://tc.ciallo.ccwu.cc/file/...LXGWWenKaiMono-Regular.woff2` | + +**每个字体文件约8MB**,3个合计 **~24MB**。 + +### Step 4: 检查CDN可达性 + +CDN服务器 `tc.ciallo.ccwu.cc` 本身可达: +- HTTP 200 ✅(Cloudflare缓存命中) +- 从服务器有代理无代理均可访问 +- 但文件过大(8MB/个) + +### Step 5: 检查代理配置 + +**插件配置**(AstrBot WebUI - T2I渲染环境切换): +- 渲染环境:内地 +- Google Fonts镜像:`https://fonts.loli.net` +- Gstatic镜像:`https://gstatic.loli.net` + +**系统代理变量**: +``` +HTTP_PROXY=http://127.0.0.1:7890 +HTTPS_PROXY=http://127.0.0.1:7890 +ALL_PROXY=socks5h://127.0.0.1:7890 +``` + +**T2I系统服务文件**(`/etc/systemd/system/t2i.service`): +``` +[Service] +Type=simple +WorkingDirectory=/opt/astrbot-t2i-service +ExecStart=/usr/bin/python3 /opt/astrbot-t2i-service/main.py +Environment=PLAYWRIGHT_CHROMIUM_EXECUTABLE=/usr/bin/chromium-browser +Restart=always +RestartSec=5 +``` +⚠️ **没有配置任何代理环境变量!** + +--- + +## 🎯 根因确认 + +``` +群分析HTML模板 → 引用3个@font-face外部字体(各~8MB) +→ Playwright浏览器打开本地HTML → 尝试从CDN下载字体 +→ 浏览器无代理配置(T2I systemd服务未继承系统代理) +→ 24MB字体下载缓慢 → 等待100秒 → 超时TimeoutError +→ 返回500 Internal Server Error +``` + +### 核心问题链 + +1. 群分析模板使用了 **外部web字体**(`tc.ciallo.ccwu.cc`) +2. 每个字体文件 **8MB**,3个共 **24MB** +3. Playwright的 `page.goto()` 默认等待 `load` 事件 +4. `load` 事件需要等到所有外部资源(包括字体)加载完毕才触发 +5. T2I的systemd服务未配置 `HTTP_PROXY`/`HTTPS_PROXY` 环境变量 +6. 浏览器无代理,大文件下载慢,100秒内未完成 → Timeout + +### 为什么自我介绍的T2I渲染成功了? + +自我介绍的T2I渲染使用的是**行内样式HTML**(无外部资源),页面瞬间加载完成,`load` 事件即刻触发。而群分析模板依赖外部web字体,因此超时。 + +--- + +## 🛠 修复方案 + +### 方案A(推荐):T2I服务添加代理环境变量 + +在 `/etc/systemd/system/t2i.service` 的 `[Service]` 区域添加: + +``` +Environment=HTTP_PROXY=http://127.0.0.1:7890 +Environment=HTTPS_PROXY=http://127.0.0.1:7890 +``` + +然后执行: +```bash +systemctl daemon-reload +systemctl restart t2i +``` + +**优点**:一劳永逸,所有需要外部资源的HTML都能通过代理加载 + +### 方案B:移除外部字体引用 + +修改群分析HTML模板,改用系统字体栈,去掉 `@font-face` 引用。 + +**优点**:不依赖网络加载,渲染速度快 +**缺点**:字体不如霞鹜文楷美观 + +### 方案C:修改wait_until策略 + +T2I渲染时设置 `wait_until: "domcontentloaded"` 而不是 `"load"`,不等字体加载完就截图。 + +**优点**:改动最小 +**缺点**:字体可能没加载完成,截图时显示备选字体 + +--- + +## 📎 相关文件 + +- T2I服务:`/opt/astrbot-t2i-service/` +- 服务配置:`/etc/systemd/system/t2i.service` +- T2I日志:`journalctl -u t2i` +- 字体CDN:`https://tc.ciallo.ccwu.cc/` +- 插件配置:AstrBot WebUI → 插件配置 → t2i渲染环境切换 + +--- + +*记录者:ATRI 🥕 · 2026-04-29 16:45*