dramaling-app/docs/04_technical/low-budget-deployment.md

12 KiB
Raw Blame History

低預算部署指南

概述

為Drama Ling應用設計的超低預算部署方案滿足開發階段NT$2,000/月、生產階段NT$5,000/月的預算限制。

部署策略總覽

成本控制原則

  • 開發階段: 完全本地化開發,最小化雲端服務使用
  • 生產階段: VPS單機部署優化AI服務用量
  • 擴展準備: 架構設計考慮未來遷移至雲端服務的可能性

開發階段部署 (NT$ 2,000/月預算)

本地開發環境設置

Docker Compose配置

# docker-compose.dev.yml
version: '3.8'

services:
  # 後端API服務
  api:
    build: 
      context: ./backend
      dockerfile: Dockerfile.dev
    ports:
      - "3001:3001"
    environment:
      - NODE_ENV=development
      - DATABASE_URL=postgresql://dev:dev123@postgres:5432/dramaling_dev
      - REDIS_URL=redis://redis:6379
      - OPENAI_API_KEY=${OPENAI_API_KEY}
    volumes:
      - ./backend:/app
      - /app/node_modules
    depends_on:
      - postgres
      - redis

  # PostgreSQL資料庫
  postgres:
    image: postgres:15-alpine
    environment:
      POSTGRES_DB: dramaling_dev
      POSTGRES_USER: dev
      POSTGRES_PASSWORD: dev123
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - ./database/init:/docker-entrypoint-initdb.d

  # Redis快取
  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    command: redis-server --appendonly yes
    volumes:
      - redis_data:/data

  # 前端開發服務器
  web:
    build:
      context: ./frontend
      dockerfile: Dockerfile.dev
    ports:
      - "3000:3000"
    volumes:
      - ./frontend:/app
      - /app/node_modules
    environment:
      - REACT_APP_API_URL=http://localhost:3001

volumes:
  postgres_data:
  redis_data:

開發成本明細

development_costs:
  infrastructure:
    local_docker: "免費"
    domain_testing: "免費 (ngrok或localhost)"
    
  services:
    openai_api: "NT$ 300-600/月"
    # 基於低用量GPT-4o-mini約1000-2000次API呼叫
    database: "免費 (本地PostgreSQL)"
    storage: "免費 (本地檔案系統)"
    
  tools:
    monitoring: "免費 (Docker logs)"
    version_control: "免費 (GitHub)"
    
  total: "NT$ 300-600/月"
  remaining_budget: "NT$ 1,400-1,700/月"

開發工作流程

1. 環境啟動

# 啟動開發環境
docker-compose -f docker-compose.dev.yml up -d

# 檢查服務狀態
docker-compose -f docker-compose.dev.yml ps

# 查看日誌
docker-compose -f docker-compose.dev.yml logs -f api

2. 資料庫遷移

# 執行資料庫遷移
docker-compose -f docker-compose.dev.yml exec api npm run migrate

# 填充測試資料
docker-compose -f docker-compose.dev.yml exec api npm run seed

3. AI服務成本控制

// AI服務配置
const aiConfig = {
  provider: 'openai',
  model: 'gpt-4o-mini', // 比GPT-4便宜10倍
  maxTokens: 500, // 限制回應長度
  cache: {
    enabled: true,
    ttl: 3600, // 1小時快取
    hitRateTarget: 0.9 // 目標90%命中率
  },
  rateLimiting: {
    requestsPerMinute: 10,
    tokensPerMinute: 5000
  }
}

生產階段部署 (NT$ 5,000/月預算)

VPS服務商選擇

推薦VPS配置

recommended_vps:
  provider_options:
    - name: "DigitalOcean"
      specs: "4GB RAM, 2 vCPU, 80GB SSD"
      monthly_cost: "NT$ 320 ($10 USD)"
      location: "Singapore"
      
    - name: "Vultr"
      specs: "4GB RAM, 2 vCPU, 80GB SSD" 
      monthly_cost: "NT$ 384 ($12 USD)"
      location: "Tokyo"
      
    - name: "Linode"
      specs: "4GB RAM, 2 vCPU, 80GB SSD"
      monthly_cost: "NT$ 320 ($10 USD)"
      location: "Tokyo"

  selection_criteria:
    - 亞洲機房降低延遲
    - 穩定的網路連線
    - 良好的技術支援
    - 彈性的計費方式

