# 2026-06-10 — 浏览器内 RDP（guacd）

## 摘要

将 RDP 从原生 `.rdp` 下载改为 **浏览器内远程桌面**：`guacd` 侧车 + Guacamole WebSocket 桥 + `guacamole-common-js` 画布。

## 动机

用户需要浏览器 RDP，而非本机 mstsc。

## 涉及文件

- `docs/design/specs/2026-06-10-rdp-browser-guacd-design.md`
- `docker/docker-compose.prod.yml`、`docker-compose.yml` — `guacd` 服务
- `server/config.py` — `GUACD_HOST` / `GUACD_PORT`
- `server/infrastructure/guacamole/tunnel.py`
- `server/api/rdp.py` — `WS /ws/rdp/{id}`
- `server/api/servers.py` — `GET /rdp-connect`，移除 `rdp-file`
- `server/utils/rdp_config.py` — RDP 密码加密、`build_guacamole_connect_string`
- `frontend/src/pages/RdpPage.vue`、`composables/rdp/useRdpSession.ts`
- `frontend/package.json` — `guacamole-common-js`

## 迁移 / 重启

- 生产需 `docker compose` 拉起 **guacd** 并设置 `NEXUS_GUACD_HOST=guacd`
- Nexus 容器需重建/重启以加载新代码
- 服务器需配置 **RDP 密码**（浏览器连接必需）

## 验证

```bash
pytest tests/test_rdp_config.py -q
cd frontend && npm install && npm run type-check
```

浏览器：侧栏「3389远程」→ 选择服务器 → 画布连接；服务器列表「RDP」仍跳转同页。

## 安全说明

- 使用常规 access JWT 作为 WS `token`（无专用 rdp-token）
- **无** RDP 连接级审计（与 WebSSH 会话审计区分）
- `rdp-connect` 向已登录管理员返回解密密码（仅 HTTPS 环境使用）
