File size: 10,126 Bytes
77169b4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
# Web2API 部署指南

本文档介绍如何将 Web2API 部署到本地 Ubuntu、远程 VPS 或 Render 平台。

---

## 目录

- [系统要求](#系统要求)
- [方式一:Docker 部署(推荐)](#方式一docker-部署推荐)
- [方式二:Docker Compose 部署](#方式二docker-compose-部署)
- [方式三:Ubuntu 裸机部署](#方式三ubuntu-裸机部署)
- [方式四:Render 部署](#方式四render-部署)
- [环境变量参考](#环境变量参考)
- [部署后配置](#部署后配置)
- [常见问题](#常见问题)

---

## 系统要求

| 项目 | 最低要求 | 推荐配置 |
|------|---------|---------|
| CPU | 1 核 | 2 核+ |
| 内存 | 1 GB | 2 GB+ |
| 磁盘 | 2 GB | 5 GB+ |
| 系统 | Ubuntu 22.04+ / Debian 12+ | Ubuntu 24.04 |
| Python | 3.12+ | 3.12 |
| 架构 | amd64 / arm64 | amd64 |

---

## 方式一:Docker 部署(推荐)

最简单的部署方式,适用于本地 Ubuntu 和远程 VPS。

### 1. 安装 Docker

```bash
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
# 重新登录使 docker 组生效
```

### 2. 构建镜像

```bash
git clone https://github.com/shenhao-stu/web2api.git
cd web2api
git checkout feat/huggingface-postgres-space

docker build -t web2api .
```

### 3. 运行容器

```bash
docker run -d \
  --name web2api \
  -p 9000:9000 \
  -v web2api-data:/data \
  -e WEB2API_AUTH_API_KEY="your-api-key-here" \
  -e WEB2API_AUTH_CONFIG_SECRET="your-admin-password" \
  -e WEB2API_BROWSER_NO_SANDBOX=true \
  -e WEB2API_BROWSER_DISABLE_GPU=true \
  -e WEB2API_BROWSER_DISABLE_GPU_SANDBOX=true \
  web2api
```

### 4. 验证

```bash
# 检查服务状态
curl http://localhost:9000/claude/v1/models \
  -H "Authorization: Bearer your-api-key-here"

# 测试对话
curl http://localhost:9000/claude/v1/chat/completions \
  -H "Authorization: Bearer your-api-key-here" \
  -H "Content-Type: application/json" \
  -d '{"model":"claude-sonnet-4.6","stream":false,"messages":[{"role":"user","content":"Hello"}]}'
```

---

## 方式二:Docker Compose 部署

适合需要 PostgreSQL 持久化配置的场景。

创建 `docker-compose.yml````yaml
services:
  web2api:
    build: .
    ports:
      - "9000:9000"
    volumes:
      - web2api-data:/data
    environment:
      - WEB2API_AUTH_API_KEY=your-api-key-here
      - WEB2API_AUTH_CONFIG_SECRET=your-admin-password
      - WEB2API_BROWSER_NO_SANDBOX=true
      - WEB2API_BROWSER_DISABLE_GPU=true
      - WEB2API_BROWSER_DISABLE_GPU_SANDBOX=true
      - WEB2API_DATABASE_URL=postgresql://web2api:web2api@db:5432/web2api
    depends_on:
      db:
        condition: service_healthy
    restart: unless-stopped

  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: web2api
      POSTGRES_PASSWORD: web2api
      POSTGRES_DB: web2api
    volumes:
      - pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U web2api"]
      interval: 5s
      timeout: 3s
      retries: 5
    restart: unless-stopped

volumes:
  web2api-data:
  pgdata:
```

```bash
docker compose up -d
```

---

## 方式三:Ubuntu 裸机部署

适合不想用 Docker 的场景,或需要更精细控制的 VPS。

### 1. 安装系统依赖

```bash
sudo apt-get update && sudo apt-get install -y \
  ca-certificates curl xz-utils xvfb xauth \
  python3 python3-pip python3-venv python-is-python3 \
  software-properties-common fonts-liberation \
  libasound2t64 libatk-bridge2.0-0t64 libatk1.0-0t64 \
  libcairo2 libcups2t64 libdbus-1-3 libdrm2 \
  libfontconfig1 libgbm1 libglib2.0-0t64 libgtk-3-0t64 \
  libnspr4 libnss3 libpango-1.0-0 libu2f-udev \
  libvulkan1 libx11-6 libx11-xcb1 libxcb1 \
  libxcomposite1 libxdamage1 libxext6 libxfixes3 \
  libxkbcommon0 libxrandr2 libxrender1 libxshmfence1
```

> 注意:Ubuntu 22.04 上部分包名不带 `t64` 后缀,如 `libasound2`、`libcups2` 等。

### 2. 安装 Fingerprint Chromium

```bash
# AMD64
sudo mkdir -p /opt/fingerprint-chromium
curl -L "https://github.com/adryfish/fingerprint-chromium/releases/download/142.0.7444.175/ungoogled-chromium-142.0.7444.175-1-x86_64_linux.tar.xz" \
  -o /tmp/fp-chromium.tar.xz
sudo tar -xf /tmp/fp-chromium.tar.xz -C /opt/fingerprint-chromium --strip-components=1
rm /tmp/fp-chromium.tar.xz

# 验证
/opt/fingerprint-chromium/chrome --version
```

### 3. 安装 Python 依赖

```bash
cd /opt
git clone https://github.com/shenhao-stu/web2api.git
cd web2api
git checkout feat/huggingface-postgres-space

python -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install curl-cffi fastapi playwright pyyaml python-dotenv pydantic pytz "uvicorn[standard]"

# 如需 PostgreSQL 支持
pip install "psycopg[binary]"
```

### 4. 创建配置文件

```bash
mkdir -p /data
cp docker/config.container.yaml /data/config.yaml
```

根据需要编辑 `/data/config.yaml`,或通过环境变量覆盖。

### 5. 创建 systemd 服务

```bash
sudo tee /etc/systemd/system/web2api.service > /dev/null << 'EOF'
[Unit]
Description=Web2API Service
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/opt/web2api
Environment=DISPLAY=:99
Environment=WEB2API_DATA_DIR=/data
Environment=WEB2API_CONFIG_PATH=/data/config.yaml
Environment=WEB2API_AUTH_API_KEY=your-api-key-here
Environment=WEB2API_AUTH_CONFIG_SECRET=your-admin-password
Environment=WEB2API_BROWSER_NO_SANDBOX=true
Environment=WEB2API_BROWSER_DISABLE_GPU=true
Environment=WEB2API_BROWSER_DISABLE_GPU_SANDBOX=true
Environment=HOME=/data
Environment=PYTHONUNBUFFERED=1
ExecStartPre=/bin/bash -c 'rm -rf /data/fp-data && mkdir -p /data/fp-data /tmp/.X11-unix'
ExecStartPre=/bin/bash -c 'rm -f /tmp/.X99-lock; Xvfb :99 -screen 0 1600x900x24 -nolisten tcp -ac &'
ExecStartPre=/bin/sleep 1
ExecStart=/opt/web2api/.venv/bin/python -u /opt/web2api/main.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now web2api
```

### 6. 查看日志

```bash
sudo journalctl -u web2api -f
```

---

## 方式四:Render 部署

Render 支持 Docker 部署,流程与 VPS 类似。

### 1. 创建 Render Web Service

1. 登录 [Render Dashboard](https://dashboard.render.com)
2. New → Web Service → 连接 GitHub 仓库 `shenhao-stu/web2api`
3. 选择分支 `feat/huggingface-postgres-space`
4. 配置:
   - **Environment**: Docker
   - **Instance Type**: Starter ($7/月) 或更高
   - **Disk**: 添加 1 GB 持久化磁盘,挂载到 `/data`

### 2. 设置环境变量

在 Render Dashboard → Environment 中添加:

| Key | Value |
|-----|-------|
| `WEB2API_AUTH_API_KEY` | 你的 API 密钥 |
| `WEB2API_AUTH_CONFIG_SECRET` | 管理后台密码 |
| `WEB2API_BROWSER_NO_SANDBOX` | `true` |
| `WEB2API_BROWSER_DISABLE_GPU` | `true` |
| `WEB2API_BROWSER_DISABLE_GPU_SANDBOX` | `true` |
| `PORT` | `9000` |

### 3. (可选)添加 PostgreSQL

1. Render Dashboard → New → PostgreSQL
2. 创建后复制 Internal Database URL
3. 添加环境变量 `WEB2API_DATABASE_URL` = 复制的 URL

### 4. 部署

Render 会自动构建 Docker 镜像并部署。部署完成后通过 `https://your-service.onrender.com` 访问。

---

## 环境变量参考

### 必需

| 变量 | 说明 | 示例 |
|------|------|------|
| `WEB2API_AUTH_API_KEY` | API 认证密钥 | `sk-your-key` |
| `WEB2API_AUTH_CONFIG_SECRET` | 管理后台密码 | `admin123` |

### 浏览器

| 变量 | 说明 | 默认值 |
|------|------|--------|
| `WEB2API_BROWSER_NO_SANDBOX` | 禁用沙箱(容器必须) | `false` |
| `WEB2API_BROWSER_DISABLE_GPU` | 禁用 GPU | `false` |
| `WEB2API_BROWSER_DISABLE_GPU_SANDBOX` | 禁用 GPU 沙箱 | `false` |
| `WEB2API_BROWSER_HEADLESS` | 无头模式 | `false`(使用 Xvfb) |
| `WEB2API_BROWSER_CDP_PORT_START` | CDP 起始端口 | `9222` |
| `WEB2API_BROWSER_CDP_PORT_COUNT` | CDP 端口数量 | `20` |

### 服务器

| 变量 | 说明 | 默认值 |
|------|------|--------|
| `HOST` / `WEB2API_SERVER_HOST` | 监听地址 | `0.0.0.0` |
| `PORT` / `WEB2API_SERVER_PORT` | 监听端口 | `9000` |
| `WEB2API_DATABASE_URL` | PostgreSQL 连接串 | 空(使用 SQLite) |

### 调度器

| 变量 | 说明 | 默认值 |
|------|------|--------|
| `WEB2API_SCHEDULER_TAB_MAX_CONCURRENT` | 单 tab 最大并发 | `1` |
| `WEB2API_SCHEDULER_RESIDENT_BROWSER_COUNT` | 预热浏览器数 | `1` |

### 覆盖规则

所有 `config.yaml` 中的配置项都可以通过环境变量覆盖:

```
config.yaml 中的 section.key → WEB2API_SECTION_KEY
```

例如:`claude.api_base``WEB2API_CLAUDE_API_BASE`

---

## 部署后配置

1. 访问 `http://your-host:9000/login`,输入 `WEB2API_AUTH_CONFIG_SECRET` 设置的密码
2. 进入 `/config` 管理页面
3. 添加代理组(Proxy Group):
   - 如不需要代理,取消勾选 `use_proxy``fingerprint_id` 填任意唯一标识
4. 添加 Claude 账号:
   - `name`:任意名称
   - `type``claude`
   - `auth``{"sessionKey": "你的 Claude sessionKey"}`
5. 点击 Save config
6. (可选)开启 Pro models 开关以使用 Haiku / Opus 模型

### 获取 sessionKey

1. 登录 [claude.ai](https://claude.ai)
2. 打开浏览器开发者工具 → Application → Cookies
3. 复制 `sessionKey` 的值

---

## 常见问题

### Page crashed / OOM

浏览器内存不足导致页面崩溃。解决方案:
- 升级服务器内存到 2 GB+
- 减少 `WEB2API_SCHEDULER_TAB_MAX_CONCURRENT``1`
- 减少 `WEB2API_BROWSER_CDP_PORT_COUNT``3`
- 设置 `WEB2API_SCHEDULER_RESIDENT_BROWSER_COUNT=0` 禁用预热

### D-Bus / XKEYBOARD 警告

容器环境中的正常噪音,不影响功能和性能,可忽略。

### Page.goto: Timeout

浏览器导航超时,通常是网络问题或 Claude 服务暂时不可用。服务会自动重试(最多 3 次)。如果持续出现:
- 检查服务器到 claude.ai 的网络连通性
- 检查代理配置是否正确
- 检查 sessionKey 是否过期

### 端口冲突

默认使用 9000 端口和 9222-9241 的 CDP 端口。如有冲突:
```bash
-e PORT=8080 \
-e WEB2API_BROWSER_CDP_PORT_START=19222 \
-e WEB2API_BROWSER_CDP_PORT_COUNT=6
```