vdi-cloud/docs/cloud-live-integration.md

7.3 KiB
Raw Blame History

现场真实接入

更新:2026-11-09。与原演示环境分开,当前 API 使用 production 模式和独立 PostgreSQL,不生成演示节点、桌面或用户。服务运行在开发机 Docker Desktop;这是接入现场设备的联调环境,尚未迁到独立云服务器。

日常启动与入口

打开 Docker Desktop,在项目根目录运行:

.\tools\start-cloud-live.ps1

代码修改后加 -Build。控制台为 http://127.0.0.1:5182,初始管理员账号密码保存在本机忽略提交的 .local/live/admin-login.txt。原 5181 仍是独立演示环境,不作为现场入口。正式数据库命名卷 vdi-cloud-live_vdi-live-postgres;停止容器不会删除数据,勿执行 down -v。

盒子通过 https://192.168.1.159:8443 访问平台,校验专用 CA;HTTP 控制台端口只映射本机。开发机必须保持运行、内网地址可达,IP 变化时需更新证书、Compose 地址和盒子配置。浏览器从其他机器访问 HTTPS 时,需要信任本机生成的 CA;本轮没有将 CA 安装进系统证书库。

当前现场映射

对象 接入方式
PVE 192.168.1.51 / 节点 starhe 专用 vdi-cloud@pve!console Token;CA 验证开启,证书 DNS 名 starhe 通过容器 extra_hosts 映射实际 IP
Windows VM100 / .70 纳管已有 VM,2560×1440 / 45FPS 请求
麒麟 VM101 / .71 纳管已有 VM,2560×1440 / 30FPS 请求
Ubuntu VM102 / .72 纳管已有 VM,2560×1440 / 45FPS 请求
盒子 .188 / SN ee621cae7199a2e9 Qt 平台适配器 qt-platform/0.2.0,设备 Token、HTTPS 心跳和命令轮询

FPS 是串流请求参数,不是实际性能验收值。桌面与设备 ID 由数据库生成;本机 .local/live/site-state.json 保存本轮映射,不把固定演示 ID 用于真实环境。

PVE Token 继承专用用户权限:根路径 PVEAuditor 负责只读发现,只有 /vms/100、/vms/101、/vms/102 授予自定义 VDICloudPower(VM.Audit VM.PowerMgmt)。子路径 ACL 会覆盖继承权限,因此该角色同时包含 VM.Audit。平台没有 PVE root 密码、宿主重启、VM 创建、删除、改硬件权限。

终端实际流程

  1. 管理员登记 SN,生成一次性激活密钥。盒子读取 ~/.config/vdi-terminal/platform.json,通过注册接口取得设备 Token,以 0600 原子保存并删除激活密钥。
  2. 每 30 秒发送真实心跳;每 15 秒在选择页刷新授权桌面;每 3 秒领取远程命令。平台配置存在时不回退到本地授权或本地票据,列表与连接参数由平台维护。
  3. 点击连接后申请、消费单次票据。消费只登记“连接中”,Moonlight 实际画面就绪后才上报 connected,计入活动连接。
  4. 自然退出、连接失败、管理员重置都会按 sessionId 释放预约。结束事件和回执写入待发队列,网络恢复后重试;已执行的命令不自动重放。旧会话事件或迟到的重置回执不能清理新会话。
  5. “重置会话”等待 Moonlight 进程真正退出后回执。“收集日志”上传受限诊断信息与脱敏日志尾部;管理员/运维可在成功任务详情下载,只读角色不可读取。
  6. “重启盒子”通过固定 sudo -n /usr/bin/systemctl reboot 调用,记录原 boot ID,下一次启动确认 boot ID 改变后才回执;未做现场重启验收。没有远程任意命令或 shell 参数接口。

本轮由 Qt 直接接入已有设备 API;未将它称为 Rust Agent 或 MQTT。Moonlight/Sunshine 继续使用原有配对;平台票据不是 Sunshine 的新认证方式。没有修改串流编码、光标、显示守护、USB 隧道配置。

