Files
opendance-web/web-server/.env.example
T
zijunchiang e4351c5062 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 实测可逆且数据无损恢复
2026-09-15 13:55:54 +08:00

62 lines
2.6 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ============================================================
# OpenDance Studio Web 服务端 —— 环境变量样例
# 复制为 .env 后填写。.env 已被 .gitignore 忽略,禁止提交。
# ============================================================
# ---- 服务 ----
NODE_ENV=production
# 软件 API 端口:Windows/Godot 客户端、Android App 调用,
# 只提供 /api、/health、/static、/contracts,不提供管理端页面
PORT=3000
# 管理端端口:浏览器访问,提供管理端 SPA 页面 + 上面全部接口。
# 默认取 PORT + 1;与 PORT 设为相同值即为单端口兼容模式(管理页面与接口同端口)。
ADMIN_PORT=3001
# 监听地址(软件 API 端口)。本地开发用 0.0.0.0(便于同网段设备联调);
# 生产环境若反代与后端同机,建议改为 127.0.0.1
HOST=0.0.0.0
# 管理端监听地址,默认与 HOST 相同。
# 需要"接口对外、管理端只对本机开放"时可单独设置,例如 ADMIN_HOST=127.0.0.1
# ADMIN_HOST=0.0.0.0
# 管理端静态站点目录(默认取 ../admin)。管理端页面只在 ADMIN_PORT 上提供,
# 反向代理把浏览器请求转发到 ADMIN_PORT、客户端接口请求转发到 PORT,
# 见 deploy/proxy/README.md
ADMIN_DIR=../admin
# ---- 现有 MySQL 实例(外部提供,本项目不部署 MySQL)----
# 当前部署:MariaDB 10.11 @ 192.168.150.10
DB_HOST=192.168.150.10
DB_PORT=3306
DB_USER=dpendance
DB_PASS=<部署方提供>
DB_NAME=dpendance
# 生产环境必须为 false,表结构一律走 TypeORM migration
DB_SYNCHRONIZE=false
DB_LOGGING=false
# ---- 文件存储 ----
# 上传文件的落盘目录(本机路径,生产环境建议用部署脚本的默认值
# /var/lib/opendance/storage,并确保服务用户可写)
STORAGE_DIR=/data/storage
# 单文件上传上限(字节),默认 512 MiB
UPLOAD_MAX_BYTES=536870912
# ---- 可选的 Assimp(FBX/glTF 动作预处理 + 压缩包模型转换)----
# 未安装时 FBX 动作的预处理会以失败状态返回,不影响 BVH/VMD;
# 但上传 .zip 模型包时必须能调用到它
ASSIMP_BIN=assimp
# 压缩包转换的目标格式:fbx(优先)| glb(Assimp FBX 导出失败时自动回退)
MODEL_CONVERT_FORMAT=fbx
# 压缩包里优先选用的 PMX 文件名
MODEL_CONVERT_PMX=Hatsune Miku.pmx
# 单次转换超时(毫秒)
MODEL_CONVERT_TIMEOUT_MS=180000
# ---- 默认模型(可选)----
# DEFAULT_MODEL_ID=1
# ---- 契约目录(可选)----
# 设置后 /health 与 /api/catalog/version 会读取该目录下的 VERSION 文件;
# 未设置时使用编译进代码的契约版本常量
# CONTRACTS_DIR=/opt/opendance/contracts