File size: 7,020 Bytes
c761692
 
 
 
 
 
 
 
 
 
 
831a8c8
c761692
831a8c8
c761692
831a8c8
c761692
831a8c8
 
 
c761692
 
 
90694b4
 
 
 
 
 
 
 
 
 
 
 
 
 
c761692
 
831a8c8
c761692
831a8c8
 
c761692
831a8c8
c761692
 
 
 
831a8c8
 
 
c761692
 
 
 
 
 
 
 
90694b4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c761692
 
831a8c8
c761692
831a8c8
c761692
 
 
831a8c8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c761692
 
 
831a8c8
c761692
831a8c8
c761692
831a8c8
 
 
 
 
 
 
90694b4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
831a8c8
 
 
 
 
 
 
 
c761692
831a8c8
c761692
831a8c8
 
 
 
 
 
 
 
 
 
 
 
 
 
c761692
831a8c8
d9d9e44
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90694b4
d9d9e44
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
# Docker 部署

## 快速开始

```bash
git clone https://github.com/cnitlrt/AutoTeam.git
cd AutoTeam

mkdir -p data
cp .env.example data/.env

# 编辑 data/.env
docker compose up -d
```

常用命令:

```bash
docker compose logs -f
docker compose restart
docker compose down
```

当前 `docker-compose.yml` 默认启用以下运行时加固:

- `init: true`:容器内启用 init/reaper,帮助回收 Chromium / Playwright 子进程。
- `shm_size: "1gb"`:提高 `/dev/shm`,降低 Chromium 在 Docker 默认 64MB shm 下崩溃的概率。
- `mem_limit: "2g"` / `pids_limit: 768`:给浏览器和后台任务设置硬边界,避免异常增长拖垮宿主机。
- `healthcheck`:通过 `http://127.0.0.1:8787/api/version` 检查真实 API 可用性。
- `AUTOTEAM_MEMORY_WARN_RATIO` / `AUTOTEAM_ZOMBIE_WARN_THRESHOLD`:控制运行时资源告警阈值。

运行时默认启用与 `autoteam-1` 对齐的轻量 Team API transport:

- 默认 `CHATGPT_API_TRANSPORT=auto`,Team backend API 读取会先尝试 HTTP transport;如果返回 Cloudflare/HTML/challenge 或鉴权异常,会回退 Playwright。
- 显式设置 `CHATGPT_API_TRANSPORT=playwright` 时,可强制恢复旧的浏览器上下文 fetch 行为。
- 该选项只影响管理员 Team API 读写;free 帐号注册、Personal OAuth、验证码、workspace UI 选择必须继续强制真实浏览器上下文。

## 数据持久化

所有运行数据都存储在 `data/` 目录,通过 volume 挂载到容器:

| 文件 / 目录 | 说明 |
|-------------|------|
| `data/.env` | 配置文件 |
| `data/accounts.json` | 账号池状态 |
| `data/state.json` | 管理员登录态 |
| `data/auths/` | Codex 认证文件 |
| `data/screenshots/` | 调试截图 |

重建容器不会丢失这些数据。

> 如果你使用了 `pull-cpa`,从 CPA 导入的认证文件也会落在 `data/auths/` 中。

## 手动构建

```bash
docker build -t autoteam .
docker run -d -p 8787:8787 -v $(pwd)/data:/app/data autoteam
```

### 快速增量镜像

首次完整构建后,本仓库提供 `Dockerfile.fast` 用于本地快速迭代。它复用 `autoteam:latest` 中已经安装好的系统依赖、uv 和 Playwright Chromium,只覆盖 Python 依赖与源码。

```bash
# 先确保有稳定基础镜像
GIT_SHA=$(git rev-parse --short HEAD) \
BUILD_TIME=$(date -u +%FT%TZ) \
docker build -t autoteam:latest .

# 后续本地快速迭代
GIT_SHA=$(git rev-parse --short HEAD) \
BUILD_TIME=$(date -u +%FT%TZ) \
docker build -f Dockerfile.fast -t autoteam:fast .
```

`Dockerfile.fast` 仅用于开发迭代,不替代首次完整构建;如果系统依赖、Playwright 版本、基础镜像或 `uv.lock` 出现难以解释的问题,回到标准 `Dockerfile``--no-cache` 构建。

## 配置方式

### 方式一:预先编辑 `.env`

启动前编辑 `data/.env`,容器启动后即可直接使用。

### 方式二:Web 页面配置

不预先配置直接启动,打开:

```text
http://host:8787
```

