Files
Nexus/docs/changelog/2026-06-12-remote-browser-worker-deploy.md
T
Nexus Agent e833b923c8 feat(browser): 远程浏览器 Worker 桥接与顶栏固定悬浮窗
接入 Playwright Worker、会话 WebSocket 与全局浏览器面板(固定于 App Bar 下);
含验证码 stealth、设置项默认音与 URL 安全校验;附带 worker 部署与设计文档。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-12 06:49:20 +08:00

2.6 KiB
Raw Blame History

2026-06-12 远程浏览器(Playwright Worker)上线

摘要

66.154.115.131 部署 browser-workerPlaywright 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/.envdocker/.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/.envWORKER_SECRET 同上)

防火墙:Worker 8443 已对 Nexus 主站 IP 20.24.218.235 放行。

迁移 / 重启

  • 无 DB 迁移(复用 admin_ui_preferences / embedded_browser
  • Workerdocker 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_OKexample.com JPEG ~4KB)。