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. 启动服务
This commit is contained in:
2026-10-12 12:20:24 +08:00
parent e7bab6c4c6
commit bb45f0981a
2 changed files with 784 additions and 0 deletions

View File

@@ -0,0 +1,371 @@
# 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)
```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 管理**:
```rust
// 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 ...")
```
**服务启动**:
```rust
// 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**:
```rust
// 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
#### 🟡 中等问题 (建议修复)
4. **文档中的路径** - 示例代码
- 影响: 文档可读性、示例执行
- 优先级: P1
5. **脚本路径** - `start-proxy.sh`
- 影响: 启动脚本执行
- 优先级: P1
---
## 🛠️ 修复方案
### 方案 1: 环境变量 + 动态路径 (推荐)
#### 优点
- ✅ 完全动态,无需修改代码
- ✅ 支持多环境部署
- ✅ 配置集中管理
#### 实施步骤
**步骤 1: 修改 admin_config.json**
```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`:
```env
# 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 代码**
```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**
```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: 启动时加载配置**
```rust
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**:
```bash
#!/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. **更新文档** (说明环境变量配置)
---
## 📝 环境变量清单
### 必需环境变量
```bash
# 根目录
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 代码、部署流程