Initial commit: Momentry Core v0.1
- Rust-based digital asset management system - Video analysis: ASR, OCR, YOLO, Face, Pose - RAG capabilities with Qdrant vector database - Multi-database support: PostgreSQL, Redis, MongoDB - Monitoring system with launchd plists - n8n workflow automation integration
This commit is contained in:
451
docs/INSTALL_CADDY.md
Normal file
451
docs/INSTALL_CADDY.md
Normal file
@@ -0,0 +1,451 @@
|
||||
# Caddy 安裝指南 (本地部署)
|
||||
|
||||
## 概述
|
||||
|
||||
本文檔說明如何在 macOS 上安裝 Caddy Web Server,配置為本地部署,作為反向代理伺服器。
|
||||
|
||||
---
|
||||
|
||||
## 當前狀態
|
||||
|
||||
| 項目 | 狀態 |
|
||||
|------|------|
|
||||
| Caddy | ✅ 已安裝 v2.10.2 |
|
||||
| 設定檔 | /Users/accusys/momentry/etc/Caddyfile |
|
||||
| 日誌目錄 | /Users/accusys/momentry/log/ |
|
||||
| Plist | /Library/LaunchDaemons/com.momentry.caddy.plist |
|
||||
|
||||
---
|
||||
|
||||
## 安裝步驟
|
||||
|
||||
### Step 1: 安裝 Caddy (使用 brew)
|
||||
|
||||
```bash
|
||||
# 安裝 Caddy
|
||||
brew install caddy
|
||||
```
|
||||
|
||||
**驗證**:
|
||||
```bash
|
||||
caddy --version
|
||||
# v2.10.2
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 2: 建立目錄
|
||||
|
||||
```bash
|
||||
# 建立配置目錄
|
||||
mkdir -p /Users/accusys/momentry/etc/caddy
|
||||
|
||||
# 建立日誌目錄
|
||||
mkdir -p /Users/accusys/momentry/log
|
||||
|
||||
# 建立數據目錄
|
||||
mkdir -p /Users/accusys/momentry/var/caddy
|
||||
|
||||
# 建立日誌文件
|
||||
touch /Users/accusys/momentry/log/caddy.log
|
||||
touch /Users/accusys/momentry/log/caddy.error.log
|
||||
|
||||
# 設定權限
|
||||
# 注意: Caddy 使用 ports 80/443,必須以 root 身份運行
|
||||
# 因此 var/caddy 目錄需要 root:admin 權限
|
||||
chown -R accusys:staff /Users/accusys/momentry/etc/caddy
|
||||
chown -R accusys:staff /Users/accusys/momentry/log
|
||||
sudo chown -R root:admin /Users/accusys/momentry/var/caddy
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 3: 建立設定檔
|
||||
|
||||
建立 `/Users/accusys/momentry/etc/Caddyfile`:
|
||||
|
||||
```Caddyfile
|
||||
{
|
||||
email admin@accusys.com.tw
|
||||
metrics
|
||||
}
|
||||
|
||||
# 定義日誌 Snippet
|
||||
(common_log) {
|
||||
log {
|
||||
output file /Users/accusys/momentry/log/{args[0]}.log {
|
||||
roll_size 100mb
|
||||
roll_keep 5
|
||||
roll_keep_for 720h
|
||||
}
|
||||
format json
|
||||
}
|
||||
}
|
||||
|
||||
# Example: 反向代理到本地服務
|
||||
example.momentry.ddns.net {
|
||||
reverse_proxy localhost:8080 {
|
||||
header_up Host {upstream_hostport}
|
||||
}
|
||||
import common_log example_access
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 4: 使用 plist 開機自動啟動
|
||||
|
||||
**注意**: Caddy 需要使用 ports 80 和 443,必須以 root 身份運行。
|
||||
|
||||
```bash
|
||||
# 複製 plist 到 LaunchDaemons 目錄
|
||||
sudo cp /Users/accusys/momentry_core_0.1/momentry_runtime/plist/com.momentry.caddy.plist /Library/LaunchDaemons/
|
||||
|
||||
# 載入並啟動
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.caddy.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 監控配置
|
||||
|
||||
### 添加到監控配置
|
||||
|
||||
在 `monitor/config/monitor_config.yaml` 中添加:
|
||||
|
||||
```yaml
|
||||
service:
|
||||
services:
|
||||
- name: "caddy"
|
||||
type: "http"
|
||||
port: 80
|
||||
host: "localhost"
|
||||
check_url: "http://localhost:2019/config/"
|
||||
timeout: 5
|
||||
enabled: true
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 卸載步驟
|
||||
|
||||
### 重要: 路徑說明
|
||||
|
||||
| 路徑 | 類型 | 說明 |
|
||||
|------|------|------|
|
||||
| `/Users/accusys/momentry/etc/caddy/` | 配置 | **不要刪除** - Caddy 配置 |
|
||||
| `/Users/accusys/momentry/log/` | 日誌 | **不要刪除** - 日誌目錄 |
|
||||
| `/Users/accusys/momentry/var/caddy/` | 數據 | **不要刪除** - Caddy 數據 |
|
||||
| `/opt/homebrew/opt/caddy/` | 安裝 | **刪除** - Caddy 安裝目錄 |
|
||||
| `/opt/homebrew/opt/caddy/` | 安裝 | **刪除** - Caddy 安裝目錄 |
|
||||
|
||||
### Step 1: 停止 Caddy
|
||||
|
||||
```bash
|
||||
# 找到 Caddy 進程
|
||||
ps aux | grep caddy | grep -v grep
|
||||
|
||||
# 停止 Caddy
|
||||
pkill caddy
|
||||
|
||||
# 確認停止
|
||||
ps aux | grep caddy | grep -v grep || echo "Caddy 已停止"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 2: 卸載 Caddy
|
||||
|
||||
```bash
|
||||
# 卸載 Caddy
|
||||
brew uninstall caddy
|
||||
|
||||
# 移除 plist
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.caddy.plist
|
||||
sudo rm /Library/LaunchDaemons/com.momentry.caddy.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 3: 刪除專屬檔案
|
||||
|
||||
```bash
|
||||
# 刪除配置目錄 (可選)
|
||||
rm -rf /Users/accusys/momentry/etc/Caddyfile
|
||||
|
||||
# 刪除日誌 (可選)
|
||||
rm -f /Users/accusys/momentry/log/caddy.log
|
||||
rm -f /Users/accusys/momentry/log/caddy.error.log
|
||||
|
||||
# 刪除數據目錄 (可選)
|
||||
rm -rf /Users/accusys/momentry/var/caddy
|
||||
```
|
||||
|
||||
**注意: 不要刪除以下共用目錄**:
|
||||
```bash
|
||||
# 這些是共用的,不要刪除!
|
||||
# /Users/accusys/momentry/etc
|
||||
# /Users/accusys/momentry/log
|
||||
# /Users/accusys/momentry/var
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 4: 卸載後檢查清單
|
||||
|
||||
```bash
|
||||
echo "=== Caddy 卸載後檢查 ==="
|
||||
|
||||
# 1. 檢查 Caddy 進程
|
||||
echo "1. Caddy 進程:"
|
||||
ps aux | grep caddy | grep -v grep && echo " ✗ 仍在運行" || echo " ✓ 已停止"
|
||||
|
||||
# 2. Port 80/443
|
||||
echo "2. Port 80/443:"
|
||||
(lsof -i :80 > /dev/null 2>&1 || lsof -i :443 > /dev/null 2>&1) && echo " ✗ 仍被佔用" || echo " ✓ 已釋放"
|
||||
|
||||
# 3. caddy 命令
|
||||
echo "3. caddy 命令:"
|
||||
which caddy > /dev/null 2>&1 && echo " ✗ 仍存在" || echo " ✓ 已移除"
|
||||
|
||||
# 4. brew 安裝
|
||||
echo "4. brew 安裝:"
|
||||
brew list caddy > /dev/null 2>&1 && echo " ✗ 仍存在" || echo " ✓ 已移除"
|
||||
|
||||
# 5. launchctl 服務
|
||||
echo "5. launchctl 服務:"
|
||||
sudo launchctl list | grep caddy > /dev/null 2>&1 && echo " ✗ 仍存在" || echo " ✓ 已移除"
|
||||
|
||||
# 6. 配置目錄 (可選刪除)
|
||||
echo "6. 配置目錄:"
|
||||
[ -d "/Users/accusys/momentry/etc" ] && echo " ✓ 保留" || echo " ✗ 已刪除"
|
||||
|
||||
# 7. 日誌目錄 (可選刪除)
|
||||
echo "7. 日誌目錄:"
|
||||
[ -d "/Users/accusys/momentry/log" ] && echo " ✓ 保留" || echo " ✗ 已刪除"
|
||||
```
|
||||
|
||||
**預期結果**:
|
||||
```
|
||||
=== Caddy 卸載後檢查 ===
|
||||
1. Caddy 進程:
|
||||
✓ 已停止
|
||||
2. Port 80/443:
|
||||
✓ 已釋放
|
||||
3. caddy 命令:
|
||||
✓ 已移除
|
||||
4. brew 安裝:
|
||||
✓ 已移除
|
||||
5. launchctl 服務:
|
||||
✓ 已移除
|
||||
6. 配置目錄:
|
||||
✓ 保留 (或 ✗ 已刪除)
|
||||
7. 日誌目錄:
|
||||
✓ 保留 (或 ✗ 已刪除)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 手動檢查命令
|
||||
|
||||
```bash
|
||||
# 1. 檢查進程
|
||||
ps aux | grep caddy | grep -v grep
|
||||
|
||||
# 2. 檢查 Port
|
||||
lsof -i :80
|
||||
lsof -i :443
|
||||
lsof -i :2019
|
||||
|
||||
# 3. 測試配置語法
|
||||
caddy validate --config /Users/accusys/momentry/etc/Caddyfile
|
||||
|
||||
# 4. 查看 Caddy 版本
|
||||
caddy version
|
||||
|
||||
# 5. 重新載入配置
|
||||
caddy reload --config /Users/accusys/momentry/etc/Caddyfile
|
||||
|
||||
# 6. 查看日誌
|
||||
tail -20 /Users/accusys/momentry/log/caddy.log
|
||||
|
||||
# 7. 查看 Caddy 適配的網站
|
||||
curl -I http://localhost:2019/config/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Caddyfile 範例
|
||||
|
||||
### 基本反向代理
|
||||
|
||||
```Caddyfile
|
||||
{
|
||||
email admin@accusys.com.tw
|
||||
}
|
||||
|
||||
# 反向代理到本地服務
|
||||
example.local {
|
||||
reverse_proxy localhost:8080
|
||||
}
|
||||
```
|
||||
|
||||
### 帶 SSL 的反向代理
|
||||
|
||||
```Caddyfile
|
||||
{
|
||||
email admin@accusys.com.tw
|
||||
}
|
||||
|
||||
# 使用 Let's Encrypt 自動 SSL
|
||||
example.momentry.ddns.net {
|
||||
reverse_proxy localhost:8080 {
|
||||
header_up Host {upstream_hostport}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 多站點配置
|
||||
|
||||
```Caddyfile
|
||||
{
|
||||
email admin@accusys.com.tw
|
||||
}
|
||||
|
||||
# 站點 1
|
||||
site1.example.com {
|
||||
reverse_proxy localhost:8080
|
||||
}
|
||||
|
||||
# 站點 2
|
||||
site2.example.com {
|
||||
reverse_proxy localhost:8081
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 環境變數
|
||||
|
||||
在 `.env` 中:
|
||||
|
||||
```env
|
||||
CADDY_CONFIG=/Users/accusys/momentry/etc/Caddyfile
|
||||
CADDY_HOME=/Users/accusys/.local/share/caddy
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 故障排除
|
||||
|
||||
### Caddy 無法啟動
|
||||
|
||||
```bash
|
||||
# 檢查日誌
|
||||
tail -f /Users/accusys/momentry/log/caddy.log
|
||||
|
||||
# 檢查配置語法
|
||||
caddy validate --config /Users/accusys/momentry/etc/Caddyfile
|
||||
|
||||
# 檢查目錄權限
|
||||
ls -la /Users/accusys/momentry/etc/
|
||||
|
||||
# 重新設定權限
|
||||
chown -R $(whoami):staff /Users/accusys/momentry/etc
|
||||
```
|
||||
|
||||
### Port 被佔用
|
||||
|
||||
```bash
|
||||
# 檢查哪個程序佔用 port 80
|
||||
lsof -i :80
|
||||
|
||||
# 終止佔用程序
|
||||
kill <PID>
|
||||
```
|
||||
|
||||
### 需要重新載入配置
|
||||
|
||||
```bash
|
||||
# 重新載入配置 (熱重載)
|
||||
caddy reload --config /Users/accusys/momentry/etc/Caddyfile
|
||||
|
||||
# 或者停止後重新啟動
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.caddy.plist
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.caddy.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 檔案位置
|
||||
|
||||
| 類型 | 路徑 | 說明 |
|
||||
|------|------|------|
|
||||
| 安裝 | `/opt/homebrew/opt/caddy/` | Caddy 安裝目錄 |
|
||||
| 執行檔 | `/opt/homebrew/opt/caddy/bin/caddy` | Caddy 執行檔 |
|
||||
| 配置 | `/Users/accusys/momentry/etc/Caddyfile` | 設定檔 |
|
||||
| 日誌 | `/Users/accusys/momentry/log/caddy.log` | 執行日誌 |
|
||||
| 錯誤日誌 | `/Users/accusys/momentry/log/caddy.error.log` | 錯誤日誌 |
|
||||
| 數據 | `/Users/accusys/momentry/var/caddy/` | Caddy 數據目錄 |
|
||||
| plist | `/Library/LaunchDaemons/com.momentry.caddy.plist` | 開機啟動 |
|
||||
| 備份 | `/Users/accusys/momentry/var/caddy_backup/Caddyfile` | 配置備份 |
|
||||
|
||||
---
|
||||
|
||||
## 常用指令
|
||||
|
||||
```bash
|
||||
# 驗證配置
|
||||
caddy validate --config /Users/accusys/momentry/etc/Caddyfile
|
||||
|
||||
# 熱重載配置
|
||||
caddy reload --config /Users/accusys/momentry/etc/Caddyfile
|
||||
|
||||
# 停止 Caddy
|
||||
caddy stop
|
||||
|
||||
# 啟動 Caddy
|
||||
caddy start --config /Users/accusys/momentry/etc/Caddyfile
|
||||
|
||||
# 適配所有網站
|
||||
caddy adapt --config /Users/accusys/momentry/etc/Caddyfile --adapter caddyfile
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 備份與恢復
|
||||
|
||||
### 備份
|
||||
|
||||
```bash
|
||||
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
||||
BACKUP_DIR="/Users/accusys/momentry/backup/daily/caddy"
|
||||
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
|
||||
# 備份配置
|
||||
tar -czf "$BACKUP_DIR/caddy_cfg_${TIMESTAMP}.tar.gz" \
|
||||
/Users/accusys/momentry/etc/Caddyfile
|
||||
|
||||
# 驗證
|
||||
sha256sum "$BACKUP_DIR/caddy_cfg_${TIMESTAMP}.tar.gz" > "$BACKUP_DIR/caddy_${TIMESTAMP}.sha256"
|
||||
```
|
||||
|
||||
### 恢復
|
||||
|
||||
```bash
|
||||
# 解壓配置
|
||||
tar -xzf /Users/accusys/momentry/backup/daily/caddy/caddy_cfg_20260316_102416.tar.gz -C /
|
||||
|
||||
# 驗證並重載
|
||||
caddy validate --config /Users/accusys/momentry/etc/Caddyfile
|
||||
caddy reload --config /Users/accusys/momentry/etc/Caddyfile
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 版本資訊
|
||||
|
||||
- 版本: 2.10.2
|
||||
- 配置: /Users/accusys/momentry/etc/Caddyfile
|
||||
- 日誌目錄: /Users/accusys/momentry/log/
|
||||
394
docs/INSTALL_GITEA.md
Normal file
394
docs/INSTALL_GITEA.md
Normal file
@@ -0,0 +1,394 @@
|
||||
# Gitea 安裝指南 (本地部署)
|
||||
|
||||
## 概述
|
||||
|
||||
本文檔說明如何在 macOS 上安裝 Gitea Git 服務,配置為本地部署。
|
||||
|
||||
---
|
||||
|
||||
## 當前狀態
|
||||
|
||||
| 項目 | 狀態 |
|
||||
|------|------|
|
||||
| Gitea | ✅ 已安裝 v1.25.3 |
|
||||
| 數據目錄 | /Users/accusys/momentry/var/gitea/ |
|
||||
| 配置目錄 | /Users/accusys/momentry/etc/gitea/ |
|
||||
| 日誌目錄 | /Users/accusys/momentry/log/ |
|
||||
| Plist | /Library/LaunchDaemons/com.momentry.gitea.plist |
|
||||
|
||||
---
|
||||
|
||||
## 安裝步驟
|
||||
|
||||
### Step 1: 安裝 Gitea (使用 brew)
|
||||
|
||||
```bash
|
||||
# 安裝 Gitea
|
||||
brew install gitea
|
||||
```
|
||||
|
||||
**驗證**:
|
||||
```bash
|
||||
gitea --version
|
||||
# gitea version 1.25.3
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 2: 建立目錄
|
||||
|
||||
```bash
|
||||
# 建立數據目錄
|
||||
mkdir -p /Users/accusys/momentry/var/gitea/data
|
||||
mkdir -p /Users/accusys/momentry/var/gitea/log
|
||||
|
||||
# 建立配置目錄
|
||||
mkdir -p /Users/accusys/momentry/etc/gitea
|
||||
|
||||
# 建立日誌目錄
|
||||
mkdir -p /Users/accusys/momentry/log
|
||||
|
||||
# 建立日誌文件
|
||||
touch /Users/accusys/momentry/log/gitea.log
|
||||
touch /Users/accusys/momentry/log/gitea.error.log
|
||||
|
||||
# 設定權限
|
||||
chown -R accusys:staff /Users/accusys/momentry/var/gitea
|
||||
chown -R accusys:staff /Users/accusys/momentry/etc/gitea
|
||||
chown -R accusys:staff /Users/accusys/momentry/log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 3: 建立設定檔
|
||||
|
||||
建立 `/Users/accusys/momentry/etc/gitea/app.ini`:
|
||||
|
||||
```ini
|
||||
APP_NAME = Gitea: Git with a cup of tea
|
||||
RUN_USER = accusys
|
||||
WORK_PATH = /Users/accusys/momentry/var/gitea
|
||||
RUN_MODE = prod
|
||||
|
||||
[database]
|
||||
DB_TYPE = postgres
|
||||
HOST = 127.0.0.1:5432
|
||||
NAME = gitea
|
||||
USER = gitea
|
||||
PASSWD = gitea_pass
|
||||
SSL_MODE = disable
|
||||
|
||||
[repository]
|
||||
ROOT = /Users/accusys/momentry/var/gitea/data/gitea-repositories
|
||||
|
||||
[server]
|
||||
SSH_DOMAIN = gitea.momentry.ddns.net
|
||||
DOMAIN = gitea.momentry.ddns.net
|
||||
HTTP_PORT = 3000
|
||||
ROOT_URL = http://gitea.momentry.ddns.net:3000/
|
||||
APP_DATA_PATH = /Users/accusys/momentry/var/gitea/data
|
||||
DISABLE_SSH = false
|
||||
SSH_PORT = 2222
|
||||
LFS_START_SERVER = true
|
||||
OFFLINE_MODE = true
|
||||
|
||||
[lfs]
|
||||
PATH = /Users/accusys/momentry/var/gitea/data/lfs
|
||||
|
||||
[log]
|
||||
MODE = console, file
|
||||
ROOT_PATH = /Users/accusys/momentry/log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 4: 使用 plist 開機自動啟動
|
||||
|
||||
```bash
|
||||
# 複製 plist 到 LaunchDaemons 目錄
|
||||
sudo cp /Users/accusys/momentry_core_0.1/momentry_runtime/plist/com.momentry.gitea.plist /Library/LaunchDaemons/
|
||||
|
||||
# 載入並啟動
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.gitea.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 監控配置
|
||||
|
||||
### 添加到監控配置
|
||||
|
||||
在 `monitor/config/monitor_config.yaml` 中添加:
|
||||
|
||||
```yaml
|
||||
service:
|
||||
services:
|
||||
- name: "gitea"
|
||||
type: "http"
|
||||
port: 3000
|
||||
host: "localhost"
|
||||
check_url: "http://localhost:3000/"
|
||||
timeout: 5
|
||||
enabled: true
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 卸載步驟
|
||||
|
||||
### 重要: 路徑說明
|
||||
|
||||
| 路徑 | 類型 | 說明 |
|
||||
|------|------|------|
|
||||
| `/Users/accusys/momentry/var/gitea/` | 數據 | **不要刪除** - Gitea 數據 |
|
||||
| `/Users/accusys/momentry/etc/gitea/` | 配置 | **不要刪除** - Gitea 配置 |
|
||||
| `/Users/accusys/momentry/log/` | 日誌 | **不要刪除** - 日誌目錄 |
|
||||
| `/opt/homebrew/opt/gitea/` | 安裝 | **刪除** - Gitea 安裝目錄 |
|
||||
|
||||
### Step 1: 停止 Gitea
|
||||
|
||||
```bash
|
||||
# 找到 Gitea 進程
|
||||
ps aux | grep gitea | grep -v grep
|
||||
|
||||
# 停止 Gitea
|
||||
pkill gitea
|
||||
|
||||
# 確認停止
|
||||
ps aux | grep gitea | grep -v grep || echo "Gitea 已停止"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 2: 卸載 Gitea
|
||||
|
||||
```bash
|
||||
# 卸載 Gitea
|
||||
brew uninstall gitea
|
||||
|
||||
# 移除 plist
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.gitea.plist
|
||||
sudo rm /Library/LaunchDaemons/com.momentry.gitea.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 3: 刪除專屬檔案
|
||||
|
||||
```bash
|
||||
# 刪除數據目錄 (可選)
|
||||
rm -rf /Users/accusys/momentry/var/gitea
|
||||
|
||||
# 刪除配置目錄 (可選)
|
||||
rm -rf /Users/accusys/momentry/etc/gitea
|
||||
|
||||
# 刪除日誌 (可選)
|
||||
rm -f /Users/accusys/momentry/log/gitea.log
|
||||
rm -f /Users/accusys/momentry/log/gitea.error.log
|
||||
```
|
||||
|
||||
**注意: 不要刪除以下共用目錄**:
|
||||
```bash
|
||||
# 這些是共用的,不要刪除!
|
||||
# /Users/accusys/momentry/var
|
||||
# /Users/accusys/momentry/etc
|
||||
# /Users/accusys/momentry/log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 4: 卸載後檢查清單
|
||||
|
||||
```bash
|
||||
echo "=== Gitea 卸載後檢查 ==="
|
||||
|
||||
# 1. 檢查 Gitea 進程
|
||||
echo "1. Gitea 進程:"
|
||||
ps aux | grep gitea | grep -v grep && echo " ✗ 仍在運行" || echo " ✓ 已停止"
|
||||
|
||||
# 2. Port 3000
|
||||
echo "2. Port 3000:"
|
||||
lsof -i :3000 > /dev/null 2>&1 && echo " ✗ 仍被佔用" || echo " ✓ 已釋放"
|
||||
|
||||
# 3. gitea 命令
|
||||
echo "3. gitea 命令:"
|
||||
which gitea > /dev/null 2>&1 && echo " ✗ 仍存在" || echo " ✓ 已移除"
|
||||
|
||||
# 4. brew 安裝
|
||||
echo "4. brew 安裝:"
|
||||
brew list gitea > /dev/null 2>&1 && echo " ✗ 仍存在" || echo " ✓ 已移除"
|
||||
|
||||
# 5. launchctl 服務
|
||||
echo "5. launchctl 服務:"
|
||||
sudo launchctl list | grep gitea > /dev/null 2>&1 && echo " ✗ 仍存在" || echo " ✓ 已移除"
|
||||
|
||||
# 6. 數據目錄 (可選刪除)
|
||||
echo "6. 數據目錄:"
|
||||
[ -d "/Users/accusys/momentry/var/gitea" ] && echo " ✓ 保留" || echo " ✗ 已刪除"
|
||||
|
||||
# 7. 配置目錄 (可選刪除)
|
||||
echo "7. 配置目錄:"
|
||||
[ -d "/Users/accusys/momentry/etc/gitea" ] && echo " ✓ 保留" || echo " ✗ 已刪除"
|
||||
```
|
||||
|
||||
**預期結果**:
|
||||
```
|
||||
=== Gitea 卸載後檢查 ===
|
||||
1. Gitea 進程:
|
||||
✓ 已停止
|
||||
2. Port 3000:
|
||||
✓ 已釋放
|
||||
3. gitea 命令:
|
||||
✓ 已移除
|
||||
4. brew 安裝:
|
||||
✓ 已移除
|
||||
5. launchctl 服務:
|
||||
✓ 已移除
|
||||
6. 數據目錄:
|
||||
✓ 保留 (或 ✗ 已刪除)
|
||||
7. 配置目錄:
|
||||
✓ 保留 (或 ✗ 已刪除)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 手動檢查命令
|
||||
|
||||
```bash
|
||||
# 1. 檢查進程
|
||||
ps aux | grep gitea | grep -v grep
|
||||
|
||||
# 2. 檢查 Port
|
||||
lsof -i :3000
|
||||
|
||||
# 3. 測試連線
|
||||
curl http://localhost:3000/
|
||||
|
||||
# 4. 查看版本
|
||||
gitea --version
|
||||
|
||||
# 5. 驗證配置
|
||||
gitea doctor --config /Users/accusys/momentry/etc/gitea/app.ini
|
||||
|
||||
# 6. 查看日誌
|
||||
tail -20 /Users/accusys/momentry/log/gitea.log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 連線資訊
|
||||
|
||||
| 項目 | 值 |
|
||||
|------|-----|
|
||||
| URL | http://localhost:3000 |
|
||||
| Domain | gitea.momentry.ddns.net |
|
||||
| SSH Port | 2222 |
|
||||
| Database | PostgreSQL (gitea) |
|
||||
|
||||
---
|
||||
|
||||
## 環境變數
|
||||
|
||||
在 `.env` 中:
|
||||
|
||||
```env
|
||||
GITEA_URL=http://localhost:3000
|
||||
GITEA_ROOT=/Users/accusys/momentry/var/gitea/data/gitea-repositories
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 故障排除
|
||||
|
||||
### Gitea 無法啟動
|
||||
|
||||
```bash
|
||||
# 檢查日誌
|
||||
tail -f /Users/accusys/momentry/log/gitea.log
|
||||
|
||||
# 檢查配置語法
|
||||
gitea doctor --config /Users/accusys/momentry/etc/gitea/app.ini
|
||||
|
||||
# 檢查目錄權限
|
||||
ls -la /Users/accusys/momentry/var/gitea/
|
||||
|
||||
# 重新設定權限
|
||||
chown -R $(whoami):staff /Users/accusys/momentry/var/gitea
|
||||
```
|
||||
|
||||
### Port 被佔用
|
||||
|
||||
```bash
|
||||
# 檢查哪個程序佔用 port 3000
|
||||
lsof -i :3000
|
||||
|
||||
# 終止佔用程序
|
||||
kill <PID>
|
||||
```
|
||||
|
||||
### 需要重新載入 plist
|
||||
|
||||
```bash
|
||||
# 卸載舊服務 (如果存在)
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.gitea.plist 2>/dev/null
|
||||
|
||||
# 載入新服務
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.gitea.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 檔案位置
|
||||
|
||||
| 類型 | 路徑 | 說明 |
|
||||
|------|------|------|
|
||||
| 安裝 | `/opt/homebrew/opt/gitea/` | Gitea 安裝目錄 |
|
||||
| 執行檔 | `/opt/homebrew/opt/gitea/bin/gitea` | Gitea 執行檔 |
|
||||
| 數據目錄 | `/Users/accusys/momentry/var/gitea/data/` | 數據儲存 |
|
||||
| 配置 | `/Users/accusys/momentry/etc/gitea/app.ini` | 設定檔 |
|
||||
| 日誌 | `/Users/accusys/momentry/log/gitea.log` | 執行日誌 |
|
||||
| 錯誤日誌 | `/Users/accusys/momentry/log/gitea.error.log` | 錯誤日誌 |
|
||||
| plist | `/Library/LaunchDaemons/com.momentry.gitea.plist` | 開機啟動 |
|
||||
| 備份 | `/Users/accusys/momentry/var/gitea_backup/app.ini` | 配置備份 |
|
||||
|
||||
---
|
||||
|
||||
## 資料庫資訊
|
||||
|
||||
Gitea 使用 PostgreSQL 作為資料庫:
|
||||
|
||||
| 項目 | 值 |
|
||||
|------|-----|
|
||||
| Database | gitea |
|
||||
| User | gitea |
|
||||
| Host | 127.0.0.1:5432 |
|
||||
| Password | gitea_pass |
|
||||
|
||||
---
|
||||
|
||||
## 常用指令
|
||||
|
||||
```bash
|
||||
# 啟動 Gitea
|
||||
gitea web --config /Users/accusys/momentry/etc/gitea/app.ini
|
||||
|
||||
# 驗證配置
|
||||
gitea doctor --config /Users/accusys/momentry/etc/gitea/app.ini
|
||||
|
||||
# 查看版本
|
||||
gitea --version
|
||||
|
||||
# 備份數據
|
||||
gitea dump --config /Users/accusys/momentry/etc/gitea/app.ini --zipfile /Users/accusys/momentry/var/gitea_backup.zip
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 版本資訊
|
||||
|
||||
- 版本: 1.25.3
|
||||
- HTTP Port: 3000
|
||||
- SSH Port: 2222
|
||||
- 數據目錄: /Users/accusys/momentry/var/gitea/
|
||||
- 配置: /Users/accusys/momentry/etc/gitea/app.ini
|
||||
- 日誌目錄: /Users/accusys/momentry/log/
|
||||
380
docs/INSTALL_MARIADB.md
Normal file
380
docs/INSTALL_MARIADB.md
Normal file
@@ -0,0 +1,380 @@
|
||||
# MariaDB 安裝指南 (本地部署)
|
||||
|
||||
## 概述
|
||||
|
||||
本文檔說明如何在 macOS 上安裝 MariaDB,配置為本地部署,支援遠端訪問。
|
||||
|
||||
---
|
||||
|
||||
## 當前狀態
|
||||
|
||||
| 項目 | 狀態 |
|
||||
|------|------|
|
||||
| MariaDB | ✅ 已安裝 v12.1.2 |
|
||||
| 數據目錄 | /Users/accusys/momentry/var/mariadb/ |
|
||||
| 日誌目錄 | /Users/accusys/momentry/log/ |
|
||||
| Plist | /Library/LaunchDaemons/com.momentry.mariadb.plist |
|
||||
|
||||
---
|
||||
|
||||
## 安裝步驟
|
||||
|
||||
### Step 1: 安裝 MariaDB (使用 brew)
|
||||
|
||||
```bash
|
||||
# 安裝 MariaDB
|
||||
brew install mariadb
|
||||
```
|
||||
|
||||
**驗證**:
|
||||
```bash
|
||||
mariadb --version
|
||||
# mariadb from 12.1.2-MariaDB
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 2: 建立目錄結構
|
||||
|
||||
```bash
|
||||
# 建立數據目錄
|
||||
mkdir -p /Users/accusys/momentry/var/mariadb
|
||||
|
||||
# 建立配置目錄
|
||||
mkdir -p /Users/accusys/momentry/etc/mariadb
|
||||
|
||||
# 建立日誌目錄
|
||||
mkdir -p /Users/accusys/momentry/log
|
||||
|
||||
# 建立日誌文件
|
||||
touch /Users/accusys/momentry/log/mariadb.log
|
||||
touch /Users/accusys/momentry/log/mariadb.error.log
|
||||
|
||||
# 設定權限
|
||||
chown -R accusys:staff /Users/accusys/momentry/var/mariadb
|
||||
chown -R accusys:staff /Users/accusys/momentry/etc/mariadb
|
||||
chown -R accusys:staff /Users/accusys/momentry/log
|
||||
```
|
||||
|
||||
**注意**: 如果需要從舊數據遷移,需要先初始化新目錄:
|
||||
```bash
|
||||
# 初始化新數據目錄
|
||||
mysql_install_db --datadir=/Users/accusys/momentry/var/mariadb
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 3: 使用 plist 開機自動啟動
|
||||
|
||||
```bash
|
||||
# 複製 plist 到 LaunchDaemons 目錄
|
||||
sudo cp /Users/accusys/momentry_core_0.1/momentry_runtime/plist/com.momentry.mariadb.plist /Library/LaunchDaemons/
|
||||
|
||||
# 載入並啟動
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.mariadb.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 監控配置
|
||||
|
||||
### 添加到監控配置
|
||||
|
||||
在 `monitor/config/monitor_config.yaml` 中添加:
|
||||
|
||||
```yaml
|
||||
database:
|
||||
mariadb:
|
||||
enabled: true
|
||||
host: "localhost"
|
||||
port: 3306
|
||||
user: "root"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 卸載步驟
|
||||
|
||||
### 重要: 路徑說明
|
||||
|
||||
| 路徑 | 類型 | 說明 |
|
||||
|------|------|------|
|
||||
| `/Users/accusys/momentry/var/mariadb/` | 數據 | **不要刪除** - 數據目錄 |
|
||||
| `/Users/accusys/momentry/etc/mariadb/` | 配置 | **不要刪除** - 配置目錄 |
|
||||
| `/Users/accusys/momentry/log/` | 日誌 | **不要刪除** - 日誌目錄 |
|
||||
| `/opt/homebrew/opt/mariadb/` | 安裝 | **刪除** - MariaDB 安裝目錄 |
|
||||
|
||||
### Step 1: 停止 MariaDB
|
||||
|
||||
```bash
|
||||
# 找到 MariaDB 進程
|
||||
ps aux | grep mariadb | grep -v grep
|
||||
|
||||
# 停止 MariaDB
|
||||
mysqladmin -u root -p shutdown
|
||||
# 或
|
||||
pkill mariadbd
|
||||
|
||||
# 確認停止
|
||||
ps aux | grep mariadb | grep -v grep || echo "MariaDB 已停止"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 2: 卸載 MariaDB
|
||||
|
||||
```bash
|
||||
# 卸載 MariaDB
|
||||
brew uninstall mariadb
|
||||
|
||||
# 移除 plist
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.mariadb.plist
|
||||
sudo rm /Library/LaunchDaemons/com.momentry.mariadb.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 3: 刪除專屬檔案
|
||||
|
||||
```bash
|
||||
# 刪除數據目錄 (可選)
|
||||
rm -rf /Users/accusys/momentry/var/mariadb
|
||||
|
||||
# 刪除日誌 (可選)
|
||||
rm -f /Users/accusys/momentry/log/mariadb.log
|
||||
rm -f /Users/accusys/momentry/log/mariadb.error.log
|
||||
```
|
||||
|
||||
**注意: 不要刪除以下共用目錄**:
|
||||
```bash
|
||||
# 這些是共用的,不要刪除!
|
||||
# /Users/accusys/momentry/var
|
||||
# /Users/accusys/momentry/log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 4: 卸載後檢查清單
|
||||
|
||||
```bash
|
||||
echo "=== MariaDB 卸載後檢查 ==="
|
||||
|
||||
# 1. 檢查 MariaDB 進程
|
||||
echo "1. MariaDB 進程:"
|
||||
ps aux | grep mariadb | grep -v grep && echo " ✗ 仍在運行" || echo " ✓ 已停止"
|
||||
|
||||
# 2. Port 3306
|
||||
echo "2. Port 3306:"
|
||||
lsof -i :3306 > /dev/null 2>&1 && echo " ✗ 仍被佔用" || echo " ✓ 已釋放"
|
||||
|
||||
# 3. mariadb 命令
|
||||
echo "3. mariadb 命令:"
|
||||
which mariadb > /dev/null 2>&1 && echo " ✗ 仍存在" || echo " ✓ 已移除"
|
||||
|
||||
# 4. brew 安裝
|
||||
echo "4. brew 安裝:"
|
||||
brew list mariadb > /dev/null 2>&1 && echo " ✗ 仍存在" || echo " ✓ 已移除"
|
||||
|
||||
# 5. launchctl 服務
|
||||
echo "5. launchctl 服務:"
|
||||
sudo launchctl list | grep mariadb > /dev/null 2>&1 && echo " ✗ 仍存在" || echo " ✓ 已移除"
|
||||
|
||||
# 6. 數據目錄 (可選刪除)
|
||||
echo "6. 數據目錄:"
|
||||
[ -d "/Users/accusys/momentry/var/mariadb" ] && echo " ✓ 保留" || echo " ✗ 已刪除"
|
||||
|
||||
# 7. 日誌目錄 (可選刪除)
|
||||
echo "7. 日誌目錄:"
|
||||
[ -d "/Users/accusys/momentry/log" ] && echo " ✓ 保留" || echo " ✗ 已刪除"
|
||||
```
|
||||
|
||||
**預期結果**:
|
||||
```
|
||||
=== MariaDB 卸載後檢查 ===
|
||||
1. MariaDB 進程:
|
||||
✓ 已停止
|
||||
2. Port 3306:
|
||||
✓ 已釋放
|
||||
3. mariadb 命令:
|
||||
✓ 已移除
|
||||
4. brew 安裝:
|
||||
✓ 已移除
|
||||
5. launchctl 服務:
|
||||
✓ 已移除
|
||||
6. 數據目錄:
|
||||
✓ 保留 (或 ✗ 已刪除)
|
||||
7. 日誌目錄:
|
||||
✓ 保留 (或 ✗ 已刪除)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 手動檢查命令
|
||||
|
||||
```bash
|
||||
# 1. 檢查進程
|
||||
ps aux | grep mariadb | grep -v grep
|
||||
|
||||
# 2. 檢查 Port
|
||||
lsof -i :3306
|
||||
|
||||
# 3. 測試連線
|
||||
mariadb -u root -e "SELECT 1;"
|
||||
|
||||
# 4. 查看所有數據庫
|
||||
mariadb -u root -e "SHOW DATABASES;"
|
||||
|
||||
# 5. 查看用戶
|
||||
mariadb -u root -e "SELECT User, Host FROM mysql.user;"
|
||||
|
||||
# 6. 查看表
|
||||
mariadb -u root -e "USE mysql; SHOW TABLES;"
|
||||
|
||||
# 7. 查看日誌
|
||||
tail -20 /Users/accusys/momentry/log/mariadb.log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 連線資訊
|
||||
|
||||
| 項目 | 值 |
|
||||
|------|-----|
|
||||
| Host | localhost |
|
||||
| Port | 3306 |
|
||||
| User | root |
|
||||
|
||||
---
|
||||
|
||||
## 環境變數
|
||||
|
||||
在 `.env` 中:
|
||||
|
||||
```env
|
||||
MARIADB_URL=mariadb://root@localhost:3306
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 遠端訪問
|
||||
|
||||
- MariaDB 綁定到所有網路介面 (0.0.0.0)
|
||||
- 本地網路其他機器可透過 IP 訪問
|
||||
- 請設定用戶權限限制訪問
|
||||
|
||||
---
|
||||
|
||||
## 故障排除
|
||||
|
||||
### MariaDB 無法啟動
|
||||
|
||||
```bash
|
||||
# 檢查日誌
|
||||
tail -f /Users/accusys/momentry/log/mariadb.log
|
||||
|
||||
# 檢查目錄權限
|
||||
ls -la /Users/accusys/momentry/var/mariadb/
|
||||
|
||||
# 重新設定權限
|
||||
chown -R $(whoami):staff /Users/accusys/momentry/var/mariadb
|
||||
```
|
||||
|
||||
### Port 被佔用
|
||||
|
||||
```bash
|
||||
# 檢查哪個程序佔用 port 3306
|
||||
lsof -i :3306
|
||||
|
||||
# 終止佔用程序
|
||||
kill <PID>
|
||||
```
|
||||
|
||||
### 需要重新載入 plist
|
||||
|
||||
```bash
|
||||
# 卸載舊服務 (如果存在)
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.mariadb.plist 2>/dev/null
|
||||
|
||||
# 載入新服務
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.mariadb.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 檔案位置
|
||||
|
||||
| 類型 | 路徑 | 說明 |
|
||||
|------|------|------|
|
||||
| 安裝 | `/opt/homebrew/opt/mariadb/` | MariaDB 安裝目錄 |
|
||||
| 執行檔 | `/opt/homebrew/opt/mariadb/bin/mariadbd` | MariaDB 執行檔 |
|
||||
| 數據目錄 | `/Users/accusys/momentry/var/mariadb/` | 數據儲存 |
|
||||
| 日誌 | `/Users/accusys/momentry/log/mariadb.log` | 執行日誌 |
|
||||
| 錯誤日誌 | `/Users/accusys/momentry/log/mariadb.error.log` | 錯誤日誌 |
|
||||
| plist | `/Library/LaunchDaemons/com.momentry.mariadb.plist` | 開機啟動 |
|
||||
| 備份 | `/Users/accusys/momentry/var/mariadb_backup/` | 數據備份 |
|
||||
|
||||
---
|
||||
|
||||
## 備份與恢復
|
||||
|
||||
### 備份用戶配置
|
||||
|
||||
已創建專用備份用戶:
|
||||
- 用戶名:`momentry_backup`
|
||||
- 密碼:`momentry_backup_pwd_2026`
|
||||
- 權限:SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER
|
||||
|
||||
### 備份 (mysqldump)
|
||||
|
||||
```bash
|
||||
# 備份所有數據庫
|
||||
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
||||
mysqldump -u momentry_backup -pmomentry_backup_pwd_2026 --all-databases | gzip > \
|
||||
/Users/accusys/momentry/backup/daily/mariadb/mariadb_db_all_${TIMESTAMP}.sql.gz
|
||||
|
||||
# 備份指定數據庫 (WordPress)
|
||||
mysqldump -u momentry_backup -pmomentry_backup_pwd_2026 wordpress | gzip > \
|
||||
/Users/accusys/momentry/backup/daily/mariadb/mariadb_db_wordpress_${TIMESTAMP}.sql.gz
|
||||
|
||||
# 驗證
|
||||
sha256sum /Users/accusys/momentry/backup/daily/mariadb/mariadb_db_*.sql.gz > \
|
||||
/Users/accusys/momentry/backup/daily/mariadb/mariadb_db_${TIMESTAMP}.sha256
|
||||
```
|
||||
|
||||
### 恢復 (mysql)
|
||||
|
||||
```bash
|
||||
# 恢復所有數據庫
|
||||
gunzip < /Users/accusys/momentry/backup/daily/mariadb/mariadb_db_all_20260316_101802.sql.gz | \
|
||||
mysql -u momentry_backup -pmomentry_backup_pwd_2026
|
||||
|
||||
# 恢復指定數據庫
|
||||
gunzip < /Users/accusys/momentry/backup/daily/mariadb/mariadb_db_wordpress_20260316_101802.sql.gz | \
|
||||
mysql -u momentry_backup -pmomentry_backup_pwd_2026 wordpress
|
||||
```
|
||||
|
||||
### 數據目錄複製 (完整遷移) - 離線
|
||||
|
||||
```bash
|
||||
# 1. 停止 MariaDB
|
||||
mysqladmin -u momentry_backup -pmomentry_backup_pwd_2026 shutdown
|
||||
|
||||
# 2. 複製數據目錄
|
||||
cp -r /opt/homebrew/var/mysql/* /Users/accusys/momentry/var/mariadb/
|
||||
|
||||
# 3. 設定權限
|
||||
chown -R $(whoami):staff /Users/accusys/momentry/var/mariadb
|
||||
|
||||
# 4. 啟動 MariaDB
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.mariadb.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 版本資訊
|
||||
|
||||
- 版本: 12.1.2
|
||||
- Port: 3306
|
||||
- User: root
|
||||
- 數據目錄: /Users/accusys/momentry/var/mariadb/
|
||||
- 日誌目錄: /Users/accusys/momentry/log/
|
||||
367
docs/INSTALL_MONGODB.md
Normal file
367
docs/INSTALL_MONGODB.md
Normal file
@@ -0,0 +1,367 @@
|
||||
# MongoDB 安裝指南 (本地部署)
|
||||
|
||||
## 概述
|
||||
|
||||
本文檔說明如何在 macOS 上安裝 MongoDB Community Edition,配置為本地部署,支援遠端訪問。
|
||||
|
||||
---
|
||||
|
||||
## 當前狀態
|
||||
|
||||
| 項目 | 狀態 |
|
||||
|------|------|
|
||||
| MongoDB (mongodb-community) | ✅ 已安裝 v8.2.6 |
|
||||
| 數據目錄 | 保留 (/Users/accusys/momentry/var) - 共用 |
|
||||
| 日誌目錄 | 保留 (/Users/accusys/momentry/log) - 共用 |
|
||||
|
||||
---
|
||||
|
||||
## 安裝步驟
|
||||
|
||||
### Step 1: 安裝 MongoDB Community
|
||||
|
||||
```bash
|
||||
# 安裝 MongoDB Community
|
||||
brew tap mongodb/brew
|
||||
brew install mongodb-community
|
||||
```
|
||||
|
||||
**驗證**:
|
||||
```bash
|
||||
mongod --version
|
||||
# db version v8.x.x
|
||||
mongosh --version
|
||||
# 2.7.x
|
||||
sudo launchctl list | grep mongo
|
||||
# 確認 MongoDB 服務已載入
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 2: 數據目錄 (已存在 - 共用)
|
||||
|
||||
數據目錄已存在,無需建立:
|
||||
- 數據目錄: `/Users/accusys/momentry/var`
|
||||
- 配置目錄: `/Users/accusys/momentry/etc/mongodb`
|
||||
- 日誌目錄: `/Users/accusys/momentry/log`
|
||||
|
||||
**建立配置目錄和日誌文件**:
|
||||
```bash
|
||||
# 建立配置目錄
|
||||
mkdir -p /Users/accusys/momentry/etc/mongodb
|
||||
|
||||
# 建立日誌文件
|
||||
touch /Users/accusys/momentry/log/mongodb.log
|
||||
touch /Users/accusys/momentry/log/mongodb.error.log
|
||||
|
||||
# 確認權限:
|
||||
ls -la /Users/accusys/momentry/
|
||||
chown -R accusys:staff /Users/accusys/momentry
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 3: 啟動 MongoDB (後台執行)
|
||||
|
||||
```bash
|
||||
nohup /opt/homebrew/bin/mongod \
|
||||
--dbpath /Users/accusys/momentry/var \
|
||||
--logpath /Users/accusys/momentry/log/mongodb.log \
|
||||
--port 27017 \
|
||||
--bind_ip 0.0.0.0 \
|
||||
> /Users/accusys/momentry/log/mongodb.log 2>&1 &
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 4: 建立資料庫用戶
|
||||
|
||||
```bash
|
||||
mongosh --eval '
|
||||
use admin
|
||||
db.createUser({
|
||||
user: "accusys",
|
||||
pwd: "Test3200Test3200",
|
||||
roles: [
|
||||
{ role: "readWrite", db: "momentry" },
|
||||
{ role: "dbAdmin", db: "momentry" }
|
||||
]
|
||||
})
|
||||
|
||||
---
|
||||
|
||||
### Step 5: 使用 plist 開機自動啟動
|
||||
|
||||
```bash
|
||||
# 複製 plist 到 LaunchDaemons 目錄
|
||||
sudo cp /Users/accusys/momentry_core_0.1/momentry_runtime/plist/com.momentry.mongodb.plist /Library/LaunchDaemons/
|
||||
|
||||
# 載入並啟動
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.mongodb.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 監控配置
|
||||
|
||||
### 添加到監控配置
|
||||
|
||||
在 `monitor/config/monitor_config.yaml` 中添加:
|
||||
|
||||
```yaml
|
||||
database:
|
||||
mongodb:
|
||||
enabled: true
|
||||
host: "localhost"
|
||||
port: 27017
|
||||
user: "accusys"
|
||||
database: "momentry"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 卸載步驟
|
||||
|
||||
### 重要: 路徑說明
|
||||
|
||||
| 路徑 | 類型 | 說明 |
|
||||
|------|------|------|
|
||||
| `/Users/accusys/momentry/` | 共用 | **不要刪除** - 多個系統共用 |
|
||||
| `/Users/accusys/momentry/var` | 共用 | **不要刪除** - 數據目錄 |
|
||||
| `/Users/accusys/momentry/etc/mongodb/` | 配置 | **不要刪除** - MongoDB 配置 |
|
||||
| `/Users/accusys/momentry/log` | 共用 | **不要刪除** - 日誌目錄 |
|
||||
| `~/.mongosh_history` | 專屬 | 可選刪除 - Mongo Shell 歷史 |
|
||||
|
||||
### Step 1: 停止 MongoDB
|
||||
|
||||
```bash
|
||||
# 找到 MongoDB 進程
|
||||
ps aux | grep mongod | grep -v grep
|
||||
|
||||
# 停止 MongoDB
|
||||
pkill mongod
|
||||
# 或
|
||||
kill <PID>
|
||||
|
||||
# 確認停止
|
||||
ps aux | grep mongod | grep -v grep || echo "MongoDB 已停止"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 2: 卸載 MongoDB
|
||||
|
||||
```bash
|
||||
# 完全卸載 (保留數據)
|
||||
brew uninstall mongodb-community
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 3: 刪除專屬檔案
|
||||
|
||||
```bash
|
||||
# 刪除 MongoDB 專屬配置 (如果有)
|
||||
rm -f ~/.mongosh_history
|
||||
|
||||
# 刪除臨時文件 (可選)
|
||||
rm -rf /tmp/mongodb-*
|
||||
```
|
||||
|
||||
**注意: 不要刪除以下共用目錄**:
|
||||
```bash
|
||||
# 這些是共用的,不要刪除!
|
||||
# /Users/accusys/momentry/var
|
||||
# /Users/accusys/momentry/log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 4: 卸載後檢查清單
|
||||
|
||||
```bash
|
||||
echo "=== MongoDB 卸載後檢查 ==="
|
||||
|
||||
# 1. 檢查 MongoDB 進程
|
||||
echo "1. MongoDB 進程:"
|
||||
ps aux | grep mongod | grep -v grep && echo " ✗ 仍在運行" || echo " ✓ 已停止"
|
||||
|
||||
# 2. 檢查 Port 27017
|
||||
echo "2. Port 27017:"
|
||||
lsof -i :27017 > /dev/null 2>&1 && echo " ✗ 仍被佔用" || echo " ✓ 已釋放"
|
||||
|
||||
# 3. 檢查 mongod 命令
|
||||
echo "3. mongod 命令:"
|
||||
which mongod > /dev/null 2>&1 && echo " ✗ 仍存在" || echo " ✓ 已移除"
|
||||
|
||||
# 4. 檢查 launchctl
|
||||
echo "4. launchctl 服務:"
|
||||
sudo launchctl list | grep mongo > /dev/null 2>&1 && echo " ✗ 仍存在" || echo " ✓ 已移除"
|
||||
|
||||
# 5. 檢查 Homebrew
|
||||
echo "5. Homebrew 移除:"
|
||||
brew list mongo > /dev/null 2>&1 && echo " ✗ 仍存在" || echo " ✓ 已移除"
|
||||
|
||||
# 6. 檢查數據目錄 (應該存在)
|
||||
echo "6. 數據目錄:"
|
||||
[ -d "/Users/accusys/momentry/var" ] && echo " ✓ 保留" || echo " ✗ 已刪除"
|
||||
|
||||
# 7. 檢查日誌目錄 (應該存在)
|
||||
echo "7. 日誌目錄:"
|
||||
[ -d "/Users/accusys/momentry/log" ] && echo " ✓ 保留" || echo " ✗ 已刪除"
|
||||
```
|
||||
|
||||
**預期結果**:
|
||||
```
|
||||
=== MongoDB 卸載後檢查 ===
|
||||
1. MongoDB 進程:
|
||||
✓ 已停止
|
||||
2. Port 27017:
|
||||
✓ 已釋放
|
||||
3. mongod 命令:
|
||||
✓ 已移除
|
||||
4. launchctl 服務:
|
||||
✓ 已移除
|
||||
5. Homebrew 移除:
|
||||
✓ 已移除
|
||||
6. 數據目錄:
|
||||
✓ 保留
|
||||
7. 日誌目錄:
|
||||
✓ 保留
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 手動檢查命令
|
||||
|
||||
```bash
|
||||
# 1. 檢查 Process 是否運行
|
||||
ps aux | grep mongo | grep -v grep
|
||||
|
||||
# 2. 檢查 Port 27017
|
||||
lsof -i :27017
|
||||
|
||||
# 3. 測試連線 (無認證)
|
||||
mongosh --eval "db.adminCommand('ping')"
|
||||
|
||||
# 4. 測試連線 (有認證)
|
||||
mongosh "mongodb://accusys:Test3200Test3200@localhost:27017/admin" --eval "db.adminCommand('ping')"
|
||||
|
||||
# 5. 查看所有資料庫
|
||||
mongosh "mongodb://accusys:Test3200Test3200@localhost:27017/admin" --quiet --eval "db.adminCommand({listDatabases:1}).databases"
|
||||
|
||||
# 6. 查看用戶
|
||||
mongosh "mongodb://accusys:Test3200Test3200@localhost:27017/admin" --quiet --eval "db.getUser('accusys')"
|
||||
|
||||
# 7. 查看日誌
|
||||
tail -20 /Users/accusys/momentry/log/mongodb.log
|
||||
tail -20 /Users/accusys/momentry/log/mongodb.error.log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 管理命令
|
||||
|
||||
### 啟動/停止
|
||||
|
||||
```bash
|
||||
# 停止
|
||||
pkill mongod
|
||||
# 或
|
||||
kill <PID>
|
||||
|
||||
# 啟動 (後台)
|
||||
nohup /opt/homebrew/bin/mongod \
|
||||
--dbpath /Users/accusys/momentry/var \
|
||||
--logpath /Users/accusys/momentry/log/mongodb.log \
|
||||
--port 27017 \
|
||||
--bind_ip 0.0.0.0 \
|
||||
> /Users/accusys/momentry/log/mongodb.log 2>&1 &
|
||||
|
||||
# 使用 plist (開機自動啟動)
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.mongodb.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 連線字串
|
||||
|
||||
```bash
|
||||
# 無認證 (本地)
|
||||
mongodb://localhost:27017
|
||||
|
||||
# 有認證 (admin 資料庫)
|
||||
mongodb://accusys:Test3200Test3200@localhost:27017/admin
|
||||
|
||||
# 有認證 (momentry 資料庫)
|
||||
mongodb://accusys:Test3200Test3200@localhost:27017/momentry?authSource=admin
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 環境變數
|
||||
|
||||
在 `.env` 中:
|
||||
|
||||
```env
|
||||
MONGODB_URL=mongodb://accusys:Test3200Test3200@localhost:27017/admin
|
||||
MONGODB_DATABASE=momentry
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 遠端訪問
|
||||
|
||||
- MongoDB 綁定到 `0.0.0.0` (所有網路介面)
|
||||
- 本地網路其他機器可透過 IP 訪問
|
||||
- 建議設定防火牆規則限制訪問 IP
|
||||
|
||||
---
|
||||
|
||||
## 故障排除
|
||||
|
||||
### MongoDB 無法啟動
|
||||
|
||||
```bash
|
||||
# 檢查日誌
|
||||
tail -f /Users/accusys/momentry/log/mongodb.log
|
||||
|
||||
# 檢查目錄權限
|
||||
ls -la /Users/accusys/momentry/
|
||||
|
||||
# 重新設定權限
|
||||
chown -R $(whoami):staff /Users/accusys/momentry
|
||||
```
|
||||
|
||||
### Port 被佔用
|
||||
|
||||
```bash
|
||||
# 檢查哪個程序佔用 port 27017
|
||||
lsof -i :27017
|
||||
|
||||
# 終止佔用程序
|
||||
kill <PID>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 檔案位置
|
||||
|
||||
| 類型 | 路徑 | 說明 |
|
||||
|------|------|------|
|
||||
| 數據目錄 | `/Users/accusys/momentry/var` | **共用 - 不要刪除** |
|
||||
| 日誌目錄 | `/Users/accusys/momentry/log` | **共用 - 不要刪除** |
|
||||
| mongod | `/opt/homebrew/bin/mongod` | 安裝後存在 |
|
||||
| Homebrew | `/opt/homebrew/Cellar/mongodb-community/` | 卸載時刪除 |
|
||||
| Homebrew | `/opt/homebrew/Cellar/mongodb-database-tools/` | 卸載時刪除 |
|
||||
| Homebrew | `/opt/homebrew/Cellar/mongosh/` | 卸載時刪除 |
|
||||
| 配置檔 | `/opt/homebrew/etc/mongod.conf` | 卸載時刪除 |
|
||||
|
||||
---
|
||||
|
||||
## 版本資訊
|
||||
|
||||
- 用戶: accusys
|
||||
- 密碼: Test3200Test3200
|
||||
- 數據目錄: /Users/accusys/momentry/var (共用 - 不要刪除!)
|
||||
- 日誌目錄: /Users/accusys/momentry/log (共用 - 不要刪除!)
|
||||
466
docs/INSTALL_N8N.md
Normal file
466
docs/INSTALL_N8N.md
Normal file
@@ -0,0 +1,466 @@
|
||||
# n8n 安裝指南 (本地部署)
|
||||
|
||||
## 概述
|
||||
|
||||
本文檔說明如何在 macOS 上安裝 n8n 工作流自動化平台,配置為本地部署,使用 Queue 模式。
|
||||
|
||||
---
|
||||
|
||||
## 當前狀態
|
||||
|
||||
| 項目 | 狀態 |
|
||||
|------|------|
|
||||
| n8n | ✅ 已安裝 v2.3.5 |
|
||||
| 數據目錄 | /Users/accusys/momentry/var/n8n/ |
|
||||
| 日誌目錄 | /Users/accusys/momentry/log/ |
|
||||
| Main Plist | /Library/LaunchDaemons/com.momentry.n8n.main.plist |
|
||||
| Worker Plist | /Library/LaunchDaemons/com.momentry.n8n.worker.plist |
|
||||
| 數據庫 | PostgreSQL (n8n) |
|
||||
| 隊列 | Redis |
|
||||
|
||||
---
|
||||
|
||||
## 安裝步驟
|
||||
|
||||
### Step 1: 安裝 n8n (使用 brew)
|
||||
|
||||
```bash
|
||||
# 安裝 n8n
|
||||
brew install n8n
|
||||
```
|
||||
|
||||
**驗證**:
|
||||
```bash
|
||||
n8n --version
|
||||
# 2.3.5
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 2: 建立目錄
|
||||
|
||||
```bash
|
||||
# 建立數據目錄
|
||||
mkdir -p /Users/accusys/momentry/var/n8n
|
||||
|
||||
# 建立配置目錄
|
||||
mkdir -p /Users/accusys/momentry/etc/n8n
|
||||
|
||||
# 建立日誌目錄
|
||||
mkdir -p /Users/accusys/momentry/log
|
||||
|
||||
# 建立日誌文件
|
||||
touch /Users/accusys/momentry/log/n8n.main.log
|
||||
touch /Users/accusys/momentry/log/n8n.main.error.log
|
||||
touch /Users/accusys/momentry/log/n8n.worker.log
|
||||
touch /Users/accusys/momentry/log/n8n.worker.error.log
|
||||
|
||||
# 設定權限
|
||||
chown -R accusys:staff /Users/accusys/momentry/var/n8n
|
||||
chown -R accusys:staff /Users/accusys/momentry/etc/n8n
|
||||
chown -R accusys:staff /Users/accusys/momentry/log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 3: 數據遷移 (如果從舊位置遷移)
|
||||
|
||||
```bash
|
||||
# 停止舊服務
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.n8n.main.plist
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.n8n.worker.plist
|
||||
|
||||
# 複製數據
|
||||
cp -r /Users/accusys/.n8n/* /Users/accusys/momentry/var/n8n/
|
||||
|
||||
# 設定權限
|
||||
chown -R accusys:staff /Users/accusys/momentry/var/n8n
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 4: 使用 plist 開機自動啟動
|
||||
|
||||
```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/
|
||||
|
||||
# 移除舊 plist (如果存在)
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.n8n.main.plist 2>/dev/null
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.n8n.worker.plist 2>/dev/null
|
||||
sudo rm /Library/LaunchDaemons/com.n8n.main.plist 2>/dev/null
|
||||
sudo rm /Library/LaunchDaemons/com.n8n.worker.plist 2>/dev/null
|
||||
|
||||
# 載入並啟動
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.n8n.main.plist
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.n8n.worker.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 監控配置
|
||||
|
||||
### 添加到監控配置
|
||||
|
||||
在 `monitor/config/monitor_config.yaml` 中添加:
|
||||
|
||||
```yaml
|
||||
service:
|
||||
services:
|
||||
- name: "n8n"
|
||||
type: "http"
|
||||
port: 5678
|
||||
host: "localhost"
|
||||
check_url: "http://localhost:5678/"
|
||||
timeout: 5
|
||||
enabled: true
|
||||
```
|
||||
|
||||
### 添加健康檢查函數
|
||||
|
||||
在 `monitor/service/health_check.sh` 中添加:
|
||||
|
||||
```bash
|
||||
check_n8n() {
|
||||
local start=$(date +%s%N)
|
||||
if curl -s http://localhost:5678/ > /dev/null 2>&1; then
|
||||
local end=$(date +%s%N)
|
||||
local ms=$(( (end - start) / 1000000 ))
|
||||
echo -e "${GREEN}✓${NC} n8n (5678) - ${ms}ms"
|
||||
record_service "n8n" "up" "$ms" ""
|
||||
return 0
|
||||
else
|
||||
echo -e "${RED}✗${NC} n8n (5678) - Down"
|
||||
record_service "n8n" "down" "0" "Connection failed"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
```
|
||||
|
||||
### n8n Workflow 監控
|
||||
|
||||
n8n 有專門的工作流監控腳本,請參考 `monitor/workflow/n8n_workflow_monitor.sh`。
|
||||
|
||||
---
|
||||
|
||||
## 卸載步驟
|
||||
|
||||
### 重要: 路徑說明
|
||||
|
||||
| 路徑 | 類型 | 說明 |
|
||||
|------|------|------|
|
||||
| `/Users/accusys/momentry/var/n8n/` | 數據 | **不要刪除** - n8n 數據 |
|
||||
| `/Users/accusys/momentry/etc/n8n/` | 配置 | **不要刪除** - n8n 配置 |
|
||||
| `/Users/accusys/momentry/log/` | 日誌 | **不要刪除** - n8n 日誌 |
|
||||
| `/opt/homebrew/lib/node_modules/n8n/` | 安裝 | **刪除** - n8n 安裝目錄 |
|
||||
|
||||
### Step 1: 停止 n8n
|
||||
|
||||
```bash
|
||||
# 停止 n8n 服務
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.n8n.main.plist
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.n8n.worker.plist
|
||||
|
||||
# 確認停止
|
||||
ps aux | grep n8n | grep -v grep || echo "n8n 已停止"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 2: 卸載 n8n
|
||||
|
||||
```bash
|
||||
# 卸載 n8n
|
||||
brew uninstall n8n
|
||||
|
||||
# 移除 plist
|
||||
sudo rm /Library/LaunchDaemons/com.momentry.n8n.main.plist
|
||||
sudo rm /Library/LaunchDaemons/com.momentry.n8n.worker.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 3: 刪除專屬檔案
|
||||
|
||||
```bash
|
||||
# 刪除數據目錄 (可選)
|
||||
rm -rf /Users/accusys/momentry/var/n8n
|
||||
|
||||
# 刪除日誌 (可選)
|
||||
rm -f /Users/accusys/momentry/log/n8n-*.log
|
||||
```
|
||||
|
||||
**注意: 不要刪除以下共用目錄**:
|
||||
```bash
|
||||
# 這些是共用的,不要刪除!
|
||||
# /Users/accusys/momentry/var
|
||||
# /Users/accusys/momentry/log
|
||||
# PostgreSQL n8n 數據庫 (如需保留)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 4: 卸載後檢查清單
|
||||
|
||||
```bash
|
||||
echo "=== n8n 卸載後檢查 ==="
|
||||
|
||||
# 1. 檢查 n8n 進程
|
||||
echo "1. n8n Main 進程:"
|
||||
ps aux | grep "n8n.*start" | grep -v grep && echo " ✗ 仍在運行" || echo " ✓ 已停止"
|
||||
|
||||
echo "2. n8n Worker 進程:"
|
||||
ps aux | grep "n8n.*worker" | grep -v grep && echo " ✗ 仍在運行" || echo " ✓ 已停止"
|
||||
|
||||
# 2. Port 8085
|
||||
echo "3. Port 8085:"
|
||||
lsof -i :8085 > /dev/null 2>&1 && echo " ✗ 仍被佔用" || echo " ✓ 已釋放"
|
||||
|
||||
# 3. Port 5690-5691
|
||||
echo "4. Port 5690-5691:"
|
||||
lsof -i :5690 > /dev/null 2>&1 && echo " ✗ 仍被佔用" || echo " ✓ 已釋放"
|
||||
|
||||
# 4. n8n 命令
|
||||
echo "5. n8n 命令:"
|
||||
which n8n > /dev/null 2>&1 && echo " ✗ 仍存在" || echo " ✓ 已移除"
|
||||
|
||||
# 5. brew 安裝
|
||||
echo "6. brew 安裝:"
|
||||
brew list n8n > /dev/null 2>&1 && echo " ✗ 仍存在" || echo " ✓ 已移除"
|
||||
|
||||
# 6. launchctl 服務
|
||||
echo "7. launchctl 服務:"
|
||||
sudo launchctl list | grep n8n > /dev/null 2>&1 && echo " ✗ 仍存在" || echo " ✓ 已移除"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 備份步驟
|
||||
|
||||
### 備份 n8n 數據
|
||||
|
||||
```bash
|
||||
# 建立備份目錄
|
||||
mkdir -p /Users/accusys/momentry/var/n8n_backup
|
||||
|
||||
# 1. 備份 PostgreSQL 數據庫
|
||||
PGPASSWORD=accusys pg_dump -U accusys -d n8n > /Users/accusys/momentry/var/n8n_backup/n8n_database_$(date +%Y%m%d).sql
|
||||
|
||||
# 2. 備份用戶數據夾
|
||||
cp -r /Users/accusys/momentry/var/n8n /Users/accusys/momentry/var/n8n_backup/
|
||||
|
||||
# 3. 壓縮備份
|
||||
cd /Users/accusys/momentry/var && tar -czvf n8n_backup_$(date +%Y%m%d).tar.gz n8n_backup/
|
||||
|
||||
# 4. 清理臨時備份
|
||||
rm -rf /Users/accusys/momentry/var/n8n_backup
|
||||
```
|
||||
|
||||
### 還原數據
|
||||
|
||||
```bash
|
||||
# 1. 停止 n8n
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.n8n.main.plist
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.n8n.worker.plist
|
||||
|
||||
# 2. 還原 PostgreSQL 數據庫
|
||||
PGPASSWORD=accusys psql -U accusys -d n8n < /Users/accusys/momentry/var/n8n_backup/n8n_database_20260314.sql
|
||||
|
||||
# 3. 還原用戶數據夾
|
||||
rm -rf /Users/accusys/momentry/var/n8n
|
||||
cp -r /Users/accusys/momentry/var/n8n_backup/n8n /Users/accusys/momentry/var/n8n
|
||||
chown -R accusys:staff /Users/accusys/momentry/var/n8n
|
||||
|
||||
# 4. 啟動 n8n
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.n8n.main.plist
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.n8n.worker.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 手動檢查命令
|
||||
|
||||
```bash
|
||||
# 1. 檢查進程
|
||||
ps aux | grep n8n | grep -v grep
|
||||
|
||||
# 2. 檢查 Port
|
||||
lsof -i :5678
|
||||
lsof -i :5690
|
||||
lsof -i :5691
|
||||
|
||||
# 3. 測試連線
|
||||
curl http://localhost:5678/
|
||||
|
||||
# 4. 查看版本
|
||||
n8n --version
|
||||
|
||||
# 5. 查看日誌
|
||||
tail -20 /Users/accusys/momentry/log/n8n-main.log
|
||||
tail -20 /Users/accusys/momentry/log/n8n-worker.log
|
||||
|
||||
# 6. 查看錯誤日誌
|
||||
tail -20 /Users/accusys/momentry/log/n8n-main.error.log
|
||||
tail -20 /Users/accusys/momentry/log/n8n-worker.error.log
|
||||
|
||||
# 7. 檢查 launchctl 狀態
|
||||
sudo launchctl list | grep n8n
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 連線資訊
|
||||
|
||||
| 項目 | 值 |
|
||||
|------|-----|
|
||||
| URL | http://localhost:5678 |
|
||||
| Domain | n8n.momentry.ddns.net |
|
||||
| 數據庫 | PostgreSQL (n8n) |
|
||||
| 隊列 | Redis |
|
||||
| Encryption Key | Test3200Test3200Test3200 |
|
||||
|
||||
### Queue 模式端口
|
||||
|
||||
| 服務 | Port |
|
||||
|------|------|
|
||||
| Main | 5678 |
|
||||
| Worker Broker | 5690 |
|
||||
| Worker Health Check | 5691 |
|
||||
|
||||
---
|
||||
|
||||
## 環境變數
|
||||
|
||||
在 `.env` 中:
|
||||
|
||||
```env
|
||||
N8N_URL=http://localhost:5678
|
||||
N8N_USER_FOLDER=/Users/accusys/momentry/var/n8n
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 故障排除
|
||||
|
||||
### n8n 無法啟動
|
||||
|
||||
```bash
|
||||
# 檢查日誌
|
||||
tail -f /Users/accusys/momentry/log/n8n-main.log
|
||||
tail -f /Users/accusys/momentry/log/n8n-worker.log
|
||||
|
||||
# 檢查環境變數
|
||||
launchctl list | grep n8n
|
||||
|
||||
# 檢查數據庫連線
|
||||
PGPASSWORD=accusys psql -U accusys -d n8n -c "SELECT 1"
|
||||
|
||||
# 檢查 Redis 連線
|
||||
redis-cli -a accusys ping
|
||||
```
|
||||
|
||||
### Port 被佔用
|
||||
|
||||
```bash
|
||||
# 檢查哪個程序佔用 port
|
||||
lsof -i :8085
|
||||
|
||||
# 終止佔用程序
|
||||
kill <PID>
|
||||
```
|
||||
|
||||
### 數據庫連線失敗
|
||||
|
||||
```bash
|
||||
# 檢查 PostgreSQL
|
||||
pg_isready -h 127.0.0.1 -p 5432 -U n8n
|
||||
|
||||
# 測試連線
|
||||
PGPASSWORD=accusys psql -h 127.0.0.1 -U n8n -d n8n -c "SELECT version();"
|
||||
```
|
||||
|
||||
### 需要重新載入 plist
|
||||
|
||||
```bash
|
||||
# 卸載舊服務
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.n8n.main.plist
|
||||
sudo launchctl unload /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
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 檔案位置
|
||||
|
||||
| 類型 | 路徑 | 說明 |
|
||||
|------|------|------|
|
||||
| 安裝 | `/opt/homebrew/lib/node_modules/n8n/` | n8n 安裝目錄 |
|
||||
| 執行檔 | `/opt/homebrew/bin/n8n` | n8n 執行檔 |
|
||||
| 數據目錄 | `/Users/accusys/momentry/var/n8n/` | 數據儲存 |
|
||||
| 配置目錄 | `/Users/accusys/momentry/etc/n8n/` | 配置儲存 |
|
||||
| Main 日誌 | `/Users/accusys/momentry/log/n8n.main.log` | 主服務日誌 |
|
||||
| Main 錯誤日誌 | `/Users/accusys/momentry/log/n8n.main.error.log` | 主服務錯誤日誌 |
|
||||
| Worker 日誌 | `/Users/accusys/momentry/log/n8n.worker.log` | Worker 日誌 |
|
||||
| Worker 錯誤日誌 | `/Users/accusys/momentry/log/n8n.worker.error.log` | Worker 錯誤日誌 |
|
||||
| Main Plist | `/Library/LaunchDaemons/com.momentry.n8n.main.plist` | 主服務開機啟動 |
|
||||
| Worker Plist | `/Library/LaunchDaemons/com.momentry.n8n.worker.plist` | Worker 開機啟動 |
|
||||
| 備份 | `/Users/accusys/momentry/var/n8n_backup/` | 數據備份 |
|
||||
|
||||
---
|
||||
|
||||
## 數據庫資訊
|
||||
|
||||
n8n 使用 PostgreSQL 作為數據庫:
|
||||
|
||||
| 項目 | 值 |
|
||||
|------|-----|
|
||||
| Database | n8n |
|
||||
| User | n8n |
|
||||
| Host | 127.0.0.1:5432 |
|
||||
| Password | accusys |
|
||||
|
||||
### Redis 隊列資訊
|
||||
|
||||
| 項目 | 值 |
|
||||
|------|-----|
|
||||
| Host | 127.0.0.1:6379 |
|
||||
| Password | accusys |
|
||||
| Mode | Queue (Bull) |
|
||||
|
||||
---
|
||||
|
||||
## 常用指令
|
||||
|
||||
```bash
|
||||
# 啟動 n8n Main
|
||||
n8n start
|
||||
|
||||
# 啟動 n8n Worker
|
||||
n8n worker
|
||||
|
||||
# 查看版本
|
||||
n8n --version
|
||||
|
||||
# 備份數據
|
||||
PGPASSWORD=accusys pg_dump -U accusys -d n8n > n8n_backup.sql
|
||||
|
||||
# 重新載入服務
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.n8n.main.plist
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.n8n.main.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 版本資訊
|
||||
|
||||
- 版本: 2.3.5
|
||||
- Main Port: 5678
|
||||
- Worker Ports: 5690-5691
|
||||
- 數據目錄: /Users/accusys/momentry/var/n8n/
|
||||
- 日誌目錄: /Users/accusys/momentry/log/
|
||||
- 數據庫: PostgreSQL n8n
|
||||
- 隊列: Redis
|
||||
359
docs/INSTALL_OLLAMA.md
Normal file
359
docs/INSTALL_OLLAMA.md
Normal file
@@ -0,0 +1,359 @@
|
||||
# Ollama 安裝指南 (本地部署)
|
||||
|
||||
## 概述
|
||||
|
||||
本文檔說明如何在 macOS 上安裝 Ollama,配置為本地部署,用於運行大型語言模型 (LLM)。
|
||||
|
||||
---
|
||||
|
||||
## 當前狀態
|
||||
|
||||
| 項目 | 狀態 |
|
||||
|------|------|
|
||||
| Ollama | ✅ 已安裝 v0.13.5 |
|
||||
| Port | 11434 |
|
||||
| Models 目錄 | /Users/accusys/.ollama/models/ |
|
||||
| 日誌目錄 | /Users/accusys/momentry/log/ |
|
||||
| Plist | /Library/LaunchDaemons/com.momentry.ollama.plist |
|
||||
|
||||
---
|
||||
|
||||
## 安裝步驟
|
||||
|
||||
### Step 1: 安裝 Ollama (使用 brew)
|
||||
|
||||
```bash
|
||||
# 安裝 Ollama
|
||||
brew install ollama
|
||||
```
|
||||
|
||||
**驗證**:
|
||||
```bash
|
||||
ollama --version
|
||||
# ollama version is 0.13.5
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 2: 建立目錄
|
||||
|
||||
```bash
|
||||
# 建立數據目錄
|
||||
mkdir -p /Users/accusys/momentry/var/ollama
|
||||
|
||||
# 建立配置目錄
|
||||
mkdir -p /Users/accusys/momentry/etc/ollama
|
||||
|
||||
# 建立日誌目錄
|
||||
mkdir -p /Users/accusys/momentry/log
|
||||
|
||||
# 建立日誌文件
|
||||
touch /Users/accusys/momentry/log/ollama.log
|
||||
touch /Users/accusys/momentry/log/ollama.error.log
|
||||
|
||||
# 設定權限
|
||||
chown -R accusys:staff /Users/accusys/momentry/var/ollama
|
||||
chown -R accusys:staff /Users/accusys/momentry/etc/ollama
|
||||
chown -R accusys:staff /Users/accusys/momentry/log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 3: 使用 plist 開機自動啟動
|
||||
|
||||
```bash
|
||||
# 複製 plist 到 LaunchDaemons 目錄
|
||||
sudo cp /Users/accusys/momentry_core_0.1/momentry_runtime/plist/com.momentry.ollama.plist /Library/LaunchDaemons/
|
||||
|
||||
# 載入並啟動
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.ollama.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 監控配置
|
||||
|
||||
### 添加到監控配置
|
||||
|
||||
在 `monitor/config/monitor_config.yaml` 中添加:
|
||||
|
||||
```yaml
|
||||
service:
|
||||
services:
|
||||
- name: "ollama"
|
||||
type: "http"
|
||||
port: 11434
|
||||
host: "localhost"
|
||||
check_url: "http://localhost:11434/api/tags"
|
||||
timeout: 5
|
||||
enabled: true
|
||||
```
|
||||
|
||||
### 添加健康檢查函數
|
||||
|
||||
在 `monitor/service/health_check.sh` 中添加:
|
||||
|
||||
```bash
|
||||
check_ollama() {
|
||||
local start=$(date +%s%N)
|
||||
if curl -s http://localhost:11434/api/tags > /dev/null 2>&1; then
|
||||
local end=$(date +%s%N)
|
||||
local ms=$(( (end - start) / 1000000 ))
|
||||
echo -e "${GREEN}✓${NC} Ollama (11434) - ${ms}ms"
|
||||
record_service "ollama" "up" "$ms" ""
|
||||
return 0
|
||||
else
|
||||
echo -e "${RED}✗${NC} Ollama (11434) - Down"
|
||||
record_service "ollama" "down" "0" "Connection failed"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 卸載步驟
|
||||
|
||||
### 重要: 路徑說明
|
||||
|
||||
| 路徑 | 類型 | 說明 |
|
||||
|------|------|------|
|
||||
| `/Users/accusys/momentry/var/ollama/` | 數據 | **不要刪除** - Ollama 數據 |
|
||||
| `/Users/accusys/momentry/etc/ollama/` | 配置 | **不要刪除** - Ollama 配置 |
|
||||
| `/Users/accusys/momentry/log/` | 日誌 | **不要刪除** - 日誌目錄 |
|
||||
| `/opt/homebrew/opt/ollama/` | 安裝 | **刪除** - Ollama 安裝目錄 |
|
||||
|
||||
### Step 1: 停止 Ollama
|
||||
|
||||
```bash
|
||||
# 找到 Ollama 進程
|
||||
ps aux | grep ollama | grep -v grep
|
||||
|
||||
# 停止 Ollama
|
||||
pkill ollama
|
||||
|
||||
# 確認停止
|
||||
ps aux | grep ollama | grep -v grep || echo "Ollama 已停止"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 2: 卸載 Ollama
|
||||
|
||||
```bash
|
||||
# 卸載 Ollama
|
||||
brew uninstall ollama
|
||||
|
||||
# 移除 plist
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.ollama.plist
|
||||
sudo rm /Library/LaunchDaemons/com.momentry.ollama.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 3: 刪除專屬檔案
|
||||
|
||||
```bash
|
||||
# 刪除日誌 (可選)
|
||||
rm -f /Users/accusys/momentry/log/ollama.log
|
||||
rm -f /Users/accusys/momentry/log/ollama.error.log
|
||||
```
|
||||
|
||||
**注意: 不要刪除以下目錄**:
|
||||
```bash
|
||||
# 這些是重要的,不要刪除!
|
||||
# /Users/accusys/.ollama/models
|
||||
# /Users/accusys/momentry/log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 4: 卸載後檢查清單
|
||||
|
||||
```bash
|
||||
echo "=== Ollama 卸載後檢查 ==="
|
||||
|
||||
# 1. 檢查 Ollama 進程
|
||||
echo "1. Ollama 進程:"
|
||||
ps aux | grep ollama | grep -v grep && echo " ✗ 仍在運行" || echo " ✓ 已停止"
|
||||
|
||||
# 2. Port 11434
|
||||
echo "2. Port 11434:"
|
||||
lsof -i :11434 > /dev/null 2>&1 && echo " ✗ 仍被佔用" || echo " ✓ 已釋放"
|
||||
|
||||
# 3. ollama 命令
|
||||
echo "3. ollama 命令:"
|
||||
which ollama > /dev/null 2>&1 && echo " ✗ 仍存在" || echo " ✓ 已移除"
|
||||
|
||||
# 4. brew 安裝
|
||||
echo "4. brew 安裝:"
|
||||
brew list ollama > /dev/null 2>&1 && echo " ✗ 仍存在" || echo " ✓ 已移除"
|
||||
|
||||
# 5. launchctl 服務
|
||||
echo "5. launchctl 服務:"
|
||||
sudo launchctl list | grep ollama > /dev/null 2>&1 && echo " ✗ 仍存在" || echo " ✓ 已移除"
|
||||
|
||||
# 6. 模型目錄 (應該保留)
|
||||
echo "6. 模型目錄:"
|
||||
[ -d "/Users/accusys/.ollama/models" ] && echo " ✓ 保留" || echo " ✗ 已刪除"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 手動檢查命令
|
||||
|
||||
```bash
|
||||
# 1. 檢查進程
|
||||
ps aux | grep ollama | grep -v grep
|
||||
|
||||
# 2. 檢查 Port
|
||||
lsof -i :11434
|
||||
|
||||
# 3. 測試連線
|
||||
curl http://localhost:11434/
|
||||
|
||||
# 4. 查看版本
|
||||
ollama --version
|
||||
|
||||
# 5. 查看已安裝的模型
|
||||
ollama list
|
||||
|
||||
# 6. 查看日誌
|
||||
tail -20 /Users/accusys/momentry/log/ollama.log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 連線資訊
|
||||
|
||||
| 項目 | 值 |
|
||||
|------|-----|
|
||||
| Host | localhost |
|
||||
| Port | 11434 |
|
||||
| Models | /Users/accusys/.ollama/models |
|
||||
|
||||
---
|
||||
|
||||
## 環境變數
|
||||
|
||||
在 `.env` 中:
|
||||
|
||||
```env
|
||||
OLLAMA_HOST=0.0.0.0:11434
|
||||
OLLAMA_MODELS=/Users/accusys/.ollama/models
|
||||
OLLAMA_FLASH_ATTENTION=1
|
||||
OLLAMA_KV_CACHE_TYPE=q8_0
|
||||
```
|
||||
|
||||
### 環境變數說明
|
||||
|
||||
| 變數 | 說明 | 預設值 |
|
||||
|------|------|---------|
|
||||
| OLLAMA_HOST | 綁定主機和端口 | 127.0.0.1:11434 |
|
||||
| OLLAMA_MODELS | 模型儲存目錄 | ~/.ollama/models |
|
||||
| OLLAMA_FLASH_ATTENTION | 啟用 Flash Attention | 0 |
|
||||
| OLLAMA_KV_CACHE_TYPE | KV 緩存類型 | f16 |
|
||||
|
||||
---
|
||||
|
||||
## 遠端訪問
|
||||
|
||||
- Ollama 綁定到 `0.0.0.0:11434` (所有網路介面)
|
||||
- 本地網路其他機器可透過 IP 訪問
|
||||
- 請注意安全風險
|
||||
|
||||
---
|
||||
|
||||
## 故障排除
|
||||
|
||||
### Ollama 無法啟動
|
||||
|
||||
```bash
|
||||
# 檢查日誌
|
||||
tail -f /Users/accusys/momentry/log/ollama.log
|
||||
|
||||
# 檢查模型目錄權限
|
||||
ls -la /Users/accusys/.ollama/models/
|
||||
|
||||
# 重新設定權限
|
||||
chown -R $(whoami):staff /Users/accusys/.ollama
|
||||
```
|
||||
|
||||
### Port 被佔用
|
||||
|
||||
```bash
|
||||
# 檢查哪個程序佔用 port 11434
|
||||
lsof -i :11434
|
||||
|
||||
# 終止佔用程序
|
||||
kill <PID>
|
||||
```
|
||||
|
||||
### 需要重新載入 plist
|
||||
|
||||
```bash
|
||||
# 卸載舊服務 (如果存在)
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.ollama.plist 2>/dev/null
|
||||
|
||||
# 載入新服務
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.ollama.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 檔案位置
|
||||
|
||||
| 類型 | 路徑 | 說明 |
|
||||
|------|------|------|
|
||||
| 安裝 | `/opt/homebrew/opt/ollama/` | Ollama 安裝目錄 |
|
||||
| 執行檔 | `/opt/homebrew/opt/ollama/bin/ollama` | Ollama 執行檔 |
|
||||
| 數據目錄 | `/Users/accusys/momentry/var/ollama/` | 數據儲存 |
|
||||
| 配置目錄 | `/Users/accusys/momentry/etc/ollama/` | 配置儲存 |
|
||||
| 模型目錄 | `/Users/accusys/.ollama/models/` | AI 模型儲存 |
|
||||
| 日誌 | `/Users/accusys/momentry/log/ollama.log` | 執行日誌 |
|
||||
| 錯誤日誌 | `/Users/accusys/momentry/log/ollama.error.log` | 錯誤日誌 |
|
||||
| plist | `/Library/LaunchDaemons/com.momentry.ollama.plist` | 開機啟動 |
|
||||
| 備份 | `/Users/accusys/momentry/var/ollama_backup/environment.txt` | 環境變數備份 |
|
||||
|
||||
---
|
||||
|
||||
## 常用指令
|
||||
|
||||
```bash
|
||||
# 查看版本
|
||||
ollama --version
|
||||
|
||||
# 查看已安裝的模型
|
||||
ollama list
|
||||
|
||||
# 拉取模型
|
||||
ollama pull mistral
|
||||
ollama pull llama2
|
||||
|
||||
# 運行模型
|
||||
ollama run mistral
|
||||
|
||||
# 刪除模型
|
||||
ollama remove mistral
|
||||
|
||||
# 查看模型資訊
|
||||
ollama show mistral
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 已安裝的模型
|
||||
|
||||
查看已安裝的模型:
|
||||
```bash
|
||||
ollama list
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 版本資訊
|
||||
|
||||
- 版本: 0.13.5
|
||||
- Port: 11434
|
||||
- Models: /Users/accusys/.ollama/models/
|
||||
- 日誌目錄: /Users/accusys/momentry/log/
|
||||
379
docs/INSTALL_PHP.md
Normal file
379
docs/INSTALL_PHP.md
Normal file
@@ -0,0 +1,379 @@
|
||||
# PHP 安裝指南 (本地部署)
|
||||
|
||||
## 概述
|
||||
|
||||
本文檔說明如何在 macOS 上安裝 PHP 及 PHP-FPM,配置為本地部署。
|
||||
|
||||
---
|
||||
|
||||
## 當前狀態
|
||||
|
||||
| 項目 | 狀態 |
|
||||
|------|------|
|
||||
| PHP | ✅ 已安裝 v8.5.2 |
|
||||
| PHP-FPM | ✅ 執行中 |
|
||||
| 配置目錄 | /Users/accusys/momentry/etc/php/ |
|
||||
| 日誌目錄 | /Users/accusys/momentry/log/ |
|
||||
| Plist | /Library/LaunchDaemons/com.momentry.php.plist |
|
||||
|
||||
---
|
||||
|
||||
## 安裝步驟
|
||||
|
||||
### Step 1: 安裝 PHP (使用 brew)
|
||||
|
||||
```bash
|
||||
# 安裝 PHP
|
||||
brew install php
|
||||
|
||||
# 安裝 PHP-FPM (通常包含在 php 中)
|
||||
brew install php --fpm
|
||||
```
|
||||
|
||||
**驗證**:
|
||||
```bash
|
||||
php --version
|
||||
# PHP 8.5.2 (cli)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 2: 建立目錄
|
||||
|
||||
```bash
|
||||
# 建立配置目錄
|
||||
mkdir -p /Users/accusys/momentry/etc/php
|
||||
|
||||
# 建立日誌目錄
|
||||
mkdir -p /Users/accusys/momentry/log
|
||||
|
||||
# 建立日誌文件
|
||||
touch /Users/accusys/momentry/log/php.log
|
||||
touch /Users/accusys/momentry/log/php.error.log
|
||||
|
||||
# 設定權限
|
||||
chown -R accusys:staff /Users/accusys/momentry/etc/php
|
||||
chown -R accusys:staff /Users/accusys/momentry/log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 3: 建立設定檔
|
||||
|
||||
建立 `/Users/accusys/momentry/etc/php/php-fpm.conf`:
|
||||
|
||||
```ini
|
||||
[global]
|
||||
pid = /Users/accusys/momentry/var/php-fpm.pid
|
||||
error_log = /Users/accusys/momentry/log/php.error.log
|
||||
log_level = notice
|
||||
|
||||
[www]
|
||||
user = accusys
|
||||
group = staff
|
||||
listen = 127.0.0.1:9000
|
||||
listen.owner = accusys
|
||||
listen.group = staff
|
||||
pm = dynamic
|
||||
pm.max_children = 5
|
||||
pm.start_servers = 2
|
||||
pm.min_spare_servers = 1
|
||||
pm.max_spare_servers = 3
|
||||
```
|
||||
|
||||
複製 php.ini:
|
||||
```bash
|
||||
cp /opt/homebrew/etc/php/8.5/php.ini /Users/accusys/momentry/etc/php/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 4: 使用 plist 開機自動啟動
|
||||
|
||||
```bash
|
||||
# 複製 plist 到 LaunchDaemons 目錄
|
||||
sudo cp /Users/accusys/momentry_core_0.1/momentry_runtime/plist/com.momentry.php.plist /Library/LaunchDaemons/
|
||||
|
||||
# 載入並啟動
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.php.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 監控配置
|
||||
|
||||
### 添加到監控配置
|
||||
|
||||
在 `monitor/config/monitor_config.yaml` 中添加:
|
||||
|
||||
```yaml
|
||||
service:
|
||||
services:
|
||||
- name: "php-fpm"
|
||||
type: "tcp"
|
||||
port: 9000
|
||||
host: "localhost"
|
||||
timeout: 5
|
||||
enabled: true
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 卸載步驟
|
||||
|
||||
### 重要: 路徑說明
|
||||
|
||||
| 路徑 | 類型 | 說明 |
|
||||
|------|------|------|
|
||||
| `/Users/accusys/momentry/etc/php/` | 配置 | **不要刪除** - PHP 配置 |
|
||||
| `/Users/accusys/momentry/log/` | 日誌 | **不要刪除** - 日誌目錄 |
|
||||
| `/opt/homebrew/opt/php/` | 安裝 | **刪除** - PHP 安裝目錄 |
|
||||
|
||||
### Step 1: 停止 PHP-FPM
|
||||
|
||||
```bash
|
||||
# 找到 PHP-FPM 進程
|
||||
ps aux | grep php-fpm | grep -v grep
|
||||
|
||||
# 停止 PHP-FPM
|
||||
pkill php-fpm
|
||||
|
||||
# 確認停止
|
||||
ps aux | grep php-fpm | grep -v grep || echo "PHP-FPM 已停止"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 2: 卸載 PHP
|
||||
|
||||
```bash
|
||||
# 卸載 PHP
|
||||
brew uninstall php
|
||||
|
||||
# 移除 plist
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.php.plist
|
||||
sudo rm /Library/LaunchDaemons/com.momentry.php.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 3: 刪除專屬檔案
|
||||
|
||||
```bash
|
||||
# 刪除配置目錄 (可選)
|
||||
rm -rf /Users/accusys/momentry/etc/php
|
||||
|
||||
# 刪除日誌 (可選)
|
||||
rm -f /Users/accusys/momentry/log/php.log
|
||||
rm -f /Users/accusys/momentry/log/php.error.log
|
||||
```
|
||||
|
||||
**注意: 不要刪除以下共用目錄**:
|
||||
```bash
|
||||
# 這些是共用的,不要刪除!
|
||||
# /Users/accusys/momentry/etc
|
||||
# /Users/accusys/momentry/log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 4: 卸載後檢查清單
|
||||
|
||||
```bash
|
||||
echo "=== PHP 卸載後檢查 ==="
|
||||
|
||||
# 1. 檢查 PHP-FPM 進程
|
||||
echo "1. PHP-FPM 進程:"
|
||||
ps aux | grep php-fpm | grep -v grep && echo " ✗ 仍在運行" || echo " ✓ 已停止"
|
||||
|
||||
# 2. Port 9000
|
||||
echo "2. Port 9000:"
|
||||
lsof -i :9000 > /dev/null 2>&1 && echo " ✗ 仍被佔用" || echo " ✓ 已釋放"
|
||||
|
||||
# 3. php 命令
|
||||
echo "3. php 命令:"
|
||||
which php > /dev/null 2>&1 && echo " ✗ 仍存在" || echo " ✓ 已移除"
|
||||
|
||||
# 4. brew 安裝
|
||||
echo "4. brew 安裝:"
|
||||
brew list php > /dev/null 2>&1 && echo " ✗ 仍存在" || echo " ✓ 已移除"
|
||||
|
||||
# 5. launchctl 服務
|
||||
echo "5. launchctl 服務:"
|
||||
sudo launchctl list | grep php > /dev/null 2>&1 && echo " ✗ 仍存在" || echo " ✓ 已移除"
|
||||
|
||||
# 6. 配置目錄 (可選刪除)
|
||||
echo "6. 配置目錄:"
|
||||
[ -d "/Users/accusys/momentry/etc/php" ] && echo " ✓ 保留" || echo " ✗ 已刪除"
|
||||
|
||||
# 7. 日誌目錄 (可選刪除)
|
||||
echo "7. 日誌目錄:"
|
||||
[ -d "/Users/accusys/momentry/log" ] && echo " ✓ 保留" || echo " ✗ 已刪除"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 手動檢查命令
|
||||
|
||||
```bash
|
||||
# 1. 檢查 PHP 版本
|
||||
php --version
|
||||
|
||||
# 2. 檢查 PHP-FPM 進程
|
||||
ps aux | grep php-fpm | grep -v grep
|
||||
|
||||
# 3. 檢查 Port
|
||||
lsof -i :9000
|
||||
|
||||
# 4. 測試 PHP
|
||||
php -r "echo 'PHP OK' . PHP_EOL;"
|
||||
|
||||
# 5. 查看 PHP 模組
|
||||
php -m
|
||||
|
||||
# 6. 查看 PHP 配置
|
||||
php -i | grep "Loaded Configuration File"
|
||||
|
||||
# 7. 查看日誌
|
||||
tail -20 /Users/accusys/momentry/log/php.log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 連線資訊
|
||||
|
||||
| 項目 | 值 |
|
||||
|------|-----|
|
||||
| PHP-FPM Port | 9000 |
|
||||
| PHP Version | 8.5.2 |
|
||||
| Config | /Users/accusys/momentry/etc/php/php-fpm.conf |
|
||||
| php.ini | /Users/accusys/momentry/etc/php/php.ini |
|
||||
|
||||
---
|
||||
|
||||
## 環境變數
|
||||
|
||||
在 `.env` 中:
|
||||
|
||||
```env
|
||||
PHP_INI_SCAN_DIR=/Users/accusys/momentry/etc/php/conf.d
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 故障排除
|
||||
|
||||
### PHP-FPM 無法啟動
|
||||
|
||||
```bash
|
||||
# 檢查日誌
|
||||
tail -f /Users/accusys/momentry/log/php.error.log
|
||||
|
||||
# 檢查配置語法
|
||||
/opt/homebrew/opt/php/sbin/php-fpm --test --fpm-config /Users/accusys/momentry/etc/php/php-fpm.conf
|
||||
|
||||
# 檢查目錄權限
|
||||
ls -la /Users/accusys/momentry/etc/php/
|
||||
|
||||
# 重新設定權限
|
||||
chown -R $(whoami):staff /Users/accusys/momentry/etc/php
|
||||
```
|
||||
|
||||
### Port 被佔用
|
||||
|
||||
```bash
|
||||
# 檢查哪個程序佔用 port 9000
|
||||
lsof -i :9000
|
||||
|
||||
# 終止佔用程序
|
||||
kill <PID>
|
||||
```
|
||||
|
||||
### 需要重新載入 plist
|
||||
|
||||
```bash
|
||||
# 卸載舊服務 (如果存在)
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.php.plist 2>/dev/null
|
||||
|
||||
# 載入新服務
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.php.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 檔案位置
|
||||
|
||||
| 類型 | 路徑 | 說明 |
|
||||
|------|------|------|
|
||||
| 安裝 | `/opt/homebrew/opt/php/` | PHP 安裝目錄 |
|
||||
| 執行檔 | `/opt/homebrew/bin/php` | PHP 執行檔 |
|
||||
| PHP-FPM | `/opt/homebrew/opt/php/sbin/php-fpm` | PHP-FPM 執行檔 |
|
||||
| php.ini | `/Users/accusys/momentry/etc/php/8.5/php.ini` | PHP 配置 |
|
||||
| PHP-FPM 配置 | `/Users/accusys/momentry/etc/php/8.5/php-fpm.conf` | PHP-FPM 主配置 |
|
||||
| PHP-FPM pool | `/Users/accusys/momentry/etc/php/8.5/php-fpm.d/` | Pool 配置 |
|
||||
| 日誌 | `/Users/accusys/momentry/log/php.log` | 執行日誌 |
|
||||
| 錯誤日誌 | `/opt/homebrew/var/log/php-fpm.log` | PHP-FPM 錯誤日誌 |
|
||||
| plist | `/Library/LaunchDaemons/com.momentry.php.plist` | 開機啟動 |
|
||||
| 備份 | `/Users/accusys/momentry/backup/daily/php/` | 配置備份 |
|
||||
|
||||
---
|
||||
|
||||
## 常用指令
|
||||
|
||||
```bash
|
||||
# 測試 PHP-FPM 配置
|
||||
/opt/homebrew/opt/php/sbin/php-fpm --test --fpm-config /Users/accusys/momentry/etc/php/php-fpm.conf
|
||||
|
||||
# 查看 PHP 模組
|
||||
php -m
|
||||
|
||||
# 查看已載入的配置
|
||||
php -i
|
||||
|
||||
# 測試 PHP 腳本
|
||||
php -r "echo 'Hello World' . PHP_EOL;"
|
||||
|
||||
# 查看 PHP-FPM 狀態
|
||||
curl http://127.0.0.1:9000/status
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 備份與恢復
|
||||
|
||||
### 備份
|
||||
|
||||
```bash
|
||||
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
||||
BACKUP_DIR="/Users/accusys/momentry/backup/daily/php"
|
||||
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
|
||||
# 備份配置 (注意:PHP-FPM 實際使用 /Users/accusys/momentry/etc/php/8.5/ 配置)
|
||||
tar -czf "$BACKUP_DIR/php_cfg_${TIMESTAMP}.tar.gz" \
|
||||
/Users/accusys/momentry/etc/php/8.5/php.ini \
|
||||
/Users/accusys/momentry/etc/php/8.5/php-fpm.conf \
|
||||
/Users/accusys/momentry/etc/php/8.5/php-fpm.d/
|
||||
|
||||
# 驗證
|
||||
sha256sum "$BACKUP_DIR/php_cfg_${TIMESTAMP}.tar.gz" > "$BACKUP_DIR/php_${TIMESTAMP}.sha256"
|
||||
```
|
||||
|
||||
### 恢復
|
||||
|
||||
```bash
|
||||
# 解壓配置
|
||||
tar -xzf /Users/accusys/momentry/backup/daily/php/php_cfg_20260316_102727.tar.gz -C /
|
||||
|
||||
# 測試配置
|
||||
/opt/homebrew/opt/php/sbin/php-fpm --test --fpm-config /Users/accusys/momentry/etc/php/8.5/php-fpm.conf
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 版本資訊
|
||||
|
||||
- PHP Version: 8.5.2
|
||||
- PHP-FPM Port: 9000
|
||||
- 配置目錄: /Users/accusys/momentry/etc/php/
|
||||
- 日誌目錄: /Users/accusys/momentry/log/
|
||||
372
docs/INSTALL_POSTGRESQL.md
Normal file
372
docs/INSTALL_POSTGRESQL.md
Normal file
@@ -0,0 +1,372 @@
|
||||
# PostgreSQL 安裝指南 (本地部署)
|
||||
|
||||
## 概述
|
||||
|
||||
本文檔說明如何在 macOS 上安裝 PostgreSQL,配置為本地部署,支援遠端訪問。
|
||||
|
||||
---
|
||||
|
||||
## 當前狀態
|
||||
|
||||
| 項目 | 狀態 |
|
||||
|------|------|
|
||||
| PostgreSQL | ✅ 已安裝 v18.1 |
|
||||
| 數據目錄 | /Users/accusys/momentry/var/postgresql/ |
|
||||
| 日誌目錄 | /Users/accusys/momentry/log/ |
|
||||
| Plist | /Library/LaunchDaemons/com.momentry.postgresql.plist |
|
||||
|
||||
---
|
||||
|
||||
## 安裝步驟
|
||||
|
||||
### Step 1: 安裝 PostgreSQL (使用 brew)
|
||||
|
||||
```bash
|
||||
# 安裝 PostgreSQL
|
||||
brew install postgresql@18
|
||||
```
|
||||
|
||||
**驗證**:
|
||||
```bash
|
||||
postgres --version
|
||||
# postgres (PostgreSQL) 18.1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 2: 建立目錄結構
|
||||
|
||||
```bash
|
||||
# 建立數據目錄
|
||||
mkdir -p /Users/accusys/momentry/var/postgresql
|
||||
|
||||
# 建立配置目錄
|
||||
mkdir -p /Users/accusys/momentry/etc/postgresql
|
||||
|
||||
# 建立日誌目錄
|
||||
mkdir -p /Users/accusys/momentry/log
|
||||
|
||||
# 建立日誌文件
|
||||
touch /Users/accusys/momentry/log/postgresql.log
|
||||
touch /Users/accusys/momentry/log/postgresql.error.log
|
||||
|
||||
# 設定權限
|
||||
chown -R accusys:staff /Users/accusys/momentry/var/postgresql
|
||||
chown -R accusys:staff /Users/accusys/momentry/etc/postgresql
|
||||
chown -R accusys:staff /Users/accusys/momentry/log
|
||||
```
|
||||
|
||||
**注意**: 如果需要從舊數據遷移,需要先初始化新目錄:
|
||||
```bash
|
||||
# 初始化新數據目錄 (會創建默認數據庫)
|
||||
initdb -D /Users/accusys/momentry/var/postgresql -U accusys
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 3: 使用 plist 開機自動啟動
|
||||
|
||||
```bash
|
||||
# 複製 plist 到 LaunchDaemons 目錄
|
||||
sudo cp /Users/accusys/momentry_core_0.1/momentry_runtime/plist/com.momentry.postgresql.plist /Library/LaunchDaemons/
|
||||
|
||||
# 載入並啟動
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.postgresql.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 監控配置
|
||||
|
||||
### 添加到監控配置
|
||||
|
||||
在 `monitor/config/monitor_config.yaml` 中添加:
|
||||
|
||||
```yaml
|
||||
database:
|
||||
postgresql:
|
||||
enabled: true
|
||||
host: "localhost"
|
||||
port: 5432
|
||||
user: "accusys"
|
||||
database: "momentry"
|
||||
```
|
||||
|
||||
### 添加健康檢查函數
|
||||
|
||||
在 `monitor/database/postgres_monitor.sh` 中已包含 PostgreSQL 監控。
|
||||
|
||||
---
|
||||
|
||||
## 卸載步驟
|
||||
|
||||
### 重要: 路徑說明
|
||||
|
||||
| 路徑 | 類型 | 說明 |
|
||||
|------|------|------|
|
||||
| `/Users/accusys/momentry/var/postgresql/` | 數據 | **不要刪除** - 數據目錄 |
|
||||
| `/Users/accusys/momentry/etc/postgresql/` | 配置 | **不要刪除** - 配置目錄 |
|
||||
| `/Users/accusys/momentry/log/` | 日誌 | **不要刪除** - 日誌目錄 |
|
||||
| `/opt/homebrew/opt/postgresql@18/` | 安裝 | **刪除** - PostgreSQL 安裝目錄 |
|
||||
|
||||
### Step 1: 停止 PostgreSQL
|
||||
|
||||
```bash
|
||||
# 找到 PostgreSQL 進程
|
||||
ps aux | grep postgres | grep -v grep
|
||||
|
||||
# 停止 PostgreSQL
|
||||
pg_ctl -D /opt/homebrew/var/postgresql@18 stop
|
||||
# 或
|
||||
pkill -f postgresql
|
||||
|
||||
# 確認停止
|
||||
ps aux | grep postgres | grep -v grep || echo "PostgreSQL 已停止"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 2: 卸載 PostgreSQL
|
||||
|
||||
```bash
|
||||
# 卸載 PostgreSQL
|
||||
brew uninstall postgresql@18
|
||||
|
||||
# 移除 plist
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.postgresql.plist
|
||||
sudo rm /Library/LaunchDaemons/com.momentry.postgresql.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 3: 刪除專屬檔案
|
||||
|
||||
```bash
|
||||
# 刪除數據目錄 (可選)
|
||||
rm -rf /Users/accusys/momentry/var/postgresql
|
||||
|
||||
# 刪除日誌 (可選)
|
||||
rm -f /Users/accusys/momentry/log/postgresql.log
|
||||
rm -f /Users/accusys/momentry/log/postgresql.error.log
|
||||
```
|
||||
|
||||
**注意: 不要刪除以下共用目錄**:
|
||||
```bash
|
||||
# 這些是共用的,不要刪除!
|
||||
# /Users/accusys/momentry/var
|
||||
# /Users/accusys/momentry/log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 4: 卸載後檢查清單
|
||||
|
||||
```bash
|
||||
echo "=== PostgreSQL 卸載後檢查 ==="
|
||||
|
||||
# 1. 檢查 PostgreSQL 進程
|
||||
echo "1. PostgreSQL 進程:"
|
||||
ps aux | grep postgres | grep -v grep && echo " ✗ 仍在運行" || echo " ✓ 已停止"
|
||||
|
||||
# 2. Port 5432
|
||||
echo "2. Port 5432:"
|
||||
lsof -i :5432 > /dev/null 2>&1 && echo " ✗ 仍被佔用" || echo " ✓ 已釋放"
|
||||
|
||||
# 3. postgres 命令
|
||||
echo "3. postgres 命令:"
|
||||
which postgres > /dev/null 2>&1 && echo " ✗ 仍存在" || echo " ✓ 已移除"
|
||||
|
||||
# 4. brew 安裝
|
||||
echo "4. brew 安裝:"
|
||||
brew list postgresql@18 > /dev/null 2>&1 && echo " ✗ 仍存在" || echo " ✓ 已移除"
|
||||
|
||||
# 5. launchctl 服務
|
||||
echo "5. launchctl 服務:"
|
||||
sudo launchctl list | grep postgresql > /dev/null 2>&1 && echo " ✗ 仍存在" || echo " ✓ 已移除"
|
||||
|
||||
# 6. 數據目錄 (可選刪除)
|
||||
echo "6. 數據目錄:"
|
||||
[ -d "/Users/accusys/momentry/var/postgresql" ] && echo " ✓ 保留" || echo " ✗ 已刪除"
|
||||
|
||||
# 7. 日誌目錄 (可選刪除)
|
||||
echo "7. 日誌目錄:"
|
||||
[ -d "/Users/accusys/momentry/log" ] && echo " ✓ 保留" || echo " ✗ 已刪除"
|
||||
```
|
||||
|
||||
**預期結果**:
|
||||
```
|
||||
=== PostgreSQL 卸載後檢查 ===
|
||||
1. PostgreSQL 進程:
|
||||
✓ 已停止
|
||||
2. Port 5432:
|
||||
✓ 已釋放
|
||||
3. postgres 命令:
|
||||
✓ 已移除
|
||||
4. brew 安裝:
|
||||
✓ 已移除
|
||||
5. launchctl 服務:
|
||||
✓ 已移除
|
||||
6. 數據目錄:
|
||||
✓ 保留 (或 ✗ 已刪除)
|
||||
7. 日誌目錄:
|
||||
✓ 保留 (或 ✗ 已刪除)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 手動檢查命令
|
||||
|
||||
```bash
|
||||
# 1. 檢查進程
|
||||
ps aux | grep postgres | grep -v grep
|
||||
|
||||
# 2. 檢查 Port
|
||||
lsof -i :5432
|
||||
|
||||
# 3. 測試連線
|
||||
psql -U accusys -l
|
||||
|
||||
# 4. 查看所有數據庫
|
||||
psql -U accusys -c "\l"
|
||||
|
||||
# 5. 查看連接
|
||||
psql -U accusys -c "\conninfo"
|
||||
|
||||
# 6. 查看表
|
||||
psql -U accusys -d momentry -c "\dt"
|
||||
|
||||
# 7. 查看日誌
|
||||
tail -20 /Users/accusys/momentry/log/postgresql.log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 連線資訊
|
||||
|
||||
| 項目 | 值 |
|
||||
|------|-----|
|
||||
| Host | localhost |
|
||||
| Port | 5432 |
|
||||
| User | accusys |
|
||||
| Database | momentry, video_register, gitea, n8n |
|
||||
|
||||
---
|
||||
|
||||
## 環境變數
|
||||
|
||||
在 `.env` 中:
|
||||
|
||||
```env
|
||||
POSTGRES_URL=postgresql://accusys@localhost:5432
|
||||
POSTGRES_DB=momentry
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 遠端訪問
|
||||
|
||||
- PostgreSQL 綁定到所有網路介面 (0.0.0.0)
|
||||
- 本地網路其他機器可透過 IP 訪問
|
||||
- 請設定 `pg_hba.conf` 限制訪問 IP
|
||||
|
||||
---
|
||||
|
||||
## 故障排除
|
||||
|
||||
### PostgreSQL 無法啟動
|
||||
|
||||
```bash
|
||||
# 檢查日誌
|
||||
tail -f /Users/accusys/momentry/log/postgresql.log
|
||||
|
||||
# 檢查目錄權限
|
||||
ls -la /Users/accusys/momentry/var/postgresql/
|
||||
|
||||
# 重新設定權限
|
||||
chown -R $(whoami):staff /Users/accusys/momentry/var/postgresql
|
||||
```
|
||||
|
||||
### Port 被佔用
|
||||
|
||||
```bash
|
||||
# 檢查哪個程序佔用 port 5432
|
||||
lsof -i :5432
|
||||
|
||||
# 終止佔用程序
|
||||
kill <PID>
|
||||
```
|
||||
|
||||
### 需要重新載入 plist
|
||||
|
||||
```bash
|
||||
# 卸載舊服務 (如果存在)
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.postgresql.plist 2>/dev/null
|
||||
|
||||
# 載入新服務
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.postgresql.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 檔案位置
|
||||
|
||||
| 類型 | 路徑 | 說明 |
|
||||
|------|------|------|
|
||||
| 安裝 | `/opt/homebrew/opt/postgresql@18/` | PostgreSQL 安裝目錄 |
|
||||
| 執行檔 | `/opt/homebrew/opt/postgresql@18/bin/postgres` | PostgreSQL 執行檔 |
|
||||
| 數據目錄 | `/Users/accusys/momentry/var/postgresql/` | 數據儲存 |
|
||||
| 日誌 | `/Users/accusys/momentry/log/postgresql.log` | 執行日誌 |
|
||||
| 錯誤日誌 | `/Users/accusys/momentry/log/postgresql.error.log` | 錯誤日誌 |
|
||||
| plist | `/Library/LaunchDaemons/com.momentry.postgresql.plist` | 開機啟動 |
|
||||
| 備份 | `/Users/accusys/momentry/var/momentry_db_backup_latest.sql` | momentry 數據庫備份 |
|
||||
| 備份 | `/Users/accusys/momentry/var/video_register_db_backup_latest.sql` | video_register 數據庫備份 |
|
||||
|
||||
---
|
||||
|
||||
## 備份與恢復
|
||||
|
||||
### 備份 (pg_dump)
|
||||
|
||||
```bash
|
||||
# 備份 momentry 數據庫
|
||||
pg_dump -U accusys momentry > /Users/accusys/momentry/var/momentry_db_backup_latest.sql
|
||||
|
||||
# 備份 video_register 數據庫
|
||||
pg_dump -U accusys video_register > /Users/accusys/momentry/var/video_register_db_backup_latest.sql
|
||||
```
|
||||
|
||||
### 恢復 (psql)
|
||||
|
||||
```bash
|
||||
# 恢復 momentry 數據庫
|
||||
psql -U accusys -d momentry < /Users/accusys/momentry/var/momentry_db_backup_latest.sql
|
||||
|
||||
# 恢復 video_register 數據庫
|
||||
psql -U accusys -d video_register < /Users/accusys/momentry/var/video_register_db_backup_latest.sql
|
||||
```
|
||||
|
||||
### 數據目錄複製 (完整遷移)
|
||||
|
||||
```bash
|
||||
# 1. 停止 PostgreSQL
|
||||
pg_ctl -D /Users/accusys/momentry/var/postgresql stop
|
||||
|
||||
# 2. 複製數據目錄
|
||||
cp -r /opt/homebrew/var/postgresql@18/* /Users/accusys/momentry/var/postgresql/
|
||||
|
||||
# 3. 設定權限
|
||||
chown -R $(whoami):staff /Users/accusys/momentry/var/postgresql
|
||||
|
||||
# 4. 啟動 PostgreSQL
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.postgresql.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 版本資訊
|
||||
|
||||
- 版本: 18.1
|
||||
- Port: 5432
|
||||
- User: accusys
|
||||
- 數據目錄: /Users/accusys/momentry/var/postgresql/
|
||||
- 日誌目錄: /Users/accusys/momentry/log/
|
||||
456
docs/INSTALL_QDRANT.md
Normal file
456
docs/INSTALL_QDRANT.md
Normal file
@@ -0,0 +1,456 @@
|
||||
# Qdrant 安裝指南 (本地部署)
|
||||
|
||||
## 概述
|
||||
|
||||
本文檔說明如何在 macOS 上安裝 Qdrant Vector Database,配置為本地部署,支援遠端訪問。
|
||||
|
||||
---
|
||||
|
||||
## 當前狀態
|
||||
|
||||
| 項目 | 狀態 |
|
||||
|------|------|
|
||||
| Qdrant | ✅ 已安裝 v1.17.0 |
|
||||
| 數據目錄 | /Users/accusys/momentry/var/qdrant/ |
|
||||
| 日誌目錄 | /Users/accusys/momentry/log/ |
|
||||
| Plist | /Library/LaunchDaemons/com.momentry.qdrant.plist |
|
||||
|
||||
---
|
||||
|
||||
## 安裝步驟
|
||||
|
||||
### Step 1: 安裝 Qdrant (使用 cargo)
|
||||
|
||||
```bash
|
||||
# 安裝 Qdrant 從 GitHub
|
||||
cargo install --git https://github.com/qdrant/qdrant.git --locked
|
||||
```
|
||||
|
||||
**驗證**:
|
||||
```bash
|
||||
qdrant --version
|
||||
# qdrant 1.17.0
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 2: 驗證 Qdrant 安裝
|
||||
|
||||
```bash
|
||||
# 驗證 Qdrant 安裝
|
||||
~/.cargo/bin/qdrant --version
|
||||
# qdrant 1.17.0
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 3: 建立目錄結構
|
||||
|
||||
```bash
|
||||
# 建立數據目錄
|
||||
mkdir -p /Users/accusys/momentry/var/qdrant
|
||||
|
||||
# 建立配置目錄
|
||||
mkdir -p /Users/accusys/momentry/etc/qdrant
|
||||
|
||||
# 建立日誌目錄
|
||||
mkdir -p /Users/accusys/momentry/log
|
||||
|
||||
# 建立日誌文件
|
||||
touch /Users/accusys/momentry/log/qdrant.log
|
||||
touch /Users/accusys/momentry/log/qdrant.error.log
|
||||
|
||||
# 設定權限
|
||||
chown -R accusys:staff /Users/accusys/momentry/var/qdrant
|
||||
chown -R accusys:staff /Users/accusys/momentry/etc/qdrant
|
||||
chown -R accusys:staff /Users/accusys/momentry/log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 4: 使用 plist 開機自動啟動
|
||||
|
||||
```bash
|
||||
# 複製 plist 到 LaunchDaemons 目錄
|
||||
sudo cp /Users/accusys/momentry_core_0.1/momentry_runtime/plist/com.momentry.qdrant.plist /Library/LaunchDaemons/
|
||||
|
||||
# 載入並啟動
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.qdrant.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 監控配置
|
||||
|
||||
### 添加到監控配置
|
||||
|
||||
在 `monitor/config/monitor_config.yaml` 中添加:
|
||||
|
||||
```yaml
|
||||
database:
|
||||
qdrant:
|
||||
enabled: true
|
||||
host: "localhost"
|
||||
port: 6333
|
||||
```
|
||||
|
||||
### 添加健康檢查函數
|
||||
|
||||
在 `monitor/database/qdrant_monitor.sh` 中已包含 Qdrant 監控。
|
||||
|
||||
---
|
||||
|
||||
## 卸載步驟
|
||||
|
||||
### 重要: 路徑說明
|
||||
|
||||
| 路徑 | 類型 | 說明 |
|
||||
|------|------|------|
|
||||
| `/Users/accusys/momentry/var/qdrant/` | 數據 | **不要刪除** - Qdrant 數據 |
|
||||
| `/Users/accusys/momentry/etc/qdrant/` | 配置 | **不要刪除** - Qdrant 配置 |
|
||||
| `/Users/accusys/momentry/log/` | 日誌 | **不要刪除** - 日誌目錄 |
|
||||
| `~/.cargo/bin/qdrant` | 安裝 | **刪除** - Qdrant 執行檔 |
|
||||
|
||||
### Step 1: 停止 Qdrant
|
||||
|
||||
```bash
|
||||
# 找到 Qdrant 進程
|
||||
ps aux | grep qdrant | grep -v grep
|
||||
|
||||
# 停止 Qdrant
|
||||
pkill qdrant
|
||||
# 或
|
||||
kill <PID>
|
||||
|
||||
# 確認停止
|
||||
ps aux | grep qdrant | grep -v grep || echo "Qdrant 已停止"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 2: 卸載 Qdrant (cargo)
|
||||
|
||||
```bash
|
||||
# 移除 cargo 安裝的 Qdrant
|
||||
cargo uninstall qdrant
|
||||
|
||||
# 移除 plist
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.qdrant.plist
|
||||
sudo rm /Library/LaunchDaemons/com.momentry.qdrant.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 3: 刪除專屬檔案
|
||||
|
||||
```bash
|
||||
# 刪除數據目錄 (可選)
|
||||
rm -rf /Users/accusys/momentry/var/qdrant
|
||||
|
||||
# 刪除日誌 (可選)
|
||||
rm -f /Users/accusys/momentry/log/qdrant.log
|
||||
rm -f /opt/homebrew/var/log/qdrant.error.log
|
||||
```
|
||||
|
||||
**注意: 不要刪除以下共用目錄**:
|
||||
```bash
|
||||
# 這些是共用的,不要刪除!
|
||||
# /Users/accusys/momentry/var
|
||||
# /Users/accusys/momentry/log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 4: 卸載後檢查清單
|
||||
|
||||
```bash
|
||||
echo "=== Qdrant 卸載後檢查 ==="
|
||||
|
||||
# 1. 檢查 Qdrant 進程
|
||||
echo "1. Qdrant 進程:"
|
||||
ps aux | grep qdrant | grep -v grep && echo " ✗ 仍在運行" || echo " ✓ 已停止"
|
||||
|
||||
# 2. Port 6333
|
||||
echo "2. Port 6333:"
|
||||
lsof -i :6333 > /dev/null 2>&1 && echo " ✗ 仍被佔用" || echo " ✓ 已釋放"
|
||||
|
||||
# 3. Port 6334
|
||||
echo "3. Port 6334:"
|
||||
lsof -i :6334 > /dev/null 2>&1 && echo " ✗ 仍被佔用" || echo " ✓ 已釋放"
|
||||
|
||||
# 4. qdrant 命令
|
||||
echo "4. qdrant 命令:"
|
||||
which qdrant > /dev/null 2>&1 && echo " ✗ 仍存在" || echo " ✓ 已移除"
|
||||
|
||||
# 5. cargo 安裝
|
||||
echo "5. cargo 安裝:"
|
||||
cargo install --list | grep qdrant > /dev/null 2>&1 && echo " ✗ 仍存在" || echo " ✓ 已移除"
|
||||
|
||||
# 6. launchctl 服務
|
||||
echo "6. launchctl 服務:"
|
||||
sudo launchctl list | grep qdrant > /dev/null 2>&1 && echo " ✗ 仍存在" || echo " ✓ 已移除"
|
||||
|
||||
# 7. 數據目錄 (可選刪除)
|
||||
echo "7. 數據目錄:"
|
||||
[ -d "/Users/accusys/momentry/var/qdrant" ] && echo " ✓ 保留" || echo " ✗ 已刪除"
|
||||
|
||||
# 8. 日誌目錄 (可選刪除)
|
||||
echo "8. 日誌目錄:"
|
||||
[ -d "/Users/accusys/momentry/log" ] && echo " ✓ 保留" || echo " ✗ 已刪除"
|
||||
```
|
||||
|
||||
**預期結果**:
|
||||
```
|
||||
=== Qdrant 卸載後檢查 ===
|
||||
1. Qdrant 進程:
|
||||
✓ 已停止
|
||||
2. Port 6333:
|
||||
✓ 已釋放
|
||||
3. Port 6334:
|
||||
✓ 已釋放
|
||||
4. qdrant 命令:
|
||||
✓ 已移除
|
||||
5. cargo 安裝:
|
||||
✓ 已移除
|
||||
6. launchctl 服務:
|
||||
✓ 已移除
|
||||
7. 數據目錄:
|
||||
✓ 保留 (或 ✗ 已刪除)
|
||||
8. 日誌目錄:
|
||||
✓ 保留 (或 ✗ 已刪除)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 手動檢查命令
|
||||
|
||||
```bash
|
||||
# 1. 檢查進程
|
||||
ps aux | grep qdrant | grep -v grep
|
||||
|
||||
# 2. 檢查 Port
|
||||
lsof -i :6333
|
||||
lsof -i :6334
|
||||
|
||||
# 3. 測試連線 (無認證)
|
||||
curl http://localhost:6333/collections
|
||||
|
||||
# 4. 測試連線 (有認證)
|
||||
curl -H "api-key: Test3200Test3200Test3200" http://localhost:6333/collections
|
||||
|
||||
# 5. 查看所有 collections
|
||||
curl -s -H "api-key: Test3200Test3200Test3200" http://localhost:6333/collections
|
||||
|
||||
# 6. 查看日誌
|
||||
tail -20 /Users/accusys/momentry/log/qdrant.log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 連線資訊
|
||||
|
||||
| 項目 | 值 |
|
||||
|------|-----|
|
||||
| REST API | http://localhost:6333 |
|
||||
| gRPC | localhost:6334 |
|
||||
| API Key | Test3200Test3200Test3200 |
|
||||
| Qdrant UI | http://localhost:6333/dashboard |
|
||||
|
||||
---
|
||||
|
||||
## 環境變數
|
||||
|
||||
在 `.env` 中:
|
||||
|
||||
```env
|
||||
QDRANT_URL=http://localhost:6333
|
||||
QDRANT_API_KEY=Test3200Test3200Test3200
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 遠端訪問
|
||||
|
||||
- Qdrant 綁定到 `0.0.0.0` (所有網路介面)
|
||||
- 本地網路其他機器可透過 IP 訪問
|
||||
- 建議設定防火牆規則限制訪問 IP
|
||||
|
||||
---
|
||||
|
||||
## 故障排除
|
||||
|
||||
### Qdrant 無法啟動
|
||||
|
||||
```bash
|
||||
# 檢查日誌
|
||||
tail -f /Users/accusys/momentry/log/qdrant.log
|
||||
|
||||
# 檢查目錄權限
|
||||
ls -la /Users/accusys/momentry/var/qdrant/
|
||||
|
||||
# 重新設定權限
|
||||
chown -R $(whoami):staff /Users/accusys/momentry/var/qdrant
|
||||
```
|
||||
|
||||
### Port 被佔用
|
||||
|
||||
```bash
|
||||
# 檢查哪個程序佔用 port 6333
|
||||
lsof -i :6333
|
||||
|
||||
# 終止佔用程序
|
||||
kill <PID>
|
||||
```
|
||||
|
||||
### 需要重新載入 plist
|
||||
|
||||
```bash
|
||||
# 卸載舊服務 (如果存在)
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.qdrant.plist 2>/dev/null
|
||||
|
||||
# 載入新服務
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.qdrant.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 檔案位置
|
||||
|
||||
| 類型 | 路徑 | 說明 |
|
||||
|------|------|------|
|
||||
| `/Users/accusys/.cargo/bin/qdrant` | 二進制 | cargo 安裝位置 (直接使用) |
|
||||
| `/opt/homebrew/bin/qdrant` | 符號連結 | ~~已棄用~~ - 不再需要 |
|
||||
| 數據目錄 | `/Users/accusys/momentry/var/qdrant/` | 數據儲存 |
|
||||
| 日誌 | `/Users/accusys/momentry/log/qdrant.log` | 執行日誌 |
|
||||
| 錯誤日誌 | `/opt/homebrew/var/log/qdrant.error.log` | 錯誤日誌 |
|
||||
| plist | `/Library/LaunchDaemons/com.momentry.qdrant.plist` | 開機啟動 |
|
||||
| 備份 | `/Users/accusys/momentry/var/qdrant_backup/` | 數據備份 |
|
||||
|
||||
---
|
||||
|
||||
## 備份與恢復
|
||||
|
||||
### 備份
|
||||
|
||||
Qdrant 提供兩種備份方式:Snapshots (推薦) 和手動複製。
|
||||
|
||||
#### 方式一:使用 Snapshots API (推薦)
|
||||
|
||||
```bash
|
||||
# 創建備份目錄
|
||||
mkdir -p /Users/accusys/momentry/var/qdrant_backup
|
||||
|
||||
# 獲取所有 collections
|
||||
curl -s -H "api-key: Test3200Test3200Test3200" \
|
||||
http://localhost:6333/collections | jq -r '.result[].name'
|
||||
|
||||
# 為每個 collection 創建 snapshot
|
||||
# 假設 collection 名稱為 "chunks"
|
||||
curl -X POST -H "api-key: Test3200Test3200Test3200" \
|
||||
http://localhost:6333/collections/chunks/snapshots \
|
||||
-o /Users/accusys/momentry/var/qdrant_backup/chunks_snapshot_$(date +%Y%m%d).tar.gz
|
||||
```
|
||||
|
||||
#### 方式二:手動複製數據目錄 (停機備份)
|
||||
|
||||
```bash
|
||||
# 停止 Qdrant
|
||||
pkill qdrant
|
||||
|
||||
# 等待停止
|
||||
sleep 2
|
||||
|
||||
# 複製數據目錄
|
||||
TIMESTAMP=$(date +%Y%m%d)
|
||||
mkdir -p /Users/accusys/momentry/var/qdrant_backup
|
||||
tar -czf /Users/accusys/momentry/var/qdrant_backup/qdrant_data_${TIMESTAMP}.tar.gz \
|
||||
-C /Users/accusys/momentry/var qdrant/
|
||||
|
||||
# 啟動 Qdrant
|
||||
launchctl load /Library/LaunchDaemons/com.momentry.qdrant.plist
|
||||
```
|
||||
|
||||
#### 自動備份腳本
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# backup_qdrant.sh
|
||||
set -e
|
||||
|
||||
QDRANT_HOST="localhost"
|
||||
QDRANT_PORT="6333"
|
||||
QDRANT_API_KEY="Test3200Test3200Test3200"
|
||||
BACKUP_DIR="/Users/accusys/momentry/var/qdrant_backup"
|
||||
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
||||
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
|
||||
echo "開始 Qdrant 備份..."
|
||||
|
||||
# 獲取所有 collections
|
||||
COLLECTIONS=$(curl -s -H "api-key: $QDRANT_API_KEY" \
|
||||
http://${QDRANT_HOST}:${QDRANT_PORT}/collections | \
|
||||
jq -r '.result[].name')
|
||||
|
||||
if [ -z "$COLLECTIONS" ]; then
|
||||
echo "警告: 沒有找到任何 collections"
|
||||
else
|
||||
for COLLECTION in $COLLECTIONS; do
|
||||
echo "備份 collection: $COLLECTION"
|
||||
curl -X POST -H "api-key: $QDRANT_API_KEY" \
|
||||
"http://${QDRANT_HOST}:${QDRANT_PORT}/collections/${COLLECTION}/snapshots" \
|
||||
-o "${BACKUP_DIR}/${COLLECTION}_${TIMESTAMP}.tar.gz" 2>/dev/null || \
|
||||
echo "警告: $COLLECTION 備份失敗"
|
||||
done
|
||||
fi
|
||||
|
||||
# 壓縮所有 snapshot
|
||||
cd "$BACKUP_DIR"
|
||||
tar -czf qdrant_snapshots_${TIMESTAMP}.tar.gz *.tar.gz 2>/dev/null || true
|
||||
rm -f *.tar.gz
|
||||
|
||||
# 清理 30 天前的備份
|
||||
find "$BACKUP_DIR" -name "qdrant_snapshots_*.tar.gz" -mtime +30 -delete
|
||||
|
||||
echo "Qdrant 備份完成: ${BACKUP_DIR}/qdrant_snapshots_${TIMESTAMP}.tar.gz"
|
||||
```
|
||||
|
||||
### 恢復
|
||||
|
||||
```bash
|
||||
# 停止 Qdrant
|
||||
pkill qdrant
|
||||
sleep 2
|
||||
|
||||
# 解壓縮備份
|
||||
TIMESTAMP="20260315"
|
||||
tar -xzf /Users/accusys/momentry/var/qdrant_backup/qdrant_snapshots_${TIMESTAMP}.tar.gz \
|
||||
-C /Users/accusys/momentry/var/qdrant_backup/
|
||||
|
||||
# 恢復數據目錄 (方式二備份)
|
||||
# rm -rf /Users/accusys/momentry/var/qdrant/*
|
||||
# tar -xzf /Users/accusys/momentry/var/qdrant_backup/qdrant_data_${TIMESTAMP}.tar.gz \
|
||||
# -C /Users/accusys/momentry/var/
|
||||
|
||||
# 啟動 Qdrant
|
||||
launchctl load /Library/LaunchDaemons/com.momentry.qdrant.plist
|
||||
```
|
||||
|
||||
### 排程備份
|
||||
|
||||
```bash
|
||||
# 編輯 crontab
|
||||
crontab -e
|
||||
|
||||
# 添加每天凌晨 3 點執行備份
|
||||
0 3 * * * /Users/accusys/momentry/scripts/backup_qdrant.sh >> /Users/accusys/momentry/log/backup.log 2>&1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 版本資訊
|
||||
|
||||
- 版本: 1.17.0
|
||||
- API Key: Test3200Test3200Test3200
|
||||
- 數據目錄: /Users/accusys/momentry/var/qdrant/
|
||||
- 日誌目錄: /Users/accusys/momentry/log/
|
||||
367
docs/INSTALL_REDIS.md
Normal file
367
docs/INSTALL_REDIS.md
Normal file
@@ -0,0 +1,367 @@
|
||||
# Redis 安裝指南 (本地部署)
|
||||
|
||||
## 概述
|
||||
|
||||
本文檔說明如何在 macOS 上安裝 Redis,配置為本地部署,支援遠端訪問。
|
||||
|
||||
---
|
||||
|
||||
## 當前狀態
|
||||
|
||||
| 項目 | 狀態 |
|
||||
|------|------|
|
||||
| Redis | ✅ 已安裝 v8.4.0 |
|
||||
| 數據目錄 | /Users/accusys/momentry/var/redis/ |
|
||||
| 日誌目錄 | /Users/accusys/momentry/log/ |
|
||||
| Plist | /Library/LaunchDaemons/com.momentry.redis.plist |
|
||||
|
||||
---
|
||||
|
||||
## 安裝步驟
|
||||
|
||||
### Step 1: 安裝 Redis (使用 brew)
|
||||
|
||||
```bash
|
||||
# 安裝 Redis
|
||||
brew install redis
|
||||
```
|
||||
|
||||
**驗證**:
|
||||
```bash
|
||||
redis-server --version
|
||||
# Redis server v8.4.0
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 2: 建立目錄結構
|
||||
|
||||
```bash
|
||||
# 建立數據目錄
|
||||
mkdir -p /Users/accusys/momentry/var/redis
|
||||
|
||||
# 建立配置目錄
|
||||
mkdir -p /Users/accusys/momentry/etc/redis
|
||||
|
||||
# 建立日誌目錄
|
||||
mkdir -p /Users/accusys/momentry/log
|
||||
|
||||
# 建立日誌文件
|
||||
touch /Users/accusys/momentry/log/redis.log
|
||||
touch /Users/accusys/momentry/log/redis.error.log
|
||||
|
||||
# 設定權限
|
||||
chown -R accusys:staff /Users/accusys/momentry/var/redis
|
||||
chown -R accusys:staff /Users/accusys/momentry/etc/redis
|
||||
chown -R accusys:staff /Users/accusys/momentry/log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 3: 使用 plist 開機自動啟動
|
||||
|
||||
```bash
|
||||
# 複製 plist 到 LaunchDaemons 目錄
|
||||
sudo cp /Users/accusys/momentry_core_0.1/momentry_runtime/plist/com.momentry.redis.plist /Library/LaunchDaemons/
|
||||
|
||||
# 載入並啟動
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.redis.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 卸載步驟
|
||||
|
||||
### 重要: 路徑說明
|
||||
|
||||
| 路徑 | 類型 | 說明 |
|
||||
|------|------|------|
|
||||
| `/Users/accusys/momentry/var/redis/` | 數據 | **不要刪除** - 數據目錄 |
|
||||
| `/Users/accusys/momentry/etc/redis/` | 配置 | **不要刪除** - 配置目錄 |
|
||||
| `/Users/accusys/momentry/log/` | 日誌 | **不要刪除** - 日誌目錄 |
|
||||
| `/opt/homebrew/opt/redis/` | 安裝 | **刪除** - Redis 安裝目錄 |
|
||||
|
||||
### Step 1: 停止 Redis
|
||||
|
||||
```bash
|
||||
# 找到 Redis 進程
|
||||
ps aux | grep redis | grep -v grep
|
||||
|
||||
# 停止 Redis
|
||||
redis-cli -a accusys SHUTDOWN
|
||||
# 或
|
||||
pkill redis-server
|
||||
|
||||
# 確認停止
|
||||
ps aux | grep redis | grep -v grep || echo "Redis 已停止"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 2: 卸載 Redis
|
||||
|
||||
```bash
|
||||
# 卸載 Redis
|
||||
brew uninstall redis
|
||||
|
||||
# 移除 plist
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.redis.plist
|
||||
sudo rm /Library/LaunchDaemons/com.momentry.redis.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 3: 刪除專屬檔案
|
||||
|
||||
```bash
|
||||
# 刪除數據目錄 (可選)
|
||||
rm -rf /Users/accusys/momentry/var/redis
|
||||
|
||||
# 刪除配置目錄 (可選)
|
||||
rm -rf /Users/accusys/momentry/etc/redis
|
||||
|
||||
# 刪除日誌 (可選)
|
||||
rm -f /Users/accusys/momentry/log/redis.log
|
||||
rm -f /Users/accusys/momentry/log/redis.error.log
|
||||
```
|
||||
|
||||
**注意: 不要刪除以下共用目錄**:
|
||||
```bash
|
||||
# 這些是共用的,不要刪除!
|
||||
# /Users/accusys/momentry/var
|
||||
# /Users/accusys/momentry/etc
|
||||
# /Users/accusys/momentry/log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 4: 卸載後檢查清單
|
||||
|
||||
```bash
|
||||
echo "=== Redis 卸載後檢查 ==="
|
||||
|
||||
# 1. 檢查 Redis 進程
|
||||
echo "1. Redis 進程:"
|
||||
ps aux | grep redis | grep -v grep && echo " ✗ 仍在運行" || echo " ✓ 已停止"
|
||||
|
||||
# 2. Port 6379
|
||||
echo "2. Port 6379:"
|
||||
lsof -i :6379 > /dev/null 2>&1 && echo " ✗ 仍被佔用" || echo " ✓ 已釋放"
|
||||
|
||||
# 3. redis-server 命令
|
||||
echo "3. redis-server 命令:"
|
||||
which redis-server > /dev/null 2>&1 && echo " ✗ 仍存在" || echo " ✓ 已移除"
|
||||
|
||||
# 4. brew 安裝
|
||||
echo "4. brew 安裝:"
|
||||
brew list redis > /dev/null 2>&1 && echo " ✗ 仍存在" || echo " ✓ 已移除"
|
||||
|
||||
# 5. launchctl 服務
|
||||
echo "5. launchctl 服務:"
|
||||
sudo launchctl list | grep redis > /dev/null 2>&1 && echo " ✗ 仍存在" || echo " ✓ 已移除"
|
||||
|
||||
# 6. 數據目錄 (可選刪除)
|
||||
echo "6. 數據目錄:"
|
||||
[ -d "/Users/accusys/momentry/var/redis" ] && echo " ✓ 保留" || echo " ✗ 已刪除"
|
||||
|
||||
# 7. 日誌目錄 (可選刪除)
|
||||
echo "7. 日誌目錄:"
|
||||
[ -d "/Users/accusys/momentry/log" ] && echo " ✓ 保留" || echo " ✗ 已刪除"
|
||||
```
|
||||
|
||||
**預期結果**:
|
||||
```
|
||||
=== Redis 卸載後檢查 ===
|
||||
1. Redis 進程:
|
||||
✓ 已停止
|
||||
2. Port 6379:
|
||||
✓ 已釋放
|
||||
3. redis-server 命令:
|
||||
✓ 已移除
|
||||
4. brew 安裝:
|
||||
✓ 已移除
|
||||
5. launchctl 服務:
|
||||
✓ 已移除
|
||||
6. 數據目錄:
|
||||
✓ 保留 (或 ✗ 已刪除)
|
||||
7. 日誌目錄:
|
||||
✓ 保留 (或 ✗ 已刪除)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 監控配置
|
||||
|
||||
### 添加到監控配置
|
||||
|
||||
在 `monitor/config/monitor_config.yaml` 中添加:
|
||||
|
||||
```yaml
|
||||
service:
|
||||
services:
|
||||
- name: "redis"
|
||||
type: "tcp"
|
||||
port: 6379
|
||||
host: "localhost"
|
||||
timeout: 5
|
||||
enabled: true
|
||||
```
|
||||
|
||||
### 添加健康檢查函數
|
||||
|
||||
在 `monitor/service/health_check.sh` 中添加:
|
||||
|
||||
```bash
|
||||
check_redis() {
|
||||
local start=$(date +%s%N)
|
||||
if redis-cli -a accusys ping > /dev/null 2>&1; then
|
||||
local end=$(date +%s%N)
|
||||
local ms=$(( (end - start) / 1000000 ))
|
||||
echo -e "${GREEN}✓${NC} Redis (6379) - ${ms}ms"
|
||||
record_service "redis" "up" "$ms" ""
|
||||
return 0
|
||||
else
|
||||
echo -e "${RED}✗${NC} Redis (6379) - Down"
|
||||
record_service "redis" "down" "0" "Connection failed"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
```
|
||||
|
||||
```bash
|
||||
# 1. 檢查進程
|
||||
ps aux | grep redis | grep -v grep
|
||||
|
||||
# 2. 檢查 Port
|
||||
lsof -i :6379
|
||||
|
||||
# 3. 測試連線 (無認證)
|
||||
redis-cli -a accusys PING
|
||||
|
||||
# 4. 測試連線 (有認證)
|
||||
redis-cli -a accusys -e "PING"
|
||||
|
||||
# 5. 查看所有 keys
|
||||
redis-cli -a accusys KEYS '*'
|
||||
|
||||
# 6. 查看 info
|
||||
redis-cli -a accusys INFO
|
||||
|
||||
# 7. 查看日誌
|
||||
tail -20 /Users/accusys/momentry/log/redis.log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 連線資訊
|
||||
|
||||
| 項目 | 值 |
|
||||
|------|-----|
|
||||
| Host | localhost |
|
||||
| Port | 6379 |
|
||||
| Password | accusys |
|
||||
|
||||
---
|
||||
|
||||
## 環境變數
|
||||
|
||||
在 `.env` 中:
|
||||
|
||||
```env
|
||||
REDIS_URL=redis://:accusys@localhost:6379
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 遠端訪問
|
||||
|
||||
- Redis 綁定到 `0.0.0.0` (所有網路介面)
|
||||
- 本地網路其他機器可透過 IP 訪問
|
||||
- 密碼認證: `accusys`
|
||||
|
||||
---
|
||||
|
||||
## 故障排除
|
||||
|
||||
### Redis 無法啟動
|
||||
|
||||
```bash
|
||||
# 檢查日誌
|
||||
tail -f /Users/accusys/momentry/log/redis.log
|
||||
|
||||
# 檢查目錄權限
|
||||
ls -la /Users/accusys/momentry/var/redis/
|
||||
|
||||
# 重新設定權限
|
||||
chown -R $(whoami):staff /Users/accusys/momentry/var/redis
|
||||
```
|
||||
|
||||
### Port 被佔用
|
||||
|
||||
```bash
|
||||
# 檢查哪個程序佔用 port 6379
|
||||
lsof -i :6379
|
||||
|
||||
# 終止佔用程序
|
||||
kill <PID>
|
||||
```
|
||||
|
||||
### 需要重新載入 plist
|
||||
|
||||
```bash
|
||||
# 卸載舊服務 (如果存在)
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.redis.plist 2>/dev/null
|
||||
|
||||
# 載入新服務
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.redis.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 檔案位置
|
||||
|
||||
| 類型 | 路徑 | 說明 |
|
||||
|------|------|------|
|
||||
| 安裝 | `/opt/homebrew/opt/redis/` | Redis 安裝目錄 |
|
||||
| 執行檔 | `/opt/homebrew/opt/redis/bin/redis-server` | Redis 執行檔 |
|
||||
| 數據目錄 | `/Users/accusys/momentry/var/redis/` | 數據儲存 |
|
||||
| 配置目錄 | `/Users/accusys/momentry/etc/redis/` | 配置儲存 |
|
||||
| 日誌 | `/Users/accusys/momentry/log/redis.log` | 執行日誌 |
|
||||
| 錯誤日誌 | `/Users/accusys/momentry/log/redis.error.log` | 錯誤日誌 |
|
||||
| plist | `/Library/LaunchDaemons/com.momentry.redis.plist` | 開機啟動 |
|
||||
| 備份 | `/Users/accusys/momentry/var/redis_backup_latest.rdb` | 數據備份 |
|
||||
|
||||
---
|
||||
|
||||
## 備份與恢復
|
||||
|
||||
### 備份
|
||||
|
||||
```bash
|
||||
# 觸發保存並備份
|
||||
redis-cli -a accusys SAVE
|
||||
cp /opt/homebrew/var/db/redis/dump.rdb /Users/accusys/momentry/var/redis_backup_latest.rdb
|
||||
```
|
||||
|
||||
### 恢復
|
||||
|
||||
```bash
|
||||
# 停止 Redis
|
||||
redis-cli -a accusys SHUTDOWN
|
||||
|
||||
# 複製備份文件覆蓋
|
||||
cp /Users/accusys/momentry/var/redis_backup_latest.rdb /Users/accusys/momentry/var/redis/dump.rdb
|
||||
|
||||
# 啟動 Redis
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.redis.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 版本資訊
|
||||
|
||||
- 版本: 8.4.0
|
||||
- Port: 6379
|
||||
- Password: accusys
|
||||
- 數據目錄: /Users/accusys/momentry/var/redis/
|
||||
- 日誌目錄: /Users/accusys/momentry/log/
|
||||
284
docs/INSTALL_RUSTDESK.md
Normal file
284
docs/INSTALL_RUSTDESK.md
Normal file
@@ -0,0 +1,284 @@
|
||||
# RustDesk 安裝指南 (本地部署)
|
||||
|
||||
## 概述
|
||||
|
||||
本文檔說明如何在 macOS 上安裝 RustDesk 遠端桌面服務,配置為本地部署。
|
||||
|
||||
---
|
||||
|
||||
## 當前狀態
|
||||
|
||||
| 項目 | 狀態 |
|
||||
|------|------|
|
||||
| RustDesk | ✅ 已安裝 |
|
||||
| 數據目錄 | /Users/accusys/momentry/var/rustdesk/ |
|
||||
| 日誌目錄 | /Users/accusys/momentry/log/ |
|
||||
| HBBS Plist | /Library/LaunchDaemons/com.momentry.rustdesk.hbbs.plist |
|
||||
| HBBR Plist | /Library/LaunchDaemons/com.momentry.rustdesk.hbbr.plist |
|
||||
|
||||
---
|
||||
|
||||
## 服務端口
|
||||
|
||||
| 服務 | Port | 協議 |
|
||||
|------|------|------|
|
||||
| hbbs (TCP) | 21115 | 主端口 |
|
||||
| hbbs (TCP/UDP) | 21116 | NAT 測試 |
|
||||
| hbbs (WebSocket) | 21118 | WebSocket |
|
||||
| hbbr (TCP) | 21117 | 中繼端口 |
|
||||
| hbbr (TCP) | 21119 | 中繼 extra |
|
||||
|
||||
---
|
||||
|
||||
## 安裝步驟
|
||||
|
||||
### Step 1: 安裝 RustDesk (使用 brew)
|
||||
|
||||
```bash
|
||||
# 安裝 RustDesk
|
||||
brew install rustdesk
|
||||
```
|
||||
|
||||
**驗證**:
|
||||
```bash
|
||||
hbbs --version
|
||||
hbbr --version
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 2: 建立目錄
|
||||
|
||||
```bash
|
||||
# 建立數據目錄
|
||||
mkdir -p /Users/accusys/momentry/var/rustdesk
|
||||
|
||||
# 建立配置目錄
|
||||
mkdir -p /Users/accusys/momentry/etc/rustdesk
|
||||
|
||||
# 建立日誌目錄
|
||||
mkdir -p /Users/accusys/momentry/log
|
||||
|
||||
# 建立日誌文件
|
||||
touch /Users/accusys/momentry/log/rustdesk.hbbs.log
|
||||
touch /Users/accusys/momentry/log/rustdesk.hbbs.error.log
|
||||
touch /Users/accusys/momentry/log/rustdesk.hbbr.log
|
||||
touch /Users/accusys/momentry/log/rustdesk.hbbr.error.log
|
||||
|
||||
# 設定權限
|
||||
chown -R accusys:staff /Users/accusys/momentry/var/rustdesk
|
||||
chown -R accusys:staff /Users/accusys/momentry/etc/rustdesk
|
||||
chown -R accusys:staff /Users/accusys/momentry/log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 3: 使用 plist 開機自動啟動
|
||||
|
||||
```bash
|
||||
# 複製 plist 到 LaunchDaemons 目錄
|
||||
sudo cp /Users/accusys/momentry_core_0.1/momentry_runtime/plist/com.momentry.rustdesk.hbbs.plist /Library/LaunchDaemons/
|
||||
sudo cp /Users/accusys/momentry_core_0.1/momentry_runtime/plist/com.momentry.rustdesk.hbbr.plist /Library/LaunchDaemons/
|
||||
|
||||
# 移除舊 plist (如果存在)
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.rustdesk.hbbs.plist 2>/dev/null
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.rustdesk.hbbr.plist 2>/dev/null
|
||||
sudo rm /Library/LaunchDaemons/com.rustdesk.hbbs.plist 2>/dev/null
|
||||
sudo rm /Library/LaunchDaemons/com.rustdesk.hbbr.plist 2>/dev/null
|
||||
|
||||
# 載入並啟動
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.rustdesk.hbbs.plist
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.rustdesk.hbbr.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 監控配置
|
||||
|
||||
### 添加到監控配置
|
||||
|
||||
在 `monitor/config/monitor_config.yaml` 中添加:
|
||||
|
||||
```yaml
|
||||
service:
|
||||
services:
|
||||
- name: "rustdesk-hbbs"
|
||||
type: "tcp"
|
||||
port: 21115
|
||||
host: "localhost"
|
||||
timeout: 5
|
||||
enabled: true
|
||||
- name: "rustdesk-hbbr"
|
||||
type: "tcp"
|
||||
port: 21117
|
||||
host: "localhost"
|
||||
timeout: 5
|
||||
enabled: true
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 卸載步驟
|
||||
|
||||
### 重要: 路徑說明
|
||||
|
||||
| 路徑 | 類型 | 說明 |
|
||||
|------|------|------|
|
||||
| `/Users/accusys/momentry/var/rustdesk/` | 數據 | **不要刪除** - RustDesk 數據 |
|
||||
| `/Users/accusys/momentry/log/` | 日誌 | **不要刪除** - 日誌目錄 |
|
||||
| `/opt/homebrew/bin/hbbr` | 安裝 | **刪除** - RustDesk 安裝 |
|
||||
| `/opt/homebrew/bin/hbbs` | 安裝 | **刪除** - RustDesk 安裝 |
|
||||
|
||||
### Step 1: 停止 RustDesk
|
||||
|
||||
```bash
|
||||
# 停止 RustDesk 服務
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.rustdesk.hbbs.plist
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.rustdesk.hbbr.plist
|
||||
|
||||
# 確認停止
|
||||
ps aux | grep rustdesk | grep -v grep || echo "RustDesk 已停止"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 2: 卸載 RustDesk
|
||||
|
||||
```bash
|
||||
# 卸載 RustDesk
|
||||
brew uninstall rustdesk
|
||||
|
||||
# 移除 plist
|
||||
sudo rm /Library/LaunchDaemons/com.momentry.rustdesk.hbbs.plist
|
||||
sudo rm /Library/LaunchDaemons/com.momentry.rustdesk.hbbr.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 3: 刪除專屬檔案
|
||||
|
||||
```bash
|
||||
# 刪除數據目錄 (可選)
|
||||
rm -rf /Users/accusys/momentry/var/rustdesk
|
||||
|
||||
# 刪除日誌 (可選)
|
||||
rm -f /Users/accusys/momentry/log/rustdesk-*.log
|
||||
```
|
||||
|
||||
**注意: 不要刪除以下共用目錄**:
|
||||
```bash
|
||||
# 這些是共用的,不要刪除!
|
||||
# /Users/accusys/momentry/var
|
||||
# /Users/accusys/momentry/log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 手動檢查命令
|
||||
|
||||
```bash
|
||||
# 1. 檢查進程
|
||||
ps aux | grep rustdesk | grep -v grep
|
||||
|
||||
# 2. 檢查 Port
|
||||
lsof -i :21115
|
||||
lsof -i :21116
|
||||
lsof -i :21117
|
||||
lsof -i :21118
|
||||
lsof -i :21119
|
||||
|
||||
# 3. 測試連線
|
||||
nc -zv localhost 21115
|
||||
nc -zv localhost 21116
|
||||
|
||||
# 4. 查看日誌
|
||||
tail -20 /Users/accusys/momentry/log/rustdesk-hbbs.log
|
||||
tail -20 /Users/accusys/momentry/log/rustdesk-hbbr.log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 連線資訊
|
||||
|
||||
| 項目 | 值 |
|
||||
|------|-----|
|
||||
| Server ID | 59.124.167.225 |
|
||||
| NAT Test Port | 21116 |
|
||||
| Relay Port | 21117, 21119 |
|
||||
|
||||
---
|
||||
|
||||
## 故障排除
|
||||
|
||||
### RustDesk 無法啟動
|
||||
|
||||
```bash
|
||||
# 檢查日誌
|
||||
tail -f /Users/accusys/momentry/log/rustdesk-hbbs.log
|
||||
tail -f /Users/accusys/momentry/log/rustdesk-hbbr.log
|
||||
|
||||
# 檢查數據目錄權限
|
||||
ls -la /Users/accusys/momentry/var/rustdesk/
|
||||
|
||||
# 重新設定權限
|
||||
chown -R $(whoami):staff /Users/accusys/momentry/var/rustdesk
|
||||
```
|
||||
|
||||
### Port 被佔用
|
||||
|
||||
```bash
|
||||
# 檢查哪個程序佔用 port
|
||||
lsof -i :21116
|
||||
|
||||
# 終止佔用程序
|
||||
kill <PID>
|
||||
```
|
||||
|
||||
### 需要重新載入 plist
|
||||
|
||||
```bash
|
||||
# 卸載舊服務
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.rustdesk.hbbs.plist
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.rustdesk.hbbr.plist
|
||||
|
||||
# 載入新服務
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.rustdesk.hbbs.plist
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.rustdesk.hbbr.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 檔案位置
|
||||
|
||||
| 類型 | 路徑 | 說明 |
|
||||
|------|------|------|
|
||||
| 安裝 | `/opt/homebrew/bin/hbbs` | RustDesk Server 執行檔 |
|
||||
| 安裝 | `/opt/homebrew/bin/hbbr` | RustDesk Relay 執行檔 |
|
||||
| 數據目錄 | `/Users/accusys/momentry/var/rustdesk/` | 數據儲存 |
|
||||
| HBBS 日誌 | `/Users/accusys/momentry/log/rustdesk-hbbs.log` | 服務日誌 |
|
||||
| HBBR 日誌 | `/Users/accusys/momentry/log/rustdesk-hbbr.log` | 中繼日誌 |
|
||||
| HBBS Plist | `/Library/LaunchDaemons/com.momentry.rustdesk.hbbs.plist` | 開機啟動 |
|
||||
| HBBR Plist | `/Library/LaunchDaemons/com.momentry.rustdesk.hbbr.plist` | 開機啟動 |
|
||||
|
||||
---
|
||||
|
||||
## 版本資訊
|
||||
|
||||
- 安裝方式: Homebrew (Cask)
|
||||
- Client 版本: 1.4.6
|
||||
- Server 版本: 1.1.15 (hbbs/hbbr binaries from homebrew)
|
||||
- 數據目錄: /Users/accusys/momentry/var/rustdesk/
|
||||
- 日誌目錄: /Users/accusys/momentry/log/
|
||||
|
||||
---
|
||||
|
||||
## 注意事項
|
||||
|
||||
### Server 版本
|
||||
|
||||
Homebrew 的 RustDesk Cask 只提供客戶端應用程序。服務器二進制文件 (hbbs, hbbr) 需要從其他來源安裝或自行編譯。當前使用的版本較舊 (1.1.15)。
|
||||
|
||||
如需更新服務器版本,可以考慮:
|
||||
1. 從源代碼編譯最新版本
|
||||
2. 使用 RustDesk 官方提供的 Docker 鏡像
|
||||
3. 等待 Homebrew 添加服務器公式
|
||||
360
docs/INSTALL_SFTPGO.md
Normal file
360
docs/INSTALL_SFTPGO.md
Normal file
@@ -0,0 +1,360 @@
|
||||
# SFTPGo 安裝指南 (本地部署)
|
||||
|
||||
## 概述
|
||||
|
||||
本文檔說明如何在 macOS 上安裝 SFTPGo,配置為本地部署,用於 SFTP/FTP/WebDAV 檔案傳輸服務。
|
||||
|
||||
---
|
||||
|
||||
## 當前狀態
|
||||
|
||||
| 項目 | 狀態 |
|
||||
|------|------|
|
||||
| SFTPGo | ✅ 已安裝 v2.7.0 |
|
||||
| Port | 8080 (HTTP), 2022 (SFTP) |
|
||||
| 配置目錄 | /Users/accusys/momentry/etc/sftpgo/ |
|
||||
| 日誌目錄 | /Users/accusys/momentry/log/ |
|
||||
| Plist | /Library/LaunchDaemons/com.momentry.sftpgo.plist |
|
||||
|
||||
---
|
||||
|
||||
## 安裝步驟
|
||||
|
||||
### Step 1: 安裝 SFTPGo (使用 brew)
|
||||
|
||||
```bash
|
||||
# 安裝 SFTPGo
|
||||
brew install sftpgo
|
||||
```
|
||||
|
||||
**驗證**:
|
||||
```bash
|
||||
sftpgo --version
|
||||
# SFTPGo 2.7.0
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 2: 建立目錄
|
||||
|
||||
```bash
|
||||
# 建立配置目錄
|
||||
mkdir -p /Users/accusys/momentry/etc/sftpgo
|
||||
|
||||
# 建立日誌目錄
|
||||
mkdir -p /Users/accusys/momentry/log
|
||||
|
||||
# 建立工作目錄
|
||||
mkdir -p /Users/accusys/workspace/sftpgo
|
||||
|
||||
# 建立日誌文件
|
||||
touch /Users/accusys/momentry/log/sftpgo.log
|
||||
touch /Users/accusys/momentry/log/sftpgo.error.log
|
||||
|
||||
# 設定權限
|
||||
chown -R accusys:staff /Users/accusys/momentry/etc/sftpgo
|
||||
chown -R accusys:staff /Users/accusys/momentry/log
|
||||
chown -R accusys:staff /Users/accusys/workspace/sftpgo
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 3: 建立設定檔
|
||||
|
||||
建立 `/Users/accusys/momentry/etc/sftpgo/sftpgo.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"common": {
|
||||
"idle_timeout": 15,
|
||||
"upload_mode": 0,
|
||||
"max_per_host_connections": 20
|
||||
},
|
||||
"users": [
|
||||
{
|
||||
"username": "accusys",
|
||||
"password": "",
|
||||
"public_keys": [],
|
||||
"home_dir": "/Users/accusys/workspace/sftpgo",
|
||||
"uid": 501,
|
||||
"gid": 20,
|
||||
"permissions": {
|
||||
"/": ["*"]
|
||||
}
|
||||
}
|
||||
],
|
||||
"httpd": {
|
||||
"bind_port": 8080,
|
||||
"bind_address": "0.0.0.0"
|
||||
},
|
||||
"ftpd": {
|
||||
"bind_port": 21,
|
||||
"bind_address": "0.0.0.0"
|
||||
},
|
||||
"sftpd": {
|
||||
"bind_port": 2022,
|
||||
"bind_address": "0.0.0.0"
|
||||
},
|
||||
"webdavd": {
|
||||
"bind_port": 0,
|
||||
"bind_address": ""
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 4: 使用 plist 開機自動啟動
|
||||
|
||||
```bash
|
||||
# 複製 plist 到 LaunchDaemons 目錄
|
||||
sudo cp /Users/accusys/momentry_core_0.1/momentry_runtime/plist/com.momentry.sftpgo.plist /Library/LaunchDaemons/
|
||||
|
||||
# 載入並啟動
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.sftpgo.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 監控配置
|
||||
|
||||
### 添加到監控配置
|
||||
|
||||
在 `monitor/config/monitor_config.yaml` 中添加:
|
||||
|
||||
```yaml
|
||||
service:
|
||||
services:
|
||||
- name: "sftpgo"
|
||||
type: "http"
|
||||
port: 8080
|
||||
host: "localhost"
|
||||
check_url: "http://localhost:8080/api/v2/info"
|
||||
timeout: 5
|
||||
enabled: true
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 卸載步驟
|
||||
|
||||
### 重要: 路徑說明
|
||||
|
||||
| 路徑 | 類型 | 說明 |
|
||||
|------|------|------|
|
||||
| `/Users/accusys/momentry/etc/sftpgo/` | 配置 | **不要刪除** - SFTPGo 配置 |
|
||||
| `/Users/accusys/momentry/log/` | 日誌 | **不要刪除** - 日誌目錄 |
|
||||
| `/Users/accusys/workspace/sftpgo/` | 數據 | **不要刪除** - 上傳檔案目錄 |
|
||||
| `/opt/homebrew/opt/sftpgo/` | 安裝 | **刪除** - SFTPGo 安裝目錄 |
|
||||
|
||||
### Step 1: 停止 SFTPGo
|
||||
|
||||
```bash
|
||||
# 找到 SFTPGo 進程
|
||||
ps aux | grep sftpgo | grep -v grep
|
||||
|
||||
# 停止 SFTPGo
|
||||
pkill sftpgo
|
||||
|
||||
# 確認停止
|
||||
ps aux | grep sftpgo | grep -v grep || echo "SFTPGo 已停止"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 2: 卸載 SFTPGo
|
||||
|
||||
```bash
|
||||
# 卸載 SFTPGo
|
||||
brew uninstall sftpgo
|
||||
|
||||
# 移除 plist
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.sftpgo.plist
|
||||
sudo rm /Library/LaunchDaemons/com.momentry.sftpgo.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 3: 刪除專屬檔案
|
||||
|
||||
```bash
|
||||
# 刪除配置目錄 (可選)
|
||||
rm -rf /Users/accusys/momentry/etc/sftpgo
|
||||
|
||||
# 刪除日誌 (可選)
|
||||
rm -f /Users/accusys/momentry/log/sftpgo.log
|
||||
rm -f /Users/accusys/momentry/log/sftpgo.error.log
|
||||
```
|
||||
|
||||
**注意: 不要刪除以下目錄**:
|
||||
```bash
|
||||
# 這些是重要的,不要刪除!
|
||||
# /Users/accusys/momentry/etc/sftpgo
|
||||
# /Users/accusys/momentry/log
|
||||
# /Users/accusys/workspace/sftpgo
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 4: 卸載後檢查清單
|
||||
|
||||
```bash
|
||||
echo "=== SFTPGo 卸載後檢查 ==="
|
||||
|
||||
# 1. 檢查 SFTPGo 進程
|
||||
echo "1. SFTPGo 進程:"
|
||||
ps aux | grep sftpgo | grep -v grep && echo " ✗ 仍在運行" || echo " ✓ 已停止"
|
||||
|
||||
# 2. Port 8080/2022
|
||||
echo "2. Port 8080/2022:"
|
||||
(lsof -i :8080 > /dev/null 2>&1 || lsof -i :2022 > /dev/null 2>&1) && echo " ✗ 仍被佔用" || echo " ✓ 已釋放"
|
||||
|
||||
# 3. sftpgo 命令
|
||||
echo "3. sftpgo 命令:"
|
||||
which sftpgo > /dev/null 2>&1 && echo " ✗ 仍存在" || echo " ✓ 已移除"
|
||||
|
||||
# 4. brew 安裝
|
||||
echo "4. brew 安裝:"
|
||||
brew list sftpgo > /dev/null 2>&1 && echo " ✗ 仍存在" || echo " ✓ 已移除"
|
||||
|
||||
# 5. launchctl 服務
|
||||
echo "5. launchctl 服務:"
|
||||
sudo launchctl list | grep sftpgo > /dev/null 2>&1 && echo " ✗ 仍存在" || echo " ✓ 已移除"
|
||||
|
||||
# 6. 配置目錄 (可選刪除)
|
||||
echo "6. 配置目錄:"
|
||||
[ -d "/Users/accusys/momentry/etc/sftpgo" ] && echo " ✓ 保留" || echo " ✗ 已刪除"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 手動檢查命令
|
||||
|
||||
```bash
|
||||
# 1. 檢查進程
|
||||
ps aux | grep sftpgo | grep -v grep
|
||||
|
||||
# 2. 檢查 Port
|
||||
lsof -i :8080
|
||||
lsof -i :2022
|
||||
|
||||
# 3. 測試連線
|
||||
curl http://localhost:8080/
|
||||
|
||||
# 4. 查看版本
|
||||
sftpgo --version
|
||||
|
||||
# 5. 驗證配置
|
||||
sftpgo validate --config /Users/accusys/momentry/etc/sftpgo/sftpgo.json
|
||||
|
||||
# 6. 查看日誌
|
||||
tail -20 /Users/accusys/momentry/log/sftpgo.log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 連線資訊
|
||||
|
||||
| 項目 | 值 |
|
||||
|------|-----|
|
||||
| HTTP/WebDAV | http://localhost:8080 |
|
||||
| SFTP | localhost:2022 |
|
||||
| FTP | localhost:21 |
|
||||
| Admin API | http://localhost:8080/api/v2/info |
|
||||
|
||||
---
|
||||
|
||||
## 環境變數
|
||||
|
||||
在 `.env` 中:
|
||||
|
||||
```env
|
||||
SFTPGO_CONFIG=/Users/accusys/momentry/etc/sftpgo/sftpgo.json
|
||||
SFTPGO_DATA_DIR=/Users/accusys/workspace/sftpgo
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 故障排除
|
||||
|
||||
### SFTPGo 無法啟動
|
||||
|
||||
```bash
|
||||
# 檢查日誌
|
||||
tail -f /Users/accusys/momentry/log/sftpgo.log
|
||||
|
||||
# 驗證配置語法
|
||||
sftpgo validate --config /Users/accusys/momentry/etc/sftpgo/sftpgo.json
|
||||
|
||||
# 檢查目錄權限
|
||||
ls -la /Users/accusys/momentry/etc/sftpgo/
|
||||
|
||||
# 重新設定權限
|
||||
chown -R $(whoami):staff /Users/accusys/momentry/etc/sftpgo
|
||||
```
|
||||
|
||||
### Port 被佔用
|
||||
|
||||
```bash
|
||||
# 檢查哪個程序佔用 port
|
||||
lsof -i :8080
|
||||
lsof -i :2022
|
||||
|
||||
# 終止佔用程序
|
||||
kill <PID>
|
||||
```
|
||||
|
||||
### 需要重新載入 plist
|
||||
|
||||
```bash
|
||||
# 卸載舊服務 (如果存在)
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.sftpgo.plist 2>/dev/null
|
||||
|
||||
# 載入新服務
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.sftpgo.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 檔案位置
|
||||
|
||||
| 類型 | 路徑 | 說明 |
|
||||
|------|------|------|
|
||||
| 安裝 | `/opt/homebrew/opt/sftpgo/` | SFTPGo 安裝目錄 |
|
||||
| 執行檔 | `/opt/homebrew/opt/sftpgo/bin/sftpgo` | SFTPGo 執行檔 |
|
||||
| 配置 | `/Users/accusys/momentry/etc/sftpgo/sftpgo.json` | 設定檔 |
|
||||
| 日誌 | `/Users/accusys/momentry/log/sftpgo.log` | 執行日誌 |
|
||||
| 錯誤日誌 | `/Users/accusys/momentry/log/sftpgo.error.log` | 錯誤日誌 |
|
||||
| 工作目錄 | `/Users/accusys/workspace/sftpgo/` | 上傳檔案目錄 |
|
||||
| plist | `/Library/LaunchDaemons/com.momentry.sftpgo.plist` | 開機啟動 |
|
||||
| 備份 | `/Users/accusys/momentry/var/sftpgo_backup/sftpgo.json` | 配置備份 |
|
||||
|
||||
---
|
||||
|
||||
## 常用指令
|
||||
|
||||
```bash
|
||||
# 驗證配置
|
||||
sftpgo validate --config /Users/accusys/momentry/etc/sftpgo/sftpgo.json
|
||||
|
||||
# 查看版本
|
||||
sftpgo --version
|
||||
|
||||
# 查看可用命令
|
||||
sftpgo --help
|
||||
|
||||
# 重載配置 (熱重載)
|
||||
sftpgo reload --config /Users/accusys/momentry/etc/sftpgo/sftpgo.json
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 版本資訊
|
||||
|
||||
- 版本: 2.7.0
|
||||
- HTTP Port: 8080
|
||||
- SFTP Port: 2022
|
||||
- FTP Port: 21
|
||||
- 配置: /Users/accusys/momentry/etc/sftpgo/sftpgo.json
|
||||
- 工作目錄: /Users/accusys/workspace/sftpgo
|
||||
- 日誌目錄: /Users/accusys/momentry/log/
|
||||
423
docs/NODEJS.md
Normal file
423
docs/NODEJS.md
Normal file
@@ -0,0 +1,423 @@
|
||||
# Node.js 開發指南
|
||||
|
||||
## 概述
|
||||
|
||||
本文檔說明 Momentry 專案中 Node.js 環境的配置、管理與監控。
|
||||
|
||||
---
|
||||
|
||||
## 當前狀態
|
||||
|
||||
| 項目 | 狀態 |
|
||||
|------|------|
|
||||
| 系統預設 Node.js | v25.8.1 |
|
||||
| 鎖定 Node.js (n8n) | v22.22.1 |
|
||||
| n8n 版本 | v2.3.5 |
|
||||
| npm 路徑 (預設) | /opt/homebrew/bin/npm |
|
||||
| node 路徑 (預設) | /opt/homebrew/bin/node |
|
||||
| node@22 路徑 | /opt/homebrew/opt/node@22/bin/node |
|
||||
|
||||
---
|
||||
|
||||
## 版本策略
|
||||
|
||||
### 為什麼需要版本鎖定?
|
||||
|
||||
n8n 要求 Node.js 版本為 22.x LTS。系統預設的 Node.js 25.x 會導致:
|
||||
- n8n 啟動警告
|
||||
- Task-runner 執行錯誤
|
||||
- 相容性問題
|
||||
|
||||
### 版本對照表
|
||||
|
||||
| 用途 | Node.js 版本 | 路徑 |
|
||||
|------|-------------|------|
|
||||
| 系統預設 | 25.8.1 | /opt/homebrew/bin/node |
|
||||
| n8n 專用 | 22.22.1 | /opt/homebrew/opt/node@22/bin/node |
|
||||
| 開發測試 | 22.x | /opt/homebrew/opt/node@22/bin/node |
|
||||
|
||||
---
|
||||
|
||||
## 安裝步驟
|
||||
|
||||
### 安裝特定版本 Node.js
|
||||
|
||||
```bash
|
||||
# 安裝 Node.js 22.x (LTS)
|
||||
brew install node@22
|
||||
|
||||
# 驗證安裝
|
||||
/opt/homebrew/opt/node@22/bin/node --version
|
||||
# v22.22.1
|
||||
```
|
||||
|
||||
### 安裝全局工具
|
||||
|
||||
```bash
|
||||
# 使用 node@22 安裝全局工具
|
||||
/opt/homebrew/opt/node@22/bin/npm install -g <package-name>
|
||||
|
||||
# 例如安裝 n8n
|
||||
/opt/homebrew/opt/node@22/bin/npm install -g n8n
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 使用方式
|
||||
|
||||
### 方式 1:直接使用完整路徑
|
||||
|
||||
```bash
|
||||
# 使用 node@22
|
||||
/opt/homebrew/opt/node@22/bin/node script.js
|
||||
|
||||
# 使用 npm@22
|
||||
/opt/homebrew/opt/node@22/bin/npm install
|
||||
```
|
||||
|
||||
### 方式 2:修改 PATH 環境變數
|
||||
|
||||
在 shell 配置檔案 (~/.zshrc) 中加入:
|
||||
|
||||
```bash
|
||||
# 優先使用 node@22
|
||||
export PATH="/opt/homebrew/opt/node@22/bin:$PATH"
|
||||
|
||||
# 重新載入
|
||||
source ~/.zshrc
|
||||
|
||||
# 驗證
|
||||
node --version
|
||||
# v22.22.1
|
||||
```
|
||||
|
||||
### 方式 3:使用 nvm (推薦)
|
||||
|
||||
```bash
|
||||
# 安裝 nvm
|
||||
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
|
||||
|
||||
# 安裝 Node.js 22.x
|
||||
nvm install 22
|
||||
nvm use 22
|
||||
|
||||
# 設定預設版本
|
||||
nvm alias default 22
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## n8n 配置
|
||||
|
||||
### 環境變數設定
|
||||
|
||||
在 plist 或啟動腳本中設定:
|
||||
|
||||
```xml
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>/opt/homebrew/opt/node@22/bin/node</string>
|
||||
<string>/opt/homebrew/lib/node_modules/n8n/bin/n8n</string>
|
||||
<string>start</string>
|
||||
</array>
|
||||
|
||||
<key>EnvironmentVariables</key>
|
||||
<dict>
|
||||
<key>PATH</key>
|
||||
<string>/opt/homebrew/opt/node@22/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
|
||||
</dict>
|
||||
```
|
||||
|
||||
### Task Runner 配置
|
||||
|
||||
n8n Task Runner 用於執行 Code node 中的 JavaScript 代碼。
|
||||
|
||||
確保 PATH 中 node@22 在前面,這樣 task-runner 子進程會使用正確版本。
|
||||
|
||||
---
|
||||
|
||||
## 監控配置
|
||||
|
||||
### 健康檢查
|
||||
|
||||
`monitor/service/health_check.sh` 已包含 Node.js 版本檢查:
|
||||
|
||||
```bash
|
||||
# 檢查 n8n 進程是否使用正確的 Node.js 版本
|
||||
check_node() {
|
||||
local LOCKED_NODE_VERSION="22"
|
||||
# ...
|
||||
}
|
||||
```
|
||||
|
||||
### 執行監控
|
||||
|
||||
```bash
|
||||
# 單獨檢查 Node.js
|
||||
bash /Users/accusys/momentry_core_0.1/monitor/control/monitor_control.sh check node
|
||||
|
||||
# 檢查 Python
|
||||
bash /Users/accusys/momentry_core_0.1/monitor/control/monitor_control.sh check python
|
||||
```
|
||||
|
||||
### 查看版本狀態
|
||||
|
||||
```bash
|
||||
# 查詢資料庫中的版本記錄
|
||||
psql -U accusys -h localhost -d momentry -c "SELECT * FROM node_version_baseline;"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 應用Registry
|
||||
|
||||
記錄系統中所有使用 Node.js 的應用程式。
|
||||
|
||||
| 應用 | Node.js 版本 | 執行路徑 | Port | 狀態 | 說明 |
|
||||
|------|-------------|----------|------|------|------|
|
||||
| n8n | 22.22.1 | /opt/homebrew/opt/node@22/bin/node | 5678/5690 | ✅ 執行中 | 工作流自動化平台 |
|
||||
| - | - | - | - | - | 新增應用請填入此表 |
|
||||
|
||||
---
|
||||
|
||||
## 新增 Node.js 應用決策
|
||||
|
||||
### 決策樹
|
||||
|
||||
```
|
||||
新應用需要 Node.js?
|
||||
│
|
||||
├─ 支援 Node.js 22.x ────→ 使用現有 node@22
|
||||
│ (路徑: /opt/homebrew/opt/node@22/bin/node)
|
||||
│
|
||||
├─ 需要特定版本 (如 18.x, 20.x) ────→ 安裝新版本 node@XX
|
||||
│ │
|
||||
│ ├─ 建立獨立目錄: /opt/homebrew/opt/node@XX/
|
||||
│ ├─ 更新本文檔 Registry
|
||||
│ └─ 建立獨立 plist 使用完整路徑
|
||||
│
|
||||
└─ 需要最新版本 ────→ 使用系統預設 node@25
|
||||
(路徑: /opt/homebrew/bin/node)
|
||||
```
|
||||
|
||||
### 步驟清單
|
||||
|
||||
1. **確認版本需求**
|
||||
```bash
|
||||
# 查看應用支援的 Node.js 版本
|
||||
# 通常在 package.json 或官方文件中說明
|
||||
```
|
||||
|
||||
2. **選擇現有版本或安裝新版本**
|
||||
- 若支援 22.x → 使用 node@22
|
||||
- 若需要特定版本 → 使用完整路徑隔離
|
||||
|
||||
3. **安裝新版本 (如需要)**
|
||||
```bash
|
||||
# 安裝特定版本
|
||||
brew install node@20
|
||||
# 或
|
||||
brew install node@18
|
||||
|
||||
# 驗證安裝
|
||||
/opt/homebrew/opt/node@20/bin/node --version
|
||||
```
|
||||
|
||||
4. **建立隔離的服務配置**
|
||||
- 使用完整路徑,不要依賴 PATH
|
||||
- plist 中明确指定 node 路徑
|
||||
- 設定獨立的環境變數
|
||||
|
||||
5. **更新文件**
|
||||
- 更新本文檔 Registry 表格
|
||||
- 新增應用的安裝文檔
|
||||
- 更新監控配置
|
||||
|
||||
### 隔離原則
|
||||
|
||||
| 原則 | 說明 |
|
||||
|------|------|
|
||||
| **完整路徑** | 使用 `/opt/homebrew/opt/node@XX/bin/node` 而非 `node` |
|
||||
| **獨立 PATH** | plist 中設定隔離的 PATH 環境變數 |
|
||||
| **獨立目錄** | 不同版本的 node 安裝在各自目錄 |
|
||||
| **獨立全局套件** | 每個版本有自己的 node_modules |
|
||||
|
||||
---
|
||||
|
||||
## 版本衝突處理
|
||||
|
||||
### 常見衝突場景
|
||||
|
||||
| 場景 | 原因 | 解決方案 |
|
||||
|------|------|----------|
|
||||
| n8n 顯示版本警告 | 使用 Node.js 25.x 啟動 | 確認 plist 使用 node@22 路徑 |
|
||||
| task-runner 執行錯誤 | 子進程繼承錯誤版本 | 在 plist 中設定正確的 PATH |
|
||||
| 全域套件找不到 | 跨版本安裝 | 使用正確版本的 npm |
|
||||
| Port 被佔用 | 多個應用使用相同 Port | 分配獨立 Port |
|
||||
|
||||
### 診斷命令
|
||||
|
||||
```bash
|
||||
# 1. 查看程序使用的 node 版本
|
||||
ps aux | grep node
|
||||
|
||||
# 2. 查看程序 PID 使用的執行檔
|
||||
lsof -p <PID> | grep bin/node
|
||||
|
||||
# 3. 確認路徑優先順序
|
||||
echo $PATH
|
||||
|
||||
# 4. 查看 launchctl 服務的環境變數
|
||||
sudo launchctl list | grep <service-name>
|
||||
|
||||
# 5. 檢查 Port 佔用
|
||||
lsof -i :<port-number>
|
||||
```
|
||||
|
||||
### 預防措施
|
||||
|
||||
1. **每次新增服務都更新 Registry**
|
||||
2. **使用完整路徑而非 PATH**
|
||||
3. **建立服務時指定版本**
|
||||
4. **定期檢查執行中的程序**
|
||||
|
||||
---
|
||||
|
||||
## 故障排除
|
||||
|
||||
### 問題:n8n 顯示 Node.js 版本警告
|
||||
|
||||
**原因**:n8n 檢測到 Node.js 版本不是 22.x
|
||||
|
||||
**解決方案**:
|
||||
1. 確認 plist 中 ProgramArguments 使用正確路徑
|
||||
2. 確認 PATH 環境變數中 node@22 在前面
|
||||
3. 重載服務:
|
||||
```bash
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.n8n.main.plist
|
||||
sudo launchctl unload /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
|
||||
```
|
||||
|
||||
### 問題:Task Runner 使用錯誤版本
|
||||
|
||||
**原因**:PATH 環境變數設定不正確
|
||||
|
||||
**診斷**:
|
||||
```bash
|
||||
# 查看 task-runner 進程使用的 node
|
||||
ps aux | grep "task-runner"
|
||||
lsof -p <PID> | grep "txt" | grep node
|
||||
```
|
||||
|
||||
**解決方案**:
|
||||
更新 plist 中的 PATH,確保 `/opt/homebrew/opt/node@22/bin` 在最前面。
|
||||
|
||||
### 問題:npm 全域套件找不到
|
||||
|
||||
**原因**:使用錯誤的 node 版本安裝
|
||||
|
||||
**解決方案**:
|
||||
```bash
|
||||
# 確認使用的是哪個 node
|
||||
which node
|
||||
node --version
|
||||
|
||||
# 使用正確版本重新安裝
|
||||
/opt/homebrew/opt/node@22/bin/npm install -g <package>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 版本切換腳本
|
||||
|
||||
建立快速切換腳本 `~/bin/switch-node.sh`:
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
VERSION=$1
|
||||
|
||||
case $VERSION in
|
||||
22)
|
||||
export PATH="/opt/homebrew/opt/node@22/bin:$PATH"
|
||||
echo "切換到 Node.js 22.x"
|
||||
;;
|
||||
system|25)
|
||||
export PATH="/opt/homebrew/bin:$PATH"
|
||||
echo "切換到系統 Node.js 25.x"
|
||||
;;
|
||||
*)
|
||||
echo "用法: $0 {22|system}"
|
||||
echo " 22 - Node.js 22.x (n8n)"
|
||||
echo " system - Node.js 25.x (系統預設)"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
node --version
|
||||
```
|
||||
|
||||
賦予執行權限:
|
||||
```bash
|
||||
chmod +x ~/bin/switch-node.sh
|
||||
```
|
||||
|
||||
使用方式:
|
||||
```bash
|
||||
~/bin/switch-node.sh 22 # 切換到 22.x
|
||||
~/bin/switch-node.sh system # 切換到系統預設
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 常用指令
|
||||
|
||||
```bash
|
||||
# 查看 node 版本
|
||||
node --version
|
||||
|
||||
# 查看 npm 版本
|
||||
npm --version
|
||||
|
||||
# 查看 node 安裝位置
|
||||
which node
|
||||
|
||||
# 查看 node@22 版本
|
||||
/opt/homebrew/opt/node@22/bin/node --version
|
||||
|
||||
# 安裝全域套件 (使用 node@22)
|
||||
/opt/homebrew/opt/node@22/bin/npm install -g n8n
|
||||
|
||||
# 檢查 n8n 進程
|
||||
ps aux | grep n8n | grep -v grep
|
||||
|
||||
# 檢查 task-runner
|
||||
ps aux | grep task-runner | grep -v grep
|
||||
|
||||
# 查看 task-runner 使用的 node 版本
|
||||
lsof -p <PID> | grep "txt" | grep node
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 檔案位置
|
||||
|
||||
| 類型 | 路徑 | 說明 |
|
||||
|------|------|------|
|
||||
| node (系統) | /opt/homebrew/bin/node | 預設 node |
|
||||
| node@22 | /opt/homebrew/opt/node@22/bin/node | n8n 專用 |
|
||||
| npm (系統) | /opt/homebrew/bin/npm | 預設 npm |
|
||||
| npm@22 | /opt/homebrew/opt/node@22/bin/npm | n8n 專用 |
|
||||
| n8n 安裝 | /opt/homebrew/lib/node_modules/n8n/ | n8n 目錄 |
|
||||
| n8n main plist | /Library/LaunchDaemons/com.momentry.n8n.main.plist | 開機啟動 |
|
||||
| n8n worker plist | /Library/LaunchDaemons/com.momentry.n8n.worker.plist | 開機啟動 |
|
||||
|
||||
---
|
||||
|
||||
## 相關文件
|
||||
|
||||
- [INSTALL_N8N.md](./INSTALL_N8N.md) - n8n 安裝指南 (包含 Node.js 配置範例)
|
||||
- [monitor_config.yaml](../monitor/config/monitor_config.yaml) - 監控配置
|
||||
- [node_monitor.sh](../monitor/service/node_monitor.sh) - Node.js 監控腳本
|
||||
483
docs/PYTHON.md
Normal file
483
docs/PYTHON.md
Normal file
@@ -0,0 +1,483 @@
|
||||
# Python 開發規範
|
||||
|
||||
## 概述
|
||||
|
||||
本文檔定義 Momentry 專案中 Python 程式碼的開發標準與最佳實踐。
|
||||
|
||||
---
|
||||
|
||||
## 版本管理
|
||||
|
||||
### 鎖定版本
|
||||
|
||||
| 版本 | 用途 | 路徑 |
|
||||
|------|------|------|
|
||||
| Python 3.11.14 | Momentry venv | /Users/accusys/momentry_core_0.1/venv/bin/python |
|
||||
| Python 3.11.14 | 系統安裝 | /opt/homebrew/bin/python3.11 |
|
||||
| Python 3.14.3 | 系統預設 | /opt/homebrew/bin/python3 |
|
||||
| Python 3.9.6 | 系統預設 (備用) | /usr/bin/python3 |
|
||||
|
||||
### 版本選擇原則
|
||||
|
||||
- **Momentry 專案**:使用 venv 中的 Python 3.11.14
|
||||
- **新專案**:建議使用 venv 管理
|
||||
- **系統工具**:可使用系統預設版本
|
||||
|
||||
---
|
||||
|
||||
## 腳本規範
|
||||
|
||||
### Shebang 宣告
|
||||
|
||||
所有 Momentry Python 腳本必須在第一行宣告明確的 Python 路徑:
|
||||
|
||||
```python
|
||||
#!/opt/homebrew/bin/python3.11
|
||||
```
|
||||
|
||||
**錯誤範例**:
|
||||
```python
|
||||
#!/usr/bin/env python3 # 會解析到系統預設 (3.14.3)
|
||||
#!/usr/bin/python3 # 會使用系統 Python (3.9.6)
|
||||
```
|
||||
|
||||
**正確範例**:
|
||||
```python
|
||||
#!/opt/homebrew/bin/python3.11
|
||||
import sys
|
||||
...
|
||||
```
|
||||
|
||||
### 檔案結構
|
||||
|
||||
```
|
||||
scripts/
|
||||
├── asr_processor.py # ASR 處理腳本
|
||||
├── thumbnail_extractor.py # 縮圖提取腳本
|
||||
└── new_script.py # 新腳本模板
|
||||
```
|
||||
|
||||
### 腳本模板
|
||||
|
||||
```python
|
||||
#!/opt/homebrew/bin/python3.11
|
||||
"""
|
||||
腳本名稱
|
||||
簡短描述腳本功能
|
||||
|
||||
用法:
|
||||
python3.11 script.py <args>
|
||||
|
||||
作者: Momentry Team
|
||||
版本: 1.0.0
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import json
|
||||
import logging
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
logging.basicConfig(
|
||||
level=logging.INFO,
|
||||
format="%(asctime)s - %(levelname)s - %(message)s",
|
||||
stream=sys.stderr,
|
||||
)
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="腳本功能描述")
|
||||
parser.add_argument("input", help="輸入檔案或參數")
|
||||
parser.add_argument("-o", "--output", default="output.json", help="輸出檔案")
|
||||
parser.add_argument("-v", "--verbose", action="store_true", help="詳細輸出")
|
||||
parser.add_argument("-c", "--count", type=int, default=10, help="數量")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.verbose:
|
||||
logger.setLevel(logging.DEBUG)
|
||||
|
||||
# 業務邏輯
|
||||
result = process_data(args.input, args.count)
|
||||
|
||||
# 輸出 JSON結果
|
||||
print(json.dumps(result))
|
||||
|
||||
|
||||
def process_data(input_path: str, count: int) -> dict:
|
||||
"""處理資料並返回結果"""
|
||||
logger.info(f"Processing: {input_path}")
|
||||
|
||||
# TODO: 實作業務邏輯
|
||||
|
||||
return {
|
||||
"status": "success",
|
||||
"input": input_path,
|
||||
"count": count,
|
||||
}
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 與 Rust 整合
|
||||
|
||||
### 使用 venv (目前採用)
|
||||
|
||||
Momentry 使用 venv 管理 Python 環境,避免與系統其他程式衝突。
|
||||
|
||||
#### 建立 venv
|
||||
|
||||
```bash
|
||||
# 建立虛擬環境
|
||||
cd /Users/accusys/momentry_core_0.1
|
||||
/opt/homebrew/bin/python3.11 -m venv venv
|
||||
|
||||
# 啟用虛擬環境
|
||||
source venv/bin/activate
|
||||
|
||||
# 安裝依賴
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
#### 從 Rust 呼叫 venv Python
|
||||
|
||||
```rust
|
||||
use std::path::Path;
|
||||
|
||||
let script_path = Path::new(env!("CARGO_MANIFEST_DIR"))
|
||||
.join("scripts")
|
||||
.join("asr_processor.py");
|
||||
|
||||
// 使用 venv 中的 Python
|
||||
let venv_python = Path::new(env!("CARGO_MANIFEST_DIR"))
|
||||
.join("venv")
|
||||
.join("bin")
|
||||
.join("python");
|
||||
|
||||
let output = Command::new(venv_python)
|
||||
.arg(script_path)
|
||||
.arg(video_path)
|
||||
.output()
|
||||
.context("Failed to run processor")?;
|
||||
```
|
||||
|
||||
**優點**:
|
||||
- 專案依賴隔離
|
||||
- 不同專案可使用不同 Python 版本
|
||||
- 易於重現環境
|
||||
- 不影響系統其他程式
|
||||
|
||||
---
|
||||
|
||||
## 依賴管理
|
||||
|
||||
### venv 目錄結構
|
||||
|
||||
```
|
||||
momentry_core_0.1/
|
||||
├── venv/ # 虛擬環境
|
||||
│ ├── bin/
|
||||
│ │ ├── python # Python 3.11.14
|
||||
│ │ ├── pip
|
||||
│ │ └── ...
|
||||
│ └── lib/python3.11/ # 安裝的套件
|
||||
├── requirements.txt # 依賴列表
|
||||
├── scripts/ # Python 腳本
|
||||
│ ├── asr_processor.py
|
||||
│ └── thumbnail_extractor.py
|
||||
└── src/ # Rust 程式碼
|
||||
```
|
||||
|
||||
### 使用虛擬環境
|
||||
|
||||
```bash
|
||||
# 啟用虛擬環境
|
||||
source venv/bin/activate
|
||||
|
||||
# 安裝依賴
|
||||
pip install faster-whisper
|
||||
|
||||
# 退出虛擬環境
|
||||
deactivate
|
||||
```
|
||||
|
||||
# 退出虛擬環境
|
||||
deactivate
|
||||
```
|
||||
|
||||
### 依賴列表格式
|
||||
|
||||
建立 `requirements.txt`:
|
||||
|
||||
```
|
||||
faster-whisper>=1.0.0
|
||||
ffmpeg-python>=0.2.0
|
||||
Pillow>=10.0.0
|
||||
```
|
||||
|
||||
### 安裝專案依賴
|
||||
|
||||
```bash
|
||||
# 使用 python3.11 安裝
|
||||
/opt/homebrew/bin/python3.11 -m pip install -r requirements.txt
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 程式碼規範
|
||||
|
||||
### Import 排序
|
||||
|
||||
```python
|
||||
# 1. 標準庫
|
||||
import sys
|
||||
import os
|
||||
import json
|
||||
import logging
|
||||
from pathlib import Path
|
||||
from typing import Optional
|
||||
|
||||
# 2. 第三方庫
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
from faster_whisper import WhisperModel
|
||||
|
||||
# 3. 本地模組
|
||||
from . import local_module
|
||||
from ..package import module
|
||||
```
|
||||
|
||||
### 命名規範
|
||||
|
||||
| 類型 | 規範 | 範例 |
|
||||
|------|------|------|
|
||||
| 模組/檔案 | snake_case | `asr_processor.py` |
|
||||
| 類別 | PascalCase | `class VideoProcessor` |
|
||||
| 函數/變數 | snake_case | `def process_video()` |
|
||||
| 常量 | UPPER_SNAKE_CASE | `MAX_WORKERS = 4` |
|
||||
| 私有成員 | _leading_underscore | `_private_method()` |
|
||||
|
||||
### 類型提示
|
||||
|
||||
```python
|
||||
from typing import Optional, List, Dict
|
||||
|
||||
def process_video(
|
||||
video_path: str,
|
||||
options: Optional[Dict[str, int]] = None,
|
||||
) -> List[Dict[str, float]]:
|
||||
"""處理影片並返回結果"""
|
||||
...
|
||||
```
|
||||
|
||||
### 錯誤處理
|
||||
|
||||
```python
|
||||
import logging
|
||||
from pathlib import Path
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def process_video(video_path: str) -> dict:
|
||||
path = Path(video_path)
|
||||
|
||||
if not path.exists():
|
||||
logger.error(f"Video file not found: {video_path}")
|
||||
raise FileNotFoundError(f"Video not found: {video_path}")
|
||||
|
||||
try:
|
||||
result = _do_process(path)
|
||||
logger.info(f"Processed successfully: {path}")
|
||||
return result
|
||||
except Exception as e:
|
||||
logger.exception(f"Processing failed: {e}")
|
||||
raise
|
||||
```
|
||||
|
||||
### 日誌規範
|
||||
|
||||
```python
|
||||
import logging
|
||||
import sys
|
||||
|
||||
logging.basicConfig(
|
||||
level=logging.INFO,
|
||||
format="%(asctime)s - %(levelname)s - %(message)s",
|
||||
stream=sys.stderr,
|
||||
)
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# 使用說明
|
||||
logger.info("Starting process...")
|
||||
logger.debug(f"Input: {input_path}")
|
||||
logger.warning(f"Using fallback: {reason}")
|
||||
logger.error(f"Failed: {error}")
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 測試規範
|
||||
|
||||
### 測試結構
|
||||
|
||||
```
|
||||
tests/
|
||||
├── __init__.py
|
||||
├── test_asr_processor.py
|
||||
└── test_thumbnail_extractor.py
|
||||
```
|
||||
|
||||
### 測試範例
|
||||
|
||||
```python
|
||||
import pytest
|
||||
from pathlib import Path
|
||||
import sys
|
||||
|
||||
sys.path.insert(0, str(Path(__file__).parent.parent / "scripts"))
|
||||
|
||||
from asr_processor import run_asr
|
||||
|
||||
|
||||
def test_asr_processor_with_valid_video(tmp_path):
|
||||
video_path = tmp_path / "test.mp4"
|
||||
output_path = tmp_path / "output.json"
|
||||
|
||||
# 建立測試影片
|
||||
video_path.write_text("dummy")
|
||||
|
||||
# 執行
|
||||
result = run_asr(str(video_path), str(output_path))
|
||||
|
||||
# 斷言
|
||||
assert output_path.exists()
|
||||
assert result["segments"]
|
||||
|
||||
|
||||
def test_asr_processor_with_invalid_video():
|
||||
with pytest.raises(FileNotFoundError):
|
||||
run_asr("/nonexistent/video.mp4", "/tmp/output.json")
|
||||
```
|
||||
|
||||
### 執行測試
|
||||
|
||||
```bash
|
||||
# 使用 python3.11 執行測試
|
||||
/opt/homebrew/bin/python3.11 -m pytest tests/ -v
|
||||
|
||||
# 包含覆蓋率
|
||||
/opt/homebrew/bin/python3.11 -m pytest tests/ --cov=scripts
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 監控配置
|
||||
|
||||
### 監控腳本
|
||||
|
||||
在 `monitor/config/monitor_config.yaml` 中配置:
|
||||
|
||||
```yaml
|
||||
service:
|
||||
- name: "python"
|
||||
type: "process"
|
||||
process_name: "python3"
|
||||
enabled: true
|
||||
check_interval: 60
|
||||
version_lock: "3.11.14"
|
||||
scripts:
|
||||
- "/Users/accusys/momentry_core_0.1/scripts/asr_processor.py"
|
||||
- "/Users/accusys/momentry_core_0.1/scripts/thumbnail_extractor.py"
|
||||
```
|
||||
|
||||
### 檢查版本
|
||||
|
||||
```bash
|
||||
# 執行 Python 監控
|
||||
bash /Users/accusys/momentry_core_0.1/monitor/control/monitor_control.sh check python
|
||||
|
||||
# 查看資料庫記錄
|
||||
psql -U accusys -h localhost -d momentry -c "SELECT * FROM python_version_baseline;"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## CI/CD 考量
|
||||
|
||||
### GitHub Actions 範例
|
||||
|
||||
```yaml
|
||||
name: Python Tests
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: macos-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Python 3.11
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.11"
|
||||
|
||||
- name: Run tests
|
||||
run: |
|
||||
python -m pytest tests/ -v
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 常見問題
|
||||
|
||||
### Q: 為什麼腳本要用 `#!/opt/homebrew/bin/python3.11` 而不是 `#!/usr/bin/env python3`?
|
||||
|
||||
A: `#!/usr/bin/env python3` 會解析 PATH 中的第一個 `python3`,在 macOS 上可能是:
|
||||
- `/opt/homebrew/bin/python3` (3.14.3)
|
||||
- `/usr/bin/python3` (3.9.6)
|
||||
|
||||
明確指定路徑可確保使用正確版本。
|
||||
|
||||
### Q: Rust 呼叫 Python 腳本時如何確保版本正確?
|
||||
|
||||
A: 有三種方式:
|
||||
1. Rust 程式碼中使用明確路徑:`Command::new("/opt/homebrew/bin/python3.11")`
|
||||
2. 設定環境變數 PATH
|
||||
3. 建立系統別名(不推薦,影響其他程式)
|
||||
|
||||
### Q: 如何管理多個 Python 版本?
|
||||
|
||||
A: 建議使用:
|
||||
- **pyenv**:管理多個 Python 版本
|
||||
- **venv**:隔離專案依賴
|
||||
- **Docker**:容器化環境
|
||||
|
||||
---
|
||||
|
||||
## 檢查清單
|
||||
|
||||
新增 Python 腳本時確認:
|
||||
|
||||
- [ ] 使用 `#!/opt/homebrew/bin/python3.11` shebang
|
||||
- [ ] 包含 docstring 說明功能
|
||||
- [ ] 使用 argparse 處理命令行參數
|
||||
- [ ] 使用 logging 進行日誌輸出
|
||||
- [ ] 錯誤處理適當
|
||||
- [ ] 類型提示完整
|
||||
- [ ] 更新監控配置
|
||||
- [ ] 建立測試案例
|
||||
|
||||
---
|
||||
|
||||
## 相關文件
|
||||
|
||||
- [NODEJS.md](./NODEJS.md) - Node.js 開發指南
|
||||
- [monitor_config.yaml](../monitor/config/monitor_config.yaml) - 監控配置
|
||||
- [python_monitor.sh](../monitor/service/python_monitor.sh) - Python 監控腳本
|
||||
726
docs/SERVICES.md
Normal file
726
docs/SERVICES.md
Normal file
@@ -0,0 +1,726 @@
|
||||
# Momentry 系統服務安裝與管理指南
|
||||
|
||||
## 概述
|
||||
|
||||
本文檔記錄 momentry 系統所需的所有服務,包括安裝步驟、健康檢查和管理命令。
|
||||
|
||||
**重要**: 請勿使用 `brew services` 命令管理服務,否則可能導致 .plist 檔案還原為預設狀態,造成系統異常。請使用 `launchctl` 命令進行管理。
|
||||
|
||||
---
|
||||
|
||||
## 服務清單
|
||||
|
||||
| 服務名稱 | 安裝方式 | 用途 | 狀態 |
|
||||
|----------|----------|------|-------|
|
||||
| PostgreSQL | Homebrew | 影片元資料儲存 | 已安裝 |
|
||||
| Redis | Homebrew | 快取與工作佇列 | 已安裝 |
|
||||
| Ollama | Homebrew | 本地 LLM 推論 | 已安裝 |
|
||||
| Caddy | Homebrew | 網頁伺服器 (可選) | 已安裝 |
|
||||
| Gitea | 手動安裝 | Git 服務 | 已安裝 |
|
||||
| Grafana | Homebrew | 監控儀表板 | 已安裝 |
|
||||
| Kafka | 手動安裝 | 訊息佇列 (可選) | 已安裝 |
|
||||
| MariaDB | Homebrew | 資料庫 (可選) | 已安裝 |
|
||||
| Netdata | Homebrew | 系統監控 | 已安裝 |
|
||||
| PHP | Homebrew | Web 後端 | 已安裝 |
|
||||
| Prometheus | Homebrew | 指標收集 | 已安裝 |
|
||||
| SeaweedFS | 手動安裝 | 分散式儲存 (可選) | 已安裝 |
|
||||
| SFTPGo | 手動安裝 | SFTP 服務 | 已安裝 |
|
||||
| n8n | Homebrew | 工作流自動化 | 已安裝 |
|
||||
|
||||
---
|
||||
|
||||
## 必要服務 (Momentry 核心)
|
||||
|
||||
### 1. PostgreSQL
|
||||
|
||||
#### 安裝
|
||||
```bash
|
||||
# 檢查是否已安裝
|
||||
brew list postgresql@18 2>/dev/null || echo "Not installed"
|
||||
|
||||
# 安裝 PostgreSQL 18
|
||||
brew install postgresql@18
|
||||
```
|
||||
|
||||
#### 初始化資料庫
|
||||
```bash
|
||||
# 初始化資料庫 (如尚未初始化)
|
||||
initdb /usr/local/var/postgresql@18
|
||||
|
||||
# 建立 momentry 資料庫
|
||||
createdb -U accusys momentry
|
||||
```
|
||||
|
||||
#### 開機自動啟動
|
||||
```bash
|
||||
# 建立 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>ProgramArguments</key>
|
||||
<array>
|
||||
<string>/opt/homebrew/opt/postgresql@18/bin/pg_ctl</string>
|
||||
<string>-D</string>
|
||||
<string>/opt/homebrew/var/postgresql@18</string>
|
||||
<string>-l</string>
|
||||
<string>/opt/homebrew/var/postgresql@18/logfile</string>
|
||||
<string>start</string>
|
||||
</array>
|
||||
<key>RunAtLoad</key>
|
||||
<true/>
|
||||
<key>KeepAlive</key>
|
||||
<true/>
|
||||
<key>WorkingDirectory</key>
|
||||
<string>/opt/homebrew/var/postgresql@18</string>
|
||||
<key>UserName</key>
|
||||
<string>accusys</string>
|
||||
</dict>
|
||||
</plist>
|
||||
EOF
|
||||
|
||||
# 載入服務
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.postgresql.plist
|
||||
```
|
||||
|
||||
#### 管理命令
|
||||
```bash
|
||||
# 啟動
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.postgresql.plist
|
||||
|
||||
# 停止
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.postgresql.plist
|
||||
|
||||
# 重新載入
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.postgresql.plist
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.postgresql.plist
|
||||
```
|
||||
|
||||
#### 健康檢查
|
||||
```bash
|
||||
# 方法 1: 使用 pg_isready
|
||||
pg_isready -h localhost -p 5432 -U accusys
|
||||
|
||||
# 方法 2: 連線測試
|
||||
psql -U accusys -h localhost -d momentry -c "SELECT 1;"
|
||||
|
||||
# 方法 3: 檢查程序
|
||||
pgrep -f "postgres.*postgresql@18"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 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'
|
||||
<?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
|
||||
```
|
||||
|
||||
#### 管理命令
|
||||
```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'
|
||||
<?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
|
||||
```
|
||||
|
||||
#### 管理命令
|
||||
```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 :5690
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 可選服務
|
||||
|
||||
### 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
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 服務管理速查表
|
||||
|
||||
### 啟動服務
|
||||
```bash
|
||||
# PostgreSQL (需要 root 權限)
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.postgresql.plist
|
||||
|
||||
# Redis, Ollama (需要 root 權限)
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.redis.plist
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.ollama.plist
|
||||
|
||||
# n8n (需要 root 權限)
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.n8n.main.plist
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.n8n.worker.plist
|
||||
```
|
||||
|
||||
### 停止服務
|
||||
```bash
|
||||
# PostgreSQL
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.postgresql.plist
|
||||
|
||||
# Redis, Ollama
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.redis.plist
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.ollama.plist
|
||||
|
||||
# n8n
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.n8n.main.plist
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.n8n.worker.plist
|
||||
```
|
||||
|
||||
### 查詢服務狀態
|
||||
```bash
|
||||
# 查看所有服務
|
||||
launchctl list | grep -E "(postgres|redis|ollama|n8n|grafana|prometheus)"
|
||||
|
||||
# 查看特定服務
|
||||
launchctl list | grep com.momentry
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 故障排除
|
||||
|
||||
### 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 | 使用者 | plist 位置 |
|
||||
|------|------|--------|-------------|
|
||||
| PostgreSQL | 5432 | accusys | /Library/LaunchDaemons/ |
|
||||
| Redis | 6379 | accusys | /Library/LaunchDaemons/ |
|
||||
| Ollama | 11434 | accusys | /Library/LaunchDaemons/ |
|
||||
| n8n Main | 5678 | accusys | /Library/LaunchDaemons/ |
|
||||
| n8n Worker | 5690-5691 | accusys | /Library/LaunchDaemons/ |
|
||||
| Grafana | 3000 | accusys | /Library/LaunchDaemons/ |
|
||||
| Prometheus | 9090 | accusys | /Library/LaunchDaemons/ |
|
||||
| Caddy | 2019 | root | /Library/LaunchDaemons/ |
|
||||
| Netdata | 19999 | root | /Library/LaunchDaemons/ |
|
||||
659
docs/SERVICE_ADDITION_GUIDE.md
Normal file
659
docs/SERVICE_ADDITION_GUIDE.md
Normal file
@@ -0,0 +1,659 @@
|
||||
# Momentry 服務添加規範 v2.0
|
||||
|
||||
## 一、概述
|
||||
|
||||
本文檔定義在 Momentry 系統中添加新服務的標準流程和規範。
|
||||
|
||||
**重要原則**:
|
||||
- 使用 `launchctl` 管理服務,勿使用 `brew services`
|
||||
- 所有服務使用 `com.momentry.*` 作為 plist Label
|
||||
- 數據存放於 `/Users/accusys/momentry/` 目錄
|
||||
- 每個服務需提供完整的監控腳本
|
||||
- 所有服務 Plist 存放於 `/Library/LaunchDaemons/`
|
||||
- 所有服務以 `accusys` 用戶運行,確保 accusys 可以管理
|
||||
|
||||
---
|
||||
|
||||
## 二、服務運行方式
|
||||
|
||||
### 2.1 運行分類
|
||||
|
||||
| 類型 | 說明 | 示例 |
|
||||
|------|------|------|
|
||||
| **開機自動運行** | 電腦開機後立即自動啟動 | PostgreSQL, Redis, n8n, Caddy 等核心服務 |
|
||||
| **登入時運行** | 用戶登入後才啟動 | 開發工具、臨時服務 |
|
||||
|
||||
**當前所有服務**:均為開機自動運行
|
||||
|
||||
### 2.2 Plist 存放位置
|
||||
|
||||
所有 Momentry 服務統一存放於:
|
||||
```
|
||||
/Library/LaunchDaemons/com.momentry.{service_name}.plist
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 三、服務命名規範
|
||||
|
||||
### 3.1 Plist 文件命名
|
||||
|
||||
```
|
||||
com.momentry.{service_name}.plist
|
||||
```
|
||||
|
||||
示例:
|
||||
- `com.momentry.redis.plist`
|
||||
- `com.momentry.n8n.main.plist`
|
||||
- `com.momentry.rustdesk.hbbs.plist`
|
||||
|
||||
### 3.2 目錄命名
|
||||
|
||||
服務相關目錄統一放置於:
|
||||
```
|
||||
/Users/accusys/momentry/
|
||||
├── var/{service_name}/ # 服務數據
|
||||
├── etc/{service_name}/ # 服務配置
|
||||
├── log/{service_name}.log # 服務日誌 (stdout)
|
||||
└── log/{service_name}.error.log # 錯誤日誌 (stderr)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 四、Plist 文件模板
|
||||
|
||||
### 4.1 標準服務模板
|
||||
|
||||
```xml
|
||||
<?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.{service_name}</string>
|
||||
|
||||
<key>UserName</key>
|
||||
<string>accusys</string>
|
||||
|
||||
<key>WorkingDirectory</key>
|
||||
<string>/Users/accusys/momentry/var/{service_name}</string>
|
||||
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>/path/to/executable</string>
|
||||
<string>--arg1</string>
|
||||
<string>value1</string>
|
||||
</array>
|
||||
|
||||
<key>EnvironmentVariables</key>
|
||||
<dict>
|
||||
<key>PATH</key>
|
||||
<string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
|
||||
<!-- 其他環境變數 -->
|
||||
</dict>
|
||||
|
||||
<key>RunAtLoad</key>
|
||||
<true/>
|
||||
|
||||
<key>KeepAlive</key>
|
||||
<true/>
|
||||
|
||||
<key>StandardOutPath</key>
|
||||
<string>/Users/accusys/momentry/log/{service_name}.log</string>
|
||||
|
||||
<key>StandardErrorPath</key>
|
||||
<string>/Users/accusys/momentry/log/{service_name}.error.log</string>
|
||||
</dict>
|
||||
</plist>
|
||||
```
|
||||
|
||||
### 4.2 日誌文件規範
|
||||
|
||||
每個服務必須創建兩個日誌文件:
|
||||
|
||||
| 文件 | 說明 | 路徑 |
|
||||
|------|------|------|
|
||||
| StandardOutPath | 標準輸出日誌 | `/Users/accusys/momentry/log/{service_name}.log` |
|
||||
| StandardErrorPath | 錯誤輸出日誌 | `/Users/accusys/momentry/log/{service_name}.error.log` |
|
||||
|
||||
**創建日誌文件**:
|
||||
```bash
|
||||
touch /Users/accusys/momentry/log/{service_name}.log
|
||||
touch /Users/accusys/momentry/log/{service_name}.error.log
|
||||
chmod 644 /Users/accusys/momentry/log/{service_name}.log
|
||||
chmod 644 /Users/accusys/momentry/log/{service_name}.error.log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 五、添加服務步驟
|
||||
|
||||
### 步驟 1:創建目錄結構
|
||||
|
||||
```bash
|
||||
# 創建服務目錄
|
||||
mkdir -p /Users/accusys/momentry/var/{service_name}
|
||||
mkdir -p /Users/accusys/momentry/etc/{service_name}
|
||||
|
||||
# 創建日誌文件
|
||||
touch /Users/accusys/momentry/log/{service_name}.log
|
||||
touch /Users/accusys/momentry/log/{service_name}.error.log
|
||||
```
|
||||
|
||||
### 步驟 2:創建 Plist 文件
|
||||
|
||||
```bash
|
||||
# 複製模板並編輯
|
||||
cp /Users/accusys/momentry_core_0.1/momentry_runtime/plist/template.service.plist \
|
||||
/Users/accusys/momentry_core_0.1/momentry_runtime/plist/com.momentry.{service_name}.plist
|
||||
|
||||
# 編輯 plist 文件
|
||||
vim /Users/accusys/momentry_core_0.1/momentry_runtime/plist/com.momentry.{service_name}.plist
|
||||
```
|
||||
|
||||
### 步驟 3:複製到系統 LaunchDaemons
|
||||
|
||||
```bash
|
||||
# 複製到 /Library/LaunchDaemons/
|
||||
sudo cp /Users/accusys/momentry_core_0.1/momentry_runtime/plist/com.momentry.{service_name}.plist \
|
||||
/Library/LaunchDaemons/
|
||||
```
|
||||
|
||||
### 步驟 4:載入服務
|
||||
|
||||
```bash
|
||||
# 載入服務
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.{service_name}.plist
|
||||
|
||||
# 驗證服務狀態
|
||||
launchctl list | grep momentry
|
||||
```
|
||||
|
||||
### 步驟 5:添加監控
|
||||
|
||||
在 `monitor/config/monitor_config.yaml` 中添加服務配置:
|
||||
|
||||
```yaml
|
||||
service:
|
||||
services:
|
||||
- name: "{service_name}"
|
||||
type: "http" # 或 "process", "tcp"
|
||||
port: {port_number}
|
||||
host: "localhost"
|
||||
check_url: "http://localhost:{port}/health"
|
||||
timeout: 5
|
||||
enabled: true
|
||||
```
|
||||
|
||||
### 步驟 6:添加文檔
|
||||
|
||||
在 `docs/INSTALL_{SERVICE_NAME}.md` 中記錄:
|
||||
- 安裝步驟
|
||||
- 配置說明
|
||||
- 健康檢查命令
|
||||
- 故障排除
|
||||
|
||||
---
|
||||
|
||||
## 六、服務分類
|
||||
|
||||
### 按功能分類
|
||||
|
||||
| 類別 | 服務 |
|
||||
|------|------|
|
||||
| 資料庫 | PostgreSQL, Redis, MariaDB, MongoDB |
|
||||
| 應用 | n8n, Gitea, SFTPGo |
|
||||
| 網頁 | Caddy, PHP-FPM |
|
||||
| AI/ML | Ollama, Qdrant |
|
||||
| 遠程 | RustDesk |
|
||||
|
||||
### 按運行方式分類
|
||||
|
||||
| 運行方式 | 數量 | 服務 |
|
||||
|----------|------|------|
|
||||
| 開機自動運行 | 15 | PostgreSQL, Redis, n8n, Caddy, Gitea, SFTPGo, Ollama, Qdrant, MariaDB, PHP-FPM, RustDesk, MongoDB, Agent |
|
||||
| 登入時運行 | 0 | (暫無) |
|
||||
|
||||
---
|
||||
|
||||
## 七、監控要求
|
||||
|
||||
每個服務必須提供:
|
||||
|
||||
### 7.1 健康檢查
|
||||
|
||||
在 `monitor/service/health_check.sh` 中添加檢查函數:
|
||||
|
||||
```bash
|
||||
check_{service_name}() {
|
||||
local start=$(date +%s%N)
|
||||
if nc -z localhost {port} > /dev/null 2>&1; then
|
||||
local end=$(date +%s%N)
|
||||
local ms=$(( (end - start) / 1000000 ))
|
||||
echo -e "${GREEN}✓${NC} {service_name} ({port}) - ${ms}ms"
|
||||
record_service "{service_name}" "up" "$ms" ""
|
||||
return 0
|
||||
else
|
||||
echo -e "${RED}✗${NC} {service_name} ({port}) - Down"
|
||||
record_service "{service_name}" "down" "0" "Connection failed"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
```
|
||||
|
||||
### 7.2 數據庫記錄
|
||||
|
||||
```sql
|
||||
-- 添加服務監控記錄函數
|
||||
record_service() {
|
||||
local service=$1
|
||||
local status=$2
|
||||
local response_time=$3
|
||||
local error_msg=$4
|
||||
|
||||
psql -U accusys -h localhost -d momentry << EOF
|
||||
INSERT INTO monitor_services (service_name, service_type, status, response_time_ms, error_message, checked_at)
|
||||
VALUES ('$service', 'service', '$status', $response_time, '$error_msg', NOW());
|
||||
EOF
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 八、服務管理命令
|
||||
|
||||
### 8.1 基本操作
|
||||
|
||||
```bash
|
||||
# 啟動服務
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.{service}.plist
|
||||
|
||||
# 停止服務
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.{service}.plist
|
||||
|
||||
# 重啟服務
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.{service}.plist
|
||||
sudo launchctl load /Library/LaunchDaemons/com.momentry.{service}.plist
|
||||
|
||||
# 查看服務狀態
|
||||
launchctl list | grep momentry
|
||||
|
||||
# 查看服務日誌
|
||||
tail -f /Users/accusys/momentry/log/{service}.log
|
||||
tail -f /Users/accusys/momentry/log/{service}.error.log
|
||||
```
|
||||
|
||||
### 8.2 故障排除
|
||||
|
||||
```bash
|
||||
# 檢查服務是否運行
|
||||
pgrep -f "{service_process_name}"
|
||||
|
||||
# 檢查端口是否監聽
|
||||
lsof -i :{port}
|
||||
|
||||
# 檢查錯誤日誌
|
||||
tail -100 /Users/accusys/momentry/log/{service}.error.log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 九、服務備份作業
|
||||
|
||||
### 9.1 備份內容
|
||||
|
||||
每個服務需要備份的內容:
|
||||
|
||||
| 類別 | 路徑 | 說明 |
|
||||
|------|------|------|
|
||||
| 數據 | `/Users/accusys/momentry/var/{service}/` | 服務運行數據 |
|
||||
| 配置 | `/Users/accusys/momentry/etc/{service}/` | 服務配置文件 |
|
||||
| Plist | `/Library/LaunchDaemons/com.momentry.{service}.plist` | 啟動配置 |
|
||||
| 日誌 | `/Users/accusys/momentry/log/{service}.log` | 運行日誌 |
|
||||
|
||||
### 9.2 備份命名規範
|
||||
|
||||
**格式**: `{service}_{type}_{YYYYMMDD}_{HHMMSS}[_{suffix}].{ext}`
|
||||
|
||||
**組成部分**:
|
||||
| 位置 | 說明 | 範例 |
|
||||
|------|------|------|
|
||||
| `{service}` | 服務名稱 (小寫) | `postgresql`, `redis`, `n8n` |
|
||||
| `{type}` | 備份類型 | `full`, `db`, `cfg`, `data` |
|
||||
| `{YYYYMMDD}` | 備份日期 | `20260315` |
|
||||
| `{HHMMSS}` | 備份時間 (24小時制) | `030000` |
|
||||
| `{suffix}` | 可選標記 | `incremental`, `verified` |
|
||||
| `{ext}` | 檔案擴展名 | `sql.gz`, `tar.gz`, `rdb`, `zip` |
|
||||
|
||||
**類型說明**:
|
||||
| 類型 | 說明 | 包含內容 |
|
||||
|------|------|---------|
|
||||
| `full` | 完整備份 | 數據 + 配置 + 日誌 |
|
||||
| `db` | 數據庫備份 | 資料庫導出 (sql, rdb) |
|
||||
| `cfg` | 配置備份 | 配置文件 |
|
||||
| `data` | 數據備份 | var 目錄 |
|
||||
|
||||
**範例**:
|
||||
```
|
||||
postgresql_db_20260315_030000.sql.gz # PostgreSQL 完整資料庫 (壓縮)
|
||||
redis_rdb_20260315_030000.rdb # Redis RDB 快照
|
||||
n8n_full_20260315_030000.tar.gz # n8n 完整備份
|
||||
mariadb_db_wordpress_20260315_030000.sql.gz # MariaDB WP 資料庫
|
||||
gitea_full_20260315_030000.zip # Gitea 完整備份
|
||||
qdrant_snapshot_20260315_030000.tar.gz # Qdrant 向量庫
|
||||
ollama_cfg_20260315_030000.tar.gz # Ollama 配置
|
||||
caddy_cfg_20260315_030000.tar.gz # Caddy 配置
|
||||
```
|
||||
|
||||
**可信斷點標記**:
|
||||
- 檔名本身即為可信時間點
|
||||
- 還原時直接使用檔名中的時間戳
|
||||
- 建議配合 `backup_registry` 資料庫記錄完整元數據
|
||||
|
||||
**校驗和命名**:
|
||||
```
|
||||
postgresql_db_20260315_030000.sql.gz.sha256
|
||||
```
|
||||
|
||||
### 9.3 備份腳本
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# 標準化備份腳本範本
|
||||
# 遵循命名規範: {service}_{type}_{YYYYMMDD}_{HHMMSS}.{ext}
|
||||
|
||||
set -e
|
||||
|
||||
SERVICE_NAME="{service_name}"
|
||||
BACKUP_TYPE="{type}" # full, db, cfg, data
|
||||
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
||||
BACKUP_DIR="/Users/accusys/momentry/backup/${SERVICE_NAME}"
|
||||
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
|
||||
# 根據類型執行備份
|
||||
case "$BACKUP_TYPE" in
|
||||
full)
|
||||
echo "[$TIMESTAMP] 執行 $SERVICE_NAME 完整備份..."
|
||||
tar -czf "$BACKUP_DIR/${SERVICE_NAME}_full_${TIMESTAMP}.tar.gz" \
|
||||
/Users/accusys/momentry/var/${SERVICE_NAME}/ \
|
||||
/Users/accusys/momentry/etc/${SERVICE_NAME}/ 2>/dev/null
|
||||
;;
|
||||
db)
|
||||
echo "[$TIMESTAMP] 執行 $SERVICE_NAME 資料庫備份..."
|
||||
if [ "$SERVICE_NAME" = "postgresql" ]; then
|
||||
pg_dump -U accusys ${SERVICE_NAME} | gzip > \
|
||||
"$BACKUP_DIR/${SERVICE_NAME}_db_${TIMESTAMP}.sql.gz"
|
||||
elif [ "$SERVICE_NAME" = "mariadb" ]; then
|
||||
mysqldump -u root -p --all-databases | gzip > \
|
||||
"$BACKUP_DIR/${SERVICE_NAME}_db_${TIMESTAMP}.sql.gz"
|
||||
elif [ "$SERVICE_NAME" = "redis" ]; then
|
||||
redis-cli -a accusys SAVE
|
||||
cp /opt/homebrew/var/db/redis/dump.rdb \
|
||||
"$BACKUP_DIR/${SERVICE_NAME}_rdb_${TIMESTAMP}.rdb"
|
||||
fi
|
||||
;;
|
||||
cfg)
|
||||
echo "[$TIMESTAMP] 執行 $SERVICE_NAME 配置備份..."
|
||||
tar -czf "$BACKUP_DIR/${SERVICE_NAME}_cfg_${TIMESTAMP}.tar.gz" \
|
||||
/Users/accusys/momentry/etc/${SERVICE_NAME}/ 2>/dev/null
|
||||
;;
|
||||
data)
|
||||
echo "[$TIMESTAMP] 執行 $SERVICE_NAME 數據備份..."
|
||||
tar -czf "$BACKUP_DIR/${SERVICE_NAME}_data_${TIMESTAMP}.tar.gz" \
|
||||
/Users/accusys/momentry/var/${SERVICE_NAME}/ 2>/dev/null
|
||||
;;
|
||||
esac
|
||||
|
||||
# 生成校驗和
|
||||
if [ -f "$BACKUP_DIR/${SERVICE_NAME}_${BACKUP_TYPE}_${TIMESTAMP}"* ]; then
|
||||
sha256sum "$BACKUP_DIR/${SERVICE_NAME}_${BACKUP_TYPE}_${TIMESTAMP}"* > \
|
||||
"$BACKUP_DIR/${SERVICE_NAME}_${BACKUP_TYPE}_${TIMESTAMP}.sha256"
|
||||
fi
|
||||
|
||||
# 清理舊備份 (保留 30 天)
|
||||
find "$BACKUP_DIR" -name "*_${TIMESTAMP%%_*}_*.tar.gz" -mtime +30 -delete 2>/dev/null
|
||||
find "$BACKUP_DIR" -name "*_${TIMESTAMP%%_*}_*.sql.gz" -mtime +30 -delete 2>/dev/null
|
||||
find "$BACKUP_DIR" -name "*_${TIMESTAMP%%_*}_*.rdb" -mtime +30 -delete 2>/dev/null
|
||||
find "$BACKUP_DIR" -name "*.sha256" -mtime +30 -delete 2>/dev/null
|
||||
|
||||
echo "備份完成: ${SERVICE_NAME}_${BACKUP_TYPE}_${TIMESTAMP}"
|
||||
```
|
||||
|
||||
### 9.4 備份排程
|
||||
|
||||
建議使用 cron 進行自動備份:
|
||||
|
||||
```bash
|
||||
# 編輯 crontab
|
||||
crontab -e
|
||||
|
||||
# 添加備份任務 (每天凌晨 3 點)
|
||||
0 3 * * * /Users/accusys/momentry/scripts/backup_{service}.sh >> /Users/accusys/momentry/log/backup.log 2>&1
|
||||
|
||||
# 每週日凌晨 3 點執行完整備份
|
||||
0 3 * * 0 /Users/accusys/momentry/scripts/backup_{service}.sh full >> /Users/accusys/momentry/log/backup.log 2>&1
|
||||
```
|
||||
|
||||
### 9.5 備份驗證
|
||||
|
||||
```bash
|
||||
# 查看備份列表 (按時間排序)
|
||||
ls -lt /Users/accusys/momentry/backup/{service}/
|
||||
|
||||
# 驗證備份完整性
|
||||
# 1. 檢查校驗和
|
||||
sha256sum -c /Users/accusys/momentry/backup/{service}/*.sha256
|
||||
|
||||
# 2. 驗證 tar 壓縮
|
||||
tar -tzf /Users/accusys/momentry/backup/{service}/{service}_full_20260315_030000.tar.gz
|
||||
|
||||
# 3. 驗證 SQL 備份
|
||||
zcat /Users/accusys/momentry/backup/{service}/{service}_db_20260315_030000.sql.gz | head -5
|
||||
|
||||
# 驗證備份完整性
|
||||
tar -tzf /Users/accusys/momentry/backup/{service}/{service}_var_20260315.tar.gz
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 十、服務完整刪除作業
|
||||
|
||||
### 10.1 刪除前確認
|
||||
|
||||
**警告**:此操作不可逆,請確保已完成備份!
|
||||
|
||||
- [ ] 確認服務已停止運行
|
||||
- [ ] 確認數據已備份
|
||||
- [ ] 確認無其他服務依賴此服務
|
||||
|
||||
### 10.2 刪除步驟
|
||||
|
||||
**步驟 1:停止服務**
|
||||
|
||||
```bash
|
||||
# 停止服務
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.{service}.plist
|
||||
|
||||
# 驗證服務已停止
|
||||
launchctl list | grep momentry.{service}
|
||||
```
|
||||
|
||||
**步驟 2:刪除 Plist**
|
||||
|
||||
```bash
|
||||
# 刪除系統 Plist
|
||||
sudo rm /Library/LaunchDaemons/com.momentry.{service}.plist
|
||||
|
||||
# 刪除專案 Plist
|
||||
rm /Users/accusys/momentry_core_0.1/momentry_runtime/plist/com.momentry.{service}.plist
|
||||
```
|
||||
|
||||
**步驟 3:刪除數據和配置**
|
||||
|
||||
```bash
|
||||
# 刪除數據目錄
|
||||
sudo rm -rf /Users/accusys/momentry/var/{service}/
|
||||
|
||||
# 刪除配置目錄
|
||||
sudo rm -rf /Users/accusys/momentry/etc/{service}/
|
||||
|
||||
# 刪除日誌
|
||||
rm -f /Users/accusys/momentry/log/{service}.log
|
||||
rm -f /Users/accusys/momentry/log/{service}.error.log
|
||||
```
|
||||
|
||||
**步驟 4:清理監控配置**
|
||||
|
||||
```bash
|
||||
# 從監控配置中移除服務
|
||||
vim /Users/accusys/momentry_core_0.1/monitor/config/monitor_config.yaml
|
||||
# 刪除該服務的監控配置
|
||||
|
||||
# 從監控腳本中移除
|
||||
vim /Users/accusys/momentry_core_0.1/monitor/service/health_check.sh
|
||||
# 移除該服務的檢查函數
|
||||
```
|
||||
|
||||
**步驟 5:清理監控數據(可選)**
|
||||
|
||||
```bash
|
||||
# 保留歷史數據還是刪除?
|
||||
# 刪除監控數據
|
||||
psql -U accusys -h localhost -d momentry -c "
|
||||
DELETE FROM monitor_services WHERE service_name = '{service}';
|
||||
"
|
||||
```
|
||||
|
||||
### 10.3 驗證刪除
|
||||
|
||||
```bash
|
||||
# 確認服務已停止
|
||||
launchctl list | grep momentry.{service}
|
||||
|
||||
# 確認目錄已刪除
|
||||
ls /Users/accusys/momentry/var/{service}/ 2>/dev/null || echo "已刪除"
|
||||
|
||||
# 確認 Plist 已刪除
|
||||
ls /Library/LaunchDaemons/com.momentry.{service}.plist 2>/dev/null || echo "已刪除"
|
||||
```
|
||||
|
||||
### 10.4 完整刪除腳本
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
SERVICE_NAME="{service_name}"
|
||||
|
||||
echo "========== 服務完整刪除 =========="
|
||||
echo "服務: $SERVICE_NAME"
|
||||
echo "警告:此操作不可逆!"
|
||||
read -p "確認繼續 (yes/no): " confirm
|
||||
|
||||
if [ "$confirm" != "yes" ]; then
|
||||
echo "取消刪除"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# 停止服務
|
||||
echo "[1/6] 停止服務..."
|
||||
sudo launchctl unload /Library/LaunchDaemons/com.momentry.${SERVICE_NAME}.plist 2>/dev/null
|
||||
|
||||
# 刪除 Plist
|
||||
echo "[2/6] 刪除 Plist..."
|
||||
sudo rm -f /Library/LaunchDaemons/com.momentry.${SERVICE_NAME}.plist
|
||||
rm -f /Users/accusys/momentry_core_0.1/momentry_runtime/plist/com.momentry.${SERVICE_NAME}.plist
|
||||
|
||||
# 刪除數據
|
||||
echo "[3/6] 刪除數據..."
|
||||
sudo rm -rf /Users/accusys/momentry/var/${SERVICE_NAME}/
|
||||
|
||||
# 刪除配置
|
||||
echo "[4/6] 刪除配置..."
|
||||
sudo rm -rf /Users/accusys/momentry/etc/${SERVICE_NAME}/
|
||||
|
||||
# 刪除日誌
|
||||
echo "[5/6] 刪除日誌..."
|
||||
rm -f /Users/accusys/momentry/log/${SERVICE_NAME}.log
|
||||
rm -f /Users/accusys/momentry/log/${SERVICE_NAME}.error.log
|
||||
|
||||
# 清理監控數據
|
||||
echo "[6/6] 清理監控數據..."
|
||||
psql -U accusys -h localhost -d momentry -c "
|
||||
DELETE FROM monitor_services WHERE service_name = '${SERVICE_NAME}';
|
||||
" 2>/dev/null
|
||||
|
||||
echo "========== 刪除完成 =========="
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 十一、檢查清單
|
||||
|
||||
添加新服務時,請確認以下項目:
|
||||
|
||||
- [ ] 創建服務目錄 (`var/`, `etc/`)
|
||||
- [ ] 配置日誌文件 (`.log` + `.error.log`)
|
||||
- [ ] 創建 plist 文件,UserName 設為 `accusys`
|
||||
- [ ] 複製到 `/Library/LaunchDaemons/`
|
||||
- [ ] 使用 launchctl 載入服務
|
||||
- [ ] 驗證服務運行
|
||||
- [ ] 添加監控配置
|
||||
- [ ] 測試監控腳本
|
||||
- [ ] 創建安裝文檔
|
||||
- [ ] 更新 SERVICES.md 服務清單
|
||||
- [ ] 更新 MOMENTRY_INTEGRATION_GUIDE.md
|
||||
|
||||
---
|
||||
|
||||
## 十二、模板文件
|
||||
|
||||
### Plist 模板位置
|
||||
|
||||
```
|
||||
/Users/accusys/momentry_core_0.1/momentry_runtime/plist/
|
||||
├── template.service.plist # 服務模板
|
||||
├── com.momentry.redis.plist # 服務示例
|
||||
└── com.momentry.n8n.main.plist # 複雜服務示例
|
||||
```
|
||||
|
||||
### 創建模板命令
|
||||
|
||||
```bash
|
||||
# 創建服務模板
|
||||
cat > /Users/accusys/momentry_core_0.1/momentry_runtime/plist/template.service.plist << '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.SERVICE_NAME</string>
|
||||
<key>UserName</key>
|
||||
<string>accusys</string>
|
||||
<key>WorkingDirectory</key>
|
||||
<string>/Users/accusys/momentry/var/SERVICE_NAME</string>
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>/path/to/executable</string>
|
||||
</array>
|
||||
<key>RunAtLoad</key>
|
||||
<true/>
|
||||
<key>KeepAlive</key>
|
||||
<true/>
|
||||
<key>StandardOutPath</key>
|
||||
<string>/Users/accusys/momentry/log/SERVICE_NAME.log</string>
|
||||
<key>StandardErrorPath</key>
|
||||
<string>/Users/accusys/momentry/log/SERVICE_NAME.error.log</string>
|
||||
</dict>
|
||||
</plist>
|
||||
EOF
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 十一、版本歷史
|
||||
|
||||
| 版本 | 日期 | 內容 |
|
||||
|------|------|------|
|
||||
| 1.0 | 2026-03-15 | 初始版本 |
|
||||
| 2.0 | 2026-03-15 | 統一 Plist 位置、移除 root/用戶區分、加入運行方式分類 |
|
||||
| 2.1 | 2026-03-15 | 新增服務備份作業、服務完整刪除作業 |
|
||||
Reference in New Issue
Block a user