# 巡查 — 远程浏览器 + 生产基线

**日期**：2026-06-12  
**范围**：生产 `api.synaglobal.vip`、Worker `66.154.115.131:8443`、工作区浏览器改动、审计 F1/F3 闭环  
**关联审计**：`docs/audit/2026-06-12-remote-browser-worker.md`

## 进度条

| 步骤 | 状态 |
|------|------|
| 生产 `/health` + prod_probe | ✅ 全通过 |
| 浏览器后端配置 | ✅ `BROWSER_ENABLED=1`，Worker URL 已配 |
| 浏览器前端 bundle | ❌ **未部署** |
| Worker 可达 / 暴露面 | ⚠️ 公网可访问 `/health` |
| 审计 P1 闭环 | ❌ F1 SSRF、F3 防火墙未修 |
| 工作区 git | ⚠️ 浏览器源码 largely 未 commit |
| 本地单测 | ✅ browser 7 + watch_pins 9 = 16 passed |

## 生产探针（`scripts/prod_health_check.sh`）

```text
✓ external /health → ok
✓ external /app/ → HTTP 200
✓ login / health/detail / alert-history / schedules / cron / main bundle
=== All production probe checks passed ===
```

容器：`nexus-prod-nexus-1` **Up ~4min (healthy)**（巡查时刚重启不久）。

## 远程浏览器链路

| 检查项 | 结果 | 说明 |
|--------|------|------|
| 主站 `/health` | `ok` | 公网 + 容器内均 OK |
| 容器 `settings.BROWSER_ENABLED` | `1` | Worker URL `http://66.154.115.131:8443` |
| 主站 → Worker `/health` | `ok` | 容器内 curl 成功 |
| 公网 → Worker `/health` | **可达** | `{"status":"ok","sessions":1,"max_sessions":2}` |
| 无 Key `POST /v1/sessions` | `422` | 非 401，但无密钥无法建会话 |
| 生产 `web/app` 含 `GlobalBrowser` / `ws/browser` / screencast | **无** | 146 个 JS，grep 零命中 |
| 侧栏「浏览器」/ 地球按钮 UI | **未上线** | 需 `vite build` + `sync_webapp_to_container.sh` |

**结论**：后端与 Worker **已启用**，但 **SPA 未同步**，管理员面板仍无远程浏览器入口；与「连不上」用户反馈一致（旧 bundle 无 canvas 客户端）。

## 审计项复查（未闭环）

| ID | 审计结论 | 巡查结果 |
|----|----------|----------|
| **F1** | 页内点击/重定向无 SSRF 复验 | **未修** — `session_manager.py` 仅 `NAVIGATE` 调 `validate_navigation_url` |
| **F3** | Worker `ufw` 过宽 | **未确认修** — 公网 curl `/health` 成功，8443 仍暴露；Worker SSH 本机无凭据 |
| F4 | delete 失败静默 | 未改 |
| F5 | 内存 session_registry | 可接受（单进程 Docker） |

Worker 当前 **`sessions:1`**：可能存在陈旧会话占槽（`max_sessions=2`），建议 Worker 侧重启或调 API 清理。

## 工作区状态

浏览器相关文件多为 **未跟踪 / 未提交**（`browser-worker/`、`GlobalBrowserPanel.vue`、`browser_session.py` 等）。生产后端已跑新镜像，但 **前端构建产物未进容器**，形成 **前后端版本错位**。

本地：

```bash
pytest tests/test_browser_url_safe.py tests/test_browser_ui_state.py tests/test_watch_pins.py -q
→ 16 passed
```

## 发现汇总

| # | 严重度 | 问题 | 建议 |
|---|--------|------|------|
| 1 | **P0 体验** | 前端未部署，用户无法使用浏览器 | `cd frontend && npx vite build` → `deploy/sync_webapp_to_container.sh` |
| 2 | **P1 安全** | Worker 8443 + `/health` 公网可见 | 收紧 ufw 仅 `20.24.218.235`；`/health` 加 Key 或禁公网 |
| 3 | **P1 安全** | F1 页内导航 SSRF 缺口 | `framenavigated` 逐跳校验 |
| 4 | P2 | Worker `sessions:1` 占槽 | 清理会话或等待 idle 超时 |
| 5 | P2 | 源码未 commit | 部署稳定后 `git add` 源码+文档（不含 `web/app/assets` 洪流） |

## 建议执行顺序

1. **同步前端**（解除 P0）  
2. **收紧 Worker 防火墙**（F3）  
3. **实现 F1** 后复审计  
4. **commit** 源码与 changelog/audit/report  

## 验证命令（复巡）

```bash
bash scripts/prod_health_check.sh
ssh nexus 'sudo docker exec nexus-prod-nexus-1 python3 -c "from server.config import settings; print(settings.BROWSER_ENABLED)"'
ssh nexus 'sudo docker exec nexus-prod-nexus-1 grep -rl ws/browser /app/web/app/assets/ | head -1'
curl -s http://66.154.115.131:8443/health   # 修 F3 后应仅主站可达
```