初次配置其他现场

安装 Python 的 paramiko、cryptography 后,先确认 SSH known_hosts 中存在核验过的 PVE 主机公钥,再执行:

python tools/provision-pve-access.py --host <PVE-IP> --vmids <VM-ID...> --output .local/live/pve-access.json
python tools/prepare-live-config.py --ip <平台内网-IP> --pve-hostname <PVE证书内DNS名称> --pve-ip <PVE-IP>
.\tools\start-cloud-live.ps1 -Build

PVE SSH 密码通过交互提示或 VDI_PVE_SSH_PASSWORD 读取;工具不在控制台打印 Token。已存在配置或账号时会停止,防止覆盖已有身份。不要将本轮现场的 .local/live 文件复制给其他客户。

从控制台发现并纳管 VM、登记设备和创建用户授权。盒子配置格式如下,路径按现场用户调整:

{
  "url": "https://平台内网地址:8443",
  "caFile": "/home/armbian/.config/vdi-terminal/platform-ca.pem",
  "activationSecret": "控制台生成的一次性密钥"
}

配置和证书通过受信 SSH 安装;配置权限 0600。注册成功后由终端维护 deviceToken、待发事件和回执,不再手工覆盖。备份时同时保留数据库、PVE Token、平台 CA 私钥和终端身份文件,均按凭据管理。

盒子回退

本轮初始备份路径在盒子 ~/vdi-terminal/backups/platform-live-current-backup 指向的目录。备份包括接入前 kiosk-shell、client.conf、desktops.json。维护时先结束串流,再原子恢复该 kiosk-shell 并将 platform.json 移至受限备份目录,由原有监控进程重启 kiosk。恢复后是原本的本地 POC 模式,不再从平台授权。无需回退 Moonlight 二进制或重启 VM。

只撤销 PVE 接入时,可禁用 vdi-cloud@pve 用户或移除 console Token;不要删除 root 或其他账号。独立部署、用户管理与密码轮换、登录限流、备份恢复演练、设备撤销/重新激活、OTA 和多租户仍属于后续产品化范围。

本轮现场验收

  • PVE 严格 CA/DNS 验证通过,发现并纳管三台真实 VM;节点/VM 状态每 30 秒自动同步。
  • 盒子实际注册,心跳上报 qt-platform/0.2.0;控制台显示 1 台在线,串流请求使用现场原有配对。
  • Windows、Ubuntu、麒麟分别从真实授权列表申请并消费票据,实际画面就绪事件被平台记录;控制台分别下发 reset-session,Moonlight 实际退出后收到成功回执,最终活动连接均归零。
  • 首次 Windows 重置因同步检查异步退出而错误返回 failed,已保留任务;修复为异步等待后重测通过,未删除失败记录。
  • Go 测试与专用 PostgreSQL 集成测试、go vet 通过,新增覆盖会话事件隔离、预约不冒充活动串流、日志读取权限与迟到回执不清理新会话。盒子 CTest 3/3、前端静态检查、类型检查、单元测试和 Docker 构建通过。
  • 现场 Playwright 页面流程通过:正式登录、3 台真实桌面、真实设备在线、下发日志采集、收到成功回执并下载实际 boot ID/uptime/日志内容。截图见 真实总览、真实桌面。
  • 现场 kiosk-shell SHA256:2cca9d2d183c2f34f0f6172db207649decb2799414f9443043d175bbb19d33a1。Moonlight 二进制未更换。

浏览器现场用例独立执行,避免运行演示库用例操作真实 VM:

cd console
npx playwright test --config=playwright.live.config.ts

该用例读取本机私有初始账号文件,验证正式登录、真实桌面/设备以及日志收集下载,不发 VM 电源操作。完整演示 E2E 仍要求 demo 模式;数据库集成测试仍只指向专用 vdi_test。