Files
momentry_core/docs/SERVICES.md
accusys 1122dd977c docs: add Momentry Playground and Job Worker to SERVICES.md
- Add Momentry Playground binary entry (port 3003, dev environment)
- Add Job Worker architecture and monitoring section
- Add Momentry API vs Playground comparison table
- Add Job Worker environment variables documentation
- Add SQL monitoring commands for jobs and processors
2026-03-25 14:53:41 +08:00

30 KiB
Raw Blame History

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

狀態監控:

# 查看待處理工作
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 = <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

驗證命令:

opencode mcp ls

詳細文檔: OpenCode MCP 安裝指南

測試腳本

#!/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

安裝

# 檢查是否已安裝
brew list postgresql@18 2>/dev/null || echo "Not installed"

# 安裝 PostgreSQL 18
brew install postgresql@18

資料目錄

/Users/accusys/momentry/var/postgresql

重要: 確保使用統一的資料目錄,避免與 homebrew plist 衝突。

開機自動啟動

# 建立 plist 檔案
sudo tee /Library/LaunchDaemons/com.momentry.postgresql.plist > /dev/null <<'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.momentry.postgresql</string>
    <key>UserName</key>
    <string>accusys</string>
    <key>EnvironmentVariables</key>
    <dict>
        <key>LC_ALL</key>
        <string>en_US.UTF-8</string>
    </dict>
    <key>WorkingDirectory</key>
    <string>/Users/accusys/momentry/var/postgresql</string>
    <key>ProgramArguments</key>
    <array>
        <string>/opt/homebrew/opt/postgresql@18/bin/postgres</string>
        <string>-D</string>
        <string>/Users/accusys/momentry/var/postgresql</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
    <key>StandardErrorPath</key>
    <string>/Users/accusys/momentry/log/postgresql.error.log</string>
    <key>StandardOutPath</key>
    <string>/Users/accusys/momentry/log/postgresql.log</string>
</dict>
</plist>
EOF

# 載入服務
sudo launchctl bootstrap system /Library/LaunchDaemons/com.momentry.postgresql.plist

管理命令

# 啟動
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

健康檢查

# 方法 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

安裝

# 檢查是否已安裝
brew list redis 2>/dev/null || echo "Not installed"

# 安裝 Redis
brew install redis

設定密碼

# 編輯 Redis 設定檔
vim /opt/homebrew/etc/redis.conf

# 找到 requirepass 行,修改為:
requirepass accusys

# 或使用環境變數方式啟動

開機自動啟動

# 建立 plist 檔案
sudo tee /Library/LaunchDaemons/com.momentry.redis.plist > /dev/null <<'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.momentry.redis</string>
    <key>UserName</key>
    <string>accusys</string>
    <key>WorkingDirectory</key>
    <string>/Users/accusys/momentry/var/redis</string>
    <key>ProgramArguments</key>
    <array>
        <string>/opt/homebrew/opt/redis/bin/redis-server</string>
        <string>/opt/homebrew/etc/redis.conf</string>
    </array>
    <key>EnvironmentVariables</key>
    <dict>
        <key>REDIS_PASSWORD</key>
        <string>accusys</string>
    </dict>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
    <key>StandardOutPath</key>
    <string>/Users/accusys/momentry/log/redis.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/accusys/momentry/log/redis.error.log</string>
</dict>
</plist>
EOF

# 載入服務
sudo launchctl load /Library/LaunchDaemons/com.momentry.redis.plist

管理命令

# 啟動
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

健康檢查

# 方法 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

安裝

# 檢查是否已安裝
which ollama || echo "Not installed"

# 安裝 Ollama
brew install ollama

模型下載

# 下載 Mistral (LLM)
ollama pull mistral:latest

# 下載 Embedding 模型
ollama pull nomic-embed-text:latest

# 驗證模型
ollama list

開機自動啟動

# 建立 plist 檔案
sudo tee /Library/LaunchDaemons/com.momentry.ollama.plist > /dev/null <<'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.momentry.ollama</string>
    <key>UserName</key>
    <string>accusys</string>
    <key>WorkingDirectory</key>
    <string>/Users/accusys/momentry/var/ollama</string>
    <key>ProgramArguments</key>
    <array>
        <string>/opt/homebrew/bin/ollama</string>
        <string>serve</string>
    </array>
    <key>EnvironmentVariables</key>
    <dict>
        <key>OLLAMA_HOST</key>
        <string>0.0.0.0:11434</string>
        <key>OLLAMA_MODELS</key>
        <string>/Users/accusys/momentry/var/ollama/models</string>
    </dict>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
    <key>StandardOutPath</key>
    <string>/Users/accusys/momentry/log/ollama.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/accusys/momentry/log/ollama.error.log</string>
</dict>
</plist>
EOF

# 載入服務
sudo launchctl load /Library/LaunchDaemons/com.momentry.ollama.plist

管理命令

# 啟動
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

健康檢查

# 方法 1: API 測試
curl -s http://localhost:11434/api/tags | jq '.models[].name'

# 方法 2: 檢查程序
pgrep -f ollama

# 方法 3: 列出模型
ollama list

4. n8n (工作流自動化)

安裝

# 檢查是否已安裝
which n8n || echo "Not installed"

# 安裝 n8n
brew install n8n

開機自動啟動

# 複製 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

管理命令

# 啟動
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

健康檢查

# 方法 1: API 測試
curl -s http://localhost:5678/

# 方法 2: 檢查程序
ps aux | grep n8n | grep -v grep

# 方法 3: 檢查端口
lsof -i :5678
lsof -i :5679

可選服務

4. Caddy (網頁伺服器)

# 安裝
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 (監控)

# 安裝
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 (監控)

# 安裝
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 (系統監控)

# 安裝
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:

#!/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

使用方式:

chmod +x scripts/health_check.sh
./scripts/health_check.sh

服務管理速查表

啟動服務 (使用 launchctl bootstrap)

# 所有服務
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)

# 所有 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

查詢服務狀態

# 查看所有 Momentry 服務
launchctl list | grep com.momentry

# 查看特定服務
launchctl list | grep com.momentry.postgresql
launchctl list | grep com.momentry.n8n

故障排除

PostgreSQL 問題

# 查看日誌
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 問題

# 查看日誌
tail -f /opt/homebrew/var/log/redis.log

# 測試連線
redis-cli -a accusys DEBUG SLEEP 1

# 重新整理 ACL
redis-cli -a accusys FLUSHALL

Ollama 問題

# 查看日誌
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:

#!/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