浏览器中会显示配置向导页面,填写后自动验证连通性。

## 容器中的文件权限

容器以 root 运行,`docker-entrypoint.sh` 会把 `/app/data` 下的文件设为可写。

如果你在宿主机上看到部分认证文件类似:
- `nobody:nogroup`
- `600`

通常不影响容器内运行;如需宿主机直接查看,可手动调整权限。

## 常见问题

### 容器一直重启

查看日志:

```bash
docker compose logs
```

通常是:
- 配置缺失
- CloudMail / CPA 连通性验证失败
- entrypoint self-check 发现镜像代码与契约符号不一致
- `/api/version` healthcheck 持续失败

查看健康状态:

```bash
docker compose ps
docker inspect --format '{{json .State.Health}}' autoteam-autoteam-1 | python -m json.tool
```

查看资源占用和 PID 数:

```bash
docker stats
docker compose top
```

如果日志出现 `[资源] ... browser zombie processes=...`,优先确认 compose 中 `init: true` 仍然存在;如果出现 memory usage warning,先减少并发注册/轮转,再考虑调大 `mem_limit`### `data` 目录没有写权限

容器入口会自动 `chmod -R 777 /app/data`。如果宿主机仍无法访问:

```bash
sudo chmod -R 777 data/
```

### 重建后配置丢失

确保 `docker-compose.yml` 中有 volume 挂载:

```yaml
volumes:
  - ./data:/app/data
```

### 反向同步后 `data/auths` 里出现重复文件名风格

新版本会在同步时自动做去重,并统一为本地命名规范。若你怀疑历史版本留下了旧文件,执行一次:

```bash
uv run autoteam pull-cpa
```

即可重新整理。

---

## 代码更新后的 rebuild SOP(SPEC-3 §8)

> **关键认知**:本项目 `Dockerfile` 用 `COPY src/`(非 volume mount),
> **`git pull` 后必须 rebuild 镜像**,代码改动才会进入容器。

### 标准更新流程(4 步)

```bash
# 1. 拉取新代码
cd /path/to/AutoTeam && git pull

# 2. 停掉旧容器
docker compose down

# 3. 重建镜像(--no-cache 防意外缓存命中,GIT_SHA 注入版本指纹)
GIT_SHA=$(git rev-parse --short HEAD) \
BUILD_TIME=$(date -u +%FT%TZ) \
docker compose build --no-cache

# 4. 启动
docker compose up -d
```

### 验证镜像版本(三选一,结果应一致)

```bash
# 方式 A:HTTP 端点(免鉴权)
curl http://localhost:8787/api/version
# 期望:{"git_sha":"cf2f7d3","build_time":"2026-04-26T..."}

# 方式 B:进容器查环境变量
docker compose exec autoteam env | grep AUTOTEAM_GIT_SHA

# 方式 C:看镜像 OCI label(无需启动容器)
docker image inspect autoteam-autoteam --format '{{json .Config.Labels}}'
```

### 启动期 self-check

容器每次启动都会执行 `[self-check]` 段,白名单 import 任一失败立即 `exit 1` → docker 进入 crash-loop。

```bash
docker compose logs autoteam | head -20
# 期望看到:
# [self-check] verifying critical imports...
# [self-check] OK: 15 critical symbols imported.
# [self-check] passed.
```

### 故障排查:为什么修了代码 bug 还在?

**99% 是镜像没 rebuild**。先跑这条快速诊断:

```bash
# 对比 image 内 sha 与 repo HEAD
echo "image:" && curl -s http://localhost:8787/api/version | python -m json.tool
echo "repo HEAD:" && git rev-parse --short HEAD
```

如果 `image.git_sha``repo HEAD` 不一致 → 重做上面 4 步 SOP。

如果 self-check 报 `FATAL: critical import failed`:
- 说明镜像里的源码与最新代码的契约符号对不上(典型 typo 引入未定义名)
- 解决:回退最近 commit 或修复 typo,再 rebuild

### lint 守卫(开发期)

`pyproject.toml` 已配置 ruff(F401/F811/F821 三条规则),`.pre-commit-config.yaml` 也接入了同样的检查。

首次启用:

```bash
uv sync                           # 装 dev 依赖(pre-commit、ruff 已声明)
uv run pre-commit install         # 注入 .git/hooks/pre-commit
uv run pre-commit run --all-files # 一次性扫全仓,确认基线干净
```

之后每次 `git commit` 会自动跑 ruff;手动检查可:

```bash
uv run ruff check src/
```