forked from wangbo/easyai
test(deploy): 记录转换服务测试发布与浏览器验收
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
# 模型转换服务测试环境发布验收
|
||||
|
||||
2026-10-04,`https://demo.51easyai.com`,主机 `8.218.158.189`,部署目录 `/root/easyai`。
|
||||
测试环境已发布并完成以下验收;生产未部署,本次仅推送固定版本镜像,没有推送 `latest`。
|
||||
|
||||
## 发布和兼容升级
|
||||
|
||||
- 部署实现:`2a1192eb7ec822773f55af96fa12e06bf96774a8`。后端补丁:`be56a7e0ec79d1a1e7420d870709014ed4bf010a`。
|
||||
- 初次从旧部署 `f04bb5e` 更新,实际复现了定制 Compose 和未跟踪配置阻断旧脚本拉取,以及 updater 占用 API 固定地址的问题。首次使用新版 `update.sh` 的旧配置迁移入口完成备份、语义合并和更新,再由同一脚本部署服务;没有手动修改数据库或替代脚本启动业务容器。
|
||||
- 最终更新命令:`UPDATE_MODE=image UPDATE_NON_INTERACTIVE=1 UPDATE_RELEASE_VERSION=3.23.0.20261003.1 UPDATE_SERVICES='easyai-server easyai-web model-conversion-worker' bash /root/easyai/update.sh`。
|
||||
- API 镜像重新构建。前端 SSR、no-SSR 和 Worker 发布 `.1` 版本别名,镜像摘要与原版本相同,其 OCI 构建版本仍为 `3.23.0.20261003`;测试主机运行 SSR。完整摘要见上级发布记录及 `patch-deployment.json`。
|
||||
- API、前端、Worker、updater 均健康;版本接口为 `3.23.0.20261003.1`,主页、健康及更新就绪接口均 HTTP 200。补丁更新中的 13 个非目标容器保留容器 ID 和启动时间,Nginx 及原鉴权、Mongo、Redis配置已核验保留。
|
||||
- 旧配置备份保存在主机受限目录 `data/deployment-backups/legacy-update-20261003-075918-g3q8cib5`;本机记录不含配置密钥。后续固定版本更新直接使用部署目录的 `update.sh`。
|
||||
|
||||
## 浏览器上传问题的复现和修复
|
||||
|
||||
实际进入普通 `/ai/canvas/:projectId`,从文件输入选择 OBJ,确认米、默认轻量副本和性能优先。修复前,上传计划返回 HTTP 201,但本地存储合法地省略了 `headers`;浏览器在 `Object.entries(upload.headers)` 抛出 `TypeError: Cannot convert undefined or null to object`,未发送文件 PUT,未进入转换。
|
||||
|
||||
修复仅在模型转换接口把省略的请求头变为 `{}`,保留云存储提供的签名头,通用存储行为不变。真实服务回归测试修复前 1 失败、1 通过;修复后转换协议 13 项和存储既有行为 27 项全部通过。证据为 `browser/upload-regression.json`,失败截图为 `browser/import-failed.png`。
|
||||
|
||||
修复后真实 Chrome 通过普通画布执行了文件 PUT、资源完成、CanvasTask、独立 Worker 转换及 WebGL 加载,原始网络证据保存在 `browser/uncached-import.json`。没有隐藏界面、替换真实加载器或强制点击。
|
||||
|
||||
## 实际结果
|
||||
|
||||
| 验收 | 结果 | 原始记录 |
|
||||
| --- | --- | --- |
|
||||
| 默认素体 | 站立身高 1.72 米 | `browser/results.json` |
|
||||
| OBJ 导入 | 20 × 0.2 × 20 米,默认轻量副本、性能优先 | `browser/uncached-import.json`、`browser/import.png` |
|
||||
| 实际缩放 | 0.05 → 1 × 0.01 × 1;10 → 200 × 2 × 200;20 → 400 × 4 × 400;恢复 1 → 20 × 0.2 × 20 米 | `browser/transform-save.json`,数值来自实际控件读数 |
|
||||
| 保存与全新浏览器重开 | 米制 `sceneState` 保留轻量版本、倍率 1、资源 ID;尺寸 20 × 0.2 × 20 米;场景 JSON 3239 字节,没有 Base64;页面无异常 | `browser/results.json`、`browser/saved-reopened.png` |
|
||||
| 约 80 万面 GLB,补丁环境重测 | 798848 → 100000 三角面;19203544 → 714896 字节;20 × 0.200000003 × 20 → 20 × 0.199977756 × 20 米;高度误差约 0.022 毫米;产物 SHA 校验通过 | `patch-conversion/results.json` |
|
||||
| 4K 贴图 | 4096² → 1024²;生成 KTX2 和 PNG 兼容产物;保留尺寸 | `texture-4096/results.json`,原版本实测,补丁复用同一 Worker 镜像 |
|
||||
| 骨骼和动画 | 100001 三角面不减面;3 个节点、1 套骨骼、1 个动画保留;尺寸保留 | `skin-animation/results.json`,原版本实测,补丁复用同一 Worker 镜像 |
|
||||
| Worker 专属接口与付费通道 | 匿名和普通登录 token 都不能调用产物管理接口,均 HTTP 403;混元通道关闭 | `patch-worker-access.json` |
|
||||
|
||||
验收分阶段执行:先完成真实导入、变换和普通保存,再以全新 Chrome 会话重开并检查。保存会自动关闭编辑器;已有图片输出的节点通过编辑按钮重开,双击图片按原契约打开图片预览。米制 fixture 使用正式 `sceneState` 字段。早期脚本对这些入口的错误假设已纠正,不计作业务失败或成功证据。
|
||||
|
||||
## 耗时和资源边界
|
||||
|
||||
- 转换协议定向 Nx:2.38 秒(13 项,Jest 0.84 秒);存储定向 Nx:1.87 秒(27 项,Jest 0.638 秒)。
|
||||
- Shared 构建 0.66 秒,API 定向 Nx 构建 20.83 秒。正式 Linux amd64 Dockerfile 构建、固定版本推送及实际部署均已完成;未记录本次 Docker 构建和浏览器全链路的完整墙钟耗时。
|
||||
- 最后一次 GLB 链路共 71.932 秒:上传 18.502 秒,转换、任务等待和产物下载共 52.444 秒。该数值包含网络与存储开销,是一次功能复验,不是受控 A/B/C benchmark,也不能单独解读为减面计算耗时。
|
||||
- 转换及下载期间的 12 个本机 API 可用性采样全部 HTTP 200,中位数约 2.17 毫秒,最大约 6.17 毫秒。见 `patch-runtime-samples.json`;这不能证明满载 P95 退化目标。
|
||||
- Worker 实际限制:2 CPU、4 GiB、并发 1、PID 64、只读根文件系统、无主机端口;共享内部鉴权配置匹配。见 `patch-deployment.json`。测试主机仅 2 CPU、3.576 GiB 实际内存、没有 swap,不能把本轮小规模通过当作生产容量结论。
|
||||
- 旧配置迁移、固定版本及 Bash/PowerShell 更新定向测试通过,分别约 1.28 秒、21.045 秒;测试主机的旧脚本冲突和新版脚本更新另外经过真实执行。没有用命令 mock 替代真实发布验收。
|
||||
|
||||
## 尚未覆盖
|
||||
|
||||
客户原始 GLB、其他实际硬件、Worker 满载时的 API 基线对照、20 次循环内存趋势,仍需独立验收。测试主机没有重新执行全部旧场景/模板交互,也没有完成编辑器、机位预览、图片与视频的逐像素对应点检查;先前定向/本地记录仅代表其原环境。不得据此声称视觉无损、全部性能目标或生产验收已通过。原质量记录中的国际化历史缺失项仍未改动。
|
||||
Reference in New Issue
Block a user