feat: EwoooC 初始化 — 完整專案推版至 Gitea
Some checks failed
CD Pipeline / deploy (push) Failing after 59s

- 建立 Gitea Actions CD pipeline (.gitea/workflows/cd.yaml)
- 部署模式: rsync Python 檔案至 188 → docker restart (volume mount)
- Dockerfile/requirements 變動時自動重建 Docker image
- 部署通知: Telegram (開始/成功/失敗)
- 健康檢查: https://mo.wooo.work/health (最多 5 次重試)
- 同步最新 CLAUDE.md / ADR-008 / memory (2026-04-19)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
ogt
2026-04-19 01:21:13 +08:00
commit 1b4f3a7bbe
504 changed files with 387725 additions and 0 deletions

53
deploy_scripts/backup.sh Normal file
View File

@@ -0,0 +1,53 @@
#!/bin/bash
# backup.sh - 備份資料庫和重要檔案
set -e
BACKUP_DIR="$HOME/backups"
APP_DIR="$HOME/momo_pro_system"
DATE=$(date +%Y%m%d_%H%M%S)
echo "=========================================="
echo "Momo Pro System - 備份"
echo "=========================================="
# 建立備份目錄
mkdir -p "$BACKUP_DIR"
# 備份資料庫
echo "💾 備份資料庫..."
if [ -f "$APP_DIR/data/momo_database.db" ]; then
cp "$APP_DIR/data/momo_database.db" "$BACKUP_DIR/momo_db_$DATE.db"
echo "✅ 資料庫已備份到: $BACKUP_DIR/momo_db_$DATE.db"
else
echo "⚠️ 找不到資料庫檔案"
fi
# 備份 .env 檔案
echo "🔐 備份環境變數..."
if [ -f "$APP_DIR/.env" ]; then
cp "$APP_DIR/.env" "$BACKUP_DIR/env_$DATE.backup"
echo "✅ .env 已備份"
fi
# 備份日誌(最近 7 天)
echo "📋 備份日誌..."
if [ -d "$APP_DIR/logs" ]; then
tar -czf "$BACKUP_DIR/logs_$DATE.tar.gz" -C "$APP_DIR" logs/
echo "✅ 日誌已備份"
fi
# 清理舊備份(保留最近 7 天)
echo "🧹 清理舊備份..."
find "$BACKUP_DIR" -name "momo_db_*.db" -mtime +7 -delete
find "$BACKUP_DIR" -name "env_*.backup" -mtime +7 -delete
find "$BACKUP_DIR" -name "logs_*.tar.gz" -mtime +7 -delete
# 顯示備份大小
echo ""
echo "📊 備份統計:"
du -sh "$BACKUP_DIR"
echo ""
echo "✅ 備份完成!"
echo "備份位置: $BACKUP_DIR"

108
deploy_scripts/deploy_cloudrun.sh Executable file
View File

