Files
momentry_studio/docs/DEPLOYMENT_PATH_ISSUES.md
Momentry Studio bb45f0981a fix: 添加 m4promini 部署路径修复方案
问题:
- 100+ 处硬编码路径 /Users/accusys
- 配置文件 (admin_config.json) 无法适应新环境
- Rust 代码 (main.rs) 中 10+ 处路径硬编码
- 服务启动/停止命令依赖固定路径

影响:
- 无法在 m4promini (/Users/nextorageai) 上部署
- Admin 页面服务控制失效
- Worker 管理失败

解决方案:
1. 文档: docs/DEPLOYMENT_PATH_ISSUES.md
   - 详细分析所有硬编码路径
   - 提供 3 种修复方案
   - 环境变量优先级建议

2. 脚本: fix_paths_for_m4promini.sh
   - 自动替换所有硬编码路径
   - 创建备份
   - 生成环境变量模板
   - 创建部署说明

目标环境:
- 用户: nextorageai
- 主目录: /Users/nextorageai
- 项目目录: /Users/nextorageai/momentry_studio

下一步:
1. 在 m4promini 上运行 fix_paths_for_m4promini.sh
2. 配置环境变量 (.env)
3. 构建项目
4. 启动服务
2026-10-12 12:20:24 +08:00

8.9 KiB

Momentry Studio 硬编码路径问题分析与修复方案

生成时间: 2026-10-12
目标环境: m4promini
目标用户: nextorageai
目标主目录: /Users/nextorageai


🚨 问题分析

1. 硬编码路径汇总

类别 文件 硬编码路径 影响
配置文件 config/admin_config.json 多个路径 ❌ 严重
Rust 代码 src-tauri/src/main.rs 10+ 处 ❌ 严重
文档 多个 .md 文件 100+ 处 ⚠️ 中等
脚本 start-proxy.sh 1 处 ⚠️ 中等

2. 关键硬编码路径列表

2.1 配置文件 (config/admin_config.json)

{
  "paths": {
    "output_dir": "/Users/accusys/momentry/output",         // ❌
    "backup_dir": "/Users/accusys/momentry/backup",         // ❌
    "scripts_dir": "/Users/accusys/momentry_core/scripts",  // ❌
    "python_path": "/opt/homebrew/bin/python3.11",          // ✅ (可能不同)
    "ffmpeg_path": "/opt/homebrew/bin/ffmpeg"               // ✅ (可能不同)
  },
  "server": {
    "storage_root": "/Users/accusys/momentry/var/sftpgo/data" // ❌
  }
}

2.2 Rust 代码 (src-tauri/src/main.rs)

Worker 管理:

// Line 1335: Stop worker
.arg("sleep 0.5; WPID=$(cat /Users/accusys/momentry_core/logs/worker_3002.pid ...")

// Line 1365: Start worker
.arg("cd /Users/accusys/momentry_core && nohup bash run-worker-3002.sh ...")

// Line 1375: Check worker status
.arg("WPID=$(cat /Users/accusys/momentry_core/logs/worker_3002.pid ...")

服务启动:

// Line 1385: MarkBase
"mkdir -p /Users/accusys/markbase/data && cd /Users/accusys/markbase ..."

// Line 1388: Core API
"cd /Users/accusys/momentry_core && nohup bash run-server-3002.sh ..."

// Line 1391: Studio Proxy
"cd /Users/accusys/momentry_studio/src-tauri && nohup ./target/debug/momentry-proxy ..."

// Line 1394: MarkBase Engine
"cd /Users/accusys/MarkBaseEngine && nohup .build/debug/MarkBaseServer ..."

// Line 1397: MarkBase SSH
"cd /Users/accusys/markbase && nohup cargo run --bin markbase-core ..."

// Line 1400: MarkBase SMB
"cd /Users/accusys/markbase && nohup cargo run ... --root /Users/accusys/momentry/var/sftpgo/data ..."

Fallback Home:

// Line 1479, 1504, 1516: Home directory fallback
let home = dirs::home_dir().unwrap_or_else(|| std::path::PathBuf::from("/Users/accusys"));

