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 代码、部署流程

413
fix_paths_for_m4promini.sh Executable file
View File

@@ -0,0 +1,413 @@
#!/bin/bash
# Momentry Studio - m4promini 部署路径修复脚本
# 用途: 将所有硬编码的 /Users/accusys 路径替换为部署环境路径
# 使用: ./fix_paths_for_m4promini.sh
set -e
# 目标环境配置
TARGET_USER="nextorageai"
TARGET_HOME="/Users/nextorageai"
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
log_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
echo "================================================================================"
echo " Momentry Studio - m4promini Path Fixer"
echo "================================================================================"
echo ""
echo "Target User: ${TARGET_USER}"
echo "Target Home: ${TARGET_HOME}"
echo ""
# 检查是否在项目根目录
if [ ! -f "package.json" ]; then
log_error "请在项目根目录运行此脚本"
exit 1
fi
# 备份
log_info "创建备份目录..."
BACKUP_DIR="backups/path_fix_$(date +%Y%m%d_%H%M%S)"
mkdir -p ${BACKUP_DIR}
log_info "备份目录: ${BACKUP_DIR}"
# 备份关键文件
log_info "备份关键文件..."
cp config/admin_config.json ${BACKUP_DIR}/admin_config.json.bak
cp src-tauri/src/main.rs ${BACKUP_DIR}/main.rs.bak
cp start-proxy.sh ${BACKUP_DIR}/start-proxy.sh.bak 2>/dev/null || true
echo ""
# 1. 修复 config/admin_config.json
log_info "修复 config/admin_config.json..."
# 创建新的配置
cat > config/admin_config.json << 'JSONEOF'
{
"vlm_prompts": {
"scene": {
"system_prompt": "Analyze this video frame and provide a detailed description.",
"user_prompt_template": "Describe the scene in detail, including environment, objects, and activities.",
"max_tokens": 500,
"temperature": 0.7,
"output_language": "en"
},
"trace": {
"system_prompt": "Describe the person's appearance and clothing in this frame.",
"user_prompt_template": "Describe the person, focusing on clothing, accessories, and notable features.",
"max_tokens": 300,
"temperature": 0.6,
"output_language": "en"
}
},
"llm_config": {
"model": "gpt-4o",
"max_tokens": 2000,
"temperature": 0.7,
"api_base": "http://localhost:8080/v1"
},
"processor_config": {
"asr": {
"enabled": true,
"language": "auto",
"model": "large-v3"
},
"ocr": {
"enabled": true,
"languages": ["en", "zh"],
"min_confidence": 0.5
},
"face": {
"enabled": true,
"min_confidence": 0.7,
"min_size": 32
}
},
"filter_config": {
"face": {
"min_confidence": 50.0,
"min_size": 32,
"min_capture_quality": 30.0
}
},
"paths": {
"output_dir": "/Users/nextorageai/momentry/output",
"backup_dir": "/Users/nextorageai/momentry/backup",
"scripts_dir": "/Users/nextorageai/momentry_core/scripts",
"python_path": "/opt/homebrew/bin/python3.11",
"ffmpeg_path": "/opt/homebrew/bin/ffmpeg"
},
"concurrency": {
"max_concurrent_jobs": 6,
"poll_interval": 10,
"batch_size": 10,
"processor_timeout_secs": 3600
},
"feature_flags": {
"cache_enabled": true,
"auto_pipeline_enabled": false,
"watcher_auto_register": false,
"summary_enabled": true
},
"server": {
"port": 3002,
"media_base_url": "https://wp.momentry.ddns.net",
"serve_base_url": "https://m5wp.momentry.ddns.net/files",
"storage_root": "/Users/nextorageai/momentry/var/sftpgo/data"
},
"admin_settings": {
"session_timeout": 3600,
"max_login_attempts": 5,
"api_key_expiry_days": 365,
"system_stats_refresh_sec": 5
},
"face_filter_defaults": {
"min_confidence": 50.0,
"min_size": 32,
"min_capture_quality": 25.0
}
}
JSONEOF
log_info "✅ config/admin_config.json 已更新"
echo ""
# 2. 修复 src-tauri/src/main.rs
log_info "修复 src-tauri/src/main.rs..."
# 使用 sed 替换路径
sed -i.m4promini \
-e "s|/Users/accusys/momentry_core|/Users/nextorageai/momentry_core|g" \
-e "s|/Users/accusys/momentry_studio|/Users/nextorageai/momentry_studio|g" \
-e "s|/Users/accusys/markbase|/Users/nextorageai/markbase|g" \
-e "s|/Users/accusys/MarkBaseEngine|/Users/nextorageai/MarkBaseEngine|g" \
-e "s|/Users/accusys/momentry|/Users/nextorageai/momentry|g" \
-e "s|\"/Users/accusys\"|\"/Users/nextorageai\"|g" \
src-tauri/src/main.rs
log_info "✅ src-tauri/src/main.rs 已更新"
echo ""
# 3. 修复 start-proxy.sh
if [ -f "start-proxy.sh" ]; then
log_info "修复 start-proxy.sh..."
sed -i.m4promini \
-e "s|/Users/accusys/momentry_studio|/Users/nextorageai/momentry_studio|g" \
start-proxy.sh
log_info "✅ start-proxy.sh 已更新"
fi
echo ""
# 4. 创建环境变量模板
log_info "创建环境变量模板..."
cat > .env.m4promini.template << 'ENVEOF'
# Momentry Studio - m4promini Environment Variables
# 根目录
MOMENTRY_ROOT=/Users/nextorageai/momentry
MOMENTRY_CORE_ROOT=/Users/nextorageai/momentry_core
MARKBASE_ROOT=/Users/nextorageai/markbase
MOMENTRY_STUDIO_ROOT=/Users/nextorageai/momentry_studio
# 存储
STORAGE_ROOT=/Users/nextorageai/momentry/var/sftpgo/data
OUTPUT_DIR=/Users/nextorageai/momentry/output
BACKUP_DIR=/Users/nextorageai/momentry/backup
# 数据库
MOMENTRY_DATA_DIR=/Users/nextorageai/momentry_studio/data/users
# 二进制工具
PYTHON_PATH=/opt/homebrew/bin/python3.11
FFMPEG_PATH=/opt/homebrew/bin/ffmpeg
# API Keys (需要实际值)
MOMENTRY_API_KEY=your_api_key_here
# 外部服务
MOMENTRY_LLM_VISION_URL=http://localhost:8080/v1/chat/completions
MOMENTRY_LLM_CHAT_URL=http://localhost:8080/v1/chat/completions
# 数据库
DATABASE_URL=postgres://nextorageai@localhost:5432/momentry
QDRANT_URL=http://localhost:6333
QDRANT_API_KEY=Test3200Test3200Test3200
# Redis (可选)
REDIS_URL=redis://localhost:6379
ENVEOF
log_info "✅ 环境变量模板已创建: .env.m4promini.template"
echo ""
# 5. 创建部署说明
log_info "创建部署说明..."
cat > DEPLOYMENT_m4promini.md << 'MDEOF'
# Momentry Studio - m4promini 部署说明
**部署日期**: $(date +"%Y-%m-%d")
**目标用户**: nextorageai
**目标主目录**: /Users/nextorageai
---
## 部署步骤
### 1. 环境准备
```bash
# 在 m4promini 上
cd /Users/nextorageai
# 检查依赖
node --version # v18+
rustc --version # 1.70+
psql --version # 14+
```
### 2. 复制项目
```bash
# 复制或克隆项目到目标目录
cd /Users/nextorageai
git clone <repo_url> momentry_studio
cd momentry_studio
```
### 3. 运行路径修复脚本
```bash
chmod +x fix_paths_for_m4promini.sh
./fix_paths_for_m4promini.sh
```
### 4. 配置环境变量
```bash
# 复制环境变量模板
cp .env.m4promini.template .env
# 编辑 .env 文件,填入实际值
vim .env
# 加载环境变量
source .env
```
### 5. 构建项目
```bash
# 安装依赖
npm install
# 构建前端
npm run build
# 构建 Rust 代理
cd src-tauri
cargo build --release
cd ..
```
### 6. 初始化数据库
```bash
# 创建数据目录
mkdir -p data/users
# 数据库将自动创建在:
# /Users/nextorageai/momentry_studio/data/users/demo.sqlite
```
### 7. 启动服务
```bash
# 方式 1: 使用环境变量
export MOMENTRY_API_KEY=your_key_here
export MOMENTRY_DATA_DIR=/Users/nextorageai/momentry_studio/data/users
./src-tauri/target/release/momentry-proxy
# 方式 2: 使用启动脚本
npm run proxy
# 验证
curl http://localhost:8888/health
```
---
## 路径映射
| 功能 | m5max48 (当前) | m4promini (目标) |
|------|---------------|------------------|
| 用户主目录 | `/Users/accusys` | `/Users/nextorageai` |
| Studio 根目录 | `/Users/accusys/momentry_studio` | `/Users/nextorageai/momentry_studio` |
| Core API 根目录 | `/Users/accusys/momentry_core` | `/Users/nextorageai/momentry_core` |
| MarkBase 根目录 | `/Users/accusys/markbase` | `/Users/nextorageai/markbase` |
| 存储目录 | `/Users/accusys/momentry/var/sftpgo/data` | `/Users/nextorageai/momentry/var/sftpgo/data` |
| 输出目录 | `/Users/accusys/momentry/output` | `/Users/nextorageai/momentry/output` |
| 数据库目录 | `/Users/accusys/momentry_studio/data/users` | `/Users/nextorageai/momentry_studio/data/users` |
---
## 验证清单
- [ ] 环境变量已配置
- [ ] 配置文件路径正确
- [ ] 前端构建成功
- [ ] Rust 代理构建成功
- [ ] 数据库目录已创建
- [ ] 服务启动成功
- [ ] 健康检查通过
---
## 故障排除
### 问题 1: 服务启动失败
**检查**:
```bash
# 检查日志
tail -f /tmp/momentry_proxy.log
# 检查环境变量
echo $MOMENTRY_API_KEY
echo $MOMENTRY_DATA_DIR
```
### 问题 2: 路径错误
**验证**:
```bash
# 检查配置文件
cat config/admin_config.json | grep "/Users"
# 应该看到 /Users/nextorageai
```
### 问题 3: 权限问题
**修复**:
```bash
# 确保目录权限
chown -R nextorageai:staff /Users/nextorageai/momentry_studio
chmod -R 755 /Users/nextorageai/momentry_studio
```
---
**部署完成后访问**: http://localhost:8888
---
**维护**: 保持 .env 文件的安全,不要提交到版本控制。
MDEOF
log_info "✅ 部署说明已创建: DEPLOYMENT_m4promini.md"
echo ""
# 总结
echo "================================================================================"
echo " ✅ 路径修复完成"
echo "================================================================================"
echo ""
echo "修复的文件:"
echo " - config/admin_config.json"
echo " - src-tauri/src/main.rs"
echo " - start-proxy.sh (如果存在)"
echo ""
echo "创建的文件:"
echo " - .env.m4promini.template (环境变量模板)"
echo " - DEPLOYMENT_m4promini.md (部署说明)"
echo ""
echo "备份位置: ${BACKUP_DIR}/"
echo ""
echo "下一步:"
echo " 1. 编辑 .env.m4promini.template 并保存为 .env"
echo " 2. 运行: source .env"
echo " 3. 构建: npm run build && cd src-tauri && cargo build --release"
echo " 4. 启动: npm run proxy"
echo ""
echo "详细说明请查看: DEPLOYMENT_m4promini.md"
echo "================================================================================"