# 🐞 群分析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*
