Files
Nexus/docs/design/plans/2026-06-11-browser-worker-server-procurement.md
T

254 lines
8.5 KiB
Markdown
Raw Normal View History

# 浏览器 Worker 独立服务器 — 采购与部署计划
> **目标**:在**单独一台 VPS** 上运行 Playwright ChromiumNexus 主站(`api.synaglobal.vip`)通过内网 API 桥接,管理员在浮动面板 canvas 操作。
> **设计**[`2026-06-11-server-browser-chromium-design.md`](../specs/2026-06-11-server-browser-chromium-design.md)
> **状态**:待购机 → 装机 → Nexus 代码联调 → 生产接入
---
## 1. 为什么要单独买一台
| 项 | 全部塞进 Nexus 主站 | **独立 Worker(本计划)** |
|----|---------------------|---------------------------|
| 主站内存 | 每会话 +200~500MB | 主站几乎不增 |
| Docker 镜像 | +300500MB | 主镜像不变 |
| SSRF 风险面 | 与 API/DB 同机 | 隔离在 Worker |
| 扩缩容 | 和 API 绑死 | 可单独升配 Worker |
你已确认:**任意公网 https + Chromium****不要 iframe**。Worker 分离是推荐部署形态。
---
## 2. 购机规格(下单前对照)
### 2.1 最低可用(单人运维、≤2 并发会话)
| 项 | 建议 |
|----|------|
| **CPU** | 2 vCPUx86_64 |
| **内存** | **4 GB**Chromium 单会话约 300800MB,留系统与缓冲) |
| **磁盘** | 40 GB SSD(系统 + Chromium 缓存) |
| **系统** | **Ubuntu 22.04 LTS****24.04 LTS**x86_64 |
| **带宽** | ≥ 5 Mbps 出站(画面 JPEG 流;10 Mbps 更稳) |
| **地域** | 与 Nexus 主站**同区域或近区**(降延迟) |
### 2.2 推荐配置(留余量、偶尔双标签)
| 项 | 建议 |
|----|------|
| CPU | 4 vCPU |
| 内存 | **8 GB** |
| 磁盘 | 60 GB SSD |
### 2.3 不建议
- **1 GB / 2 GB 内存** — Chromium 易 OOM,会话被 kill
- **ARM 除非验证 Playwright** — 优先 x86_64,减少兼容问题
- **与 Nexus 主站共用同一台** — 违背隔离目的(若预算极紧可临时同机,不推荐)
### 2.4 厂商与形态
任意支持 **Ubuntu + 公网 IP** 的 VPS 即可(Azure、阿里云、腾讯云、Vultr 等)。
**不必**买 WindowsWorker 只跑 Linux + Docker。
---
## 3. 网络与安全(购机时一并规划)
### 3.1 拓扑
```
[ 管理员浏览器 ] ──HTTPS──► [ Nexus 主站 20.24.218.235 :443 ]
内网/VPN/专线(推荐)
[ Browser Worker :8443 ]
└──► 任意公网站点
```
### 3.2 防火墙(Worker 上)
| 方向 | 规则 |
|------|------|
| 入站 | **仅允许 Nexus 主站 IP** 访问 Worker 服务端口(默认 `8443/tcp` |
| 入站 | SSH `22/tcp` 仅你的运维 IP(或跳板机) |
| 入站 | **禁止** 0.0.0.0/0 访问 8443 |
| 出站 | 允许 `80/443` 访问公网(浏览器上网) |
| 出站 | 禁止 Worker 访问 Nexus 内网/MySQL/RedisWorker 不需要) |
> 若 Nexus 与 Worker **同云厂商同 VPC**,用**内网 IP** 通信,Worker **不要绑公网 8443**。
### 3.3 密钥
购机后生成一对:
- `NEXUS_BROWSER_WORKER_SECRET` — 随机 ≥ 32 字节,Worker 与 Nexus 主站 `.env` **各存一份相同值**
- Worker **不**存 Nexus `SECRET_KEY` / `DATABASE_URL`
---
## 4. 购机后你要收集的信息(交给 Agent 联调)
买好后请记录(可写在本地 `.env` 片段,**勿提交 git**):
```bash
# Browser Worker(新机器)
BROWSER_WORKER_PUBLIC_IP= # 若无内网则用
BROWSER_WORKER_PRIVATE_IP= # 与 Nexus 同 VPC 时优先
BROWSER_WORKER_SSH=user@ip
BROWSER_WORKER_SSH_KEY=/path/to/key.pem
# Nexus 主站侧(deploy/nexus-1panel.secrets.sh 或生产 .env
NEXUS_BROWSER_ENABLED=1
NEXUS_BROWSER_WORKER_URL=https://<worker-ip-or-internal>:8443
NEXUS_BROWSER_WORKER_SECRET=<与 Worker 相同>
NEXUS_BROWSER_MAX_SESSIONS=2
NEXUS_BROWSER_IDLE_TIMEOUT_SEC=1800
```
并确认:
- [ ]**Nexus 主站** `curl -k https://<worker>:8443/health` 能通(部署 Worker 后)
- [ ]**公网随机 IP** 访问 Worker 8443 **应失败**(防火墙生效)
---
## 5. Worker 机上安装步骤(购机后执行)
> 代码侧将提供 `browser-worker/` 目录与 `docker-compose.worker.yml`;以下为计划步骤,**Agent 实现后按 changelog 为准**。
### Phase A — 基础环境(约 15 分钟)
```bash
# 1. SSH 登录新机器
ssh -i key.pem ubuntu@<WORKER_IP>
# 2. 系统更新 + Docker
sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get install -y ca-certificates curl
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
# 重新登录使 docker 组生效
# 3. 防火墙(示例 ufw
sudo ufw default deny incoming
sudo ufw allow from <NEXUS_MAIN_IP> to any port 8443 proto tcp
sudo ufw allow from <YOUR_OPS_IP> to any port 22 proto tcp
sudo ufw enable
```
### Phase B — 部署 Browser Worker 容器(Agent 交付后)
```bash
# 在 Worker 上
git clone http://66.154.115.8:3000/admin/Nexus.git /opt/nexus-worker
cd /opt/nexus-worker/browser-worker # 待实现路径
cp .env.example .env
# 编辑 WORKER_SECRET、BIND、日志级别
docker compose up -d --build
docker compose logs -f # 确认 Chromium 就绪
curl -s http://127.0.0.1:8443/health # 应返回 ok
```
### Phase C — Nexus 主站接入(Agent 联调)
```bash
# 在 Nexus 主站 .env 增加 NEXUS_BROWSER_*
# 重启 APIsupervisorctl restart nexus 或 docker compose restart nexus
bash scripts/local_verify.sh # 开发机
# 生产:bash deploy/pre_deploy_check.sh && bash deploy/deploy-production.sh
```
### Phase D — 验收
| # | 检查项 | 通过标准 |
|---|--------|----------|
| 1 | Worker health | `/health` → ok |
| 2 | 公网站点 | 面板打开 `https://example.com` 有画面 |
| 3 | iframe 曾白屏的站 | 能显示(抽 1~2 个已知站) |
| 4 | SSRF | 面板输入 `http://127.0.0.1` → 明确错误,Worker 日志无成功请求 |
| 5 | 隔离 | 未授权 IP 无法连 Worker 8443 |
| 6 | 持久化 | 刷新 Nexus 后标签/收藏仍在(MySQL |
| 7 | 重启 Worker | Nexus 会话断开可重建,不拖垮主站 |
---
## 6. Nexus 代码实施顺序(与购机并行)
你可**先买服务器**;Agent 在仓库内并行开发,**不阻塞购机**。
| 阶段 | 内容 | 依赖 Worker 机器 |
|------|------|------------------|
| **W1** | `browser-worker/` 独立服务 + Docker + health | 否(本地 Docker 可测) |
| **W2** | SSRF 校验、Playwright screencast、Worker WS 协议 | 否 |
| **W3** | Nexus 主站 `browser_bridge` 桥接 + `/ws/browser` | 否(mock Worker |
| **W4** | 前端 canvas 替换 iframe | 否 |
| **W5** | 你在 Worker VPS 部署 + 主站 `.env` 联调 | **是** |
| **W6** | changelog、audit、门控、生产部署 | 是 |
**购机前可完成 W1W4****W5 需要你的 Worker IP + SSH**。
---
## 7. Worker 服务接口(预定,实现以代码为准)
Nexus 主站 → Worker(内网,Header `X-Nexus-Worker-Key`):
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/health` | 就绪探测 |
| POST | `/v1/sessions` | 创建 `{ session_id, viewport }` |
| DELETE | `/v1/sessions/{id}` | 销毁 |
| WS | `/v1/sessions/{id}/stream` | 双向:帧 + navigate/键鼠 |
管理员浏览器 **只连 Nexus**;不直连 Worker(Worker 不对管理员暴露)。
---
## 8. 预算参考(仅供参考)
| 配置 | 大致月费(国内/海外 VPS) |
|------|---------------------------|
| 2C4G | ¥50150 / $520 |
| 4C8G | ¥100300 / $1540 |
另计:出站流量(画面流持续使用时略高于纯 API)。
---
## 9. 购机 Checklist(打印勾选)
**下单前**
- [ ] 2 vCPU + **4 GB RAM** 及以上
- [ ] Ubuntu 22.04/24.04 x86_64
- [ ] 与 Nexus 主站同区域或近区
- [ ] 可配置安全组 / ufw
- [ ] 独立公网 IP 或与 Nexus **同 VPC 内网**
**到手后**
- [ ] SSH 可登录
- [ ] 记录公网 IP / 内网 IP
- [ ] ufw8443 仅 Nexus 主站 IP
- [ ] 生成 `NEXUS_BROWSER_WORKER_SECRET`
- [ ] 把 §4 信息发给 Agent / 写入本地 secrets
- [ ]`browser-worker/` 合并后执行 Phase BD
**回滚**
- [ ] 主站 `NEXUS_BROWSER_ENABLED=0` 即关闭,Worker 可关机不影响 Nexus
---
## 10. 与现有文档关系
| 文档 | 关系 |
|------|------|
| `server-browser-chromium-design.md` | 功能与安全 SSOT |
| `server-browser-chromium.md` | Nexus 主站 + 前端实现清单 |
| **本文** | **购机、网络、Worker 装机、联调验收** |
购机完成后,在新会话说:「Worker 已就绪,IP 是 …」并提供 SSHsecrets 本地),Agent 从 **W5 联调** 继续。