- 建立 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:
442
deploy_docker_guide.md
Normal file
442
deploy_docker_guide.md
Normal file
@@ -0,0 +1,442 @@
|
||||
# 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
|
||||
```
|
||||
Reference in New Issue
Block a user