Files
ewoooc/deploy_docker_guide.md
ogt 1b4f3a7bbe
Some checks failed
CD Pipeline / deploy (push) Failing after 59s
feat: EwoooC 初始化 — 完整專案推版至 Gitea
- 建立 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>
2026-04-19 01:21:13 +08:00

8.0 KiB
Raw Blame History

Momo Pro System - Docker 部署指南

方案一:本機測試 Docker 部署

1. 確認環境

# 確認 Docker 已安裝
docker --version
docker-compose --version

2. 建立並啟動容器

# 建立映像並啟動服務
docker-compose up -d

# 查看日誌
docker-compose logs -f

# 查看容器狀態
docker-compose ps

3. 測試訪問

瀏覽器開啟:http://localhost

4. 停止服務

# 停止容器
docker-compose down

# 停止並刪除 volumes
docker-compose down -v

方案二:部署到 GCP Cloud Run推薦

優點:

  • 完全託管,自動擴展
  • 按使用付費(沒有流量時不收費)
  • 自動 HTTPS
  • 不需要管理 VM

1. 設定 GCP 專案

# 設定專案 ID
export PROJECT_ID="your-project-id"
gcloud config set project $PROJECT_ID

# 啟用必要的 API
gcloud services enable \
    run.googleapis.com \
    cloudbuild.googleapis.com \
    artifactregistry.googleapis.com

2. 建立 Artifact Registry

# 建立 Docker repository
gcloud artifacts repositories create momo-repo \
    --repository-format=docker \
    --location=asia-east1 \
    --description="Momo Pro System Docker Repository"

3. 建立並推送 Docker 映像

# 設定映像名稱
export IMAGE_NAME="asia-east1-docker.pkg.dev/$PROJECT_ID/momo-repo/momo-app"

# 建立映像
docker build -t $IMAGE_NAME .

# 推送到 Artifact Registry
docker push $IMAGE_NAME

4. 部署到 Cloud Run

# 部署服務
gcloud run deploy momo-pro-system \
    --image=$IMAGE_NAME \
    --platform=managed \
    --region=asia-east1 \
    --allow-unauthenticated \
    --port=5000 \
    --memory=2Gi \
    --cpu=2 \
    --min-instances=1 \
    --max-instances=10 \
    --timeout=300 \
    --set-env-vars="FLASK_ENV=production" \
    --set-secrets="DATABASE_URL=momo-db-url:latest"

5. 設定環境變數和 Secrets

# 建立 secret例如EMAIL_PASSWORD
echo -n "your-password" | gcloud secrets create email-password --data-file=-

# 更新 Cloud Run 服務使用 secret
gcloud run services update momo-pro-system \
    --region=asia-east1 \
    --set-secrets=EMAIL_PASSWORD=email-password:latest

6. 獲取服務 URL

gcloud run services describe momo-pro-system \
    --region=asia-east1 \
    --format='value(status.url)'

方案三:部署到 GCP Compute Engine (VM)

1. 建立 VM

# 建立具有 Docker 的 VM
gcloud compute instances create momo-server \
    --zone=asia-east1-a \
    --machine-type=e2-medium \
    --image-family=cos-stable \
    --image-project=cos-cloud \
    --boot-disk-size=50GB \
    --tags=http-server,https-server

2. 設定防火牆規則

# 允許 HTTP 流量
gcloud compute firewall-rules create allow-http \
    --allow=tcp:80 \
    --target-tags=http-server

# 允許 HTTPS 流量
gcloud compute firewall-rules create allow-https \
    --allow=tcp:443 \
    --target-tags=https-server

3. 上傳程式碼到 VM

# 上傳整個專案
gcloud compute scp --recurse . momo-server:~/momo_pro_system \
    --zone=asia-east1-a

4. 連接到 VM 並啟動服務

# SSH 到 VM
gcloud compute ssh momo-server --zone=asia-east1-a

# 在 VM 上執行
cd ~/momo_pro_system

# 啟動服務
docker-compose up -d

# 查看日誌
docker-compose logs -f

5. 設定自動啟動

# 建立 systemd service
sudo tee /etc/systemd/system/momo-docker.service > /dev/null <<EOF
[Unit]
Description=Momo Pro System Docker
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/home/$USER/momo_pro_system
ExecStart=/usr/local/bin/docker-compose up -d
ExecStop=/usr/local/bin/docker-compose down
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target
EOF

# 啟用自動啟動
sudo systemctl enable momo-docker
sudo systemctl start momo-docker

