e833b923c8
接入 Playwright Worker、会话 WebSocket 与全局浏览器面板(固定于 App Bar 下); 含验证码 stealth、设置项默认音与 URL 安全校验;附带 worker 部署与设计文档。 Co-authored-by: Cursor <cursoragent@cursor.com>
2.6 KiB
2.6 KiB
2026-06-12 远程浏览器(Playwright Worker)上线
摘要
在 66.154.115.131 部署 browser-worker(Playwright Chromium),Nexus 主站桥接 WebSocket + canvas 浮动面板,替代已移除的 iframe 方案。
动机
运维需在面板内完整浏览公网站点(不受 X-Frame-Options 限制);Chromium 运行在独立 Worker,隔离 SSRF 与内存压力。
涉及文件
| 区域 | 文件 |
|---|---|
| Worker | browser-worker/* |
| 后端 | server/api/browser.py, browser_session.py, server/infrastructure/browser/*, server/utils/browser_url_safe.py, server/utils/browser_ui_state.py, server/config.py, server/main.py |
| 前端 | GlobalBrowserPanel.vue, useGlobalBrowser.ts, useRemoteBrowserSession.ts, BrowserPage.vue, App.vue, router, ServersPage.vue |
| 测试 | tests/test_browser_url_safe.py, tests/test_browser_ui_state.py |
部署拓扑
管理员 SPA → Nexus (20.24.218.235) → Worker (66.154.115.131:8443) → 公网
生产配置(勿提交 git)
主站 /var/lib/nexus/.env 与 docker/.env.prod 均需:
NEXUS_BROWSER_ENABLED=1
NEXUS_BROWSER_WORKER_URL=http://66.154.115.131:8443
NEXUS_BROWSER_WORKER_SECRET=<与 Worker .env WORKER_SECRET 相同>
NEXUS_BROWSER_MAX_SESSIONS=2
NEXUS_BROWSER_IDLE_TIMEOUT_SEC=1800
Worker:/opt/nexus-browser-worker/.env(WORKER_SECRET 同上)
防火墙:Worker 8443 已对 Nexus 主站 IP 20.24.218.235 放行。
迁移 / 重启
- 无 DB 迁移(复用
admin_ui_preferences/embedded_browser) - Worker:
docker compose up -d --build - 主站:重建/重启
nexus-prod-nexus-1+ 同步web/app
验证
venv/bin/pytest tests/test_browser_url_safe.py tests/test_browser_ui_state.py -q
cd frontend && npm run type-check && npx vite build
curl -H "Authorization: Bearer $TOKEN" https://api.synaglobal.vip/api/browser/status
# → enabled:true, worker_ok:true
浏览器:左下角地球按钮 / 侧栏「浏览器」;输入 https://example.com 应出现 canvas 画面。
回滚
NEXUS_BROWSER_ENABLED=0 重启主站;Worker docker compose down 不影响 Nexus 其他功能。
2026-06-12 热修 — 画面不显示 / 连不上
根因:Worker CDPSession 误用 wait_for_event(不存在),screencast 立即崩溃;断线后会话残留导致 409。
修复:browser-worker/session_manager.py 改为 cdp.on("Page.screencastFrame") + 队列;POST /api/browser/sessions 创建前清理该管理员陈旧会话。
验证:主站容器内 WS 测试 SCREENCAST_OK(example.com JPEG ~4KB)。