fix(models): Assimp 缺失时给出可操作报错,部署脚本自动安装

现象:服务器未安装 Assimp,上传 PMX 压缩包只得到
  GLB 直出:导出失败(ENOENT):spawn assimp ENOENT
  glTF 直出:导出失败(ENOENT):spawn assimp ENOENT
用户看不出缺什么、怎么装,也不知道只传 glb/vrm 其实不需要它。

修复:
1. 新增 src/common/assimp.ts:按 ASSIMP_BIN -> PATH -> /usr/bin、/usr/local/bin
   等常见目录定位可执行文件(只认文件,不认同名目录),转换前先预检;
   找不到就一次性给出各发行版安装命令、查过的路径与替代办法,
   不再打两条 ENOENT。动作预处理(FBX/glTF -> BVH)复用同一文案。
2. 新增 deploy/assimp-lib.sh:install.sh 按发行版自动安装
   (apt-get / dnf / yum / zypper / apk / pacman),装在非常规目录时把绝对
   路径写入 deploy/.env 的 ASSIMP_BIN;装不上只告警不中止,可用
   SKIP_ASSIMP_INSTALL=1 跳过。check-access.sh 自检增加 Assimp 一行。
3. /health 增加 assimp.path;管理端「概览 -> 服务健康」显示 Assimp 状态,
   不可用时给出安装提示。
4. 新增 test/assimp-locate.spec.ts 13 项;强化「assimp 不存在」用例断言安装命令。
   测试规模 12 文件 / 193 项。
5. 版本 0.2.2,README(.md/.txt)/DSH.md 同步(前置要求、FAQ、环境变量说明)。
This commit is contained in:
opendance
2026-09-16 02:55:32 +08:00
parent e9de740d66
commit da03777995
20 changed files with 579 additions and 53 deletions
+34
View File
@@ -32,6 +32,8 @@ cd "$SRC_DIR"
# 载入前先查一遍,给出带行号与改法的中文提示。
# shellcheck source=deploy/env-lib.sh
. "$SRC_DIR/deploy/env-lib.sh"
# shellcheck source=deploy/assimp-lib.sh
. "$SRC_DIR/deploy/assimp-lib.sh"
APP_DIR="${APP_DIR:-/opt/opendance}"
SERVICE_USER="${SERVICE_USER:-opendance}"
@@ -174,6 +176,38 @@ log "运行用户:$SERVICE_USER"
log "上传目录:$STORAGE_DIR"
log "目标数据库:${DB_HOST}:${DB_PORT:-3306}/${DB_NAME}(现有实例,本脚本不会创建或管理数据库)"
# ---------- 0.5 可选外部依赖:Assimp ----------
# 逻辑与文案在 deploy/assimp-lib.sh(可单独测试):Assimp 是外部命令行工具
# (BSD-3-Clause),不在 Node 依赖里,只影响 .pmx/.fbx 模型转换与 FBX/glTF
# 动作预处理;装不上不中止安装,但必须当场给出结论与可复制的安装命令。
log "检查 Assimp(可选依赖:.pmx/.fbx 模型转换、FBX/glTF 动作预处理需要)"
ASSIMP_PATH="$(opendance_assimp_resolve || true)"
if [ -z "$ASSIMP_PATH" ] && [ "${SKIP_ASSIMP_INSTALL:-0}" != "1" ]; then
log "未找到 Assimp,尝试用系统包管理器安装:$(opendance_assimp_install_cmd)"
if opendance_assimp_install >/dev/null 2>&1; then
ASSIMP_PATH="$(opendance_assimp_resolve || true)"
else
warn "自动安装 Assimp 失败(离线环境或该发行版没有对应软件包)"
fi
fi
if [ -n "$ASSIMP_PATH" ]; then
log "Assimp:$ASSIMP_PATH($("$ASSIMP_PATH" version 2>/dev/null | head -1))"
if opendance_assimp_needs_env_path "$ASSIMP_PATH"; then
log "该目录不在服务默认 PATH 中,把 ASSIMP_BIN=\"$ASSIMP_PATH\" 写入 deploy/.env"
if grep -qE '^[[:space:]]*#?[[:space:]]*ASSIMP_BIN=' deploy/.env; then
sed -i "0,/^[[:space:]]*#\?[[:space:]]*ASSIMP_BIN=.*/s||ASSIMP_BIN=\"$ASSIMP_PATH\"|" deploy/.env
else
printf '\nASSIMP_BIN="%s"\n' "$ASSIMP_PATH" >> deploy/.env
fi
fi
else
warn "未找到 Assimp:上传 .pmx / .fbx(或含它们的压缩包)会转换失败,FBX / glTF 动作也无法预处理。"
warn " 手动安装:$(opendance_assimp_install_cmd)"
warn " 只上传 .glb / .vrm 模型与 .bvh / .vmd / 关键点 JSON 动作则不受影响。"
warn " 已装好但不在 PATH?在 deploy/.env 里设置 ASSIMP_BIN 为绝对路径后重跑本脚本。"
warn " 也可用 SKIP_ASSIMP_INSTALL=1 跳过自动安装。"
fi
# ---------- 1. 系统用户与目录 ----------
if ! id -u "$SERVICE_USER" >/dev/null 2>&1; then
log "创建系统用户 $SERVICE_USER"