Auto Deploy Docker Container บน VPS ด้วย GitHub Actions

Auto Deploy Docker Container บน VPS ด้วย GitHub Actions เป็นกระบวนการสำคัญในการพัฒนาแอปพลิเคชันแบบ DevOps สมัยใหม่ ช่วยให้การปรับใช้โค้ดใหม่เป็นอัตโนมัติและรวดเร็ว ลดเวลาการปรับใช้และลดความเสี่ยงจากการดำเนินการด้วยมือ

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

  • ลดเวลาการปรับใช้: ไม่ต้องปรับใช้ด้วยมือซ้ำซ้อน
  • ความสอดคล้องกันของสภาพแวดล้อม: Docker Container ทำให้การ Deploy มีความสอดคล้องทุก Environment
  • ลดความเสี่ยง: ลดความผิดพลาดจากการดำเนินการด้วยมือ
  • ความโปร่งใส: ติดตามเวอร์ชันโค้ดและการปรับใช้ได้อย่างชัดเจน

ขั้นตอนที่ 1: เตรียม VPS

sudo apt update
sudo apt install -y docker.io docker-compose
sudo usermod -aG docker $USER

# สร้าง SSH Key สำหรับ Deploy
ssh-keygen -t rsa -b 4096 -f ~/.ssh/deploy_key -N ""
cat ~/.ssh/deploy_key.pub >> ~/.ssh/authorized_keys

ขั้นตอนที่ 2: ตั้งค่า GitHub Repository Secrets

เพิ่ม Secrets ใน Repository → Settings → Secrets and variables → Actions:

  • VPS_HOST — IP Address หรือ Domain ของ VPS
  • VPS_USER — Username SSH
  • VPS_SSH_KEY — SSH Private Key
  • DOCKER_USERNAME — Docker Hub Username
  • DOCKER_PASSWORD — Docker Hub Password หรือ Token

ขั้นตอนที่ 3: Dockerfile ตัวอย่าง

FROM node:18-alpine

WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000

HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
  CMD node -e "require('http').get('http://localhost:3000', (r) => {if (r.statusCode !== 200) throw new Error(r.statusCode)})"

CMD ["node", "index.js"]

ขั้นตอนที่ 4: GitHub Actions Workflow สมบูรณ์

name: Auto Deploy Docker Container

on:
  push:
    branches:
      - main

env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }}

jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Log in to GitHub Container Registry
        uses: docker/login-action@v3
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Build and push Docker image
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}
          cache-from: type=gha
          cache-to: type=gha,mode=max

  deploy:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - name: Setup SSH
        run: |
          mkdir -p ~/.ssh
          echo "${{ secrets.VPS_SSH_KEY }}" > ~/.ssh/deploy_key
          chmod 600 ~/.ssh/deploy_key
          ssh-keyscan -H ${{ secrets.VPS_HOST }} >> ~/.ssh/known_hosts

      - name: Deploy to VPS
        run: |
          ssh -i ~/.ssh/deploy_key ${{ secrets.VPS_USER }}@${{ secrets.VPS_HOST }} << 'ENDSSH'
          # Login to registry
          echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin

          # Pull และ restart container
          docker pull ghcr.io/${{ github.repository }}:${{ github.sha }}
          docker stop myapp || true
          docker rm myapp || true
          docker run -d --name myapp --restart unless-stopped \
            -p 80:3000 \
            -e NODE_ENV=production \
            ghcr.io/${{ github.repository }}:${{ github.sha }}

          docker image prune -f
          ENDSSH

      - name: Verify deployment
        run: |
          ssh -i ~/.ssh/deploy_key ${{ secrets.VPS_USER }}@${{ secrets.VPS_HOST }} \
            "docker ps | grep myapp && echo 'Deployment successful!'"

ใช้ Docker Hub แทน GitHub Container Registry

      - name: Log in to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Build and push to Docker Hub
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: |
            ${{ secrets.DOCKER_USERNAME }}/myapp:latest
            ${{ secrets.DOCKER_USERNAME }}/myapp:${{ github.sha }}

การจัดการ Secrets อย่างปลอดภัย

  • สร้าง Deploy User แยกที่มีสิทธิ์จำกัด ไม่ใช้ root
  • เก็บ SSH Key ใน GitHub Secrets ไม่ใส่ใน Repository
  • จำกัดสิทธิ์ SSH Key เฉพาะคำสั่งที่จำเป็น
  • หมุนเวียน Secrets เป็นระยะเวลา
  • ใช้ .env.example ไม่เก็บค่า Environment ใน Repository

Auto Deploy Docker กับ ผู้ให้บริการโฮสติ้ง Cloud VPS

หากกำลังมองหา VPS ที่มีประสิทธิภาพสูงสำหรับการรัน Docker Container ผู้ให้บริการโฮสติ้ง Cloud VPS เป็นทางเลือกที่ยอดเยี่ยม ด้วยมี SSD ความเร็วสูง RAM เพียงพอ และรองรับ Docker และ CI/CD Workflow ครบวงจร ทำให้คุณ Build และ Deploy Container ได้อย่างราบรื่นและเสถียร

สนใจใช้บริการ Cloud VPS สอบถามได้ที่ de.co.th