coderfleet 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- coderfleet/__init__.py +1 -0
- coderfleet/__main__.py +4 -0
- coderfleet/cli.py +212 -0
- coderfleet/compose.py +176 -0
- coderfleet/config.py +69 -0
- coderfleet/config_cmds.py +243 -0
- coderfleet/data/Dockerfile +92 -0
- coderfleet/data/__init__.py +0 -0
- coderfleet/data/accounts.conf.example +26 -0
- coderfleet/data/config.conf.example +31 -0
- coderfleet/data/entrypoint.sh +56 -0
- coderfleet/data/projects.conf.example +17 -0
- coderfleet/data/scripts/coderfleet_usage_status.py +138 -0
- coderfleet/docker_ops.py +385 -0
- coderfleet/init_wizard.py +227 -0
- coderfleet/login_cmd.py +168 -0
- coderfleet/server/__init__.py +0 -0
- coderfleet/server/docker_mgr.py +45 -0
- coderfleet/server/main.py +546 -0
- coderfleet/server/models.py +285 -0
- coderfleet/server/scheduler.py +1219 -0
- coderfleet/server/static/css/main.css +2906 -0
- coderfleet/server/static/index.html +378 -0
- coderfleet/server/static/js/accounts.js +85 -0
- coderfleet/server/static/js/app.js +28 -0
- coderfleet/server/static/js/chat.js +743 -0
- coderfleet/server/static/js/log.js +145 -0
- coderfleet/server/static/js/nav.js +46 -0
- coderfleet/server/static/js/projects.js +298 -0
- coderfleet/server/static/js/renderer.js +586 -0
- coderfleet/server/static/js/state.js +76 -0
- coderfleet/server/static/js/submit.js +200 -0
- coderfleet/server/static/js/tasks.js +92 -0
- coderfleet/server/static/js/terminal.js +347 -0
- coderfleet/server/static/js/utils.js +147 -0
- coderfleet/server/static/vendor/marked.min.js +6 -0
- coderfleet/server/static/vendor/xterm/addon-fit.js +2 -0
- coderfleet/server/static/vendor/xterm/xterm.css +218 -0
- coderfleet/server/static/vendor/xterm/xterm.js +2 -0
- coderfleet/server/terminal.py +129 -0
- coderfleet/task_cmds.py +311 -0
- coderfleet-0.1.0.dist-info/METADATA +492 -0
- coderfleet-0.1.0.dist-info/RECORD +45 -0
- coderfleet-0.1.0.dist-info/WHEEL +4 -0
- coderfleet-0.1.0.dist-info/entry_points.txt +2 -0
|
@@ -0,0 +1,492 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: coderfleet
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: CoderFleet - Run multiple Claude Code/Codex accounts in isolated Docker containers
|
|
5
|
+
Requires-Python: >=3.10
|
|
6
|
+
Requires-Dist: aiofiles==24.1.0
|
|
7
|
+
Requires-Dist: click>=8.1
|
|
8
|
+
Requires-Dist: fastapi==0.115.0
|
|
9
|
+
Requires-Dist: httpx>=0.27
|
|
10
|
+
Requires-Dist: pydantic==2.9.2
|
|
11
|
+
Requires-Dist: python-multipart==0.0.9
|
|
12
|
+
Requires-Dist: pyyaml>=6.0
|
|
13
|
+
Requires-Dist: uvicorn[standard]==0.30.6
|
|
14
|
+
Description-Content-Type: text/markdown
|
|
15
|
+
|
|
16
|
+
# CoderFleet (coderfleet)
|
|
17
|
+
|
|
18
|
+
**更适合中国开发者(CN)体质的多账号 AI 辅助开发方案。**
|
|
19
|
+
|
|
20
|
+
<video src="https://github.com/user-attachments/assets/37bee884-09c7-40ca-bc7b-87ce26422c8c" controls width="100%"></video>
|
|
21
|
+
|
|
22
|
+
### 💡 为什么需要 CoderFleet?
|
|
23
|
+
|
|
24
|
+
在重度 AI 编程开发中,大模型 CLI(如 Claude Code、Codex)经常面临尴尬的使用瓶颈:
|
|
25
|
+
* **单账号(Plus 会员)的额度不够用**,频繁遭遇大模型服务商的 Rate Limit 或当日使用上限;
|
|
26
|
+
* **高倍数套餐(如 5x/10x/20x 的账号会员)又极其昂贵**,在周期内往往使用量根本用不完,性价比极低;
|
|
27
|
+
* 最优解通常是**自己申请 2 个或多个普通/Plus 账号轮流使用**,但在单台机器上频繁切换账号、管理认证数据、以及维护隔离的网络环境极其繁杂。
|
|
28
|
+
|
|
29
|
+
**CoderFleet 正是为此而生!**
|
|
30
|
+
|
|
31
|
+
它允许你在单台宿主机上同时运行多个 **Codex CLI** 和 **Claude Code** 账号。每个账号采用独立容器隔离、独立会话认证,并设计了严密的**物理内网中继代理(gost)**网络,确保所有网络出站流量强制且唯一地走宿主机代理出口,完美解决国内开发者在调用 Claude / OpenAI 服务时遭遇的网络封锁和封号风险,实现"多账号额度无缝叠加、轮询提效"。
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 安装
|
|
36
|
+
|
|
37
|
+
### 环境要求
|
|
38
|
+
|
|
39
|
+
- Docker Desktop(macOS / Linux)或 Docker Engine + Compose V2
|
|
40
|
+
- 宿主机已运行代理软件(Clash / v2ray 等),并开启 allow-lan
|
|
41
|
+
- Python 3.10+(推荐用 uv 管理,见下方)
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
### 第零步:安装 uv(推荐)
|
|
46
|
+
|
|
47
|
+
[uv](https://docs.astral.sh/uv/) 是极速 Python 包管理器,同时负责安装 Python 本身和管理工具隔离环境,比 pip / pipx 更快且无副作用。
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
# macOS / Linux
|
|
51
|
+
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
52
|
+
|
|
53
|
+
# 重新加载 shell 使 uv 命令生效
|
|
54
|
+
source $HOME/.local/bin/env # bash/zsh
|
|
55
|
+
# 或重新打开终端
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
安装完成后,用 uv 装好 Python:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
uv python install 3.12
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
### 方式一:uv tool 安装(推荐,新用户)
|
|
67
|
+
|
|
68
|
+
`uv tool` 等价于 pipx,将 coderfleet 装进独立隔离环境,不污染系统 Python。
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
uv tool install coderfleet
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
安装完成后,`coderfleet` 命令全局可用,工作区默认位于 `~/.coderfleet/`。
|
|
75
|
+
|
|
76
|
+
> 如果未安装 uv,也可用 pipx:
|
|
77
|
+
> ```bash
|
|
78
|
+
> pipx install coderfleet
|
|
79
|
+
> ```
|
|
80
|
+
|
|
81
|
+
### 方式二:克隆仓库(开发者 / 老用户)
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
git clone https://github.com/your-org/coderfleet.git
|
|
85
|
+
cd coderfleet
|
|
86
|
+
|
|
87
|
+
# 用 uv 创建虚拟环境并安装(推荐)
|
|
88
|
+
uv venv && source .venv/bin/activate
|
|
89
|
+
uv pip install -e .
|
|
90
|
+
|
|
91
|
+
# 或用系统 pip(可能需要 --break-system-packages)
|
|
92
|
+
pip install -e .
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
> 老用户请参考 [从 `./aicm.sh` 迁移到 `coderfleet`](changelog/migrate-from-aicm-to-coderfleet.md)。旧的 `./aicm.sh` 包装脚本不再保留。
|
|
96
|
+
|
|
97
|
+
## 快速开始
|
|
98
|
+
|
|
99
|
+
### 1. 初始化工作区
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
coderfleet init
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
交互式向导将引导你:
|
|
106
|
+
- 确认工作区目录(默认 `~/.coderfleet/`)
|
|
107
|
+
- 填写宿主机代理端口(HTTP / SOCKS5)
|
|
108
|
+
- 设置 Docker 镜像名称和构建平台
|
|
109
|
+
|
|
110
|
+
初始化完成后,工作区结构如下:
|
|
111
|
+
|
|
112
|
+
```
|
|
113
|
+
~/.coderfleet/
|
|
114
|
+
├── config.conf # 全局配置(镜像、代理、网络)
|
|
115
|
+
├── accounts.conf # 账号配置
|
|
116
|
+
├── projects.conf # 项目配置
|
|
117
|
+
├── Dockerfile # 自建统一镜像
|
|
118
|
+
├── entrypoint.sh # 容器启动脚本
|
|
119
|
+
├── scripts/ # 镜像构建时打包进容器的辅助脚本
|
|
120
|
+
├── docker-compose.yml # 自动生成,勿手动编辑
|
|
121
|
+
└── accounts/ # 各账号认证数据(自动管理)
|
|
122
|
+
├── alice/
|
|
123
|
+
└── bob/
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### 2. 构建镜像
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
coderfleet build
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
首次构建约需 5~10 分钟,镜像包含:
|
|
133
|
+
|
|
134
|
+
- Ubuntu 24.04
|
|
135
|
+
- Python 3.12(含 uv / ruff / black / mypy)
|
|
136
|
+
- Node.js 20
|
|
137
|
+
- Rust 1.93.0
|
|
138
|
+
- Codex CLI(`@openai/codex`)
|
|
139
|
+
- Claude Code(`@anthropic-ai/claude-code`)
|
|
140
|
+
|
|
141
|
+
### 3. 添加账号与项目
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
# Codex 账号
|
|
145
|
+
coderfleet account add alice TYPE=codex
|
|
146
|
+
coderfleet project add app-a alice ~/projects/app-a
|
|
147
|
+
|
|
148
|
+
# Claude Code 账号
|
|
149
|
+
coderfleet account add bob TYPE=claude
|
|
150
|
+
coderfleet project add app-b bob ~/projects/app-b
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### 4. 生成配置并启动容器
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
coderfleet apply
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### 5. 登录账号
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
coderfleet login alice
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
CLI 会输出授权 URL,在宿主机浏览器打开 → 完成授权 → 复制 code → 粘贴回终端。
|
|
166
|
+
|
|
167
|
+
如果账号容器还未启动,`login` 会自动拉起一个临时认证容器;登录结束后容器删除,认证文件保留在 `accounts/<账号名>/`。
|
|
168
|
+
|
|
169
|
+
### 6. 进入容器工作
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
# 打开多个终端
|
|
173
|
+
coderfleet enter app-a # 进入 app-a 项目容器(使用 Codex 账号 alice)
|
|
174
|
+
coderfleet enter app-b # 进入 app-b 项目容器(使用 Claude Code 账号 bob)
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
进入后使用对应 CLI:
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
# Codex 容器内
|
|
181
|
+
codex "帮我实现用户认证模块"
|
|
182
|
+
|
|
183
|
+
# Claude Code 容器内
|
|
184
|
+
claude "帮我重构这个函数"
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### 7. 启动调度服务与 Web 控制台
|
|
188
|
+
|
|
189
|
+
除了交互式进入容器,CoderFleet 还提供 **FastAPI 任务调度服务与 Web 聊天控制台**,可在宿主机直接触发并监控容器内的异步开发任务。
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
coderfleet server
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
启动后可访问:
|
|
196
|
+
- **Web UI 对话控制台**:[http://localhost:8765](http://localhost:8765)(多任务聊天界面、日志流式追踪、WebSocket 容器终端)
|
|
197
|
+
- **API 交互式文档**:[http://localhost:8765/docs](http://localhost:8765/docs)
|
|
198
|
+
|
|
199
|
+
### 8. 命令行异步任务
|
|
200
|
+
|
|
201
|
+
服务运行期间,可在宿主机直接提交后台任务:
|
|
202
|
+
|
|
203
|
+
```bash
|
|
204
|
+
# 一次性开发任务
|
|
205
|
+
coderfleet task run "在 auth.py 中添加 JWT 生成逻辑" --project app-b
|
|
206
|
+
|
|
207
|
+
# 全自动模式(跳过 CLI 权限确认)
|
|
208
|
+
coderfleet task run "运行并修复所有 lint 错误" --project app-b --auto
|
|
209
|
+
|
|
210
|
+
# 开启新的对话链(维持上下文)
|
|
211
|
+
coderfleet task run "开始实现支付接口" --project app-b --new-chain 支付功能
|
|
212
|
+
|
|
213
|
+
# 续接已有对话上下文
|
|
214
|
+
coderfleet task run "在刚才的支付接口上增加退款支持" --conversation <任务链ID>
|
|
215
|
+
|
|
216
|
+
# 查看任务列表与实时日志
|
|
217
|
+
coderfleet task list
|
|
218
|
+
coderfleet task logs <任务ID> -f
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## 命令速查
|
|
224
|
+
|
|
225
|
+
### 生命周期
|
|
226
|
+
|
|
227
|
+
| 命令 | 说明 |
|
|
228
|
+
|------|------|
|
|
229
|
+
| `coderfleet init` | 交互式初始化工作区(首次使用) |
|
|
230
|
+
| `coderfleet build` | 构建自定义 Docker 镜像 |
|
|
231
|
+
| `coderfleet apply` | 重新生成 docker-compose.yml 并重启所有容器 |
|
|
232
|
+
| `coderfleet up` | 启动所有容器 |
|
|
233
|
+
| `coderfleet down` | 停止所有容器 |
|
|
234
|
+
| `coderfleet restart` | 重启所有容器 |
|
|
235
|
+
| `coderfleet status` | 查看容器、代理中继和镜像状态 |
|
|
236
|
+
| `coderfleet server [--port N]` | 启动 FastAPI 调度服务及 Web UI(默认端口 8765) |
|
|
237
|
+
|
|
238
|
+
### 账号管理
|
|
239
|
+
|
|
240
|
+
| 命令 | 说明 |
|
|
241
|
+
|------|------|
|
|
242
|
+
| `coderfleet account add <名称> TYPE=codex\|claude [--auth env] [--env-file 路径] [--proxy relay\|off]` | 添加账号 |
|
|
243
|
+
| `coderfleet account remove <名称>` | 删除账号(自动停止关联容器) |
|
|
244
|
+
| `coderfleet account list` | 列出所有账号及运行状态 |
|
|
245
|
+
| `coderfleet login <账号名\|all>` | 登录账号并持久化认证文件 |
|
|
246
|
+
|
|
247
|
+
### 项目管理
|
|
248
|
+
|
|
249
|
+
| 命令 | 说明 |
|
|
250
|
+
|------|------|
|
|
251
|
+
| `coderfleet project add <名称> <账号名> <项目路径>` | 添加项目 |
|
|
252
|
+
| `coderfleet project remove <名称>` | 删除项目 |
|
|
253
|
+
| `coderfleet project list` | 列出所有项目 |
|
|
254
|
+
|
|
255
|
+
### 容器操作
|
|
256
|
+
|
|
257
|
+
| 命令 | 说明 |
|
|
258
|
+
|------|------|
|
|
259
|
+
| `coderfleet enter <项目名>` | 进入项目容器 shell(TTY 直连) |
|
|
260
|
+
| `coderfleet logs [项目名]` | 查看日志(不加参数看全部容器) |
|
|
261
|
+
| `coderfleet check-proxy` | 验证代理隔离及出口 IP |
|
|
262
|
+
|
|
263
|
+
### 任务管理(需先启动 server)
|
|
264
|
+
|
|
265
|
+
| 命令 | 说明 |
|
|
266
|
+
|------|------|
|
|
267
|
+
| `coderfleet task run "<prompt>" [--project 名称] [--auto] [--at ISO时间]` | 提交异步任务 |
|
|
268
|
+
| `coderfleet task list [--status 状态] [--account 账号]` | 查看任务列表 |
|
|
269
|
+
| `coderfleet task status <任务ID>` | 查看任务详情 |
|
|
270
|
+
| `coderfleet task logs <任务ID> [-f]` | 查看任务日志(`-f` 实时跟踪) |
|
|
271
|
+
| `coderfleet task kill <任务ID>` | 终止任务 |
|
|
272
|
+
| `coderfleet task clean [N]` | 清理历史记录(保留最近 N 条,默认 30) |
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
## 配置文件详解
|
|
277
|
+
|
|
278
|
+
### config.conf
|
|
279
|
+
|
|
280
|
+
由 `coderfleet init` 自动生成,修改后执行 `coderfleet apply` 生效。
|
|
281
|
+
|
|
282
|
+
```conf
|
|
283
|
+
# 自建镜像名称和标签
|
|
284
|
+
IMAGE_NAME=coderfleet
|
|
285
|
+
IMAGE_TAG=latest
|
|
286
|
+
BUILD_PLATFORM=linux/amd64 # Apple Silicon 改为 linux/arm64
|
|
287
|
+
|
|
288
|
+
# 宿主机代理(容器通过 host.docker.internal 访问)
|
|
289
|
+
PROXY_HOST=host.docker.internal
|
|
290
|
+
PROXY_HTTP_PORT=7890
|
|
291
|
+
PROXY_SOCKS5_PORT=7891
|
|
292
|
+
|
|
293
|
+
# 内部网络
|
|
294
|
+
INTERNAL_SUBNET=172.21.0.0/16
|
|
295
|
+
RELAY_IP=172.21.0.2
|
|
296
|
+
RELAY_LISTEN_PORT=7890
|
|
297
|
+
|
|
298
|
+
# 代理中继镜像
|
|
299
|
+
RELAY_IMAGE=gogost/gost:3
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
### accounts.conf
|
|
303
|
+
|
|
304
|
+
```conf
|
|
305
|
+
# 格式:NAME=<名称> TYPE=codex|claude [AUTH=login|env] [ENV_FILE=路径] [PROXY=relay|off]
|
|
306
|
+
NAME=alice TYPE=codex
|
|
307
|
+
NAME=bob TYPE=claude
|
|
308
|
+
NAME=claude-api TYPE=claude AUTH=env ENV_FILE=./accounts/claude-api/env
|
|
309
|
+
NAME=local TYPE=claude PROXY=off
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
字段说明:
|
|
313
|
+
|
|
314
|
+
| 字段 | 必填 | 说明 |
|
|
315
|
+
|------|------|------|
|
|
316
|
+
| `NAME` | 是 | 账号名,只允许字母/数字/连字符 |
|
|
317
|
+
| `TYPE` | 是 | `codex` 使用 Codex CLI,`claude` 使用 Claude Code |
|
|
318
|
+
| `AUTH` | 否 | 认证方式,默认 `login`;Claude Code 可用 `env` 通过 API Key 认证 |
|
|
319
|
+
| `ENV_FILE` | 否 | Docker Compose env_file 路径;`AUTH=env` 时省略则默认 `./accounts/<名称>/env` |
|
|
320
|
+
| `PROXY` | 否 | 默认 `relay`(走代理中继);`off` 表示不注入代理变量,连接普通网络 |
|
|
321
|
+
|
|
322
|
+
`AUTH=env` 用于 Claude Code API key 场景:
|
|
323
|
+
|
|
324
|
+
```bash
|
|
325
|
+
coderfleet account add claude-api TYPE=claude --auth env
|
|
326
|
+
# 然后编辑 ~/.coderfleet/accounts/claude-api/env
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
示例 env 文件:
|
|
330
|
+
|
|
331
|
+
```env
|
|
332
|
+
ANTHROPIC_API_KEY=sk-ant-...
|
|
333
|
+
# ANTHROPIC_BASE_URL=https://api.anthropic.com
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
> 注意:Claude Code 会优先使用 `ANTHROPIC_API_KEY`,`login all` 会自动跳过 `AUTH=env` 账号。
|
|
337
|
+
|
|
338
|
+
### projects.conf
|
|
339
|
+
|
|
340
|
+
```conf
|
|
341
|
+
# 格式:NAME=<名称> ACCOUNT=<账号名> PATH=<项目路径>
|
|
342
|
+
NAME=my-app ACCOUNT=alice PATH=~/projects/my-app
|
|
343
|
+
NAME=api-server ACCOUNT=bob PATH=~/projects/api-server
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
字段说明:
|
|
347
|
+
|
|
348
|
+
| 字段 | 必填 | 说明 |
|
|
349
|
+
|------|------|------|
|
|
350
|
+
| `NAME` | 是 | 项目名,只允许字母/数字/连字符 |
|
|
351
|
+
| `ACCOUNT` | 是 | 使用的账号名 |
|
|
352
|
+
| `PATH` | 是 | 挂载进容器 `/workspace` 的宿主机目录,支持 `~` |
|
|
353
|
+
|
|
354
|
+
---
|
|
355
|
+
|
|
356
|
+
## 网络架构
|
|
357
|
+
|
|
358
|
+
```
|
|
359
|
+
[codex-alice] ──┐
|
|
360
|
+
[claude-bob] ──┤── intnet(internal=true,无公网路由)
|
|
361
|
+
[codex-carol] ──┘ │
|
|
362
|
+
▼
|
|
363
|
+
[coderfleet-proxy-relay](gost)
|
|
364
|
+
│ HTTP → 宿主机代理
|
|
365
|
+
▼
|
|
366
|
+
宿主机代理(Clash/v2ray)
|
|
367
|
+
│
|
|
368
|
+
▼
|
|
369
|
+
公网
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
关键设计:
|
|
373
|
+
- `intnet` 设置 `internal: true`,Docker 不添加公网路由,容器物理上无法直连公网
|
|
374
|
+
- 所有出站流量必须经过 `coderfleet-proxy-relay` 才能到达公网
|
|
375
|
+
- `PROXY=off` 账号的项目接入普通外网网络,不经过中继(适合内网服务)
|
|
376
|
+
|
|
377
|
+
验证代理隔离:
|
|
378
|
+
|
|
379
|
+
```bash
|
|
380
|
+
coderfleet check-proxy
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
正常输出:
|
|
384
|
+
|
|
385
|
+
```
|
|
386
|
+
── 代理连通性(应全部通)
|
|
387
|
+
claude-bob → proxy-relay: 通
|
|
388
|
+
codex-alice → proxy-relay: 通
|
|
389
|
+
|
|
390
|
+
── 直连公网封锁(应全部封锁)
|
|
391
|
+
claude-bob → 8.8.8.8:443: 已封锁
|
|
392
|
+
codex-alice → 8.8.8.8:443: 已封锁
|
|
393
|
+
|
|
394
|
+
── 代理出口 IP
|
|
395
|
+
claude-bob 出口 IP: x.x.x.x
|
|
396
|
+
codex-alice 出口 IP: x.x.x.x
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
---
|
|
400
|
+
|
|
401
|
+
## 认证机制
|
|
402
|
+
|
|
403
|
+
两种 CLI 的认证目录挂载方式:
|
|
404
|
+
|
|
405
|
+
| CLI | 认证目录(容器内) | 本地存储 |
|
|
406
|
+
|-----|--------------------|----------|
|
|
407
|
+
| Codex | `/home/byclaw/.codex` | `accounts/<名称>/` |
|
|
408
|
+
| Claude Code | `/home/byclaw/.claude` | `accounts/<名称>/` |
|
|
409
|
+
| Claude Code API key | 同上 | `ENV_FILE` 指定文件 |
|
|
410
|
+
|
|
411
|
+
每个账号的认证数据独立存储,容器删除重建后无需重新登录。
|
|
412
|
+
|
|
413
|
+
---
|
|
414
|
+
|
|
415
|
+
## 项目结构
|
|
416
|
+
|
|
417
|
+
```
|
|
418
|
+
coderfleet/ # Python 包
|
|
419
|
+
├── cli.py # Click 命令组入口
|
|
420
|
+
├── config.py # 工作区路径解析、.conf 文件读写
|
|
421
|
+
├── config_cmds.py # account / project 子命令
|
|
422
|
+
├── compose.py # docker-compose.yml 生成器(pyyaml)
|
|
423
|
+
├── docker_ops.py # build / apply / up / down / enter 等命令
|
|
424
|
+
├── login_cmd.py # coderfleet login(TTY 直通,os.execvp)
|
|
425
|
+
├── task_cmds.py # coderfleet task 子命令(HTTP 调用 server)
|
|
426
|
+
├── init_wizard.py # coderfleet init 交互式向导
|
|
427
|
+
├── data/ # 打包进 wheel 的资源文件
|
|
428
|
+
│ ├── Dockerfile
|
|
429
|
+
│ ├── entrypoint.sh
|
|
430
|
+
│ └── *.conf.example
|
|
431
|
+
└── server/ # FastAPI 调度服务(包内模块)
|
|
432
|
+
├── main.py # REST API + WebSocket 终端
|
|
433
|
+
├── scheduler.py # 任务队列与执行引擎
|
|
434
|
+
├── models.py # Pydantic 数据模型
|
|
435
|
+
├── docker_mgr.py # Docker exec 封装
|
|
436
|
+
├── terminal.py # WebSocket ↔ docker exec -it 桥接
|
|
437
|
+
└── static/ # Web UI(原生 JS,无构建步骤)
|
|
438
|
+
pyproject.toml # pip/pipx 打包配置
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
---
|
|
442
|
+
|
|
443
|
+
## 常见问题
|
|
444
|
+
|
|
445
|
+
**Q: 构建镜像时速度很慢怎么办?**
|
|
446
|
+
|
|
447
|
+
镜像需要下载 Node.js、Python 以及两个 CLI 包,确保宿主机代理正常且 Docker Desktop 已配置代理即可。
|
|
448
|
+
|
|
449
|
+
**Q: 登录时浏览器无法弹出?**
|
|
450
|
+
|
|
451
|
+
容器内没有浏览器,CLI 会输出一个 URL,复制到宿主机浏览器打开授权即可。
|
|
452
|
+
|
|
453
|
+
**Q: macOS Apple Silicon(M 系列芯片)能用吗?**
|
|
454
|
+
|
|
455
|
+
可以,`coderfleet init` 会自动检测并默认选择 `linux/arm64`。若需 amd64 模拟,修改 `config.conf` 中的 `BUILD_PLATFORM=linux/amd64` 后重新 `coderfleet build`。
|
|
456
|
+
|
|
457
|
+
**Q: 删除账号后认证数据还在吗?**
|
|
458
|
+
|
|
459
|
+
`coderfleet account remove <名称>` 只从 `accounts.conf` 移除配置,`accounts/<名称>/` 目录保留。需要彻底清除时手动执行:
|
|
460
|
+
|
|
461
|
+
```bash
|
|
462
|
+
rm -rf ~/.coderfleet/accounts/<名称>
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
**Q: 如何更新 CLI 版本?**
|
|
466
|
+
|
|
467
|
+
修改工作区 `Dockerfile` 中对应的 `npm install -g` 命令,然后重新构建:
|
|
468
|
+
|
|
469
|
+
```bash
|
|
470
|
+
coderfleet build
|
|
471
|
+
coderfleet restart
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
**Q: 多个账号能同时工作吗?**
|
|
475
|
+
|
|
476
|
+
可以,每个账号是独立容器,互不影响。打开多个终端窗口,分别 `coderfleet enter <项目名>` 进入即可。
|
|
477
|
+
|
|
478
|
+
---
|
|
479
|
+
|
|
480
|
+
## 自定义镜像
|
|
481
|
+
|
|
482
|
+
如需在镜像中添加更多工具,编辑工作区的 `Dockerfile`(路径:`~/.coderfleet/Dockerfile`),然后重新构建:
|
|
483
|
+
|
|
484
|
+
```dockerfile
|
|
485
|
+
# 示例:添加 Java
|
|
486
|
+
RUN apt-get update && apt-get install -y openjdk-21-jdk
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
```bash
|
|
490
|
+
coderfleet build
|
|
491
|
+
coderfleet restart
|
|
492
|
+
```
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
coderfleet/__init__.py,sha256=kUR5RAFc7HCeiqdlX36dZOHkUI5wI6V_43RpEcD8b-0,22
|
|
2
|
+
coderfleet/__main__.py,sha256=xBoFIfIiMC23j5-XafCzZ1h9lUX-tisWoACrBLNRp0g,71
|
|
3
|
+
coderfleet/cli.py,sha256=HSqVYKNuneimn-9Ry5deCMW3ueMwNN9TpCt68qKTeQY,6039
|
|
4
|
+
coderfleet/compose.py,sha256=3fZ5LfMZ4-mmuE2txoT4MEKASRWWZOrSu9uGNTasDdM,6093
|
|
5
|
+
coderfleet/config.py,sha256=k1dGNReJlkLgIrkhqnMYVxQNYded-8ldywL153541qE,2197
|
|
6
|
+
coderfleet/config_cmds.py,sha256=bhj48-8JBYGaObVCsmDWc5xPaCb1xK2JKcDNCTFh5zY,8509
|
|
7
|
+
coderfleet/docker_ops.py,sha256=WH9YnCh-Gn2_AEw-OF8PFMG_noruayshO6Nm0FRdJpM,12837
|
|
8
|
+
coderfleet/init_wizard.py,sha256=Xt9QmbGHx5MrpdzWU-oAjfy3-Q3XI4-2TWfJYn-fhC4,9648
|
|
9
|
+
coderfleet/login_cmd.py,sha256=m9MwgdShbwYoLDRMxbNb8Py-g9BM7l99wBAR8r2Sra4,6138
|
|
10
|
+
coderfleet/task_cmds.py,sha256=2I2dvRPm4Y_9eGSxMYS6c8kWrH5rxTihtxiEC43DjPw,11980
|
|
11
|
+
coderfleet/data/Dockerfile,sha256=FR0bVcbnyjnU9gGWnCa1kk3L-Ms12YwnGr3WlhQorpM,4453
|
|
12
|
+
coderfleet/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
13
|
+
coderfleet/data/accounts.conf.example,sha256=kZni2qMghCxE69o8hIeQHoXm7rk8THjYv0cfgPl_OVs,1086
|
|
14
|
+
coderfleet/data/config.conf.example,sha256=avBSPmCpFVzX_HMGp9p3K9K2RopKKjQRLGQWjpFWutk,1414
|
|
15
|
+
coderfleet/data/entrypoint.sh,sha256=-0ACNxx0A2RAhlsUqznol6gz6ChEJH2kmtBo_D1vk44,2253
|
|
16
|
+
coderfleet/data/projects.conf.example,sha256=MX72www_OtS-zLRckZlo1HI1VIxsIpsXMKtVVjvlNHU,777
|
|
17
|
+
coderfleet/data/scripts/coderfleet_usage_status.py,sha256=DIvbPNX6uObVqtOVBpRP3N870VbRi1DCKjb3DPEampg,3654
|
|
18
|
+
coderfleet/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
19
|
+
coderfleet/server/docker_mgr.py,sha256=ZYB7YvPIv0L9nP1kekaYQdDJ494HfCyK4jhoroKabf0,1107
|
|
20
|
+
coderfleet/server/main.py,sha256=ZarkB9N9xP2hlS0b-WcClz077ZCytXaCvkH92p2x_ts,19616
|
|
21
|
+
coderfleet/server/models.py,sha256=m_97MEHkDTtbhY4stvKbQbCrqGOakOA4afD7Ns7beMI,9052
|
|
22
|
+
coderfleet/server/scheduler.py,sha256=OpcPs-DKUp1OefEnjOm-VdRNHMMdyq3KcugaQBz_q5w,50955
|
|
23
|
+
coderfleet/server/terminal.py,sha256=hMqkysRub1VSJzhR2LawM84NSAzXgtP1aKFKWQXMed8,3932
|
|
24
|
+
coderfleet/server/static/index.html,sha256=-88qVHFfpRg0jt8eVcWZFS6ltHJ6P1Q0ke7ni7ycdCY,16754
|
|
25
|
+
coderfleet/server/static/css/main.css,sha256=Tfr1aPcLSpBs_sXuIeH5rp_11-8tP_GhVN7exRoW8GM,62707
|
|
26
|
+
coderfleet/server/static/js/accounts.js,sha256=o4OKR0srQJFtHBrI7l5O8Q17-GRafpTE9EhNVwjXaNo,3758
|
|
27
|
+
coderfleet/server/static/js/app.js,sha256=KGXS9zxRwXPSVWvnPithSXa-fRpsQbPZu1Ajx6h8aVc,1043
|
|
28
|
+
coderfleet/server/static/js/chat.js,sha256=spIFd9laYjNdqljSQb-pr-0sCPWu2LV63S_WlLOgXHc,28045
|
|
29
|
+
coderfleet/server/static/js/log.js,sha256=nrRy7l2AX51u8RBAgBXO6t1dzNfa7Z1lXkDK7sg3Dr4,5948
|
|
30
|
+
coderfleet/server/static/js/nav.js,sha256=5qmyXQf9s-SG_TGbdUBQWtvTkDxt6i6Nmhx_6Yi57Xo,2123
|
|
31
|
+
coderfleet/server/static/js/projects.js,sha256=MRwy24AM6FSGVc7MwvDQANZVvsLMVDM2iiSsoEqvSEE,12767
|
|
32
|
+
coderfleet/server/static/js/renderer.js,sha256=I_CYrVoD1t8ntSQnoYg44_QsDgJX3q2IDHQgvUaFi3w,23184
|
|
33
|
+
coderfleet/server/static/js/state.js,sha256=6srVNhzjS-cIn0FTqf8-Dk30TTCmfmqDiz9bciQFvmg,2875
|
|
34
|
+
coderfleet/server/static/js/submit.js,sha256=KSNCBqfAEa5d4Ib24HvUmd5wwot9p7Un9-_S8k4hGXM,10218
|
|
35
|
+
coderfleet/server/static/js/tasks.js,sha256=fxbWf7f7CWdQP8JCmAV-82fG5l9xdCv6lSK93nwu7dM,4345
|
|
36
|
+
coderfleet/server/static/js/terminal.js,sha256=y-ToD0jt6-wTJv6ikgLzafcYYAIyAZ-RB7iHHYpt_rE,11269
|
|
37
|
+
coderfleet/server/static/js/utils.js,sha256=eK7FIH-ORLYBbul4yRdF8ERPWK9h3f0BlM598PbmuS0,5806
|
|
38
|
+
coderfleet/server/static/vendor/marked.min.js,sha256=xoB1Zy2Xbkd3OQVguqESGUhVvUQEsTZH2khVquH5Ngw,49718
|
|
39
|
+
coderfleet/server/static/vendor/xterm/addon-fit.js,sha256=va76Nwsb_ELuiNRv5gckAJAqTUstRc2TQ43amyPJcIk,1497
|
|
40
|
+
coderfleet/server/static/vendor/xterm/xterm.css,sha256=uo5phWaUiJgcz0DAzv46uoByLLbJLeetYosL1xf68rY,5559
|
|
41
|
+
coderfleet/server/static/vendor/xterm/xterm.js,sha256=H5kaw7Syg-v5bmCuI6AKUnZd06Lkb6b92p8aqwMvdJU,289441
|
|
42
|
+
coderfleet-0.1.0.dist-info/METADATA,sha256=ATEFhudUxMTZWCnEqBGC0aF0YVCnagTR6ywy12w2cig,15498
|
|
43
|
+
coderfleet-0.1.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
|
|
44
|
+
coderfleet-0.1.0.dist-info/entry_points.txt,sha256=BgWrZVzZEYqHzJ4CZnYNuJobWbtmrbyYQXp3onZAs18,51
|
|
45
|
+
coderfleet-0.1.0.dist-info/RECORD,,
|