254 lines
8.5 KiB
Markdown
254 lines
8.5 KiB
Markdown
|
|
# 浏览器 Worker 独立服务器 — 采购与部署计划
|
|||
|
|
|
|||
|
|
> **目标**:在**单独一台 VPS** 上运行 Playwright Chromium,Nexus 主站(`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 镜像 | +300~500MB | 主镜像不变 |
|
|||
|
|
| SSRF 风险面 | 与 API/DB 同机 | 隔离在 Worker |
|
|||
|
|
| 扩缩容 | 和 API 绑死 | 可单独升配 Worker |
|
|||
|
|
|
|||
|
|
你已确认:**任意公网 https + Chromium**;**不要 iframe**。Worker 分离是推荐部署形态。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 2. 购机规格(下单前对照)
|
|||
|
|
|
|||
|
|
### 2.1 最低可用(单人运维、≤2 并发会话)
|
|||
|
|
|
|||
|
|
| 项 | 建议 |
|
|||
|
|
|----|------|
|
|||
|
|
| **CPU** | 2 vCPU(x86_64) |
|
|||
|
|
| **内存** | **4 GB**(Chromium 单会话约 300~800MB,留系统与缓冲) |
|
|||
|
|
| **磁盘** | 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 等)。
|
|||
|
|
**不必**买 Windows;Worker 只跑 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/Redis(Worker 不需要) |
|
|||
|
|
|
|||
|
|
> 若 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_*
|
|||
|
|
# 重启 API:supervisorctl 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、门控、生产部署 | 是 |
|
|||
|
|
|
|||
|
|
**购机前可完成 W1~W4**;**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 | ¥50~150 / $5~20 |
|
|||
|
|
| 4C8G | ¥100~300 / $15~40 |
|
|||
|
|
|
|||
|
|
另计:出站流量(画面流持续使用时略高于纯 API)。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 9. 购机 Checklist(打印勾选)
|
|||
|
|
|
|||
|
|
**下单前**
|
|||
|
|
|
|||
|
|
- [ ] 2 vCPU + **4 GB RAM** 及以上
|
|||
|
|
- [ ] Ubuntu 22.04/24.04 x86_64
|
|||
|
|
- [ ] 与 Nexus 主站同区域或近区
|
|||
|
|
- [ ] 可配置安全组 / ufw
|
|||
|
|
- [ ] 独立公网 IP 或与 Nexus **同 VPC 内网**
|
|||
|
|
|
|||
|
|
**到手后**
|
|||
|
|
|
|||
|
|
- [ ] SSH 可登录
|
|||
|
|
- [ ] 记录公网 IP / 内网 IP
|
|||
|
|
- [ ] ufw:8443 仅 Nexus 主站 IP
|
|||
|
|
- [ ] 生成 `NEXUS_BROWSER_WORKER_SECRET`
|
|||
|
|
- [ ] 把 §4 信息发给 Agent / 写入本地 secrets
|
|||
|
|
- [ ] 等 `browser-worker/` 合并后执行 Phase B~D
|
|||
|
|
|
|||
|
|
**回滚**
|
|||
|
|
|
|||
|
|
- [ ] 主站 `NEXUS_BROWSER_ENABLED=0` 即关闭,Worker 可关机不影响 Nexus
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 10. 与现有文档关系
|
|||
|
|
|
|||
|
|
| 文档 | 关系 |
|
|||
|
|
|------|------|
|
|||
|
|
| `server-browser-chromium-design.md` | 功能与安全 SSOT |
|
|||
|
|
| `server-browser-chromium.md` | Nexus 主站 + 前端实现清单 |
|
|||
|
|
| **本文** | **购机、网络、Worker 装机、联调验收** |
|
|||
|
|
|
|||
|
|
购机完成后,在新会话说:「Worker 已就绪,IP 是 …」并提供 SSH(secrets 本地),Agent 从 **W5 联调** 继续。
|