## [ERR-20260429-001] Gitea 主机 CI 高负载时 SSH/HTTP/API 全部 timeout

**日期**: 2026-04-29
**类别**: 基础设施 / Gitea Actions runner 共置
**严重度**: 中（影响 CI 期间所有 git 推送、API 调用、运维操作）

### 现象

PR #168 排队 4-5 个 ubuntu-latest job（quality-gates 旧版还在跑 + ai-review）期间，本机的：
- `git push origin ...` (SSH 2222) — 60s timeout
- `curl http://43.130.59.228/api/v1/version` — 60s timeout
- `ssh ubuntu@43.130.59.228` (SSH 22) — `Connection timed out during banner exchange`
- `nc -zv 43.130.59.228 2222` 与 `nc -zv 43.130.59.228 80` — TCP 三次握手能成

也就是 **TCP 层活着，应用层（Gitea HTTP / sshd）已经无法接受新连接**。

### 根因

`docs/ops/02-gitea-config.md` 写得很清楚：`act_runner` 跑在 Gitea 主机上（execution mode = `host`，不是 docker 隔离），capacity=1 但跟 Gitea web 服务、systemd 等共享 CPU/内存。Build job 显式开 `NODE_OPTIONS: --max-old-space-size=4096` 允许吃 4GB，nest build / next build CPU 也吃满。叠加 npm install 大量小文件 IO，Gitea 主进程和 sshd 抢不到资源。

### 验证手法

主机超载时 `nc -z` 能成（TCP 监听存在）但应用层握手不响应——这是个有用的诊断信号：**TCP 端口开但应用 timeout = 应用进程被资源饿死**，而不是网络/防火墙问题。

### 修复（短期）

- 等 CI queue 排空 5-10 分钟，自然恢复
- git 推送加 `--no-verify` 不能帮助（瓶颈在远端）
- 可改用 `git push --no-thin --no-progress` 减小握手负担，但治标不治本

### 修复（长期）

唯一真正解：**把 act_runner 从 Gitea 主机搬到独立机**。方案：
- 起一台廉价 VM（4c8G 即可），装 act_runner、注册到组织级、labels 复用 `ubuntu-latest`
- Gitea 主机上的 runner `capacity: 0` 或卸载
- 成本：每月几十块；收益：CI 不再拖死 Gitea，PR 期间运维操作不再受阻

参见今天的会话讨论：选项 A（新 VM）vs B（runner 切 docker 模式）vs C（多 runner 集群）—— A 最便宜最直接。

### 关联

- 跟 `[ERR-20260425-010] gitea-pr-merge.py` 不同：那是工具 bug，本条是底座过载。
- 当前 dry-run 期 ai-review 进一步加重 ubuntu-latest 队列，启用前最好把 runner 迁出去。

---
