สร้างระบบ Continuous Delivery ให้ Django บน DigitalOcean ด้วย GitHub Actions และ Docker

สรุปสั้น ๆ: บทความนี้จะแนะนำขั้นตอนแบบครบวงจรในการสร้าง ระบบ Continuous Delivery (CD) สำหรับโปรเจกต์ Django โดยใช้เครื่องมือยอดนิยมอย่าง GitHub Actions, Docker และ DigitalOcean (VM Ubuntu) เพื่อให้คุณสามารถทดสอบและนำโค้ดขึ้น Production ได้โดยอัตโนมัติทันทีที่ Push ไปยัง GitHub


💡 Continuous Delivery คืออะไร?

Continuous Delivery (CD) คือกระบวนการพัฒนา Software ที่ทำให้โค้ดของคุณอยู่ในสถานะที่สามารถนำขึ้น Production ได้เสมอ โดยมีจุดเด่นคือ

  • ✅ อัปเดตฟีเจอร์ได้รวดเร็ว
  • 🔄 ลดขั้นตอน Manual ที่อาจเกิดข้อผิดพลาด
  • 🔐 ส่งมอบได้บ่อยและปลอดภัย
  • 🧪 ทดสอบโค้ดอัตโนมัติทุกครั้งที่มีการเปลี่ยนแปลง

🔄 แผนภาพการทำงานของ CD Pipeline

graph TD
  A["Push โค้ดขึ้น GitHub"] --> B["GitHub Actions เริ่มทำงาน"]
  B --> C[Checkout code]
  C --> D["SSH เข้าสู่ DigitalOcean VM"]
  D --> E["ดึงโค้ดล่าสุดจาก Git"]
  E --> F["Build Docker ใหม่"]
  F --> G["Restart Django ด้วย Docker Compose"]
  G --> H["แอปออนไลน์แบบอัตโนมัติ"]
ลำดับ รายละเอียด
A นักพัฒนาส่งโค้ดขึ้น GitHub
B GitHub Actions เริ่ม Pipeline โดยอัตโนมัติ
C ดึงโค้ดมาบน runner
D เชื่อมต่อเซิร์ฟเวอร์ผ่าน SSH
E ใช้ git pull เพื่อดึงโค้ดล่าสุด
F Rebuild Docker
G รีสตาร์ทแอปด้วย Docker Compose
H ระบบออนไลน์โดยไม่ต้องแตะเซิร์ฟเวอร์เลย

🛠️ เครื่องมือที่ใช้

หน้าที่ เครื่องมือ
CI/CD GitHub Actions
เซิร์ฟเวอร์จริง DigitalOcean (Ubuntu)
Containerization Docker + Docker Compose
Web Server Nginx
การเข้าถึงจาก GitHub SSH + Secret Key

📦 ขั้นตอนที่ 1: สร้าง Dockerfile สำหรับ Django

FROM python:3.11-slim

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .
CMD ["gunicorn", "myproject.wsgi:application", "--bind", "0.0.0.0:8000"]

🐳 ขั้นตอนที่ 2: สร้าง docker-compose.prod.yml

version: '3.9'
services:
  web:
    build: .
    env_file: .env
    volumes:
      - .:/app
    expose:
      - 8000

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - web

🌐 ขั้นตอนที่ 3: ตั้งค่า Nginx

server {
    listen 80;
    server_name yourdomain.com;

    location / {
        proxy_pass http://web:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

🔐 ขั้นตอนที่ 4: ตั้งค่า SSH ให้ GitHub Actions

  1. สร้าง SSH Key:
ssh-keygen -t ed25519 -C "your_email@example.com"
  1. นำ public key ไปใส่ใน /home/deploy/.ssh/authorized_keys บน VM
  2. นำ private key ไปใส่ใน GitHub Secrets ชื่อว่า: DO_SSH_PRIVATE_KEY

🤖 ขั้นตอนที่ 5: GitHub Actions Workflow

name: Django CD to DigitalOcean

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v3

    - name: Setup SSH
      run: |
        mkdir -p ~/.ssh
        echo "${{ secrets.DO_SSH_PRIVATE_KEY }}" > ~/.ssh/id_ed25519
        chmod 600 ~/.ssh/id_ed25519
        ssh-keyscan your.server.ip >> ~/.ssh/known_hosts

    - name: Deploy via SSH
      run: |
        ssh -i ~/.ssh/id_ed25519 deploy@your.server.ip << 'EOF'
          cd /home/deploy/myproject/
          git pull origin main
          docker compose -f docker-compose.prod.yml down
          docker compose -f docker-compose.prod.yml up -d --build
        EOF

🧠 อย่าลืมเปลี่ยน your.server.ip และ deploy ให้ตรงกับเครื่องของคุณ


🔧 ไฟล์ .env ตัวอย่าง

DJANGO_SECRET_KEY=super-secret-key
DEBUG=False
ALLOWED_HOSTS=yourdomain.com

📁 โครงสร้างไฟล์บนเซิร์ฟเวอร์

/home/deploy/myproject/
├── manage.py
├── myproject/
├── Dockerfile
├── docker-compose.prod.yml
├── .env
├── nginx.conf

✅ ผลลัพธ์ที่ได้

  • ทุกครั้งที่ push → ระบบจะ pull, build, restart ให้อัตโนมัติ
  • ลดเวลา deploy เหลือเพียงไม่กี่วินาที
  • ไม่ต้อง ssh เข้าไปจัดการเองอีกต่อไป

🌟 เคล็ดลับเพิ่มเติม

  • เพิ่ม Sentry เพื่อติดตาม Error
  • ใช้ systemd หรือ supervisor เพื่อดูแล container
  • ใช้ Let’s Encrypt + Certbot สำหรับ HTTPS ฟรี

🧠 สรุป

คุณสามารถสร้างระบบ Continuous Delivery สำหรับ Django ด้วยเครื่องมือฟรีและง่ายต่อการใช้งาน ตั้งแต่การพัฒนาไปจนถึงการส่งมอบบน VM จริง ด้วยความมั่นใจและอัตโนมัติเต็มรูปแบบ


Get in Touch with us

Chat with Us on LINE

iiitum1984

Speak to Us or Whatsapp

(+66) 83001 0222

Related Posts

Our Products