---
document_type: "architecture_design"
service: "MOMENTRY_CORE"
title: "Momentry 系統自動化安裝計劃"
date: "2026-03-23"
version: "V1.0"
status: "active"
owner: "Warren"
created_by: "OpenCode"
tags:
  - "momentry"
  - "系統自動化安裝計劃"
ai_query_hints:
  - "查詢 Momentry 系統自動化安裝計劃 的內容"
  - "Momentry 系統自動化安裝計劃 的主要目的是什麼？"
  - "如何操作或實施 Momentry 系統自動化安裝計劃？"
---

# Momentry 系統自動化安裝計劃

> **計劃階段** - 僅供討論，尚未執行
> **建立時間**: 2026-03-23
> **目標**: Thunderbolt NVMe 外開機完整安裝

---

## 系統概述

### 當前環境
| 項目 | 內容 |
|------|------|
| **主控機** | Mac mini (M4, 16GB RAM) |
| **作業系統** | macOS 26.3.1 (Tahoe) |
| **儲存** | Thunderbolt NVMe (2TB) |
| **用途** | 開機碟 + 完整 Momentry 系統 |

### 目標環境
| 項目 | 內容 |
|------|------|
| **目標主機** | 其他 Mac (Intel 或 Apple Silicon) |
| **安裝方式** | Thunderbolt NVMe 外接開機 |
| **連接方式** | Thunderbolt 3/4 |
| **控制方式** | SSH 遠端管理 |

---

## 系統架構

### 服務列表

| 服務 | 版本 | 用途 | Port |
|------|------|------|------|
| **PostgreSQL** | 18.1 | 主資料庫、n8n 資料庫 | 5432 |
| **MongoDB** | 8.0 | 文件資料庫 | 27017 |
| **MariaDB** | 11.4 | WordPress 資料庫 | 3306 |
| **Redis** | 7.x | 快取、佇列 | 6379 |
| **Qdrant** | 1.7.x | 向量資料庫 | 6333 |
| **Ollama** | 0.13.5 | 本地 LLM | 11434 |
| **Caddy** | 2.x | 反向代理 | 80/443 |
| **Gitea** | 1.21 | Git 服務 | 3000 |
| **PHP-FPM** | 8.5 | WordPress | 9000 |
| **n8n** | 2.3.5 | 工作流程自動化 | 5678 |
| **RustDesk** | hbbs/hbbr | 遠端桌面 | 21115-21119 |
| **SFTPGo** | 2.x | SFTP 服務 | 2022 |
| **Momentry Core** | 0.1.0 | 影片處理核心 | 3002 |
| **Prometheus** | 3.9.1 | 監控 | 9090 |

### 目錄結構

```
/Volumes/Momentry/
├── System/
│   └── macOS/                    # macOS 系統
├── Applications/
│   └── Homebrew/                  # Homebrew 應用程式
├── momentry/
│   ├── var/                       # 資料目錄
│   │   ├── postgresql/            # PostgreSQL 資料
│   │   ├── mongodb/               # MongoDB 資料
│   │   ├── mariadb/              # MariaDB 資料
│   │   ├── redis/                 # Redis 資料
│   │   ├── qdrant/                # Qdrant 資料
│   │   ├── n8n/                   # n8n 資料
│   │   ├── ollama/                # Ollama 模型
│   │   └── ...
│   ├── etc/                       # 配置檔案
│   │   ├── Caddyfile
│   │   ├── gitea/
│   │   ├── php/
│   │   └── ...
│   ├── log/                       # 日誌
│   ├── scripts/                   # 管理腳本
│   └── backup/                    # 備份
├── momentry_core/                 # Rust 原始碼
└── momentry_dashboard/            # Web Dashboard
```

---

## 階段一：前置準備

### 1.1 收集目標主機資訊

```bash
# 需要收集的資訊
- Mac 型號 (Intel/Apple Silicon)
- macOS 版本
- Thunderbolt 版本 (3/4)
- 可用記憶體
- 目標磁碟代號 (diskX)
- 網路配置 (DHCP/固定 IP)
```

### 1.2 準備 Thunderbolt NVMe

```bash
# 檢查 Thunderbolt NVMe
diskutil list external

# 預期輸出:
# /dev/diskX (external, physical):
#   NAME                        TYPE SIZE
#   Thunderbolt NVMe            ...
```

### 1.3 準備主控機腳本

