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

443 lines
8.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Momo Pro System - Docker 部署指南
## 方案一:本機測試 Docker 部署
### 1. 確認環境
```bash
# 確認 Docker 已安裝
docker --version
docker-compose --version
```
### 2. 建立並啟動容器
```bash
# 建立映像並啟動服務
docker-compose up -d
# 查看日誌
docker-compose logs -f
# 查看容器狀態
docker-compose ps
```
### 3. 測試訪問
瀏覽器開啟http://localhost
### 4. 停止服務
```bash
# 停止容器
docker-compose down
# 停止並刪除 volumes
docker-compose down -v
```
---
## 方案二:部署到 GCP Cloud Run推薦
**優點:**
- 完全託管,自動擴展
- 按使用付費(沒有流量時不收費)
- 自動 HTTPS
- 不需要管理 VM
### 1. 設定 GCP 專案
```bash
# 設定專案 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
```bash
# 建立 Docker repository
gcloud artifacts repositories create momo-repo \
--repository-format=docker \
--location=asia-east1 \
--description="Momo Pro System Docker Repository"
```
### 3. 建立並推送 Docker 映像
```bash
# 設定映像名稱
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
```bash
# 部署服務
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
```bash
# 建立 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
```bash
gcloud run services describe momo-pro-system \
--region=asia-east1 \
--format='value(status.url)'
```
---
## 方案三:部署到 GCP Compute Engine (VM)
### 1. 建立 VM
```bash
# 建立具有 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. 設定防火牆規則
```bash
# 允許 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
```bash
# 上傳整個專案
gcloud compute scp --recurse . momo-server:~/momo_pro_system \
--zone=asia-east1-a
```
### 4. 連接到 VM 並啟動服務
```bash
# 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. 設定自動啟動
```bash
# 建立 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 集群
```bash
gcloud container clusters create momo-cluster \
--zone=asia-east1-a \
--num-nodes=2 \
--machine-type=e2-medium
```
### 2. 建立 Kubernetes 部署配置
建立 `k8s-deployment.yaml`
```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
```bash
# 部署應用
kubectl apply -f k8s-deployment.yaml
# 查看狀態
kubectl get pods
kubectl get services
```
---
## 資料持久化
### Cloud Run使用 Cloud SQL
```bash
# 建立 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
```bash
# 建立持久化磁碟
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
```
---
## 備份策略
### 自動備份腳本
```bash
# 在容器內設定 cron job
docker exec momo-pro-system sh -c "echo '0 2 * * * /app/backup.sh' | crontab -"
```
### 備份到 Cloud Storage
```bash
# 建立 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
```bash
# 查看日誌
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
```bash
# 查看容器日誌
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. ✅ 快速部署
**快速部署命令:**
```bash
# 一鍵部署
gcloud run deploy momo-pro-system \
--source . \
--region=asia-east1 \
--allow-unauthenticated \
--port=5000
```
---
## 故障排除
### 容器無法啟動
```bash
# 查看詳細日誌
docker-compose logs momo-app
# 進入容器調試
docker exec -it momo-pro-system bash
```
### 資料庫連接問題
```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 超時
```bash
# 增加超時時間
gcloud run services update momo-pro-system \
--timeout=900 \
--region=asia-east1
```