生產環境配置

Docker Compose生產配置

# docker-compose.prod.yml
version: '3.8'

services:
  # Nginx反向代理
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/ssl:/etc/nginx/ssl
      - ./frontend/build:/usr/share/nginx/html
    depends_on:
      - api
    restart: unless-stopped

  # 後端API服務
  api:
    build: 
      context: ./backend
      dockerfile: Dockerfile.prod
    environment:
      - NODE_ENV=production
      - DATABASE_URL=${DATABASE_URL}
      - REDIS_URL=${REDIS_URL}
      - OPENAI_API_KEY=${OPENAI_API_KEY}
      - JWT_SECRET=${JWT_SECRET}
    depends_on:
      - postgres
      - redis
    restart: unless-stopped

  # PostgreSQL資料庫
  postgres:
    image: postgres:15-alpine
    environment:
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - ./database/init:/docker-entrypoint-initdb.d
    restart: unless-stopped

  # Redis快取
  redis:
    image: redis:7-alpine
    command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD}
    volumes:
      - redis_data:/data
    restart: unless-stopped

  # 監控服務
  prometheus:
    image: prom/prometheus:latest
    ports:
      - "9090:9090"
    volumes:
      - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml
    restart: unless-stopped

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3001:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD}
    volumes:
      - grafana_data:/var/lib/grafana
    restart: unless-stopped

volumes:
  postgres_data:
  redis_data:
  grafana_data:

Nginx配置

# nginx/nginx.conf
events {
    worker_connections 1024;
}

http {
    upstream api {
        server api:3001;
    }

    # 啟用gzip壓縮
    gzip on;
    gzip_vary on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml text/javascript;

    # SSL配置
    server {
        listen 443 ssl http2;
        server_name your-domain.com;

        ssl_certificate /etc/nginx/ssl/cert.pem;
        ssl_certificate_key /etc/nginx/ssl/key.pem;

        # 前端靜態檔案
        location / {
            root /usr/share/nginx/html;
            try_files $uri $uri/ /index.html;
        }

        # API代理
        location /api/ {
            proxy_pass http://api;
            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;
        }
    }

    # HTTP重定向至HTTPS
    server {
        listen 80;
        server_name your-domain.com;
        return 301 https://$server_name$request_uri;
    }
}

生產成本明細

production_costs:
  infrastructure:
    vps_server: "NT$ 320-480/月" # 4GB VPS
    domain_ssl: "NT$ 400-600/月" # 域名 + Cloudflare Pro
    backup_storage: "NT$ 160-240/月" # 備份儲存

  services:
    openai_api: "NT$ 1,500-3,000/月" # 優化使用GPT-4o-mini
    payment_stripe: "3% 交易手續費"
    monitoring: "NT$ 0-480/月" # 基本免費或便宜方案

  total_fixed: "NT$ 2,380-4,800/月"
  remaining_budget: "NT$ 200-2,620/月"

AI服務成本優化策略

1. 快取策略

// 多層快取系統
const cacheStrategy = {
  // L1: 記憶體快取 (最快)
  memory: {
    provider: 'node-cache',
    ttl: 300, // 5分鐘
    checkperiod: 60
  },
  
  // L2: Redis快取 (跨實例)
  redis: {
    provider: 'redis',
    ttl: 3600, // 1小時
    keyPrefix: 'ai_cache:'
  },
  
  // L3: 資料庫快取 (持久化)
  database: {
    table: 'ai_responses',
    ttl: 86400 * 7 // 7天
  }
}

2. 批次處理

// 批次AI請求降低成本
const batchProcessor = {
  queueSize: 10, // 累積10個請求
  timeout: 5000, // 或等待5秒
  
  async processBatch(requests) {
    // 合併類似請求
    const grouped = groupSimilarRequests(requests);
    
    // 批次發送
    const results = await Promise.all(
      grouped.map(group => this.sendBatchRequest(group))
    );
    
    return results.flat();
  }
}

3. 智慧降級

// 根據複雜度選擇模型
const modelSelector = {
  simple: 'gpt-4o-mini', // 簡單任務
  complex: 'gpt-4o', // 複雜任務(限量)
  
  selectModel(task) {
    const complexity = this.analyzeComplexity(task);
    return complexity < 0.5 ? this.simple : this.complex;
  }
}