```bash
# 主控機需要準備的腳本
~/momentry/setup/
├── 01_prepare_disk.sh
├── 02_install_macos.sh
├── 03_install_homebrew.sh
├── 04_install_dependencies.sh
├── 05_install_services.sh
├── 06_install_momentry.sh
├── 07_configure_network.sh
├── 08_start_services.sh
└── utils/
    ├── common.sh
    ├── backup.sh
    └── monitor.sh
```

---

## 階段二：Thunderbolt NVMe 準備

### 2.1 分割磁碟方案 A（推薦）

```bash
# 磁碟分割配置
diskutil partitionDisk /dev/diskX \
  GPT \
  "APFS System" APFS "Momentry System" 200G \
  "APFS Data" APFS "Momentry Data" 1.8T
```

### 2.2 分割磁碟方案 B（最小化）

```bash
# 統一 APFS 容器
diskutil partitionDisk /dev/diskX \
  GPT \
  APFS "Momentry" 100%
```

---

## 階段三：安裝 macOS

### 3.1 建立 macOS 安裝碟

```bash
# 下載 macOS Sonoma (或最新版本)
softwareupdate --fetch-full-installer --full-installer-version 14.0

# 建立可開機安裝碟
sudo /Applications/Install\ macOS\ Sonoma.app/Contents/Resources/createinstallinstmedi \
  --volume /Volumes/Momentry \
  --nointeraction
```

### 3.2 安裝 macOS 到 Thunderbolt NVMe

**兩種方法：**

#### 方法 A: 復原模式安裝
1. 連接 Thunderbolt NVMe
2. 重啟目標主機，按住Option鍵
3. 選擇 Thunderbolt NVMe 開機
4. 進入 Recovery Mode (Command+R)
5. 使用 Disk Utility 格式化目標磁碟
6. 安裝 macOS

#### 方法 B: ASR 複製（建議）
```bash
# 從主控機執行
# 將現有系統複製到目標磁碟
sudo asr restore \
  --source /Volumes/Macintosh\ HD \
  --target /Volumes/Momentry \
  --erase --noprompt
```

### 3.3 設定 macOS

```bash
# 自動化設定腳本
./setup/scripts/03_install_homebrew.sh
```

**設定項目：**
- 電腦名稱：`momentry-<serial>`
- 使用者帳號：`momentry` (管理員)
- SSH 遠端登入：啟用
- 螢幕鎖定：關閉
- 節能設定：永不休眠

---

## 階段四：安裝 Homebrew

### 4.1 安裝 Homebrew

```bash
#!/bin/bash
# 04_install_homebrew.sh

# 檢查架構
ARCH=$(uname -m)

if [ "$ARCH" = "arm64" ]; then
  # Apple Silicon
  /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
  eval "$(/opt/homebrew/bin/brew shellenv)"
elif [ "$ARCH" = "x86_64" ]; then
  # Intel
  /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  echo 'eval "$(/usr/local/bin/brew shellenv)"' >> ~/.zprofile
  eval "$(/usr/local/bin/brew shellenv)"
fi

# 驗證
brew --version
```

### 4.2 安裝基礎工具

```bash
# 基礎開發工具
brew install \
  git \
  curl \
  wget \
  jq \
  yq \
  tree \
  htop \
  tmux \
  zsh \
  zsh-completions
```

---

## 階段五：安裝服務

### 5.1 安裝資料庫服務

```bash
#!/bin/bash
# 05_install_services.sh

# PostgreSQL
brew install postgresql@18
brew services start postgresql@18

# MongoDB
brew tap mongodb/brew
brew install mongodb-community
brew services start mongodb-community

# MariaDB
brew install mariadb
brew services start mariadb

# Redis
brew install redis
brew services start redis

# Qdrant (需要 Cargo)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
cargo install qdrant
```

### 5.2 安裝應用服務

```bash
# Ollama
brew install ollama
brew services start ollama

# Caddy
brew install caddy
brew services start caddy

# Gitea
brew install gitea
brew services start gitea

# PHP
brew install php
brew services start php

# n8n
brew install n8n
brew services start n8n
```

### 5.3 Launchd 服務配置

