feat(models): 模型压缩包自动转换 + 默认模型写进源码;首次启动 .env 引导;HOST 默认 0.0.0.0
需求 1:模型上传支持压缩包(MMD 模型包) - common/zip-reader.ts:纯 TS 极简 ZIP 读取器(EOCD/中央目录、STORE+DEFLATE、 ZIP64 大小字段、Shift-JIS/GBK 文件名回退、拒绝 zip-slip 与加密条目) - models/model-convert.ts:解压 → 选主模型(指名字/最浅/最大)→ Assimp 导出 FBX → **assimp info 回读校验**(Assimp 对带蒙皮大骨架模型会写出损坏文件: 实测 714 骨骼 PMX 导出退出码 11、产物回读报 FBX-DOM no Objects dictionary found) → 失败自动回退 GLB;两种都失败则 422 - models/glb-textures.ts:把 Assimp 写成外部 URI 的贴图内嵌进 GLB 的 BIN chunk, 保证模型库里单文件即可加载(否则是白模) - 溯源:压缩包原件存为 model-archive 资产;models 新增 source_asset_id / conversion_note(迁移 1789450000000-AddModelConversionFields,已在真实库上 验证 up/down 可逆) - 默认模型:转换成功且 autoDefault 不为 false → is_primary=1 + published, 并把身份(名称/格式/产物 sha256)写进源码 src/config/default-model.ts; resolveDefaultModelId 增加 DEFAULT_MODEL_ID 与源码种子两步(按 sha256 匹配, 换库仍有效),实测库中有 2 个 VRM 时默认模型仍解析为该 GLB - scripts/import-default-model.mjs:运维 CLI(上传 zip 并写源码 / --write-source-only) - 修复 multipart 中文文件名乱码(upload.util.decodeUploadName) - DTO/契约新增 conversionNote、fileSha256;管理端 accept 增加 .zip 并展示转换来源 需求 2:首次启动 .env 引导 - deploy/init-env.sh:交互式逐项填写 8 个键(回车保留默认、口令不回显不加引号、 端口校验、mysql2 连通性自检且口令只经环境变量传递、只改这 8 个键并保留模板注释、 chmod 600、结尾打码摘要);--force/--check/-y/-i/--skip-db-check 等开关; 非交互(-y、OPENDANCE_NONINTERACTIVE、stdin 关闭)绝不提问、读取带超时 - install.sh 缺 .env 时改为调用引导,失败才 die 需求 3:默认监听 0.0.0.0 - 代码默认值、两份 .env 模板、install.sh、init-env.sh 五处一致,并新增测试守护 (未设置 HOST 时为 0.0.0.0;两份模板都写着 HOST=0.0.0.0) 契约:rest-api / data-models / model-formats → 0.3.0,database → 0.2.0(另两库已同步) 验证:125 项单测通过(7 文件);契约 6 项与 29 条路由一致;typecheck/build 通过; 真实包端到端 HTTP 201 / 0.89s / format=glb / isPrimary=true / published; GLB 1,152,464 字节、1 mesh / 240 nodes / 1 skin(238 joints) / 2 张内嵌贴图; 迁移 revert→run 实测可逆且数据无损恢复
This commit is contained in:
+19
-5
@@ -92,22 +92,36 @@ http_ok() {
|
||||
[ "$(id -u)" -eq 0 ] || die "需要 root 权限(安装系统服务、创建服务用户)。
|
||||
请以 root 身份执行,例如: su -c 'bash deploy/install.sh' 或 sudo bash deploy/install.sh"
|
||||
|
||||
# 缺少 deploy/.env 时,若安装目录里已有上次安装留下的配置,直接复用。
|
||||
# 否则用户每次重新解压发布包都得重填一遍数据库口令(本次就是这么被绊住的)。
|
||||
# 缺少 deploy/.env 时:
|
||||
# 1) 若安装目录里已有上次安装留下的配置,直接复用(保持原有语义);
|
||||
# 2) 否则调用 deploy/init-env.sh 做初始化:
|
||||
# - 交互终端 / 管道输入 → 逐项询问并写回 deploy/.env;
|
||||
# - 非交互(CI、`</dev/null`、--yes)→ 只做缺字段校验并以非 0 退出,
|
||||
# 由本脚本 die 出清晰的错误,绝不阻塞。
|
||||
# 这样既保留了「复用上次安装配置」的语义,也避免用户每次重新解压发布包
|
||||
# 都得重填一遍数据库口令(本次就是这么被绊住的)。
|
||||
if [ ! -f deploy/.env ]; then
|
||||
if [ -f "$APP_DIR/deploy/.env" ]; then
|
||||
log "未找到 deploy/.env,复用上次安装的配置:$APP_DIR/deploy/.env"
|
||||
cp "$APP_DIR/deploy/.env" deploy/.env
|
||||
else
|
||||
die "缺少 deploy/.env,请先:
|
||||
cp deploy/.env.example deploy/.env && vi deploy/.env
|
||||
log "未找到 deploy/.env,启动初始化引导(deploy/init-env.sh)"
|
||||
if ! bash "$SRC_DIR/deploy/init-env.sh"; then
|
||||
die "deploy/.env 初始化失败或必填项缺失。
|
||||
可手动填写后重新执行本脚本:
|
||||
cp deploy/.env.example deploy/.env && vi deploy/.env
|
||||
|
||||
需要填写的内容(数据库连接信息由部署方提供):
|
||||
DB_HOST 现有 MySQL / MariaDB 地址
|
||||
DB_PORT 端口,默认 3306
|
||||
DB_USER 数据库账号
|
||||
DB_PASS 数据库口令(注意不要加引号)
|
||||
DB_NAME 数据库名"
|
||||
DB_NAME 数据库名
|
||||
|
||||
非交互环境请先准备好 deploy/.env,再执行:
|
||||
bash deploy/init-env.sh --non-interactive"
|
||||
fi
|
||||
[ -f deploy/.env ] || die "deploy/init-env.sh 结束后仍缺少 deploy/.env"
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
Reference in New Issue
Block a user