部署自動化

部署腳本

#!/bin/bash
# deploy.sh

set -e

echo "🚀 開始部署 Drama Ling 生產環境..."

# 1. 拉取最新代碼
git pull origin main

# 2. 構建前端
echo "📦 構建前端應用..."
cd frontend
npm run build
cd ..

# 3. 停止現有服務
echo "⏹️  停止現有服務..."
docker-compose -f docker-compose.prod.yml down

# 4. 備份資料庫
echo "💾 備份資料庫..."
./scripts/backup-database.sh

# 5. 啟動新服務
echo "▶️  啟動新服務..."
docker-compose -f docker-compose.prod.yml up -d

# 6. 健康檢查
echo "🏥 執行健康檢查..."
./scripts/health-check.sh

# 7. 清理舊映像
echo "🧹 清理舊Docker映像..."
docker image prune -f

echo "✅ 部署完成!"

健康檢查腳本

#!/bin/bash
# scripts/health-check.sh

echo "檢查服務健康狀態..."

# 檢查API服務
if curl -f http://localhost/api/health; then
    echo "✅ API服務正常"
else
    echo "❌ API服務異常"
    exit 1
fi

# 檢查資料庫連線
if docker-compose -f docker-compose.prod.yml exec -T postgres pg_isready; then
    echo "✅ 資料庫連線正常"
else
    echo "❌ 資料庫連線異常"
    exit 1
fi

# 檢查Redis服務
if docker-compose -f docker-compose.prod.yml exec -T redis redis-cli ping; then
    echo "✅ Redis服務正常"
else
    echo "❌ Redis服務異常"
    exit 1
fi

echo "🎉 所有服務健康檢查通過!"

監控與維護

免費監控方案

monitoring_stack:
  uptime_monitoring:
    provider: "UptimeRobot"
    cost: "免費"
    features:
      - 5分鐘間隔檢查
      - 50個監控點
      - email/SMS通知

  error_tracking:
    provider: "Sentry"
    cost: "免費 (5000 errors/月)"
    features:
      - 錯誤追蹤
      - 性能監控
      - 釋出追蹤

  log_analysis:
    provider: "Docker logs + Grafana"
    cost: "免費"
    features:
      - 集中化日誌
      - 基本儀表板
      - 警報通知

備份策略

#!/bin/bash
# scripts/backup-database.sh

BACKUP_DIR="/var/backups/dramaling"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_FILE="dramaling_backup_${TIMESTAMP}.sql"

# 創建備份目錄
mkdir -p $BACKUP_DIR

# 執行資料庫備份
docker-compose -f docker-compose.prod.yml exec -T postgres \
  pg_dump -U $POSTGRES_USER $POSTGRES_DB > "$BACKUP_DIR/$BACKUP_FILE"

# 壓縮備份檔案
gzip "$BACKUP_DIR/$BACKUP_FILE"

# 保留最近7天的備份
find $BACKUP_DIR -name "*.gz" -mtime +7 -delete

# 上傳至雲端存儲(可選)
# aws s3 cp "$BACKUP_DIR/${BACKUP_FILE}.gz" s3://your-backup-bucket/

echo "✅ 資料庫備份完成: ${BACKUP_FILE}.gz"

擴展計劃

當預算增加時的升級路徑

第一階段:服務優化 (NT$ 10,000/月)

  • 升級至更大規格VPS
  • 啟用專業版監控工具
  • 增加AI API使用量

第二階段:高可用性 (NT$ 20,000/月)

  • 多VPS負載均衡
  • 資料庫主從複製
  • CDN服務啟用

第三階段:雲端遷移 (NT$ 50,000/月)

  • 遷移至AWS/GCP
  • 容器編排 (Kubernetes)
  • 微服務架構改造

總結

這個低預算部署方案能夠:

滿足預算限制: 開發階段NT$300-600/月生產階段NT$2,380-4,800/月
保持功能完整: 支援所有核心功能包括AI服務
確保可擴展性: 架構設計考慮未來升級需求
維護便利性: 自動化部署和監控
風險可控: 多層備份和健康檢查


文件版本: v1.0
最後更新: 2024年9月7日
適用場景: 預算受限的初期部署階段
下次檢討: 生產環境運行3個月後評估升級需求