```xml
<!-- /Library/LaunchDaemons/com.momentry.postgresql.plist -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.momentry.postgresql</string>
    <key>UserName</key>
    <string>momentry</string>
    <key>ProgramArguments</key>
    <array>
        <string>/opt/homebrew/opt/postgresql@18/bin/postgres</string>
        <string>-D</string>
        <string>/Volumes/Momentry/momentry/var/postgresql</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
    <key>StandardOutPath</key>
    <string>/Volumes/Momentry/momentry/log/postgresql.log</string>
    <key>StandardErrorPath</key>
    <string>/Volumes/Momentry/momentry/log/postgresql.error.log</string>
</dict>
</plist>
```

---

## 階段六：安裝 Momentry Core

### 6.1 複製原始碼

```bash
#!/bin/bash
# 06_install_momentry.sh

# 建立 Momentry 目錄
mkdir -p /Volumes/Momentry/momentry/{var,etc,log,scripts,backup}
mkdir -p /Volumes/Momentry/momentry_core

# 複製原始碼
rsync -av \
  --exclude 'target' \
  --exclude '.git' \
  --exclude 'node_modules' \
  /Users/accusys/momentry_core_0.1/ \
  /Volumes/Momentry/momentry_core/

# 編譯 Rust 專案
cd /Volumes/Momentry/momentry_core
cargo build --release
```

### 6.2 初始化資料庫

```bash
# 建立 PostgreSQL 資料庫
psql -U postgres <<EOF
CREATE DATABASE momentry;
CREATE DATABASE n8n;
CREATE DATABASE video_register;
CREATE USER momentry WITH PASSWORD 'momentry_password';
CREATE USER n8n WITH PASSWORD 'n8n_password';
GRANT ALL PRIVILEGES ON DATABASE momentry TO momentry;
GRANT ALL PRIVILEGES ON DATABASE n8n TO n8n;
EOF

# 執行 migration
cd /Volumes/Momentry/momentry_core
sqlx migrate run
```

### 6.3 配置環境變數

```bash
# ~/.zshrc 或 ~/.bash_profile
export DATABASE_URL="postgres://momentry:momentry_password@localhost:5432/momentry"
export REDIS_URL="redis://:momentry_password@localhost:6379"
export QDRANT_URL="http://localhost:6333"
export MONGODB_URI="mongodb://localhost:27017/momentry"
export MOMENTRY_OUTPUT_DIR="/Volumes/Momentry/momentry/var/output"
export MOMENTRY_LOG_LEVEL="info"
```

---

## 階段七：網路配置

### 7.1 設定固定 IP（可選）

```bash
# 網路配置腳本
#!/bin/bash
# 07_configure_network.sh

# 取得網路介面
INTERFACE=$(networksetup -listallnetworkservices | grep "Thunderbolt")

# 設定固定 IP
networksetup -setmanual "$INTERFACE" \
  192.168.1.100 \
  255.255.255.0 \
  192.168.1.1

# 設定 DNS
networksetup -setdnsservers "$INTERFACE" \
  8.8.8.8 \
  8.8.4.4
```

### 7.2 配置防火牆

```bash
# 開放服務端口
# 使用 macOS Firewall 或 pfctl
```

### 7.3 設定 SSH 金鑰

```bash
# 產生 SSH 金鑰對
ssh-keygen -t ed25519 -C "momentry@$(hostname)"

# 複製公鑰到目標主機
ssh-copy-id momentry@target-host

# 主控機 SSH 配置
# ~/.ssh/config
Host momentry-target
  HostName 192.168.1.100
  User momentry
  IdentityFile ~/.ssh/id_ed25519
```

---

## 階段八：啟動服務

### 8.1 啟動順序

```bash
#!/bin/bash
# 08_start_services.sh

# 1. 基礎服務
launchctl load /Library/LaunchDaemons/com.momentry.postgresql.plist
launchctl load /Library/LaunchDaemons/com.momentry.mongodb.plist
launchctl load /Library/LaunchDaemons/com.momentry.mariadb.plist
launchctl load /Library/LaunchDaemons/com.momentry.redis.plist

sleep 10

# 2. 向量資料庫
launchctl load /Library/LaunchDaemons/com.momentry.qdrant.plist

sleep 5

# 3. 應用服務
launchctl load /Library/LaunchDaemons/com.momentry.ollama.plist
launchctl load /Library/LaunchDaemons/com.momentry.caddy.plist

sleep 5

# 4. 其他服務
launchctl load /Library/LaunchDaemons/com.momentry.gitea.plist
launchctl load /Library/LaunchDaemons/com.momentry.php.plist
launchctl load /Library/LaunchDaemons/com.momentry.n8n.main.plist
launchctl load /Library/LaunchDaemons/com.momentry.n8n.worker.plist

# 5. Momentry Core
launchctl load /Library/LaunchDaemons/com.momentry.sftpgo.plist
launchctl load /Library/LaunchDaemons/com.momentry.rustdesk.hbbs.plist
launchctl load /Library/LaunchDaemons/com.momentry.rustdesk.hbbr.plist
```