@@ -0,0 +1,108 @@
#!/bin/bash
# deploy_cloudrun.sh - 一鍵部署到 Google Cloud Run
set -e
echo "=========================================="
echo "部署 Momo Pro System 到 Cloud Run"
echo "=========================================="
# 檢查是否已登入 gcloud
if ! gcloud auth list --filter=status:ACTIVE --format="value(account)" | grep -q .; then
echo "❌ 請先登入 gcloud"
echo " gcloud auth login"
exit 1
fi
# 取得或設定專案 ID
PROJECT_ID=$(gcloud config get-value project 2>/dev/null)
if [ -z "$PROJECT_ID" ]; then
read -p "請輸入 GCP 專案 ID: " PROJECT_ID
gcloud config set project $PROJECT_ID
fi
echo "📋 使用專案: $PROJECT_ID"
# 設定區域
REGION="asia-east1"
SERVICE_NAME="momo-pro-system"
# 詢問是否需要設定環境變數
echo ""
read -p "是否需要設定環境變數?(y/n): " SETUP_ENV
if [ "$SETUP_ENV" = "y" ]; then
echo ""
echo "請輸入環境變數(留空跳過):"
read -p "EMAIL_USER: " EMAIL_USER
read -sp "EMAIL_PASSWORD: " EMAIL_PASSWORD
echo ""
read -p "SMTP_SERVER (預設: smtp.gmail.com): " SMTP_SERVER
SMTP_SERVER=${SMTP_SERVER:-smtp.gmail.com}
read -p "SMTP_PORT (預設: 587): " SMTP_PORT
SMTP_PORT=${SMTP_PORT:-587}
fi
# 啟用必要的 API
echo ""
echo "📡 啟用必要的 GCP API..."
gcloud services enable \
run.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com
# 部署到 Cloud Run直接從原始碼建立
echo ""
echo "🚀 部署到 Cloud Run..."
echo " 這可能需要幾分鐘時間..."
DEPLOY_CMD="gcloud run deploy $SERVICE_NAME \
--source . \
--region=$REGION \
--allow-unauthenticated \
--port=5000 \
--memory=2Gi \
--cpu=2 \
--min-instances=0 \
--max-instances=10 \
--timeout=300"
# 添加環境變數
if [ "$SETUP_ENV" = "y" ] && [ ! -z "$EMAIL_USER" ]; then
DEPLOY_CMD="$DEPLOY_CMD --set-env-vars=EMAIL_USER=$EMAIL_USER,SMTP_SERVER=$SMTP_SERVER,SMTP_PORT=$SMTP_PORT"
# 處理密碼(使用 Secret Manager
if [ ! -z "$EMAIL_PASSWORD" ]; then
echo "🔐 設定 Email 密碼到 Secret Manager..."
echo -n "$EMAIL_PASSWORD" | gcloud secrets create email-password --data-file=- || \
echo -n "$EMAIL_PASSWORD" | gcloud secrets versions add email-password --data-file=-
DEPLOY_CMD="$DEPLOY_CMD --set-secrets=EMAIL_PASSWORD=email-password:latest"
fi
fi
# 執行部署
eval $DEPLOY_CMD
# 取得服務 URL
SERVICE_URL=$(gcloud run services describe $SERVICE_NAME \
--region=$REGION \
--format='value(status.url)')
echo ""
echo "=========================================="
echo "✅ 部署成功!"
echo "=========================================="
echo ""
echo "🌐 服務 URL: $SERVICE_URL"
echo ""
echo "📊 查看日誌:"
echo " gcloud logging read \"resource.type=cloud_run_revision AND resource.labels.service_name=$SERVICE_NAME\" --limit=50"
echo ""
echo "🔄 更新服務:"
echo " ./deploy_scripts/deploy_cloudrun.sh"
echo ""
echo "❌ 刪除服務:"
echo " gcloud run services delete $SERVICE_NAME --region=$REGION"
echo ""
echo "💰 查看費用:"
echo " https://console.cloud.google.com/billing"
echo ""

View File

@@ -0,0 +1,87 @@
#!/bin/bash
# =============================================================================
# WOOO TECH - Momo Pro System
# UAT VM 開機自動啟動 Docker 服務配置腳本
# =============================================================================
set -e
echo "=========================================="
echo "配置 Docker 開機自動啟動"
echo "=========================================="
# 檢查是否為 root 或有 sudo 權限
if [ "$EUID" -ne 0 ]; then
echo "請使用 sudo 執行此腳本"
echo "用法: sudo bash setup_autostart.sh"
exit 1
fi
# 1. 確保 Docker 服務開機自動啟動
echo ""
echo "[1/4] 啟用 Docker 服務開機自動啟動..."
systemctl enable docker
systemctl is-enabled docker
# 2. 確保 Docker 服務正在運行
echo ""
echo "[2/4] 確認 Docker 服務狀態..."
systemctl start docker
systemctl status docker --no-pager | head -5
# 3. 創建 Momo Pro System 的 systemd 服務
echo ""
echo "[3/4] 創建 Momo Pro System systemd 服務..."
# 獲取實際的安裝路徑
INSTALL_PATH="${INSTALL_PATH:-/home/wooo/momo_pro_system}"
cat > /etc/systemd/system/momo-docker.service << EOF
[Unit]
Description=Momo Pro System Docker Compose
Documentation=https://github.com/wooo-tech/momo-pro-system
Requires=docker.service
After=docker.service network-online.target
Wants=network-online.target
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=${INSTALL_PATH}
ExecStart=/usr/bin/docker compose --profile monitoring up -d
ExecStop=/usr/bin/docker compose --profile monitoring down
ExecReload=/usr/bin/docker compose --profile monitoring restart
TimeoutStartSec=300
TimeoutStopSec=120
[Install]
WantedBy=multi-user.target
EOF
echo "服務檔案已創建: /etc/systemd/system/momo-docker.service"
# 4. 啟用並啟動服務
echo ""
echo "[4/4] 啟用 Momo Pro System 服務..."
systemctl daemon-reload
systemctl enable momo-docker.service
systemctl is-enabled momo-docker.service
echo ""
echo "=========================================="
echo "✅ 配置完成!"
echo "=========================================="
echo ""
echo "服務管理命令:"
echo " 啟動服務: sudo systemctl start momo-docker"
echo " 停止服務: sudo systemctl stop momo-docker"
echo " 重啟服務: sudo systemctl restart momo-docker"
echo " 查看狀態: sudo systemctl status momo-docker"
echo " 查看日誌: sudo journalctl -u momo-docker -f"
echo ""
echo "驗證自動啟動配置:"
echo " sudo systemctl is-enabled momo-docker"
echo ""
echo "如需修改安裝路徑,請設置環境變數:"
echo " sudo INSTALL_PATH=/your/path bash setup_autostart.sh"
echo ""

