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 与测试数量。
This commit is contained in:
opendance
2026-09-15 22:26:58 +08:00
parent d6376ec5a5
commit ea58520fc2
14 changed files with 412 additions and 33 deletions
+29 -9
View File
@@ -1,5 +1,5 @@
================================================================
OpenDance Studio -- Web 管理服务端 v0.2.0 使用说明
OpenDance Studio -- Web 管理服务端 v0.2.1 使用说明
================================================================
本服务端是 OpenDance Studio 三端中的第一端, 负责管理歌曲、VRM 模型与
@@ -8,6 +8,16 @@ OpenDance Studio -- Web 管理服务端 v0.2.0 使用说明
重要: 本服务端 不部署、不管理 MySQL。数据库为部署方提供的现有实例,
连接信息通过 .env 注入。
v0.2.1 修订
1. 修复部署失败: 模板里的 MODEL_CONVERT_PMX=Hatsune Miku.pmx 值含空格却
没加引号, install.sh 用 `set -a; . deploy/.env` 载入时把 Miku.pmx 当命令
执行, 报 command not found(退出码 127); 模板已改为带引号写法。
2. 新增 .env 语法预检(deploy/env-lib.sh): install.sh 与 ctl.sh 在 source 之前
先检查, 直接给出哪一行、原文与改法, 不再出现看不懂的 127。
3. 失败提示带上出错文件名(.env 被 source 时行号属于 .env)。
4. 新增 12 项回归测试(web-server/test/env-file.spec.ts)。
约定: 值里含空格或 shell 元字符时必须加引号(双引号内不要用 $( ) 或反引号)。
--
一、部署到 Linux 服务器(业务服务, 不含反向代理)
--
@@ -20,11 +30,11 @@ OpenDance Studio -- Web 管理服务端 v0.2.0 使用说明
2. 准备一个现有的 MySQL / MariaDB 实例, 并建好库与账号(见下方"前置要求")
本项目不会创建数据库本身
3. 取得发布包并校验(地址用你们自己的制品库替换)
curl -LO https://<制品库地址>/opendance-web-v0.2.0.tar.gz
curl -LO https://<制品库地址>/opendance-web-v0.2.1.tar.gz
curl -LO https://<制品库地址>/SHA256SUMS
sha256sum -c SHA256SUMS # 期望输出 "OK"
4. 解压并生成配置(交互式引导, 逐项问答, 口令不回显)
tar -xzf opendance-web-v0.2.0.tar.gz && cd opendance-web-v0.2.0
tar -xzf opendance-web-v0.2.1.tar.gz && cd opendance-web-v0.2.1
bash deploy/init-env.sh
5. 安装(建用户与目录 -> 装依赖 -> 迁移 -> 注册系统服务 -> 等健康检查)
bash deploy/install.sh
@@ -79,8 +89,8 @@ OpenDance Studio -- Web 管理服务端 v0.2.0 使用说明
(本项目不会创建数据库本身, 也不需要 GRANT OPTION / FILE / SUPER 等管理权限)
部署步骤
tar -xzf opendance-web-v0.2.0.tar.gz
cd opendance-web-v0.2.0
tar -xzf opendance-web-v0.2.1.tar.gz
cd opendance-web-v0.2.1
bash deploy/init-env.sh # 首次启动引导: 逐项问答生成 deploy/.env(见下)
bash deploy/install.sh # 已以 root 登录, 不需要 sudo
@@ -209,7 +219,10 @@ deploy/.env 初始化引导(deploy/init-env.sh)
- 上传 .zip 模型包报 422 且提示 Assimp 不可用
PMX/FBX 转换依赖 Assimp: apt-get install -y assimp-utils libassimp6;
只上传 .glb / .vrm 则不需要它。
- 模型审核界面显示"未分析 / 无预览图"
- 安装时报 command not found / 退出码 127, 且提示指向 deploy/.env 某一行
该行的值含空格或 shell 元字符却没加引号, 被 shell 当成命令执行了。按预检
提示给这个值加引号(如 MODEL_CONVERT_PMX="Hatsune Miku.pmx")后重跑。
- 模型审核界面显示"未分析 / 无预览图"
该模型是升级前入库的: 调 POST /api/models/<id>/reanalyze, 或批量跑
node scripts/reanalyze-models.mjs --url http://127.0.0.1:3000。
@@ -236,10 +249,10 @@ deploy/.env 初始化引导(deploy/init-env.sh)
cd web-server
npm run contracts:check # 契约版本一致性
npm run typecheck # TypeScript 严格检查
npm run test # 168 项单元测试 / 10 个文件(VMD 31、模型压缩包 24、
npm run test # 180 项单元测试 / 11 个文件(VMD 31、模型压缩包 24、
# 模型检查器 25、缩略图 8、骨骼过滤 8、
# 预处理 25、init-env 16、admin-port 16、
# access-log 9、VRM 检查器 6)
# access-log 9、VRM 检查器 6、.env 预检 12)
npm run build # 生产构建
npm run start:prod & # 启动
npm run test:smoke # 57 项端到端冒烟(需要数据库可连通)
@@ -270,6 +283,13 @@ deploy/.env 初始化引导(deploy/init-env.sh)
ADMIN_HOST 管理端监听地址(可选, 默认跟随 HOST;HOST 未设置时同样
回落 0.0.0.0)。需要接口对外、管理端只对本机时设为
127.0.0.1
.env 写法约定: install.sh / ctl.sh 用 `set -a; . deploy/.env` 载入配置, shell 会
真的执行这个文件, 因此普通值不加引号(PORT=3000), 值里含空格或 shell 元字符
(& | ; $ ` < > ( ) 等)时必须加引号, 例如 MODEL_CONVERT_PMX="Hatsune Miku.pmx";
双引号内不要用 $( ) 或反引号(会被真的执行), 需要字面量时用单引号 KEY='a b'。
两个脚本在 source 之前都会先跑 deploy/env-lib.sh 的语法预检, 不安全写法会直接
指出行号、原文与改法。
端口配置非法(非 1..65535 整数)时, 生产环境启动会直接中止;
ADMIN_PORT 设为与 PORT 相同只打印提示, 不中止。
ADMIN_DIR 管理端静态站点目录(默认 ../admin, 即 /opt/opendance/admin)
@@ -286,7 +306,7 @@ deploy/.env 初始化引导(deploy/init-env.sh)
vrm = 在 GLB 之上补 VRMC_vrm 扩展(humanoid 骨骼 / 表情语义),
humanoid 骨骼映射不全时自动回退交付 GLB 并写进 conversion_note。
产物一律用 `assimp info` 回读校验
MODEL_CONVERT_PMX 压缩包内优先选用的 PMX 文件名(默认 Hatsune Miku.pmx,
MODEL_CONVERT_PMX 压缩包内优先选用的 PMX 文件名(默认 "Hatsune Miku.pmx",
大小写不敏感); 找不到时按「格式优先级 -> 目录最浅 ->
文件最大」挑选
MODEL_CONVERT_TIMEOUT_MS