### 8.2 驗證服務

```bash
# 檢查所有服務狀態
function check_services() {
  services=(
    "postgresql"
    "mongodb"
    "mariadb"
    "redis"
    "qdrant"
    "ollama"
    "caddy"
    "gitea"
    "php"
    "n8n"
    "sftpgo"
  )
  
  for service in "${services[@]}"; do
    if launchctl list | grep "$service" | grep -q "running"; then
      echo "✅ $service: Running"
    else
      echo "❌ $service: Not running"
    fi
  done
}

check_services
```

---

## 階段九：備份與還原

### 9.1 備份策略

```bash
#!/bin/bash
# 備份腳本

BACKUP_DIR="/Volumes/Momentry/backup/$(date +%Y%m%d)"

# 1. PostgreSQL 備份
pg_dump -U momentry momentry > "$BACKUP_DIR/momentry.sql"
pg_dump -U n8n n8n > "$BACKUP_DIR/n8n.sql"

# 2. MongoDB 備份
mongodump --out "$BACKUP_DIR/mongodb"

# 3. Redis 備份
redis-cli BGSAVE
cp /Volumes/Momentry/var/redis/dump.rdb "$BACKUP_DIR/redis.rdb"

# 4. Qdrant 備份
curl -X POST http://localhost:6333/collections/accusysdb/snapshots

# 5. 配置檔案備份
tar -czf "$BACKUP_DIR/config.tar.gz" \
  /Volumes/Momentry/momentry/etc/
```

### 9.2 自動備份 Cron

```bash
# crontab -e
0 2 * * * /Volumes/Momentry/scripts/backup.sh
0 3 * * 0 /Volumes/Momentry/scripts/backup_full.sh
```

---

## 階段十：監控與維護

### 10.1 健康檢查腳本

```bash
#!/bin/bash
# health_check.sh

# 檢查所有服務
check_postgresql() {
  pg_isready -q && echo "✅ PostgreSQL" || echo "❌ PostgreSQL"
}

check_mongodb() {
  mongosh --eval "db.stats()" > /dev/null 2>&1 && echo "✅ MongoDB" || echo "❌ MongoDB"
}

check_redis() {
  redis-cli ping > /dev/null 2>&1 && echo "✅ Redis" || echo "❌ Redis"
}

check_qdrant() {
  curl -s http://localhost:6333/health && echo "✅ Qdrant" || echo "❌ Qdrant"
}

check_n8n() {
  curl -s http://localhost:5678/api/v1/workflows > /dev/null 2>&1 && echo "✅ n8n" || echo "❌ n8n"
}

check_momentry() {
  curl -s http://localhost:3002/api/v1/videos > /dev/null 2>&1 && echo "✅ Momentry" || echo "❌ Momentry"
}
```

### 10.2 日誌輪替

```bash
# 新聞日誌配置
/Volumes/Momentry/momentry/log/*.log {
  daily
  rotate 7
  compress
  missingok
  notifempty
  create 644 momentry staff
}
```

---

## 自動化腳本架構

### 主控腳本：部署控制器

```bash
#!/bin/bash
# deploy_controller.sh
# 用於從主控機部署到目標主機

set -e

# 配置
TARGET_HOST="momentry@192.168.1.100"
TARGET_DISK="/dev/disk2"

# 顏色定義
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

function log_info() {
  echo -e "${GREEN}[INFO]${NC} $1"
}

function log_warn() {
  echo -e "${YELLOW}[WARN]${NC} $1"
}

function log_error() {
  echo -e "${RED}[ERROR]${NC} $1"
}

# 階段執行
function run_stage() {
  local stage=$1
  local script=$2
  
  log_info "執行階段: $stage..."
  ssh "$TARGET_HOST" "bash /Volumes/Momentry/scripts/$script"
  
  if [ $? -eq 0 ]; then
    log_info "✅ 階段完成: $stage"
  else
    log_error "❌ 階段失敗: $stage"
    exit 1
  fi
}

# 主程序
log_info "開始 Momentry 系統部署..."

# 執行各階段
run_stage "磁碟準備" "01_prepare_disk.sh"
run_stage "macOS 安裝" "02_install_macos.sh"
run_stage "Homebrew 安裝" "03_install_homebrew.sh"
run_stage "依賴安裝" "04_install_dependencies.sh"
run_stage "服務安裝" "05_install_services.sh"
run_stage "Momentry 安裝" "06_install_momentry.sh"
run_stage "網路配置" "07_configure_network.sh"
run_stage "啟動服務" "08_start_services.sh"

log_info "✅ 部署完成！"
```