View File

@@ -0,0 +1,73 @@
#!/bin/bash
# setup_nginx.sh - 設定 Nginx 反向代理
set -e
echo "=========================================="
echo "設定 Nginx 反向代理"
echo "=========================================="
# 詢問域名或 IP
read -p "請輸入您的域名或 IP 地址 (例如: example.com 或 34.80.1.1): " DOMAIN
echo "📝 建立 Nginx 設定檔..."
sudo tee /etc/nginx/sites-available/momo > /dev/null <<EOF
server {
listen 80;
server_name $DOMAIN;
# 上傳大小限制
client_max_body_size 50M;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
# WebSocket 支援(如果需要)
proxy_http_version 1.1;
proxy_set_header Upgrade \$http_upgrade;
proxy_set_header Connection "upgrade";
# 超時設定
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
# 靜態檔案快取
location /static/ {
alias /home/$USER/momo_pro_system/static/;
expires 30d;
add_header Cache-Control "public, immutable";
}
}
EOF
# 建立軟連結
echo "🔗 啟用站點..."
sudo ln -sf /etc/nginx/sites-available/momo /etc/nginx/sites-enabled/
# 移除預設站點
sudo rm -f /etc/nginx/sites-enabled/default
# 測試設定
echo "🧪 測試 Nginx 設定..."
sudo nginx -t
# 重啟 Nginx
echo "🔄 重啟 Nginx..."
sudo systemctl restart nginx
sudo systemctl enable nginx
echo ""
echo "✅ Nginx 設定完成!"
echo ""
echo "您的應用現在可以通過以下網址訪問:"
echo " http://$DOMAIN"
echo ""
echo "如需設定 HTTPS (SSL),請執行:"
echo " sudo apt install certbot python3-certbot-nginx"
echo " sudo certbot --nginx -d $DOMAIN"

View File

@@ -0,0 +1,73 @@
#!/bin/bash
# setup_service.sh - 設定 systemd 服務(需要 sudo 權限)
set -e
USER_NAME=$(whoami)
APP_DIR="$HOME/momo_pro_system"
echo "=========================================="
echo "設定 systemd 服務"
echo "=========================================="
# 建立主服務檔案
echo "📝 建立 momo.service..."
sudo tee /etc/systemd/system/momo.service > /dev/null <<EOF
[Unit]
Description=Momo Pro System - Flask Application
After=network.target
[Service]
Type=simple
User=$USER_NAME
WorkingDirectory=$APP_DIR
Environment="PATH=$APP_DIR/venv/bin"
ExecStart=$APP_DIR/venv/bin/python app.py
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
EOF
# 建立排程服務檔案
echo "📝 建立 momo-scheduler.service..."
sudo tee /etc/systemd/system/momo-scheduler.service > /dev/null <<EOF
[Unit]
Description=Momo Pro System - Scheduler
After=network.target
[Service]
Type=simple
User=$USER_NAME
WorkingDirectory=$APP_DIR
Environment="PATH=$APP_DIR/venv/bin"
ExecStart=$APP_DIR/venv/bin/python scheduler.py
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
EOF
# 重新載入 systemd
echo "🔄 重新載入 systemd..."
sudo systemctl daemon-reload
# 啟用服務
echo "✅ 啟用服務..."
sudo systemctl enable momo
sudo systemctl enable momo-scheduler
echo ""
echo "✅ 服務設定完成!"
echo ""
echo "可以使用以下指令:"
echo " 啟動服務: sudo systemctl start momo"
echo " 查看狀態: sudo systemctl status momo"
echo " 查看日誌: sudo journalctl -u momo -f"
echo " 重啟服務: sudo systemctl restart momo"

