Files
webmail-gateway/DEPLOYMENT.md

5.5 KiB
Raw Blame History

WebMail Gateway 部署指南

環境架構

開發環境 (Development)

  • 主機: 10.1.0.245 (Windows 桌機)
  • 目錄: D:\_Develop\porscheworld_develop\webmail-gateway\
  • Port: 8100
  • 啟動: START_DEVELOPMENT.bat
  • 用途: 開發、測試、功能迭代

正式環境 (Production)

  • 主機: 10.1.0.254 (Ubuntu Server - home)
  • 目錄: /home/porsche/services/webmail-gateway/
  • Port: 8000 (容器內)
  • 啟動: docker compose up -d
  • 用途: 對外服務、穩定運行

開發流程

1. 在開發環境啟動服務

cd D:\_Develop\porscheworld_develop\webmail-gateway
START_DEVELOPMENT.bat

2. 切換 Traefik 路由到開發機

在伺服器上執行:

ssh porsche@10.1.0.254

# 停止正式環境容器
cd /home/porsche/services/webmail-gateway
docker compose down

# 建立 Traefik dynamic 配置目錄 (如果不存在)
mkdir -p /home/porsche/traefik/dynamic

# 上傳開發路由配置
# (從開發機執行)
scp traefik-dev-route.yml porsche@10.1.0.254:/home/porsche/traefik/dynamic/webmail-dev.yml

# Traefik 會自動重新載入配置

3. 開發與測試

現在訪問 https://webmail.lab.taipei 會自動路由到開發機 (10.1.0.245:8100)

  • 支援熱重載 (--reload)
  • 可以即時修改程式碼
  • 可以使用 debugger

4. 切換回正式環境

ssh porsche@10.1.0.254

# 刪除開發路由配置
rm /home/porsche/traefik/dynamic/webmail-dev.yml

# 啟動正式環境容器
cd /home/porsche/services/webmail-gateway
docker compose up -d

部署到正式環境

方案 A: 直接複製 (快速)

# 1. 停止開發伺服器 (Ctrl+C)

# 2. 從開發機上傳到伺服器
scp app.py porsche@10.1.0.254:/home/porsche/services/webmail-gateway/

# 3. 重建容器
ssh porsche@10.1.0.254 'cd /home/porsche/services/webmail-gateway && docker compose down && docker compose build && docker compose up -d'

方案 B: 透過 Git (推薦)

# 1. 在開發機提交變更
cd D:\_Develop\porscheworld_develop\webmail-gateway
git add .
git commit -m "Feature: 完整 Gmail 風格 UI"
git push gitea main

# 2. 在伺服器拉取
ssh porsche@10.1.0.254
cd /home/porsche/services/webmail-gateway
git pull
docker compose down && docker compose build && docker compose up -d

多租戶服務部署架構

當需要為每個租戶部署獨立服務時 (例如 10 個租戶 = 10 個服務)

架構設計

Traefik (Reverse Proxy)
    │
    ├─── webmail.lab.taipei/vmis-admin  → webmail-vmis-admin:8000
    ├─── webmail.lab.taipei/porsche1    → webmail-porsche1:8000
    ├─── webmail.lab.taipei/porsche2    → webmail-porsche2:8000
    ├─── ...
    └─── webmail.lab.taipei/tenant10    → webmail-tenant10:8000

部署腳本範例

#!/bin/bash
# deploy_tenant_service.sh

TENANT_CODE=$1

if [ -z "$TENANT_CODE" ]; then
    echo "Usage: ./deploy_tenant_service.sh <tenant_code>"
    exit 1
fi

# 建立租戶專屬目錄
mkdir -p /home/porsche/services/webmail-${TENANT_CODE}

# 複製基礎配置
cp -r /home/porsche/services/webmail-gateway/Dockerfile /home/porsche/services/webmail-${TENANT_CODE}/
cp -r /home/porsche/services/webmail-gateway/app.py /home/porsche/services/webmail-${TENANT_CODE}/
cp -r /home/porsche/services/webmail-gateway/requirements.txt /home/porsche/services/webmail-${TENANT_CODE}/

# 建立專屬 docker-compose.yml
cat > /home/porsche/services/webmail-${TENANT_CODE}/docker-compose.yml << EOF
services:
  webmail-${TENANT_CODE}:
    build: .
    container_name: webmail-${TENANT_CODE}
    environment:
      - REDIS_HOST=10.1.0.20
      - REDIS_PORT=6379
      - REDIS_PASSWORD=DC1qaz2wsx
      - REDIS_DB=2
      - DATABASE_URL=postgresql://admin:DC1qaz2wsx@10.1.0.20:5433/virtual_mis
      - KEYCLOAK_SERVER_URL=https://auth.lab.taipei
      - TENANT_CODE=${TENANT_CODE}
    networks:
      - traefik-network
      - mailserver_mailserver-internal
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=traefik-network"
      - "traefik.http.routers.webmail-${TENANT_CODE}.rule=Host(\`webmail.lab.taipei\`) && PathPrefix(\`/${TENANT_CODE}\`)"
      - "traefik.http.routers.webmail-${TENANT_CODE}.entrypoints=web,websecure"
      - "traefik.http.routers.webmail-${TENANT_CODE}.tls.certresolver=letsencrypt"
      - "traefik.http.services.webmail-${TENANT_CODE}.loadbalancer.server.port=8000"
    restart: always

networks:
  traefik-network:
    external: true
  mailserver_mailserver-internal:
    external: true
EOF

# 啟動容器
cd /home/porsche/services/webmail-${TENANT_CODE}
docker compose up -d

echo "Tenant ${TENANT_CODE} service deployed!"
echo "Access: https://webmail.lab.taipei/${TENANT_CODE}"

使用方式

# 部署 porsche1 租戶服務
./deploy_tenant_service.sh porsche1

# 部署 porsche2 租戶服務
./deploy_tenant_service.sh porsche2

# ... 依此類推

注意事項

開發環境切換

  • ⚠️ 開發時請確保正式環境容器已停止 (docker compose down)
  • ⚠️ 開發完成後記得切換回正式環境
  • ⚠️ 不要在開發環境直接操作正式資料庫

多租戶部署

  • 🔄 每個租戶獨立容器,互不影響
  • 📊 可以針對不同租戶調整資源限制
  • 🔍 容易追蹤各租戶的日誌和效能
  • 💰 資源消耗較高 (10 個租戶 = 10 個容器)

替代方案:單一服務多租戶

目前的設計 (路徑參數路由) 已經支援多租戶,不需要為每個租戶部署獨立服務。除非有特殊需求 (例如:租戶要求獨立部署、資源隔離等)。