3. 问题严重性评估

🔴 严重问题 (必须修复)

  1. 配置文件硬编码 - config/admin_config.json

    • 影响: Core API 无法找到输出目录、脚本目录
    • 优先级: P0
  2. Rust 代码硬编码 - main.rs

    • 影响: Worker 管理、服务启动/停止失败
    • 优先级: P0
  3. 服务管理命令 - 路径硬编码

    • 影响: Admin 页面服务控制失效
    • 优先级: P0

🟡 中等问题 (建议修复)

  1. 文档中的路径 - 示例代码

    • 影响: 文档可读性、示例执行
    • 优先级: P1
  2. 脚本路径 - start-proxy.sh

    • 影响: 启动脚本执行
    • 优先级: P1

🛠️ 修复方案

方案 1: 环境变量 + 动态路径 (推荐)

优点

  • ✅ 完全动态,无需修改代码
  • ✅ 支持多环境部署
  • ✅ 配置集中管理

实施步骤

步骤 1: 修改 admin_config.json

{
  "paths": {
    "output_dir": "${MOMENTRY_ROOT}/output",
    "backup_dir": "${MOMENTRY_ROOT}/backup",
    "scripts_dir": "${MOMENTRY_CORE_ROOT}/scripts",
    "python_path": "${PYTHON_PATH}",
    "ffmpeg_path": "${FFMPEG_PATH}"
  },
  "server": {
    "storage_root": "${STORAGE_ROOT}"
  }
}

步骤 2: 创建环境变量文件

.env.m4promini:

# Momentry Roots
MOMENTRY_ROOT=/Users/nextorageai/momentry
MOMENTRY_CORE_ROOT=/Users/nextorageai/momentry_core
MARKBASE_ROOT=/Users/nextorageai/markbase

# Storage
STORAGE_ROOT=/Users/nextorageai/momentry/var/sftpgo/data
OUTPUT_DIR=/Users/nextorageai/momentry/output
BACKUP_DIR=/Users/nextorageai/momentry/backup

# Binaries
PYTHON_PATH=/opt/homebrew/bin/python3.11
FFMPEG_PATH=/opt/homebrew/bin/ffmpeg

# Studio
MOMENTRY_STUDIO_ROOT=/Users/nextorageai/momentry_studio
MOMENTRY_DATA_DIR=/Users/nextorageai/momentry_studio/data/users

步骤 3: 修改 Rust 代码

// 替换硬编码路径为环境变量
use std::env;

fn get_momentry_core_root() -> String {
    env::var("MOMENTRY_CORE_ROOT")
        .unwrap_or_else(|_| {
            dirs::home_dir()
                .map(|h| format!("{}/momentry_core", h.display()))
                .unwrap_or_else(|| "/Users/accusys/momentry_core".to_string())
        })
}

// 使用示例
.arg(format!("cd {} && nohup bash run-worker-3002.sh ...", get_momentry_core_root()))

方案 2: 配置文件 + 相对路径 (次选)

优点

  • ✅ 简单易实施
  • ✅ 减少环境变量依赖

实施步骤

步骤 1: 创建 deployment.conf

[m4promini]
MOMENTRY_ROOT=/Users/nextorageai/momentry
MOMENTRY_CORE_ROOT=/Users/nextorageai/momentry_core
MARKBASE_ROOT=/Users/nextorageai/markbase
STUDIO_ROOT=/Users/nextorageai/momentry_studio
STORAGE_ROOT=/Users/nextorageai/momentry/var/sftpgo/data

步骤 2: 启动时加载配置

use std::fs;

fn load_deployment_config() -> HashMap<String, String> {
    let config_path = std::env::current_exe()
        .unwrap()
        .parent()
        .unwrap()
        .join("deployment.conf");
    
    // Parse conf file...
}

方案 3: 安装脚本替换 (临时方案)

优点

  • ✅ 无需修改代码
  • ✅ 快速部署

实施步骤

创建 install_m4promini.sh:

#!/bin/bash

# Momentry Studio - m4promini Installation Script

