# Momentry 系統服務安裝與管理指南 | 項目 | 內容 | |------|------| | 建立者 | Warren | | 建立時間 | 2026-03-18 | | 更新時間 | 2026-03-25 | | 文件版本 | V1.2 | --- ## 版本歷史 | 版本 | 日期 | 目的 | 操作人 | 工具/模型 | |------|------|------|--------|-----------| | V1.0 | 2026-03-18 | 創建文件 | Warren | OpenCode / MiniMax M2.5 | | V1.1 | 2026-03-24 | 更新所有服務 plist 狀態,統一使用自定義 plist | OpenCode | OpenCode / big-pickle | | V1.2 | 2026-03-25 | 新增 Momentry Playground、Job Worker 說明 | OpenCode | OpenCode / GLM-5 | --- ## 概述 本文檔記錄 momentry 系統所需的所有服務,包括安裝步驟、健康檢查和管理命令。 **重要**: 請勿使用 `brew services` 命令管理服務,否則可能導致 .plist 檔案還原為預設狀態,造成系統異常。請使用 `launchctl` 命令進行管理。 **2026-03-24 更新**: 所有服務已統一使用自定義 plist,存在於 `/Library/LaunchDaemons/` 目錄。Reboot 後會自動啟動。 --- ## 服務清單 | 服務名稱 | 安裝方式 | 用途 | 狀態 | |----------|----------|------|-------| | PostgreSQL | 自定義 plist | 影片元資料儲存 | ✅ 正常 | | Redis | 自定義 plist | 快取與工作佇列 | ✅ 正常 | | Ollama | 自定義 plist | 本地 LLM 推論 | ✅ 正常 | | Caddy | 自定義 plist | 網頁伺服器 | ✅ 正常 | | Gitea | 自定義 plist | Git 服務 | ✅ 正常 | | Gitea MCP Server | 自定義 plist | Gitea MCP 整合 | ✅ 正常 | | Grafana | Homebrew | 監控儀表板 | ⚠️ Homebrew | | Kafka | 手動安裝 | 訊息佇列 (可選) | ⚠️ 未遷移 | | MariaDB | 自定義 plist | 資料庫 (可選) | ✅ 正常 | | Netdata | Homebrew | 系統監控 | ⚠️ Homebrew | | PHP | 自定義 plist | Web 後端 | ✅ 正常 | | Prometheus | Homebrew | 指標收集 | ⚠️ Homebrew | | SeaweedFS | 手動安裝 | 分散式儲存 (可選) | ⚠️ 未遷移 | | SFTPGo | 自定義 plist | SFTP 服務 | ✅ 正常 | | n8n | 自定義 plist | 工作流自動化 | ✅ 正常 | | n8n Worker | 自定義 plist | 工作流 Worker | ✅ 正常 | | MongoDB | 自定義 plist | 文件資料庫 | ✅ 正常 | | Qdrant | 自定義 plist | 向量資料庫 | ✅ 正常 | | Momentry API | 自定義 plist | 影片管理 API | ✅ 正常 | | Momentry Playground | CLI | 開發測試用二進位 | ✅ 正常 | | RustDesk HBBR | 自定義 plist | 遠端桌面橋接 | ✅ 正常 | | RustDesk HBBS | 自定義 plist | 遠端桌面服務器 | ✅ 正常 | --- ## Momentry 服務說明 ### Momentry API vs Momentry Playground | 項目 | Momentry API | Momentry Playground | |------|--------------|---------------------| | 用途 | 生產環境 | 開發/測試環境 | | Port | 3002 | 3003 | | Redis Prefix | `momentry:` | `momentry_dev:` | | 環境變數 | `.env` | `.env.development` | | 啟動命令 | `cargo run --bin momentry -- server` | `cargo run --bin momentry_playground -- server` | ### Job Worker Job Worker 是 Momentry Core 的背景處理系統,負責執行影片處理任務。 **架構**: - 輪詢 `monitor_jobs` 表取得待處理任務 - 最多同時執行 2 個 processor(可透過環境變數調整) - 更新 `processor_results` 表記錄每個處理器狀態 **環境變數**: | 變數 | 預設值 | 說明 | |------|--------|------| | `MOMENTRY_MAX_CONCURRENT` | 2 | 最大並行處理器數 | | `MOMENTRY_POLL_INTERVAL` | 5 | 輪詢間隔(秒) | | `MOMENTRY_WORKER_ENABLED` | true | 是否啟用 Worker | **狀態監控**: ```bash # 查看待處理工作 psql -U accusys -d momentry -c "SELECT * FROM monitor_jobs WHERE status = 'pending';" # 查看執行中工作 psql -U accusys -d momentry -c "SELECT * FROM monitor_jobs WHERE status = 'running';" # 查看處理器狀態 psql -U accusys -d momentry -c "SELECT * FROM processor_results WHERE job_id = ;" ``` --- ## 服務健康檢查結果 (2026-03-24) ### ✅ 正常運行的服務 | 服務 | 版本 | Port | 測試命令 | 結果 | |------|------|------|----------|------| | **PostgreSQL** | 18.1 | 5432 | `pg_isready -h 127.0.0.1 -p 5432` | ✅ 接受連線 | | **Redis** | 7.4.x | 6379 | `redis-cli -a accusys ping` | ✅ PONG | | **MongoDB** | 8.2.6 | 27017 | `mongosh --eval "db.adminCommand('ping')"` | ✅ { ok: 1 } | | **Ollama** | - | 11434 | `curl -s http://localhost:11434/api/tags` | ✅ 模型可用 | | **n8n** | 2.12.3 | 5678/5681/5682 | `curl -s http://localhost:5678/healthz` | ✅ {"status":"ok"} | | **n8n Worker** | 2.12.3 | 5681/5690/5691 | - | ✅ 運行中 | | **Momentry API** | 0.1.0 | 3002 | `curl -s http://localhost:3002/health` | ✅ OK | | **Momentry Playground** | 0.1.0 | 3003 | `curl -s http://localhost:3003/health` | ✅ OK (開發環境) | | **Qdrant** | 1.17.0 | 6333 | `curl -s http://localhost:6333/` | ✅ 版本資訊 | | **Caddy** | 2.10.x | 443 | `curl -sI https://momentry.ddns.net` | ✅ HTTP 200 | | **SFTPGo** | 2.7.x | 8080 | `curl -s http://localhost:8080/sftpgo/` | ✅ JSON 響應 | | **Gitea** | - | 3000 | `curl -s http://localhost:3000/` | ✅ HTML 響應 | | **Gitea MCP** | - | 8787 | `curl -s http://localhost:8787/` | ✅ 運行中 | | **MariaDB** | 12.1.x | 3306 | `mariadb -u root -e "SELECT 1;"` | ✅ 正常 | | **PHP-FPM** | 8.5.x | 9000 | `ps aux \| grep php-fpm` | ✅ 運行中 | ### ⚠️ 需要配置的服務 | 服務 | 問題 | 解決方案 | |------|------|----------| | Grafana | 使用 Homebrew | 考慮遷移到自定義 plist | | Prometheus | 使用 Homebrew | 考慮遷移到自定義 plist | | Kafka | 未遷移 | 可選服務 | | SeaweedFS | 未遷移 | 可選服務 | | Netdata | 使用 Homebrew | 考慮遷移到自定義 plist | ### ⚠️ Homebrew 管理的服務 (建議遷移) | 服務 | 風險 | |------|------| | homebrew.mxcl.grafana | Reboot 後可能自動啟動但使用預設設定 | | homebrew.mxcl.prometheus | Reboot 後可能自動啟動但使用預設設定 | | homebrew.mxcl.openwebui | 需要確認是否需要 | | homebrew.mxcl.kafka | 需要確認是否需要 | | homebrew.mxcl.seaweedfs | 需要確認是否需要 | | homebrew.mxcl.netdata | 需要確認是否需要 | | homebrew.mxcl.ddclient | 動態 DNS,可能需要 | | homebrew.mxcl.shadowsocks-rust | VPN,可能需要 | ### MCP Servers (2026-03-24) | Server | 安裝方式 | 路徑 | 狀態 | |--------|----------|------|------| | gitea | Homebrew | /opt/homebrew/bin/gitea-mcp-server | ✅ Connected | | n8n | NPM | /opt/homebrew/bin/mcp-n8n | ✅ Connected | | postgres | NPM | /opt/homebrew/bin/mcp-server-postgres | ✅ Connected | | redis | NPM | /opt/homebrew/bin/mcp-server-redis | ✅ Connected | | mongodb | NPM | /opt/homebrew/bin/mongodb-mcp-server | ✅ Connected | | qdrant | Python | /opt/homebrew/bin/mcp-server-qdrant | ✅ Connected | | filesystem | NPM | /opt/homebrew/bin/mcp-server-filesystem | ✅ Connected | | sentry | NPM | /opt/homebrew/bin/sentry-mcp | ⏳ Pending Config | | context7 | NPM | /opt/homebrew/bin/context7-mcp | ✅ Connected | | playwright | NPM | /opt/homebrew/bin/playwright-mcp | ✅ Connected | **配置文件**: `~/.config/opencode/opencode.json` **驗證命令**: ```bash opencode mcp ls ``` **詳細文檔**: [OpenCode MCP 安裝指南](./OPENCODE_MCP_INSTALL.md) ### 測試腳本 ```bash #!/bin/bash # services_health_check.sh echo "=== Momentry 服務健康檢查 ===" echo "" # PostgreSQL pg_isready -h 127.0.0.1 -p 5432 -U accusys > /dev/null 2>&1 && echo "✅ PostgreSQL" || echo "❌ PostgreSQL" # Redis redis-cli -a accusys ping > /dev/null 2>&1 && echo "✅ Redis" || echo "❌ Redis" # MongoDB mongosh --quiet --eval "db.adminCommand('ping')" > /dev/null 2>&1 && echo "✅ MongoDB" || echo "❌ MongoDB" # Ollama curl -s http://localhost:11434/api/tags > /dev/null 2>&1 && echo "✅ Ollama" || echo "❌ Ollama" # n8n curl -s http://localhost:5678/ > /dev/null 2>&1 && echo "✅ n8n" || echo "❌ n8n" # Momentry API curl -s http://localhost:3002/health > /dev/null 2>&1 && echo "✅ Momentry API" || echo "❌ Momentry API" # Qdrant curl -s http://localhost:6333/ > /dev/null 2>&1 && echo "✅ Qdrant" || echo "❌ Qdrant" # Caddy curl -sI https://momentry.ddns.net > /dev/null 2>&1 && echo "✅ Caddy" || echo "❌ Caddy" # SFTPGo curl -s http://localhost:8080/api/v2/healthz > /dev/null 2>&1 && echo "✅ SFTPGo" || echo "⚠️ SFTPGo (需配置)" ``` --- --- ## 必要服務 (Momentry 核心) ### 1. PostgreSQL #### 安裝 ```bash # 檢查是否已安裝 brew list postgresql@18 2>/dev/null || echo "Not installed" # 安裝 PostgreSQL 18 brew install postgresql@18 ``` #### 資料目錄 ``` /Users/accusys/momentry/var/postgresql ``` **重要**: 確保使用統一的資料目錄,避免與 homebrew plist 衝突。 #### 開機自動啟動 ```bash # 建立 plist 檔案 sudo tee /Library/LaunchDaemons/com.momentry.postgresql.plist > /dev/null <<'EOF' Label com.momentry.postgresql UserName accusys EnvironmentVariables LC_ALL en_US.UTF-8 WorkingDirectory /Users/accusys/momentry/var/postgresql ProgramArguments /opt/homebrew/opt/postgresql@18/bin/postgres -D /Users/accusys/momentry/var/postgresql RunAtLoad KeepAlive StandardErrorPath /Users/accusys/momentry/log/postgresql.error.log StandardOutPath /Users/accusys/momentry/log/postgresql.log EOF # 載入服務 sudo launchctl bootstrap system /Library/LaunchDaemons/com.momentry.postgresql.plist ``` #### 管理命令 ```bash # 啟動 sudo launchctl bootstrap system /Library/LaunchDaemons/com.momentry.postgresql.plist # 停止 sudo launchctl bootout system/com.momentry.postgresql.plist # 重新載入 sudo launchctl bootout system/com.momentry.postgresql.plist sudo launchctl bootstrap system /Library/LaunchDaemons/com.momentry.postgresql.plist # 查看狀態 launchctl list | grep com.momentry.postgresql ``` #### 健康檢查 ```bash # 方法 1: 使用 pg_isready pg_isready -h localhost -p 5432 -U accusys # 方法 2: 連線測試 PGPASSWORD=n8n1234 psql -h localhost -U n8n -d n8n -c "SELECT 1;" # 方法 3: 檢查程序 pgrep -a postgres # 方法 4: 檢查資料庫 PGPASSWORD=n8n1234 psql -h localhost -U n8n -d n8n -c "SELECT COUNT(*) FROM workflow_entity;" ``` --- ### 2. Redis #### 安裝 ```bash # 檢查是否已安裝 brew list redis 2>/dev/null || echo "Not installed" # 安裝 Redis brew install redis ``` #### 設定密碼 ```bash # 編輯 Redis 設定檔 vim /opt/homebrew/etc/redis.conf # 找到 requirepass 行,修改為: requirepass accusys # 或使用環境變數方式啟動 ``` #### 開機自動啟動 ```bash # 建立 plist 檔案 sudo tee /Library/LaunchDaemons/com.momentry.redis.plist > /dev/null <<'EOF' Label com.momentry.redis UserName accusys WorkingDirectory /Users/accusys/momentry/var/redis ProgramArguments /opt/homebrew/opt/redis/bin/redis-server /opt/homebrew/etc/redis.conf EnvironmentVariables REDIS_PASSWORD accusys RunAtLoad KeepAlive StandardOutPath /Users/accusys/momentry/log/redis.log StandardErrorPath /Users/accusys/momentry/log/redis.error.log EOF # 載入服務 sudo launchctl load /Library/LaunchDaemons/com.momentry.redis.plist ``` #### 管理命令 ```bash # 啟動 sudo launchctl load /Library/LaunchDaemons/com.momentry.redis.plist # 停止 sudo launchctl unload /Library/LaunchDaemons/com.momentry.redis.plist # 重啟 sudo launchctl unload /Library/LaunchDaemons/com.momentry.redis.plist sudo launchctl load /Library/LaunchDaemons/com.momentry.redis.plist # 查看狀態 launchctl list | grep com.momentry.redis # 查看日誌 tail -f /Users/accusys/momentry/log/redis.log tail -f /Users/accusys/momentry/log/redis.error.log ``` #### 健康檢查 ```bash # 方法 1: 使用 redis-cli ping redis-cli -a accusys ping # 輸出應為: PONG # 方法 2: 檢查密碼認證 redis-cli -a accusys AUTH accusys # 方法 3: 檢查程序 pgrep -f redis-server # 方法 4: 檢查連線數 redis-cli -a accusys INFO clients ``` --- ### 3. Ollama #### 安裝 ```bash # 檢查是否已安裝 which ollama || echo "Not installed" # 安裝 Ollama brew install ollama ``` #### 模型下載 ```bash # 下載 Mistral (LLM) ollama pull mistral:latest # 下載 Embedding 模型 ollama pull nomic-embed-text:latest # 驗證模型 ollama list ``` #### 開機自動啟動 ```bash # 建立 plist 檔案 sudo tee /Library/LaunchDaemons/com.momentry.ollama.plist > /dev/null <<'EOF' Label com.momentry.ollama UserName accusys WorkingDirectory /Users/accusys/momentry/var/ollama ProgramArguments /opt/homebrew/bin/ollama serve EnvironmentVariables OLLAMA_HOST 0.0.0.0:11434 OLLAMA_MODELS /Users/accusys/momentry/var/ollama/models RunAtLoad KeepAlive StandardOutPath /Users/accusys/momentry/log/ollama.log StandardErrorPath /Users/accusys/momentry/log/ollama.error.log EOF # 載入服務 sudo launchctl load /Library/LaunchDaemons/com.momentry.ollama.plist ``` #### 管理命令 ```bash # 啟動 sudo launchctl load /Library/LaunchDaemons/com.momentry.ollama.plist # 停止 sudo launchctl unload /Library/LaunchDaemons/com.momentry.ollama.plist # 重啟 sudo launchctl unload /Library/LaunchDaemons/com.momentry.ollama.plist sudo launchctl load /Library/LaunchDaemons/com.momentry.ollama.plist # 查看狀態 launchctl list | grep com.momentry.ollama # 查看日誌 tail -f /Users/accusys/momentry/log/ollama.log tail -f /Users/accusys/momentry/log/ollama.error.log ``` #### 健康檢查 ```bash # 方法 1: API 測試 curl -s http://localhost:11434/api/tags | jq '.models[].name' # 方法 2: 檢查程序 pgrep -f ollama # 方法 3: 列出模型 ollama list ``` --- ### 4. n8n (工作流自動化) #### 安裝 ```bash # 檢查是否已安裝 which n8n || echo "Not installed" # 安裝 n8n brew install n8n ``` #### 開機自動啟動 ```bash # 複製 plist 到 LaunchDaemons 目錄 sudo cp /Users/accusys/momentry_core_0.1/momentry_runtime/plist/com.momentry.n8n.main.plist /Library/LaunchDaemons/ sudo cp /Users/accusys/momentry_core_0.1/momentry_runtime/plist/com.momentry.n8n.worker.plist /Library/LaunchDaemons/ # 載入服務 sudo launchctl load /Library/LaunchDaemons/com.momentry.n8n.main.plist sudo launchctl load /Library/LaunchDaemons/com.momentry.n8n.worker.plist ``` #### 管理命令 ```bash # 啟動 sudo launchctl load /Library/LaunchDaemons/com.momentry.n8n.main.plist sudo launchctl load /Library/LaunchDaemons/com.momentry.n8n.worker.plist # 停止 sudo launchctl unload /Library/LaunchDaemons/com.momentry.n8n.main.plist sudo launchctl unload /Library/LaunchDaemons/com.momentry.n8n.worker.plist ``` #### 健康檢查 ```bash # 方法 1: API 測試 curl -s http://localhost:5678/ # 方法 2: 檢查程序 ps aux | grep n8n | grep -v grep # 方法 3: 檢查端口 lsof -i :5678 lsof -i :5679 ``` --- ## 可選服務 ### 4. Caddy (網頁伺服器) ```bash # 安裝 brew install caddy # 開機啟動 cp /opt/homebrew.mxcl.caddy.plist /Library/LaunchDaemons/ sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.caddy.plist # 健康檢查 curl -s https://localhost:2019/config/ | head -5 ``` ### 5. Grafana (監控) ```bash # 安裝 brew install grafana # 開機啟動 cp /opt/homebrew.mxcl.grafana.plist ~/Library/LaunchAgents/ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.grafana.plist # 健康檢查 curl -s http://localhost:3000/api/health | jq '.' ``` ### 6. Prometheus (監控) ```bash # 安裝 brew install prometheus # 開機啟動 cp /opt/homebrew.mxcl.prometheus.plist ~/Library/LaunchAgents/ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.prometheus.plist # 健康檢查 curl -s http://localhost:9090/-/healthy ``` ### 7. Netdata (系統監控) ```bash # 安裝 brew install netdata # 開機啟動 sudo brew services start netdata # 健康檢查 curl -s http://localhost:19999/api/v1/info | jq '.version' ``` --- ## 統一健康檢查腳本 建立 `/Users/accusys/momentry_core_0.1/scripts/health_check.sh`: ```bash #!/bin/bash # Momentry 系統健康檢查腳本 echo "========================================" echo "Momentry 系統健康檢查" echo "========================================" echo "" # 顏色定義 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color check_service() { local name=$1 local check_cmd=$2 if eval "$check_cmd" > /dev/null 2>&1; then echo -e "${GREEN}✓${NC} $name" return 0 else echo -e "${RED}✗${NC} $name" return 1 fi } total=0 passed=0 # 1. PostgreSQL total=$((total + 1)) check_service "PostgreSQL (localhost:5432)" "pg_isready -h localhost -p 5432 -U accusys" && passed=$((passed + 1)) # 2. Redis total=$((total + 1)) check_service "Redis (localhost:6379)" "redis-cli -a accusys ping" && passed=$((passed + 1)) # 3. Ollama total=$((total + 1)) check_service "Ollama (localhost:11434)" "curl -s http://localhost:11434/api/tags > /dev/null" && passed=$((passed + 1)) # 4. n8n total=$((total + 1)) check_service "n8n (localhost:5678)" "curl -s http://localhost:5678/ > /dev/null" && passed=$((passed + 1)) # 5. Grafana (如果安裝) if command -v grafana-server > /dev/null 2>&1; then total=$((total + 1)) check_service "Grafana (localhost:3000)" "curl -s http://localhost:3000/api/health > /dev/null" && passed=$((passed + 1)) fi # 6. Prometheus (如果安裝) if command -v prometheus > /dev/null 2>&1; then total=$((total + 1)) check_service "Prometheus (localhost:9090)" "curl -s http://localhost:9090/-/healthy > /dev/null" && passed=$((passed + 1)) fi # 7. Netdata (如果安裝) if command -v netdata > /dev/null 2>&1; then total=$((total + 1)) check_service "Netdata (localhost:19999)" "curl -s http://localhost:19999/api/v1/info > /dev/null" && passed=$((passed + 1)) fi echo "" echo "========================================" echo "結果: $passed/$total 服務正常" echo "========================================" if [ $passed -eq $total ]; then exit 0 else exit 1 fi ``` 使用方式: ```bash chmod +x scripts/health_check.sh ./scripts/health_check.sh ``` --- ## 服務管理速查表 ### 啟動服務 (使用 launchctl bootstrap) ```bash # 所有服務 for plist in /Library/LaunchDaemons/com.momentry.*.plist; do sudo launchctl bootstrap system "$plist" done # PostgreSQL sudo launchctl bootstrap system /Library/LaunchDaemons/com.momentry.postgresql.plist # Redis, Ollama, Qdrant sudo launchctl bootstrap system /Library/LaunchDaemons/com.momentry.redis.plist sudo launchctl bootstrap system /Library/LaunchDaemons/com.momentry.ollama.plist sudo launchctl bootstrap system /Library/LaunchDaemons/com.momentry.qdrant.plist # n8n (main + worker) sudo launchctl bootstrap system /Library/LaunchDaemons/com.momentry.n8n.main.plist sudo launchctl bootstrap system /Library/LaunchDaemons/com.momentry.n8n.worker.plist ``` ### 停止服務 (使用 launchctl bootout) ```bash # 所有 Momentry 服務 for svc in $(launchctl list | grep com.momentry | awk '{print $3}'); do sudo launchctl bootout system/$svc 2>/dev/null done # PostgreSQL sudo launchctl bootout system/com.momentry.postgresql.plist # Redis, Ollama, Qdrant sudo launchctl bootout system/com.momentry.redis.plist sudo launchctl bootout system/com.momentry.ollama.plist sudo launchctl bootout system/com.momentry.qdrant.plist # n8n sudo launchctl bootout system/com.momentry.n8n.main.plist sudo launchctl bootout system/com.momentry.n8n.worker.plist ``` ### 查詢服務狀態 ```bash # 查看所有 Momentry 服務 launchctl list | grep com.momentry # 查看特定服務 launchctl list | grep com.momentry.postgresql launchctl list | grep com.momentry.n8n ``` --- ## 故障排除 ### PostgreSQL 問題 ```bash # 查看日誌 tail -f /opt/homebrew/var/postgresql@18/logfile # 重新初始化 pg_ctl -D /opt/homebrew/var/postgresql@18 stop rm -rf /opt/homebrew/var/postgresql@18 initdb -D /opt/homebrew/var/postgresql@18 # 重建資料庫 dropdb momentry createdb -U accusys momentry ``` ### Redis 問題 ```bash # 查看日誌 tail -f /opt/homebrew/var/log/redis.log # 測試連線 redis-cli -a accusys DEBUG SLEEP 1 # 重新整理 ACL redis-cli -a accusys FLUSHALL ``` ### Ollama 問題 ```bash # 查看日誌 tail -f ~/.ollama/logs/server.log # 重新下載模型 ollama pull mistral:latest ollama pull nomic-embed-text:latest # 檢查 GPU 使用情況 ollama list ``` --- ## 自動化腳本 建立 `/Users/accusys/momentry_core_0.1/scripts/service_manager.sh`: ```bash #!/bin/bash set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PLIST_DIR="$SCRIPT_DIR/../momentry_runtime/plist" action=${1:-start} service=${2:-all} start_postgresql() { echo "Starting PostgreSQL..." sudo launchctl load /Library/LaunchDaemons/com.momentry.postgresql.plist 2>/dev/null || \ echo "PostgreSQL plist not found, skipping..." } start_redis() { echo "Starting Redis..." launchctl load ~/Library/LaunchAgents/com.momentry.redis.plist 2>/dev/null || \ echo "Redis plist not found, skipping..." } start_ollama() { echo "Starting Ollama..." launchctl load ~/Library/LaunchAgents/com.momentry.ollama.plist 2>/dev/null || \ echo "Ollama plist not found, skipping..." } stop_postgresql() { echo "Stopping PostgreSQL..." sudo launchctl unload /Library/LaunchDaemons/com.momentry.postgresql.plist 2>/dev/null || true } stop_redis() { echo "Stopping Redis..." launchctl unload ~/Library/LaunchAgents/com.momentry.redis.plist 2>/dev/null || true } stop_ollama() { echo "Stopping Ollama..." launchctl unload ~/Library/LaunchAgents/com.momentry.ollama.plist 2>/dev/null || true } case $action in start) case $service in all) start_postgresql start_redis start_ollama ;; postgresql|pgsql|pg) start_postgresql ;; redis) start_redis ;; ollama) start_ollama ;; *) echo "Unknown service: $service" exit 1 ;; esac ;; stop) case $service in all) stop_ollama stop_redis stop_postgresql ;; postgresql|pgsql|pg) stop_postgresql ;; redis) stop_redis ;; ollama) stop_ollama ;; *) echo "Unknown service: $service" exit 1 ;; esac ;; restart) $0 stop $service sleep 2 $0 start $service ;; status) echo "Service Status:" echo "===============" launchctl list | grep -E "(postgres|redis|ollama)" || echo "No services found" ;; *) echo "Usage: $0 {start|stop|restart|status} [service]" echo "Services: all, postgresql, redis, ollama" exit 1 ;; esac ``` --- ## 服務快速參照 ### Port 對照表 | Port | 服務 | 說明 | |------|------|------| | 11434 | Ollama | LLM API | | 19999 | Netdata | 系統監控 | | 2019 | Caddy | 管理 API | | 21115-21119 | RustDesk | 遠端桌面 | | 27017 | MongoDB | 文件資料庫 | | 3000 | Gitea | Git 服務 | | 3001 | Grafana | 監控儀表板 | | 3002 | Momentry API | Rust API 伺服器 (生產環境) | | 3003 | Momentry Playground | Rust API 伺服器 (開發環境) | | 3306 | MariaDB | MySQL 相容資料庫 | | 4096 | OpenCode | CLI 工具 | | 5000-7000 | ControlCenter | 控制中心 | | 5678 | n8n | 工作流自動化 (Main) | | 5681 | n8n | Worker HTTP | | 5682 | n8n | Worker Health Check | | 5690 | n8n | Task Broker | | 5691 | n8n | Runner Health | | 6333-6334 | Qdrant | 向量資料庫 | | 6379 | Redis | 快取/佇列 | | 8080 | SFTPGo | HTTP/WebDAV | | 8081 | Trunk | 轉發服務 | | 8082 | SeaweedFS | Master | | 8090 | SFTPGo | WebDAV | | 8333 | SeaweedFS | Volume | | 8388 | Shadowsocks | VPN | | 8888 | SeaweedFS | Filer | | 9000 | PHP-FPM | PHP 處理器 | | 9090 | Prometheus | 指標收集 | | 9092-9093 | Kafka | 訊息佇列 | | 9333 | SeaweedFS | Volume | | 18082 | SeaweedFS | Volume | | 18333 | SeaweedFS | Volume | | 18888 | SeaweedFS | Filer | | 19333 | SeaweedFS | Volume | ## Caddy 反向代理 URL 對照表 | URL | 內部服務 | 說明 | |-----|----------|------| | `n8n.momentry.ddns.net` | :5678 | n8n 工作流自動化 | | `wp.momentry.ddns.net` | :9000 | WordPress 網站 | | `seaweed.momentry.ddns.net` | :8888 | SeaweedFS Filer | | `sftpgo.momentry.ddns.net` | :8080 | SFTPGo HTTP | | `webdav.momentry.ddns.net` | :8090 | SFTPGo WebDAV | | `qdrant.momentry.ddns.net` | :6333 | Qdrant 向量資料庫 | | `gitea.momentry.ddns.net` | :3000 | Gitea Git 服務 | | `chat.momentry.ddns.net` | :8085 | Open WebUI | | `netdata.momentry.ddns.net` | :19999 | Netdata 監控 | | `grafana.momentry.ddns.net` | :3001 | Grafana 儀表板 | | `router5.momentry.ddns.net` | 192.168.5.1:80 | Router 5 | | `router110.momentry.ddns.net` | 192.168.110.1:80 | Router 110 | | `router0.momentry.ddns.net/admin/*` | 192.168.0.1:80 | Router 0 | | `truenas.momentry.ddns.net` | 192.168.0.219:80 | TrueNAS | | `:3200` | :3002 | Momentry Dashboard + API | **Caddy 管理**: https://localhost:2019/ --- ## 目錄對照表 ### /Users/accusys/momentry/var/ | 目錄 | 服務 | 說明 | |------|------|------| | `caddy/` | Caddy | 資料目錄 | | `gitea/` | Gitea | Git 資料庫 | | `mariadb/` | MariaDB | 資料庫檔案 | | `mongodb/` | MongoDB | 文件資料庫 (自定義 plist) | | `n8n/` | n8n | 工作流資料 | | `ollama/` | Ollama | 模型快取 | | `php/` | PHP | FastCGI 進程 | | `postgresql/` | PostgreSQL | 主資料庫 (自定義 plist) | | `qdrant/` | Qdrant | 向量資料庫 | | `redis/` | Redis | 持久化檔案 | | `rustdesk/` | RustDesk | ID 資料庫 | | `sftpgo/` | SFTPGo | 使用者資料 | | `sftpgo_backup/` | SFTPGo | 備份 | ### /opt/homebrew/var/ (Homebrew 管理) | 目錄 | 服務 | 說明 | |------|------|------| | `mongodb/` | MongoDB | (舊) 文件資料庫 | | `postgresql@18/` | PostgreSQL | (舊) 主資料庫 | ### /Users/accusys/momentry/etc/ | 目錄 | 服務 | 說明 | |------|------|------| | `caddy/` | Caddy | 配置 | | `gitea/` | Gitea | 配置 | | `php/` | PHP | 配置 | | `sftpgo/` | SFTPGo | 配置 | ### /Users/accusys/momentry/log/ | 檔案 | 服務 | 說明 | |------|------|------| | `backup.log` | Backup | 備份日誌 | | `redis.log` | Redis | 執行日誌 | | `redis.error.log` | Redis | 錯誤日誌 | | `ollama.log` | Ollama | 執行日誌 | | `ollama.error.log` | Ollama | 錯誤日誌 | ### /Users/accusys/momentry/backup/ | 目錄 | 說明 | |------|------| | `daily/` | 每日備份 | | `weekly/` | 每週備份 | | `monthly/` | 每月備份 | --- ## 附錄: 服務版本對應表 | 服務 | 版本 | Port | 使用者 | plist 位置 | 資料目錄 | |------|------|------|--------|-------------|----------| | PostgreSQL | 18.1 | 5432 | accusys | /Library/LaunchDaemons/ | /Users/accusys/momentry/var/postgresql | | Redis | 7.4.x | 6379 | accusys | /Library/LaunchDaemons/ | /opt/homebrew/var/redis | | Ollama | 0.13.5 | 11434 | accusys | /Library/LaunchDaemons/ | /Users/accusys/momentry/var/ollama/models | | n8n | 2.12.3 | 5678/5681 | accusys | /Library/LaunchDaemons/ | /Users/accusys/momentry/var/n8n | | Node.js (n8n) | 22.22.1 | - | - | /opt/homebrew/opt/node@22/ | - | | Python (Momentry) | 3.11.14 | - | - | venv/bin/python | - | | Caddy | 2.10.x | 2019/443 | root | /Library/LaunchDaemons/ | /Users/accusys/momentry/var/caddy | | Gitea | - | 3000 | accusys | /Library/LaunchDaemons/ | /Users/accusys/momentry/var/gitea | | Gitea MCP | - | 8787 | accusys | /Library/LaunchDaemons/ | - | | SFTPGo | 2.7.x | 8080/2022 | accusys | /Library/LaunchDaemons/ | /Users/accusys/momentry/var/sftpgo | | Qdrant | 1.17.0 | 6333 | accusys | /Library/LaunchDaemons/ | /Users/accusys/.local/share/qdrant | | MongoDB | 8.2.6 | 27017 | root | /Library/LaunchDaemons/ | /opt/homebrew/var/mongodb | | MariaDB | 12.1.x | 3306 | accusys | /Library/LaunchDaemons/ | /Users/accusys/momentry/var/mariadb | | RustDesk HBBR | - | 21115 | accusys | /Library/LaunchDaemons/ | - | | RustDesk HBBS | - | 21115-21119 | accusys | /Library/LaunchDaemons/ | /Users/accusys/momentry/var/rustdesk | | PHP | 8.5.x | 9000 | - | /Library/LaunchDaemons/ | - | | Momentry API | 0.1.0 | 3002 | accusys | /Library/LaunchDaemons/ | - | | Momentry Playground | 0.1.0 | 3003 | accusys | - | - | --- ## 重要密碼與金鑰 | 服務 | 用途 | 預設值 | |------|------|--------| | **PostgreSQL** | 連線密碼 (accusys) | `accusys` | | **Redis** | 認證密碼 | `accusys` | | **Qdrant** | API Key | `Test3200Test3200Test3200` | | **n8n** | 資料庫密碼 | `n8n` (PostgreSQL) | | **SFTPGo** | 安裝碼 | `Test3200Test3200` | | **SFTPGo** | DB 密碼 | `sftpgo_pass_2026` | | **Momentry API** | 資料庫 | `postgres://accusys:accusys@127.0.0.1:5432/momentry` |