Workshop: สร้างระบบ Auto Deploy สำหรับ Microservices ด้วย Docker Compose

Microservices Architecture ได้เป็นแนวทางมาตรฐานในการพัฒนา Application ที่ซับซ้อน บทความนี้จะแนะนำวิธีสร้างระบบ Auto Deploy สำหรับ Microservices ด้วย Docker Compose และ GitHub Actions เพื่อให้ Deployment ของคุณเป็นไปโดยอัตโนมัติและปลอดภัย

Auto Deploy Microservices คืออะไร?

Auto Deploy Microservices เป็นกระบวนการอัตโนมัติที่ทำให้สามารถ Deploy Application ไปยัง Server ได้ทันทีเมื่อ Code มีการเปลี่ยนแปลง โดยไม่ต้องทำด้วยมือซ้ำ ๆ

ประโยชน์ของ Auto Deploy:

  • เร่งความเร็ว Release Cycle: Push Code ไปยัง GitHub ก็ Deploy ไปยัง Server โดยอัตโนมัติ
  • ลดข้อผิดพลาดจากมนุษย์: ไม่ต้องใช้คำสั่งทีละขั้นตอน ลดโอกาสผิดพลาด
  • ประสิทธิภาพสูงขึ้น: Team สามารถ Focus ไปที่การพัฒนา Feature ใหม่ไม่ต้องกังวล Deployment
  • Faster Feedback Loop: ได้รู้เร็วว่า Code ใดใช้ได้ Code ใดมีปัญหา
  • Continuous Improvement: ทำให้ Code Quality ดีขึ้นจากการ Test อัตโนมัติก่อน Deploy

สิ่งที่ต้องเตรียมก่อนเริ่มต้น

  • Cloud VPS: Server ที่เพียงพอสำหรับรัน Microservices (ตัวอย่าง: VPS 2GB RAM ขึ้นไป)
  • Docker: ติดตั้ง Docker Engine บน VPS
  • Docker Compose: ต้องติดตั้ง Docker Compose สำหรับ Orchestrate Containers
  • GitHub Repository: ที่เก็บ Source Code และ Deployment Scripts
  • SSH Access: ต้องมี SSH Key เพื่อให้ GitHub Actions สามารถ Deploy ไปยัง VPS ได้
  • Text Editor: สำหรับแก้ไข YAML และ Code Files

สถาปัตยกรรม Microservices ตัวอย่าง

ในบทความนี้ จะสร้าง Microservices ที่ประกอบด้วย 3 Services:

  • Frontend Service: React Application ที่แสดงหน้า UI (Port 3000)
  • API Service: Node.js Backend API (Port 5000)
  • Database Service: PostgreSQL Database (Port 5432)

Architecture นี้ง่ายต่อการสาธารณะและเหมาะสำหรับเริ่มต้นระบบ Auto Deploy

ขั้นตอนที่ 1: สร้าง Docker Compose สำหรับ Microservices

Docker Compose ช่วยให้สามารถสร้าง Multiple Containers โดยใช้ไฟล์ YAML เดียว ตัวอย่าง docker-compose.yml ดังนี้:

version: '3.8'

services:
  frontend:
    build:
      context: ./frontend
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
    environment:
      - REACT_APP_API_URL=http://api:5000
    depends_on:
      - api
    networks:
      - app-network
    restart: always

  api:
    build:
      context: ./api
      dockerfile: Dockerfile
    ports:
      - "5000:5000"
    environment:
      - DATABASE_URL=postgresql://user:password@db:5432/myapp
      - NODE_ENV=production
    depends_on:
      - db
    networks:
      - app-network
    restart: always

  db:
    image: postgres:15-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=myapp
    networks:
      - app-network
    restart: always

volumes:
  postgres_data:

networks:
  app-network:
    driver: bridge

ส่วนประกอบสำคัญของ docker-compose.yml:

  • services: ส่วนที่ระบุ Containers ที่ต้องสร้าง
  • build: ระบุ Context และ Dockerfile ที่ใช้สร้าง Image
  • ports: Mapping Port จาก Container ไปยัง Host
  • environment: ตัวแปร Environment สำหรับ Application
  • depends_on: ระบุ Service ที่ต้องเรียกใช้ก่อน
  • networks: สร้าง Network เพื่อให้ Services สื่อสารกันได้
  • volumes: เก็บข้อมูล Persistent โดยไม่หายเมื่อ Container ล้มลง
  • restart: Policy การ Restart Container เมื่อมีข้อผิดพลาด

ขั้นตอนที่ 2: สร้าง GitHub Actions Workflow สำหรับ Auto Deploy

GitHub Actions เป็น CI/CD Tool ที่ช่วยให้ Deploy โดยอัตโนมัติเมื่อมี Code Push ไปยัง Repository สร้างไฟล์ .github/workflows/deploy.yml ดังนี้:

name: Auto Deploy Microservices

