diff --git a/docs/CLIENTVIEW_STORAGE_ARCHITECTURE.md b/docs/CLIENTVIEW_STORAGE_ARCHITECTURE.md new file mode 100644 index 0000000..78d7694 --- /dev/null +++ b/docs/CLIENTVIEW_STORAGE_ARCHITECTURE.md @@ -0,0 +1,220 @@ +# ClientView (/client) 文件管理架构分析 + +**生成时间**: 2026-10-12 +**确认**: MarkBase API + SFTPGo 存储系统 + +--- + +## ✅ 结论 + +**ClientView (/client) 使用的文件管理不是 `~/markbase`,而是 `~/momentry/var/sftpgo/data/`** + +--- + +## 📊 架构详解 + +### 1. ClientView 路由 + +**路径**: `/client` +**组件**: `src/views/ClientView.vue` +**用途**: 文件管理界面(上传、下载、移动、删除) + +--- + +### 2. API 端点 + +**ClientView 直接调用 MarkBase API**: + +```typescript +// ClientView.vue:254-255 +const MARKBASE_URL = detectMarkbaseUrl() // http://localhost:11438 +const API_BASE = MARKBASE_URL + '/api/v2' + +// 实际调用的端点: +/api/v2/myfiles/{username}/folders // 获取文件夹列表 +/api/v2/myfiles/{username}/files // 获取文件列表 +/api/v2/upload-unlimited/{username} // 上传文件 +``` + +**关键代码**: +```typescript +// ClientView.vue:247-253 +function detectMarkbaseUrl(): string { + const stored = (window as any).__MARKBASE_URL__ || localStorage.getItem('markbase_url') + if (stored) return stored + const hostname = window.location.hostname + if (hostname === 'localhost' || hostname === '127.0.0.1') return 'http://localhost:11438' + return window.location.origin +} +``` + +--- + +### 3. 文件存储位置 + +**实际文件存储路径**: +``` +/Users/accusys/momentry/var/sftpgo/data/demo/ +``` + +**目录结构**: +``` +/Users/accusys/momentry/var/sftpgo/data/ +├── demo/ # demo 用户的文件 +│ ├── 001.mp4 +│ ├── 002.mp4 +│ ├── ... +│ └── 118.mp4 +└── {other_users}/ # 其他用户的文件(如果有) +``` + +**验证**: +```bash +ls -lh /Users/accusys/momentry/var/sftpgo/data/demo/*.mp4 | head -5 +# 输出: +# 001.mp4 (26M) +# 002.mp4 (3.6M) +# 003.mp4 (4.4M) +# ... +``` + +--- + +### 4. MarkBase API 配置 + +**MarkBase 数据目录**: +``` +/Users/accusys/markbase/data/ +├── auth.sqlite # 认证数据库 +├── authorized_keys # SSH 公钥 +└── ... +``` + +**注意**: MarkBase 数据目录 (`~/markbase/data/`) 用于存储 **MarkBase 自身的数据**(认证、配置等),**不是文件存储位置**。 + +--- + +### 5. 配置文件映射 + +**admin_config.json**: +```json +{ + "server": { + "storage_root": "/Users/accusys/momentry/var/sftpgo/data" + } +} +``` + +**环境变量**: +```bash +STORAGE_ROOT=/Users/accusys/momentry/var/sftpgo/data +``` + +--- + +## 📁 路径关系图 + +``` +ClientView (/client) + │ + ├─> MarkBase API (:11438) + │ └─> /api/v2/myfiles/{user}/* + │ └─> 读取 storage_root 配置 + │ └─> /Users/accusys/momentry/var/sftpgo/data/{user}/ + │ + └─> 文件实际存储位置 + └─> ~/momentry/var/sftpgo/data/demo/ +``` + +--- + +## 🔍 关键区别 + +### `~/markbase` 目录 + +**用途**: MarkBase 项目代码和自身数据 +**内容**: +- MarkBase Core 源代码 +- MarkBase 数据库 (`auth.sqlite`) +- MarkBase 配置文件 + +**不是文件存储位置** ❌ + +--- + +### `~/momentry/var/sftpgo/data` 目录 + +**用途**: 实际的文件存储位置 +**内容**: +- 用户上传的文件 +- 文件夹结构 +- 视频文件 (*.mp4) + +**这是 ClientView 管理的文件** ✅ + +--- + +## 🛠️ 动态路径实现 + +**paths.rs 中的路径函数**: +```rust +/// Get storage root directory +/// Priority: STORAGE_ROOT env var > ~/momentry/var/sftpgo/data +pub fn get_storage_root() -> String { + env::var("STORAGE_ROOT") + .unwrap_or_else(|_| { + format!("{}/momentry/var/sftpgo/data", get_home_dir().display()) + }) +} +``` + +**m4promini 环境路径**: +```bash +# 自动推断: +/Users/nextorageai/momentry/var/sftpgo/data/demo/ + +# 或通过环境变量: +export STORAGE_ROOT=/Users/nextorageai/momentry/var/sftpgo/data +``` + +--- + +## 📝 总结 + +| 项目 | 值 | +|-----|---| +| **ClientView 路由** | `/client` | +| **API 服务** | MarkBase API (localhost:11438) | +| **API 端点** | `/api/v2/myfiles/{user}/*` | +| **文件存储位置** | `~/momentry/var/sftpgo/data/{user}/` | +| **当前环境 (m5max48)** | `/Users/accusys/momentry/var/sftpgo/data/demo/` | +| **目标环境 (m4promini)** | `/Users/nextorageai/momentry/var/sftpgo/data/demo/` | +| **配置键** | `STORAGE_ROOT` 环境变量 | +| **配置文件** | `admin_config.json` → `server.storage_root` | + +--- + +## ⚠️ 重要提示 + +**部署到新环境时需要**: +1. ✅ 创建存储目录: + ```bash + mkdir -p ~/momentry/var/sftpgo/data/demo + ``` + +2. ✅ 设置权限: + ```bash + chmod -R 755 ~/momentry/var/sftpgo/data + ``` + +3. ✅ 配置环境变量: + ```bash + export STORAGE_ROOT=~/momentry/var/sftpgo/data + ``` + +4. ✅ 确保 MarkBase API 有读取权限 + +--- + +**ClientView 文件管理 ≠ `~/markbase`** +**ClientView 文件管理 = `~/momentry/var/sftpgo/data`** \ No newline at end of file