Files
opendance-web/deploy/.env.example
T
opendance ea58520fc2 fix(deploy): .env 中带空格的值未加引号导致 install.sh 以 127 失败
现象:
  ./deploy/.env: line 53: Miku.pmx: command not found
  [install] 第 53 行执行失败(退出码 127)

根因:deploy/.env.example 的 MODEL_CONVERT_PMX=Hatsune Miku.pmx 值含空格
却没加引号,install.sh 用 `set -a; . deploy/.env` 载入时被切成
「赋值 + 命令」,Miku.pmx 被当成命令执行。

修复:
1. 模板改为 MODEL_CONVERT_PMX="Hatsune Miku.pmx"(占位符值同样加引号);
2. 新增 deploy/env-lib.sh:.env 语法预检,install.sh / ctl.sh 在 source
   之前检查,报错给出「哪一行 / 原文 / 改法」, 与反引号建议单引号;
3. install.sh 的 ERR trap 补上出错文件名(lineno 属于被 source 的 .env,
   只报行号无法定位);
4. 新增 test/env-file.spec.ts 12 项回归测试,锁住「模板可被 shell 原样载入」;
5. 版本升到 0.2.1,README(.md/.txt)/DSH.md 补 .env 写法约定、FAQ 与测试数量。
2026-09-15 22:26:58 +08:00

67 lines
3.2 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 服务端 -- Linux 原生部署环境变量
#
# 复制为 deploy/.env 后填写;.env 已被 .gitignore 忽略,禁止提交。
# 该文件由 systemd 通过 EnvironmentFile 注入 Node 进程。
# ============================================================
# ---- 服务 ----
NODE_ENV=production
# 软件 API 端口:Windows/Godot 客户端与 Android App 调用它
# (提供 /api、/health、/static、/contracts,**不提供管理页面**)
PORT=3000
# 管理端端口:浏览器访问管理界面(页面 + 上面全部接口)
# 不设置时默认 = PORT + 1(即 3001);设为与 PORT 相同即为单端口兼容模式
ADMIN_PORT=3001
# 监听地址:
# 反代与后端同机 -> 127.0.0.1(后端不直接对外暴露,推荐)
# 反代在别的机器 -> 0.0.0.0,并用防火墙把该端口限制为仅反代来源可访问
HOST=0.0.0.0
# 管理端单独绑定地址(可选)。只想让管理端暴露在内网时,例如 127.0.0.1 或内网网卡地址
# ADMIN_HOST=127.0.0.1
# 管理端静态站点目录(本服务自带管理端页面,反代只需整体转发到管理端端口)
ADMIN_DIR=/opt/opendance/admin
# ---- 现有 MySQL / MariaDB 实例(本项目不安装、不管理数据库)----
DB_HOST='<existing-mysql-host>'
DB_PORT=3306
DB_USER=opendance_app
DB_PASS='<数据库口令>'
DB_NAME=opendance
# 生产环境必须为 false,表结构一律走 TypeORM migration
DB_SYNCHRONIZE=false
DB_LOGGING=false
# ---- 文件存储 ----
# 需与 install.sh 的 STORAGE_DIR 一致,且服务用户可写
STORAGE_DIR=/var/lib/opendance/storage
# 单文件上传上限(字节),默认 512 MiB。
# ★ 反向代理层的同名限制必须不小于此值(nginx client_max_body_size /
# IIS requestLimits),否则大模型上传会在代理层被拒(413)。
UPLOAD_MAX_BYTES=536870912
# ---- 可选的 Assimp(FBX/glTF 动作预处理;也用于压缩包模型的转换)----
# 上传 .zip(内含 .pmx 的 MMD 模型包)时必须能调用到它,否则转换会失败
ASSIMP_BIN=assimp
# 需要转换的模型(PMX / FBX)交付格式:glb(默认,两个客户端都原生加载)| vrm
# glb:通用,客户端直接加载
# vrm:在 GLB 之上补 VRMC_vrm 扩展(humanoid 骨骼 / 表情语义);
# humanoid 骨骼名映射不全时会自动回退交付 GLB 并写进 conversion_note
MODEL_CONVERT_FORMAT=glb
# 压缩包里优先选用的 PMX 文件名(大小写不敏感);找不到时按"格式优先级 -> 目录最浅 -> 文件最大"挑
# 值里含空格或 shell 元字符时必须用引号包起来(install.sh 会用
# `set -a; . deploy/.env` 真的执行本文件;不加引号会把 "Miku.pmx" 当命令)
MODEL_CONVERT_PMX="Hatsune Miku.pmx"
# 单次转换超时(毫秒)
MODEL_CONVERT_TIMEOUT_MS=180000
# ---- 默认模型(可选)----
# 显式指定默认模型 id;不设置时按源码 src/config/default-model.ts 里的种子匹配,
# 再回落到契约 data-models.md 4.1 的 VRM 优先规则
# DEFAULT_MODEL_ID=1
# ---- 契约目录 ----
# 指向安装目录下的 contracts/,使 /health 与 /api/catalog/version 反映实时契约版本
CONTRACTS_DIR=/opt/opendance/contracts