# 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` 均需: ```env 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` ## 验证 ```bash 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)。