View File

@@ -0,0 +1,59 @@
#!/bin/bash
# setup_vm.sh - 在 GCP VM 上執行此腳本來設定環境
set -e # 發生錯誤時停止
echo "=========================================="
echo "Momo Pro System - VM 環境設定"
echo "=========================================="
# 更新系統
echo "📦 更新系統套件..."
sudo apt update
sudo apt upgrade -y
# 安裝必要工具
echo "🔧 安裝必要工具..."
sudo apt install -y \
python3-pip \
python3-venv \
git \
nginx \
chromium-browser \
chromium-chromedriver \
curl \
wget
# 進入應用目錄
cd ~/momo_pro_system
# 建立虛擬環境
echo "🐍 建立 Python 虛擬環境..."
python3 -m venv venv
source venv/bin/activate
# 安裝 Python 依賴
echo "📚 安裝 Python 套件..."
pip install --upgrade pip
pip install -r requirements.txt
# 初始化資料庫
echo "💾 初始化資料庫..."
python init_db.py
# 建立必要目錄
echo "📁 建立必要目錄..."
mkdir -p logs
mkdir -p data
mkdir -p backups
# 設定權限
chmod +x start.sh
echo ""
echo "✅ 環境設定完成!"
echo ""
echo "接下來請執行:"
echo "1. 編輯 .env 檔案: nano .env"
echo "2. 設定 systemd 服務: sudo ./deploy_scripts/setup_service.sh"
echo "3. 啟動服務: sudo systemctl start momo"

View File

@@ -0,0 +1,99 @@
#!/bin/bash
# test_docker_local.sh - 本機測試 Docker 部署
set -e
echo "=========================================="
echo "本機 Docker 測試"
echo "=========================================="
# 檢查 Docker 是否安裝
if ! command -v docker &> /dev/null; then
echo "❌ Docker 未安裝"
echo " 請安裝 Docker Desktop: https://www.docker.com/products/docker-desktop"
exit 1
fi
# 檢查 Docker 是否運行
if ! docker info &> /dev/null; then
echo "❌ Docker 未運行"
echo " 請啟動 Docker Desktop"
exit 1
fi
# 檢查 .env 檔案
if [ ! -f ".env" ]; then
echo "⚠️ 找不到 .env 檔案"
read -p "是否建立 .env 檔案?(y/n): " CREATE_ENV
if [ "$CREATE_ENV" = "y" ]; then
cat > .env <<EOF
# Flask 設定
FLASK_ENV=production
SECRET_KEY=$(openssl rand -hex 32)
# Email 設定
EMAIL_USER=your-email@gmail.com
EMAIL_PASSWORD=your-app-password
SMTP_SERVER=smtp.gmail.com
SMTP_PORT=587
# 資料庫
DATABASE_PATH=data/momo_database.db
EOF
echo "✅ 已建立 .env 檔案,請編輯後再次執行此腳本"
exit 0
fi
fi
# 停止現有容器
echo ""
echo "🛑 停止現有容器..."
docker-compose down 2>/dev/null || true
# 建立並啟動容器
echo ""
echo "🔨 建立 Docker 映像..."
docker-compose build
echo ""
echo "🚀 啟動容器..."
docker-compose up -d
# 等待服務啟動
echo ""
echo "⏳ 等待服務啟動..."
sleep 5
# 檢查容器狀態
echo ""
echo "📊 容器狀態:"
docker-compose ps
# 測試健康檢查
echo ""
echo "🏥 測試健康檢查..."
if curl -f http://localhost:80/health &>/dev/null; then
echo "✅ 健康檢查通過"
else
echo "⚠️ 健康檢查失敗,查看日誌:"
docker-compose logs --tail=20
fi
echo ""
echo "=========================================="
echo "✅ Docker 容器已啟動!"
echo "=========================================="
echo ""
echo "🌐 訪問應用: http://localhost"
echo ""
echo "📋 查看日誌:"
echo " docker-compose logs -f"
echo ""
echo "🔍 進入容器:"
echo " docker exec -it momo-pro-system bash"
echo ""
echo "🛑 停止容器:"
echo " docker-compose down"
echo ""
echo "🗑️ 刪除所有數據:"
echo " docker-compose down -v"
echo ""