# 待解決問題追蹤 | 項目 | 內容 | |------|------| | 建立者 | Warren | | 建立時間 | 2026-03-17 | | 文件版本 | V1.0 | --- ## 版本歷史 | 版本 | 日期 | 目的 | 操作人 | 工具/模型 | |------|------|------|--------|-----------| | V1.0 | 2026-03-17 | 創建文件 | Warren | OpenCode / MiniMax M2.5 | | V1.1 | 2026-03-21 | 更新問題狀態 | OpenCode | - | | V1.2 | 2026-03-21 | 添加備份機制優化待辦 | OpenCode | - | | V1.3 | 2026-03-21 | 完成清理硬編碼密碼 | OpenCode | - | | V1.4 | 2026-03-21 | 完成 OpenCode n8n MCP 整合 | OpenCode | - | | V1.5 | 2026-03-21 | 完成 API Key Management 核心模組 | OpenCode | - | | V1.6 | 2026-03-23 | 添加 Momentry Core API launchd 待辦 | OpenCode | - | | V1.7 | 2026-03-23 | 完成 Momentry Core API launchd 設定 | OpenCode | - | | V1.8 | 2026-03-24 | 完成服務統一遷移,所有服務使用自定義 plist | OpenCode | big-pickle | | V1.9 | 2026-03-24 | 建立統一會員系統實作計畫 | OpenCode | big-pickle | | V2.0 | 2026-03-24 | 建立 Job Worker 實作計畫 | OpenCode | big-pickle | --- ## 問題 #1: sqlx async INSERT 不會實際寫入數據庫 ### 問題描述 使用 sqlx async 執行 INSERT 時,報告成功(rows_affected=1),但數據沒有實際寫入數據庫。 ### 嘗試過的解決方案 | # | 嘗試方法 | 結果 | |---|---------|------| | 1 | 使用 `execute()` | 報告成功但未寫入 | | 2 | 使用 `fetch()` | 同樣問題 | | 3 | 使用交易 | 同樣問題 | | 4 | 使用連接池 `acquire()` | 同樣問題 | | 5 | 每個操作創建新連接池 | 同樣問題 | | 6 | 使用 `std::process::Command` 同步調用 psql | 同樣問題 | | 7 | 使用 `tokio::task::spawn_blocking` | 同樣問題 | ### 觀察到的現象 - 直接用 psql 命令行可以成功寫入 - 用另一個 PostgreSQL client 可以成功寫入 - sqlx 查詢 COUNT(*) 可以正確讀取數據 - 但 sqlx INSERT 報告成功卻不寫入 ### 懷疑方向 - sqlx 連接池與 PostgreSQL 的某種交互問題 - Rust async runtime 與 PostgreSQL client 的問題 - postgresql.conf 配置問題 ### 臨時解決方案 - Qdrant 向量存儲正常工作(不受影響) - 存儲狀態追蹤功能正常運作 ### 負責人 - ### 建立日期 2026-03-17 ### 備註 影響 `store_vector` 函數,PVector 存儲無法正常工作,但 QVector 正常運作 ### 2026-03-21 調查結果 #### 測試結果 - 直接 psql INSERT: ✅ 成功 - 資料寫入驗證: ✅ 成功 #### 發現的問題 `store_vector` 函數 (`postgres_db.rs:819-860`) 存在以下問題: ```rust // 問題 1: 錯誤被靜默忽略 match join_result { Ok((cid, Ok(output))) => { if !output.status.success() { let err = String::from_utf8_lossy(&output.stderr); tracing::error!("psql error for {}: {}", cid, err); // 沒有返回錯誤!只是記錄日誌 } } // ... } Ok(()) // 即使失敗也返回 Ok ``` #### 建議修復 1. 讓 `store_vector` 返回實際結果 2. 在失敗時返回 `Err` 3. 添加單元測試驗證 #### 下一步 - [x] 修復 `store_vector` 錯誤處理 - [x] 添加單元測試 - [ ] 重現並確認問題根因 ### 2026-03-21 修復完成 已修復 `store_vector` 函數的錯誤處理: ```rust // 修復前:錯誤被靜默忽略 match join_result { Ok((cid, Ok(output))) => { if !output.status.success() { tracing::error!("..."); // 只記錄,不返回錯誤 } } } Ok(()) // 即使失敗也返回 Ok // 修復後:正確傳播錯誤 let (cid, output) = result; let output = output.map_err(|e| anyhow::anyhow!(...))?; if !output.status.success() { anyhow::bail!("psql INSERT failed..."); } ``` --- ## 問題 #2: TUI 與 stdout 輸出混合 ### 問題描述 Python processors 的 progress 輸出蓋過 TUI,導致使用者無法清楚看到處理進度。 ### 解決方案 ~~使用 TUI 渲染到 stderr~~ → 使用 Redis Pub/Sub 作為消息總線 ### 當前狀態 | 子項目 | 狀態 | |--------|------| | RedisPublisher Python 端 | ✅ 已實作 | | Rust Redis 客戶端 | ✅ 已實作 (`redis_client.rs`) | | Rust 訂閱更新 TUI | ✅ 已實作 (main.rs) | | 中斷後繼續/重做 | 🔜 待實作 | ### 負責人 - ### 建立日期 2026-03-17 ### 更新日期 2026-03-21 ### 參考文檔 - `docs/MOMENTRY_CORE_REDIS_KEYS.md` - `scripts/redis_publisher.py` - `src/core/db/redis_client.rs` --- ## 問題 #3: Redis Message Bus 尚未實作 ### 問題描述 根據設計規範,需要使用 Redis 作為監控和狀態管理系統。 ### 當前狀態 | 實作項目 | 狀態 | 說明 | |---------|------|------| | Redis 客戶端 (Hash) | ✅ | `redis_client.rs` | | Redis 客戶端 (Pub/Sub) | ✅ | `redis_client.rs::subscribe_progress()` | | Python RedisPublisher | ✅ | `scripts/redis_publisher.py` | | Rust 訂閱頻道 | ✅ | `main.rs` 中的 redis 訂閱邏輯 | | 監控腳本 | ✅ | `monitor/service/health_check.sh` | ### 負責人 - ### 建立日期 2026-03-17 ### 更新日期 2026-03-21 ### 優先級 ~~高~~ → 中 - 核心功能已完成 ### 參考文檔 - `docs/MOMENTRY_CORE_REDIS_KEYS.md` - `docs/MOMENTRY_CORE_MONITORING.md` --- ## 架構優化待評估 詳細內容請參考 [ARCHITECTURE_EVALUATION.md](./ARCHITECTURE_EVALUATION.md) | 項目 | 複雜度 | 優先級 | |------|--------|--------| | PostgreSQL → Redis 故障轉移 | 中 | 待評估 | | 連接池監控 | 低 | 待評估 | | Processor 重試機制 | 中 | 待評估 | | PyO3 整合 | 高 | 低 | | HTTP 健康端點 | 低 | ✅ 已完成 | | Commit Message Lint | 低 | ✅ 已完成 | --- ## 備份機制優化 (2026-03-21) ### 問題分析 | 問題 | 嚴重性 | 說明 | |------|--------|------| | 溫冷分層未啟用 | 中 | weekly/monthly/archive 目錄為空 | | 清理策略未執行 | 高 | 每日備份保留過多,空間浪費 | | 無異地備份 | 高 | 無遠程備份(雲端/另一設備) | | 備份驗證未自動化 | 中 | 只檢查文件存在,沒驗證可恢復性 | | Gitea 大文件 | 中 | 每次備份 1GB,頻率過高 | | 密碼硬編碼 | 高 | 腳本中有多處明文密碼 | ### 待辦事項 | # | 任務 | 優先級 | 狀態 | |---|------|--------|------| | 1 | 啟用溫冷分層 (`backup_monitor.sh tier`) | 高 | 待辦 | | 2 | 啟用清理策略 (`backup_monitor.sh cleanup`) | 高 | 待辦 | | 3 | 添加備份驗證腳本 | 高 | 待辦 | | 4 | 優化 Gitea 備份頻率 (改為週備份) | 中 | 待辦 | | 5 | 創建外部備份腳本 (rsync/雲端) | 高 | 待辦 | | 6 | 清理腳本中的硬編碼密碼 | 高 | ✅ 已完成 | ### 推薦備份策略 | 層級 | 保留時間 | 頻率 | 目標 | |------|----------|------|------| | Hot | 7 天 | 每日 | 本地 SSD | | Warm | 30 天 | 每週 | 本地 HDD | | Cold | 90 天 | 每月 | 外部存儲 | | Archive | 1 年 | 每季 | 離線/雲端 | ### 建議的 Crontab ```bash # 每日備份 (排除 Gitea) 0 3 * * 1-6 /Users/accusys/momentry/scripts/backup_all.sh all_except_gitea # 每週完整備份 (含 Gitea) 0 3 * * 0 /Users/accusys/momentry/scripts/backup_all.sh all # 每週溫冷分層 0 4 * * 0 /Users/accusys/momentry_core_0.1/monitor/storage/backup_monitor.sh tier # 每週清理 0 5 * * 0 /Users/accusys/momentry_core_0.1/monitor/storage/backup_monitor.sh cleanup # 每月驗證 0 6 1 * * /Users/accusys/momentry/scripts/verify_backup.sh ``` ### 負責人 - ### 參考文件 - `/Users/accusys/momentry/scripts/backup_all.sh` - `/Users/accusys/momentry_core_0.1/monitor/storage/backup_monitor.sh` - `/Users/accusys/momentry/backup/` --- ## OpenCode n8n MCP 整合 (2026-03-21) ### 完成狀態 | 項目 | 狀態 | 說明 | |------|------|------| | n8n REST API 啟用 | ✅ | `N8N_PUBLIC_API_ENABLED=true` | | API Key 生成 | ✅ | Settings → API | | MCP Server 安裝 | ✅ | `@nextoolsolutions/mcp-n8n` | | OpenCode 設定 | ✅ | `~/.config/opencode/opencode.json` | | 43 工具可用 | ✅ | workflows, executions, datatables, tags 等 | ### 設定檔案 `~/.config/opencode/opencode.json`: ```json { "mcp": { "gitea": { "type": "local", "enabled": true, "command": [ "/opt/homebrew/bin/gitea-mcp-server", "-token", "", "-host", "http://localhost:3000" ] }, "n8n": { "type": "local", "enabled": true, "command": ["/opt/homebrew/bin/mcp-n8n"], "environment": { "N8N_BASE_URL": "http://localhost:5678", "N8N_API_KEY": "" } } } } ``` ### 重要提醒 1. **API Key 安全**: 避免提交到 Git 2. **n8n 需通過反向代理**: localhost:5678 無法直接訪問 API,需通過 Caddy 3. **重啟生效**: 修改 `opencode.json` 後需重啟 OpenCode ### 參考文件 - `docs/OPENCODE_GUIDE.md` - MCP 設定章節 - `docs/INSTALL_N8N.md` - n8n 安裝指南 --- ## n8n API 備份腳本 (2026-03-21) ### 腳本位置 | 腳本 | 說明 | 依賴 | |------|------|------| | `monitor/workflow/backup_n8n_api.py` | REST API 備份 | requests | | `monitor/workflow/backup_n8n_mcp.py` | MCP 備份(開發中) | mcp SDK | ### 使用方式 ```bash # 備份所有 workflows N8N_API_KEY="..." python3.11 backup_n8n_api.py # 只顯示變更(不備份) N8N_API_KEY="..." python3.11 backup_n8n_api.py --diff # 差異備份(只備份變更的 workflows) N8N_API_KEY="..." python3.11 backup_n8n_api.py --incremental # 列出可用備份 python3.11 backup_n8n_api.py --list # 驗證最新備份 python3.11 backup_n8n_api.py --verify # 顯示備份統計 python3.11 backup_n8n_api.py --stats # 只備份啟用的 workflows N8N_API_KEY="..." python3.11 backup_n8n_api.py --active-only # 備份失敗的執行記錄 N8N_API_KEY="..." python3.11 backup_n8n_api.py --failed-only ``` ### 功能 - [x] REST API 備份 - [x] 變更偵測 - [x] SHA256 校驗 - [x] 備份版本化 - [x] 差異備份(`--incremental`) - [x] 備份驗證(`--verify`) - [x] 備份統計(`--stats`) - [x] 失敗執行記錄備份(`--failed-only`) - [ ] 選擇性備份(按 Tags) ### 備份位置 ``` /Users/accusys/momentry/backup/n8n_workflows/api/ ├── 20260321_122059/ │ ├── workflows.json # 21 workflows │ ├── workflows.json.sha256 # SHA256 校驗 │ ├── tags.json # Tags(若有) │ └── manifest.json # 元數據 └── ... ``` ### Crontab 建議 ```bash # 每日備份(下午 3 點) 0 15 * * * N8N_API_KEY="..." /opt/homebrew/bin/python3.11 /Users/accusys/momentry_core_0.1/monitor/workflow/backup_n8n_api.py >> /Users/accusys/momentry/log/monitor/workflow_backup_api.log 2>&1 ``` --- ## API Key Management System (2026-03-21) ### 設計目標 為 Momentry Core 實現完整的 API Key 管理系統,包括: - API Key 生成(安全隨機) - Key 哈希(SHA256) - 異常檢測 - 強制輪換機制 - 審計日誌 ### 模組架構 ``` src/core/api_key/ ├── mod.rs # 模組導出 ├── models.rs # 數據模型和類型 ├── service.rs # 核心服務邏輯 ├── anomaly.rs # 異常檢測 └── rotation.rs # 輪換管理 ``` ### Key 類型 | 類型 | 前綴 | 默認 TTL | 寬限期 | |------|------|----------|--------| | System | `msys_` | 365 天 | 72 小時 | | User | `muser_` | 90 天 | 24 小時 | | Service | `msvc_` | 180 天 | 48 小時 | | Integration | `mint_` | 30 天 | 24 小時 | | Emergency | `memg_` | 1 天 | 0 小時 | ### Key 格式 ``` {prefix}{uuid}_{timestamp}_{random} 例如: muser_a1b2c3d4e5f6_1710998400_abc12345 ``` ### 異常檢測閾值 | 指標 | 閾值 | |------|------| | 每分鐘請求數 | 1000 | | 每小時請求數 | 10000 | | 錯誤率 | 50% | | 每小時唯一 IP 數 | 5 | | 鎖定閾值 | 3 次觸發 | ### 實現狀態 | 組件 | 狀態 | 說明 | |------|------|------| | 數據模型 | ✅ 完成 | `models.rs` | | Key 生成/哈希 | ✅ 完成 | `service.rs` | | 異常檢測 | ✅ 完成 | `anomaly.rs` | | 輪換機制 | ✅ 完成 | `rotation.rs` | | CLI 命令 | ✅ 完成 | `main.rs` | | 數據庫集成 | ✅ 完成 | `postgres_db.rs` | | Redis 告警 | ✅ 完成 | `redis_client.rs` | | 數據庫遷移 | ✅ 完成 | `migrations/001_api_key_management.sql` | | 單元測試 | ✅ 完成 | 55 個測試通過 | ### CLI 命令 ```bash # 創建 API Key momentry api-key create --key-type service --ttl 90 # 列出所有 Keys momentry api-key list # 驗證 Key momentry api-key validate --key # 撤銷 Key momentry api-key revoke --key # 請求輪換 momentry api-key rotate --key # 顯示統計 momentry api-key stats ``` ### 參考文件 - `src/core/api_key/` - API Key 模組 - `docs/API_KEY_MANAGEMENT.md` - 設計文檔 - `migrations/001_api_key_management.sql` - 數據庫遷移 --- ## 問題 #5: Redis 用戶名問題 (2026-03-21) ### 問題描述 Redis 僅有 `default` 用戶,無 `accusys` 用戶。`.env` 檔案使用 `redis://accusys:accusys@localhost:6379` 格式會導致認證失敗。 ### 測試結果 | URL 格式 | 結果 | |----------|------| | `redis://accusys:accusys@localhost:6379` | ❌ AUTH failed | | `redis://:accusys@localhost:6379` | ✅ PONG | ### Redis ACL 狀態 ``` user default on sanitize-payload #1bd51c... ~* &* +@all requirepass: accusys ``` ### 根本原因 1. Redis 啟動時僅設定 `--requirepass accusys` 2. 未建立自訂用戶 `accusys` 3. ACL 變更不會持久化(無 config file) ### 已執行修復 | 項目 | 修改 | |------|------| | `.env` | `redis://accusys:accusys@localhost:6379` → `redis://:accusys@localhost:6379` | ### 待解決問題 1. **ACL 持久化**:Redis 啟動後手動建立的用戶不會保留(重啟後消失) 2. **需配置 ACL 文件**:建議建立 `users.acl` 並在 plist 中指定 ### 建議解決方案 #### 方案 A:使用默認用戶(現行) ```bash # .env REDIS_URL=redis://:accusys@localhost:6379 ``` **優點**:簡單,無需修改 Redis 配置 **缺點**:所有應用共享默認用戶 #### 方案 B:建立 ACL 配置文件 ```bash # 1. 創建 ACL 文件 cat > /Users/accusys/momentry/etc/redis/users.acl << 'EOF' user default on sanitize-payload ~* &* +@all >accusys user accusys on sanitize-payload ~* &* +@all >accusys EOF # 2. 修改 plist 添加 --aclfile 參數 --aclfile /Users/accusys/momentry/etc/redis/users.acl # 3. 重啟 Redis sudo launchctl unload /Library/LaunchDaemons/com.momentry.redis.plist sudo launchctl load /Library/LaunchDaemons/com.momentry.redis.plist ``` **優點**:支持多用戶,ACL 持久化 **缺點**:需修改 plist 並重啟 ### 影響範圍 - `src/core/config.rs` - REDIS_URL 讀取 - `src/core/db/redis_client.rs` - Redis 連線 - `momentry api-key` 命令 - 異常告警 ### 狀態 - [x] 已確認問題存在 - [x] 已修改 `.env` 使用默認用戶 - [ ] 待決定是否實施 ACL 方案 --- ## 問題 #6: Momentry Core API 未開機自動啟動 (2026-03-23) ### 問題描述 Momentry Core API 服務 (`momentry server --port 3002`) 未設定 launchd,導致: 1. 系統重啟後 API 服務不會自動啟動 2. `api.momentry.ddns.net` 返回 502 Bad Gateway 3. n8n workflow 呼叫 API 時失敗 ### 發現過程 1. n8n workflow 呼叫 `https://api.momentry.ddns.net/api/v1/n8n/search` 返回 502 2. 檢查發現 port 3002 無服務運行 3. Caddy 配置正向確,但後端服務未啟動 4. 手動啟動服務後 API 正常運作 ### 配置需求 | 項目 | 值 | |------|-----| | 服務名稱 | `com.momentry.api` | | 二進位檔 | `/Users/accusys/momentry_core_0.1/target/release/momentry` | | 命令 | `server --port 3002` | | Port | 3002 | | 環境變數 | `DATABASE_URL`, `REDIS_URL` 等 | ### 待辦事項 - [x] 建立 `docs/INSTALL_MOMENTRY_API.md` 安裝文件 - [x] 建立 `/Library/LaunchDaemons/com.momentry.api.plist` - [x] 設定環境變數 (`DATABASE_URL`, `REDIS_URL` 等) - [x] 測試 launchctl load/unload - [x] 驗證開機自動啟動 (launchd 載入成功) ### 完成日期 2026-03-23 ### 參考文件 - `/Library/LaunchDaemons/com.momentry.n8n.main.plist` - n8n plist 範例 - `docs/INSTALL_N8N.md` - plist 配置說明 --- ## 服務統一遷移 (2026-03-24) ### 問題描述 Reboot 後發現 n8n workflow 數量從 42 變成 41,確認是 PostgreSQL 資料庫問題。經過調查發現: 1. **兩組不同的 PostgreSQL 資料目錄**: - Homebrew plist: `/opt/homebrew/var/postgresql@18` (有最新資料) - Custom plist: `/Users/accusys/momentry/var/postgresql` (可能是舊資料) 2. **Reboot 時 custom plist 搶先啟動**,使用了錯誤的資料目錄 ### 解決方案 1. **統一使用 custom plist**: - 刪除 homebrew plist (`~/Library/LaunchAgents/homebrew.mxcl.postgresql@18.plist`) - Custom plist 使用 `/Users/accusys/momentry/var/postgresql` 作為資料目錄 - 將所有 14 個服務的 plist 註冊到 launchd 2. **所有已遷移的服務**: | 服務 | Plist | 資料目錄 | |------|-------|----------| | PostgreSQL | ✅ | `/Users/accusys/momentry/var/postgresql` | | MariaDB | ✅ | `/Users/accusys/momentry/var/mariadb` | | MongoDB | ✅ | `/opt/homebrew/var/mongodb` | | Redis | ✅ | - | | Ollama | ✅ | - | | Qdrant | ✅ | - | | n8n Main | ✅ | - | | n8n Worker | ✅ | - | | Caddy | ✅ | - | | SFTPGo | ✅ | - | | Gitea | ✅ | - | | Gitea MCP | ✅ | - | | PHP | ✅ | - | | Momentry API | ✅ | - | | RustDesk HBBR | ✅ | - | | RustDesk HBBS | ✅ | - | ### 還發現的 Homebrew 服務 (未遷移) | 服務 | 建議 | |------|------| | homebrew.mxcl.grafana | ⚠️ 考慮遷移 | | homebrew.mxcl.prometheus | ⚠️ 考慮遷移 | | homebrew.mxcl.openwebui | ⚠️ 考慮遷移 | | homebrew.mxcl.kafka | ⚠️ 考慮遷移 | | homebrew.mxcl.seaweedfs | ⚠️ 考慮遷移 | | homebrew.mxcl.netdata | ⚠️ 考慮遷移 | | homebrew.mxcl.ddclient | ⚠️ 動態 DNS | | homebrew.mxcl.shadowsocks-rust | ⚠️ VPN | ### 預防措施 1. **確保統一資料目錄**:所有服務只使用一個資料目錄 2. **Reboot 測試**:遷移完成後需進行 Reboot 測試 3. **文件同步**:plist 檔案同步到 repo ### 完成日期 2026-03-24 ### 參考文件 - `docs/SERVICES.md` - 服務管理文檔 - `docs/SERVICE_ADDITION_GUIDE.md` - 服務添加規範 - `momentry_runtime/plist/` - plist 檔案存放位置 --- ## Job Worker 實作 (2026-03-24) ### 目標 實作輪詢式 Job Worker,實現檔案註冊後自動觸發處理: 1. **輪詢機制**:Worker 定期輪詢 jobs 佇列 2. **並行處理**:最多 2 個 processor 同時執行 3. **失敗容忍**:任一模組獨立,失敗可接續 ### 設計決策 | 項目 | 決策 | 理由 | |------|------|------| | 觸發方式 | 輪詢(Job Worker) | 暫無可靠 API 觸發 | | 並行處理 | 最多 2 個 | 可根據 CPU/GPU 調整 | | 失敗處理 | 獨立模組,部分完成可接續 | 任何模組失敗都產出狀態 | | Worker 啟動 | 獨立進程 | 隔離、易管理 | | 並行上限 | 環境變數 + 預設值 | 靈活調整 | | 狀態同步 | PostgreSQL + Redis | 可靠 + 即時 | ### 環境變數 | 變數 | 預設值 | 說明 | |------|--------|------| | `MOMENTRY_MAX_CONCURRENT` | 2 | 最大並行 processor 數 | | `MOMENTRY_POLL_INTERVAL` | 5 | 輪詢間隔(秒) | | `MOMENTRY_WORKER_ENABLED` | true | 是否啟用 worker | ### 實作計畫 詳細內容請參考 [JOB_WORKER_IMPLEMENTATION_PLAN.md](./JOB_WORKER_IMPLEMENTATION_PLAN.md) ### Phase 規劃 | Phase | 任務 | 預估工時 | |-------|------|----------| | 1 | 資料庫遷移 | 2h | | 2 | Worker 框架 | 4h | | 3 | Register API 整合 | 2h | | 4 | Processor 執行 | 4h | | 5 | 進度追蹤 | 2h | | 6 | API 端點 | 3h | | 7 | CLI 命令 | 2h | | 8 | 測試 | 4h | **總預估**: ~23h ### 實作結構 ``` src/ ├── worker/ │ ├── mod.rs # Worker 模組導出 │ ├── config.rs # Worker 配置 │ ├── worker.rs # Worker 主邏輯 │ ├── processor.rs # Processor 執行器 │ ├── queue.rs # Job 佇列管理 │ └── progress.rs # 進度追蹤 ├── api/ │ └── server.rs # 更新 Register API └── main.rs # 新增 worker 命令 ``` ### 狀態 - [x] 系統分析完成 - [x] 實作計畫文件建立 - [ ] Phase 1: 資料庫遷移 - [ ] Phase 2: Worker 框架 - [ ] Phase 3: Register API 整合 - [ ] Phase 4: Processor 執行 - [ ] Phase 5-8: 依序實作 ### 參考文件 - `docs/JOB_WORKER_IMPLEMENTATION_PLAN.md` - 完整實作計畫 - `docs/PROCESSING_PIPELINE.md` - 處理流程 - `docs/MOMENTRY_CORE_REDIS_KEYS.md` - Redis Key 設計 --- ## 統一會員系統 + 影片歸屬追蹤 (2026-03-24) ### 目標 建立統一的會員系統: 1. WordPress 作為唯一登入入口 2. 每個影片關聯到 user_id(追蹤歸屬) 3. Per-user 配額管理 4. API 端點啟用認證 ### 實作計畫 詳細內容請參考 [USER_MANAGEMENT_PLAN.md](./USER_MANAGEMENT_PLAN.md) ### Phase 規劃 | Phase | 任務 | 複雜度 | 優先級 | 預估工時 | |-------|------|--------|--------|----------| | 1 | WordPress Application Passwords 測試 | 低 | P0 | 1.5h | | 2 | 資料庫遷移 (users 表) | 中 | P0 | 3h | | 3 | API auth middleware | 中 | P0 | 4h | | 4 | Register API 更新 | 低 | P0 | 2h | | 5 | Admin users API | 中 | P1 | 4h | | 6 | n8n workflow | 中 | P1 | 6h | | 7 | 配額管理 | 中 | P2 | 4h | | 8 | 測試驗證 | 中 | P2 | 4h | **總預估**: ~28.5h ### 待確認事項 - [ ] WordPress 用戶建立方式(手動/Elementor表單) - [ ] API Key 格式確認 - [ ] SFTPGo 整合方式 - [ ] 配額管理策略 - [ ] 用戶刪除同步流程 ### 狀態 - [x] 系統分析完成 - [x] 實作計畫文件建立 - [ ] Phase 1: WordPress 認證測試 - [ ] Phase 2: 資料庫遷移 - [ ] Phase 3-8: 依序實作 ### 參考文件 - `docs/USER_MANAGEMENT_PLAN.md` - 完整實作計畫 - `docs/API_KEY_MANAGEMENT.md` - API Key 管理 - `docs/SFTPGO_DEMO_USER.md` - SFTPGo 用戶設定