方案四:使用 Google Kubernetes Engine (GKE)

適合需要更複雜的擴展和管理需求。

1. 建立 GKE 集群

gcloud container clusters create momo-cluster \
    --zone=asia-east1-a \
    --num-nodes=2 \
    --machine-type=e2-medium

2. 建立 Kubernetes 部署配置

建立 k8s-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: momo-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: momo
  template:
    metadata:
      labels:
        app: momo
    spec:
      containers:
      - name: momo-app
        image: asia-east1-docker.pkg.dev/PROJECT_ID/momo-repo/momo-app
        ports:
        - containerPort: 5000
        resources:
          requests:
            memory: "512Mi"
            cpu: "500m"
          limits:
            memory: "2Gi"
            cpu: "1000m"
---
apiVersion: v1
kind: Service
metadata:
  name: momo-service
spec:
  type: LoadBalancer
  selector:
    app: momo
  ports:
  - port: 80
    targetPort: 5000

3. 部署到 GKE

# 部署應用
kubectl apply -f k8s-deployment.yaml

# 查看狀態
kubectl get pods
kubectl get services

資料持久化

Cloud Run使用 Cloud SQL

# 建立 Cloud SQL 實例
gcloud sql instances create momo-db \
    --database-version=POSTGRES_14 \
    --tier=db-f1-micro \
    --region=asia-east1

# 建立資料庫
gcloud sql databases create momo \
    --instance=momo-db

# 連接 Cloud Run 到 Cloud SQL
gcloud run services update momo-pro-system \
    --add-cloudsql-instances=$PROJECT_ID:asia-east1:momo-db

VM/GKE使用 Persistent Disk

# 建立持久化磁碟
gcloud compute disks create momo-data \
    --size=50GB \
    --zone=asia-east1-a

# 掛載到 VM
gcloud compute instances attach-disk momo-server \
    --disk=momo-data \
    --zone=asia-east1-a

備份策略

自動備份腳本

# 在容器內設定 cron job
docker exec momo-pro-system sh -c "echo '0 2 * * * /app/backup.sh' | crontab -"

備份到 Cloud Storage

# 建立 Cloud Storage bucket
gsutil mb -l asia-east1 gs://momo-backups

# 備份資料庫
docker exec momo-pro-system tar -czf - /app/data | \
    gsutil cp - gs://momo-backups/backup-$(date +%Y%m%d-%H%M%S).tar.gz

監控和日誌

Cloud Run

# 查看日誌
gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=momo-pro-system" \
    --limit=50 \
    --format=json

# 設定監控警報
gcloud alpha monitoring policies create \
    --notification-channels=CHANNEL_ID \
    --display-name="Momo High Error Rate" \
    --condition-display-name="Error rate > 5%" \
    --condition-threshold-value=5

VM/Docker

# 查看容器日誌
docker-compose logs -f --tail=100

# 使用 Google Cloud Logging
docker plugin install gcplogs --alias gcplogs

成本估算

Cloud Run最省錢

  • 免費額度:每月 200 萬請求
  • CPU: $0.00002400 / vCPU 秒
  • 記憶體: $0.00000250 / GiB 秒
  • 預估:約 $10-30 / 月

Compute Engine (e2-medium)

  • VM: ~$25 / 月
  • 儲存: ~$2 / 月
  • 網路: ~$5 / 月
  • 預估:約 $32 / 月

GKE

  • 集群管理費: $73 / 月
  • 節點: ~$50 / 月
  • 預估:約 $123 / 月

推薦方案

對於 Momo Pro System建議使用 Cloud Run

  1. 成本最低
  2. 自動擴展
  3. 免維護
  4. 自動 HTTPS
  5. 快速部署

快速部署命令:

# 一鍵部署
gcloud run deploy momo-pro-system \
    --source . \
    --region=asia-east1 \
    --allow-unauthenticated \
    --port=5000

故障排除

容器無法啟動

# 查看詳細日誌
docker-compose logs momo-app

# 進入容器調試
docker exec -it momo-pro-system bash

資料庫連接問題

# 檢查環境變數
docker exec momo-pro-system env | grep DATABASE

# 測試資料庫連接
docker exec momo-pro-system python -c "import sqlite3; print(sqlite3.connect('/app/data/momo_database.db'))"

Cloud Run 超時

# 增加超時時間
gcloud run services update momo-pro-system \
    --timeout=900 \
    --region=asia-east1