┌──────────────────────────────────────────────────────────┐
│ Ubuntu 24.04 Server │
│ │
│ ┌──────────────┐ ┌───────────────────────────────┐ │
│ │ xvfb │───▶│ HubStudio AppImage │ │
│ │ (虚拟显示) │ │ Local API :6873 │ │
│ │ │ │ CDP debug :<动态端口> │ │
│ │ │ │ (127.0.0.1, 每个环境不同) │ │
│ └──────────────┘ └───────────────────────────────┘ │
│ │ │
│ socat 端口转发 │
│ │ │
│ 0.0.0.0:6874 → 127.0.0.1:6873 │
│ 0.0.0.0:<N+1> → 127.0.0.1:<N> │
└──────────────────────────────────────────────────────────┘
│
外部机器
(Playwright / Puppeteer / Selenium)📝 说明: CDP 调试端口是动态分配的 —— 每个浏览器环境启动后由 /api/v1/browser/start接口返回各自的端口号。上图中<N>为占位符。
| 条件 | 说明 |
|---|---|
| 操作系统 | Ubuntu 24.04 Server (x86_64) |
| 推荐配置 | 8 vCPU、8 GB RAM(支持约 5 个并发环境) |
| 网络 | 需要出站互联网访问;入站开放 6874 端口及所选择的 CDP 转发端口,或使用 SSH 隧道 |
| HubStudio | 已下载客户端(下载地址) |
| Python(可选) | Python 3.8+ 及 pip,用于运行自动化脚本 |
其他语言可安装对应的 Noto 字体家族。
xvfb-run 提供虚拟显示,后台运行 HubStudio:| 参数 | 说明 |
|---|---|
--no-sandbox | 禁用沙盒模式(root 用户或容器环境下必需) |
--headless=true | 无头模式运行,不显示 GUI |
--disable-gpu | 禁用 GPU 加速 |
--ozone-platform=x11 | 指定使用 X11 显示平台 |
--app-id | HubStudio 开发者中心的 APP ID |
--app-secret | HubStudio 开发者中心的 APP Secret |
--login-group-code | 团队 ID(从用户中心获取) |
⚠️ 注意: 请将 ${APP_ID}、${APP_SECRET}、${团队ID}替换为实际值。获取方式见 Step 3。
进程完全初始化可能需要 5–10 秒。
http://127.0.0.1:6873

code为0的响应表示 API 已就绪。
✅ 检查点: HubStudio 服务已完全启动。继续 Step 4 设置远程访问,或者如果脚本运行在同一台服务器上,可直接跳转到 Step 5。
:6873)和 CDP 调试端口都绑定在 127.0.0.1。如果需要从外部机器访问(例如你的开发电脑),需要使用 socat 转发流量。⚠️ 安全风险 — 不要将这些端口暴露到公网。 Local API 的大部分端点没有内置鉴权 CDP 调试端口拥有浏览器的完全远程控制权(读取 Cookie、注入脚本、截屏) 建议: 优先使用 SSH 隧道 代替 socat(参见 4.4 节) 如果必须使用 socat,通过防火墙规则限制到指定 IP 使用 VPN 或云服务商安全组限制入站流量 绝不要在公网服务器上将端口开放到 0.0.0.0而不做 IP 限制
外部机器现在可以通过 http://<服务器IP>:6874访问 API。
debuggingPort(如 36363)。每个环境的端口可能不同。转发它以便外部自动化工具(Playwright、Puppeteer、Selenium)连接:⚠️ 注意: 同时运行多个环境时,确保转发端口不会与其他环境的调试端口冲突。建议使用较大偏移量或专用端口范围。
💡 提示: 在生产环境中,建议在每次 /api/v1/browser/start调用后动态创建 socat 转发,使用返回的debuggingPort。本项目的 Python 脚本中已包含该实现。
如果自动化脚本运行在同一台服务器上,可以跳过 socat,直接连接 127.0.0.1。
http://127.0.0.1:6873/api/v1/browser/start),获取返回的 debuggingPort。