on:
  push:
    branches:
      - main
      - production

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Code
        uses: actions/checkout@v3

      - name: Setup SSH Key
        run: |
          mkdir -p ~/.ssh
          echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
          chmod 600 ~/.ssh/id_rsa
          ssh-keyscan -H ${{ secrets.VPS_HOST }} >> ~/.ssh/known_hosts

      - name: Deploy to VPS
        run: |
          ssh -i ~/.ssh/id_rsa ${{ secrets.VPS_USER }}@${{ secrets.VPS_HOST }} << 'EOF'
            cd /app/myproject
            git pull origin main
            docker-compose down
            docker-compose build
            docker-compose up -d
            docker-compose logs -f
          EOF

      - name: Send Slack Notification
        if: always()
        uses: slackapi/slack-github-action@v1
        with:
          webhook-url: ${{ secrets.SLACK_WEBHOOK }}
          payload: |
            {
              "text": "Deployment ${{ job.status }}: ${{ github.repository }}",
              "blocks": [{
                "type": "section",
                "text": {
                  "type": "mrkdwn",
                  "text": "*Deployment Status:* ${{ job.status }}\n*Branch:* ${{ github.ref }}\n*Commit:* <${{ github.server_url }}/${{ github.repository }}/commit/${{ github.sha }}|${{ github.sha }}>"
                }
              }]
            }

ส่วนประกอบของ GitHub Actions Workflow:

  • on: Trigger ที่ทำให้ Workflow ทำงาน (เช่น push ไปยัง main branch)
  • jobs: ขั้นตอนการทำงานที่ต้องดำเนินการ
  • steps: รายละเอียดของแต่ละขั้นตอน
  • secrets: ข้อมูลที่ละเอียดอ่อน (SSH Key, VPS Host) ที่เก็บใน GitHub Secrets

ขั้นตอนที่ 3: ตั้งค่า SSH Deploy Key บน VPS

ต้องสร้าง SSH Key เพื่อให้ GitHub Actions สามารถเข้า VPS ได้โดยปลอดภัย:

# 1. สร้าง SSH Key บน VPS
ssh-keygen -t rsa -b 4096 -f ~/.ssh/github_deploy_key -N ""

# 2. เพิ่ม Public Key ไปยัง authorized_keys
cat ~/.ssh/github_deploy_key.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

# 3. Copy Private Key เพื่อใส่ใน GitHub Secrets
cat ~/.ssh/github_deploy_key

หลังจาก Copy Private Key แล้ว ให้ไปที่ Repository Settings > Secrets > New repository secret และสร้าง Secret ดังนี้:

  • SSH_PRIVATE_KEY: Private Key ที่ได้จากคำสั่งข้างต้น
  • VPS_HOST: IP Address ของ VPS
  • VPS_USER: Username สำหรับ SSH (เช่น root หรือ ubuntu)
  • SLACK_WEBHOOK: (Optional) Webhook URL สำหรับการแจ้งเตือน Slack

ขั้นตอนที่ 4: ทดสอบ Auto Deploy Pipeline

เมื่อ Setup เสร็จแล้ว ให้ทดสอบ Pipeline โดยการ Commit และ Push Code:

# 1. ทำการเปลี่ยนแปลง Code
echo "Deployment Test" > README.md

# 2. Commit และ Push ไปยัง GitHub
git add .
git commit -m "Test auto deployment pipeline"
git push origin main

# 3. ตรวจสอบ GitHub Actions
# ไปที่ Repository > Actions เพื่อดู Status ของ Deployment

ถ้า Workflow ทำงานสำเร็จ GitHub Actions จะแสดง Status เป็น “Success” และ Containers บน VPS จะ Update อัตโนมัติ

การจัดการ Environment Variables ให้ปลอดภัย

ไม่ควร Hardcode Secrets เช่น Database Password ไว้ในไฟล์ Config ควร ใช้วิธีจัดการอย่างปลอดภัยแทน:

วิธี 1: ใช้ .env File (Local Development)

# .env
DATABASE_URL=postgresql://user:password@localhost:5432/myapp
API_SECRET_KEY=your-secret-key-here
REACT_APP_API_URL=http://localhost:5000

วิธี 2: ใช้ GitHub Secrets (Production)

# ในไฟล์ docker-compose.yml
services:
  api:
    environment:
      - DATABASE_URL=${DATABASE_URL}
      - API_SECRET_KEY=${API_SECRET_KEY}

จากนั้นใส่ Secrets ใน GitHub Repository Settings เพื่อให้ GitHub Actions เข้าถึงได้

การ Monitor Microservices หลัง Deploy

หลัง Deploy สำเร็จแล้ว ต้องมีการ Monitor Service เพื่อให้แน่ใจว่าทำงานได้ตามปกติ:

# 1. ดูสถานะ Containers
docker-compose ps

# 2. ดู Logs ของแต่ละ Service
docker-compose logs -f api

# 3. ตรวจสอบ Health Check
docker-compose exec api curl http://localhost:5000/health

# 4. Check Resource Usage
docker stats

ระบบ Monitoring ที่แนะนำ:

  • Prometheus: เก็บ Metrics จาก Microservices
  • Grafana: สร้าง Dashboard สำหรับดู Metrics
  • ELK Stack: รวบรวม Logs ในที่เดียว
  • Sentry: Tracking Error ใน Application

สรุป

Auto Deploy Microservices ด้วย Docker Compose และ GitHub Actions เป็นวิธีที่มีประสิทธิภาพในการจัดการ Application ที่มี Multiple Services อย่างอัตโนมัติ ด้วยการตั้งค่า Workflow และ SSH Key อย่างถูกต้อง ทีมพัฒนาสามารถ Focus ไปที่การเขียน Code และไม่ต้องกังวลเรื่อง Deployment ในขณะเดียวกัน System ก็จะ Deploy โดยอัตโนมัติ ทำให้ Release Cycle เร็วขึ้นและ Error ลดลง