TARGET_USER="nextorageai"
TARGET_HOME="/Users/nextorageai"
STUDIO_ROOT="${TARGET_HOME}/momentry_studio"

echo "=== Installing Momentry Studio for m4promini ==="

# 1. Clone repository
cd ${TARGET_HOME}
git clone <repo_url> momentry_studio
cd momentry_studio

# 2. Update config file
sed -i.bak \
    -e "s|/Users/accusys/momentry|${TARGET_HOME}/momentry|g" \
    -e "s|/Users/accusys/momentry_core|${TARGET_HOME}/momentry_core|g" \
    -e "s|/Users/accusys/markbase|${TARGET_HOME}/markbase|g" \
    config/admin_config.json

# 3. Update Rust code
sed -i.bak \
    -e "s|/Users/accusys/momentry_core|${TARGET_HOME}/momentry_core|g" \
    -e "s|/Users/accusys/momentry_studio|${TARGET_HOME}/momentry_studio|g" \
    -e "s|/Users/accusys/markbase|${TARGET_HOME}/markbase|g" \
    -e "s|/Users/accusys|${TARGET_HOME}|g" \
    src-tauri/src/main.rs

# 4. Build
npm install
npm run build
cd src-tauri
cargo build --release
cd ..

echo "✅ Installation complete"

📋 修复清单

必须修复 (P0)

  • config/admin_config.json - 替换为环境变量或相对路径
  • main.rs - Worker 管理命令 (3 处)
  • main.rs - 服务启动命令 (6 处)
  • main.rs - Home 目录 fallback (3 处)
  • start-proxy.sh - 工作目录路径

建议修复 (P1)

  • README.md - 文档中的示例路径
  • RELEASE_v0.1.0_INSTALLATION_GUIDE.md - 安装路径示例
  • AGENTS.md - 文档中的路径引用

🚀 推荐实施方案

推荐: 方案 1 (环境变量 + 动态路径)

理由:

  1. 最灵活,支持多环境部署
  2. 符合 12-factor app 原则
  3. 便于 CI/CD 集成
  4. 无需修改代码即可适应不同环境

实施步骤:

  1. 创建环境变量模板 (.env.template)
  2. 修改 config/admin_config.json (支持变量替换)
  3. 修改 main.rs (使用环境变量)
  4. 创建部署脚本 (自动配置环境)
  5. 更新文档 (说明环境变量配置)

📝 环境变量清单

必需环境变量

# 根目录
export MOMENTRY_ROOT=/Users/nextorageai/momentry
export MOMENTRY_CORE_ROOT=/Users/nextorageai/momentry_core
export MARKBASE_ROOT=/Users/nextorageai/markbase
export MOMENTRY_STUDIO_ROOT=/Users/nextorageai/momentry_studio

# 存储
export STORAGE_ROOT=/Users/nextorageai/momentry/var/sftpgo/data
export OUTPUT_DIR=/Users/nextorageai/momentry/output
export BACKUP_DIR=/Users/nextorageai/momentry/backup

# 数据库
export MOMENTRY_DATA_DIR=/Users/nextorageai/momentry_studio/data/users

# 可选
export PYTHON_PATH=/opt/homebrew/bin/python3.11
export FFMPEG_PATH=/opt/homebrew/bin/ffmpeg

⚠️ 注意事项

  1. 环境变量优先级

    • 环境变量 > 配置文件 > 默认值
    • 使用 unwrap_or_else() 提供合理 fallback
  2. 路径验证

    • 启动时检查关键路径是否存在
    • 提供清晰的错误提示
  3. 向后兼容

    • 保留 /Users/accusys 作为 fallback
    • 但优先使用环境变量
  4. 文档更新

    • 更新所有示例路径
    • 添加环境变量配置说明

🔗 相关文档

  • /Users/accusys/momentry_studio/RELEASE_v0.1.0_INSTALLATION_GUIDE.md
  • /Users/accusys/momentry_studio/build_release.sh
  • /Users/accusys/momentry_studio/AGENTS.md

修复优先级: P0 (紧急)
预计工作量: 2-3 小时
影响范围: 配置文件、Rust 代码、部署流程