---

## 待確認事項

### 需要與使用者確認

1. **目標主機型號**
   - Intel Mac 或 Apple Silicon？
   - Thunderbolt 版本 (3/4)？
   
2. **網路配置**
   - DHCP 或固定 IP？
   - 目標 IP 網段？
   
3. **磁碟配置**
   - 分割方案 A (200G 系統 + 1.8T 資料)？
   - 分割方案 B (統一磁碟區)？
   
4. **服務需求**
   - 需要安裝全部服務？
   - 還是選擇性安裝？
   
5. **備份策略**
   - 本地備份？
   - 遠端備份？
   - 備份頻率？
   
6. **監控需求**
   - Prometheus + Grafana？
   - 簡單腳本監控？

---

## 預估時間

| 階段 | 預估時間 | 備註 |
|------|---------|------|
| 前置準備 | 30 分鐘 | 收集資訊、準備腳本 |
| 磁碟準備 | 10 分鐘 | 分割格式化 |
| macOS 安裝 | 30-60 分鐘 | 視 USB 速度 |
| Homebrew 安裝 | 15 分鐘 | 下載速度 |
| 服務安裝 | 60-90 分鐘 | 多個服務 |
| Momentry 安裝 | 20 分鐘 | 編譯 Rust |
| 網路配置 | 10 分鐘 | 固定 IP |
| 服務啟動 | 15 分鐘 | 依序啟動 |
| 驗證測試 | 30 分鐘 | 完整測試 |
| **總計** | **3-4 小時** | 自動化後可縮短 |

---

## 風險與應對

| 風險 | 機率 | 影響 | 應對措施 |
|------|------|------|---------|
| Thunderbolt 不相容 | 低 | 高 | 準備多種驅動 |
| macOS 安裝失敗 | 低 | 高 | 準備還原方案 |
| 服務啟動失敗 | 中 | 中 | 日誌診斷腳本 |
| 網路連線問題 | 中 | 中 | 有線網路備援 |
| 儲存空間不足 | 低 | 高 | 磁碟空間檢查 |

---

## 下一步行動

1. ✅ 確認目標主機規格
2. ✅ 確認 Thunderbolt NVMe 容量
3. ✅ 確認網路配置
4. ✅ 選擇服務清單
5. ✅ 準備安裝腳本
6. ✅ 測試腳本執行
7. ✅ 正式部署

---

## 附錄

### A. 服務端口對照表

| 服務 | Port | 協議 |
|------|------|------|
| PostgreSQL | 5432 | TCP |
| MongoDB | 27017 | TCP |
| MariaDB | 3306 | TCP |
| Redis | 6379 | TCP |
| Qdrant API | 6333 | HTTP |
| Qdrant gRPC | 6334 | gRPC |
| Ollama | 11434 | HTTP |
| Caddy HTTP | 80 | HTTP |
| Caddy HTTPS | 443 | HTTPS |
| Gitea | 3000 | HTTP |
| PHP-FPM | 9000 | FastCGI |
| n8n | 5678 | HTTP |
| SFTPGo | 2022 | SFTP |
| RustDesk hbbs | 21115 | TCP |
| RustDesk hbbr | 21117 | TCP |
| Momentry | 3002 | HTTP |
| Prometheus | 9090 | HTTP |

### B. 環境變數清單

見 `.env` 範例檔案或 `docs_v1.0/OPERATIONS/MOMENTRY_CORE_MONITORING.md`

### C. 疑難排解

見 `docs_v1.0/REFERENCE/PENDING_ISSUES.md`

---

**計劃狀態**: 📝 草稿 - 等待使用者確認後執行

**負責人**: OpenCode AI Assistant

**最後更新**: 2026-03-23
