Files
easyai/system-update/releases/model-conversion-20261003/test/README.md
T

6.3 KiB
Raw Blame History

模型转换服务测试环境发布验收

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 次循环内存趋势,仍需独立验收。测试主机没有重新执行全部旧场景/模板交互,也没有完成编辑器、机位预览、图片与视频的逐像素对应点检查;先前定向/本地记录仅代表其原环境。不得据此声称视觉无损、全部性能目标或生产验收已通过。原质量记录中的国际化历史缺失项仍未改动。