Dev

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

July 25, 2025

สรุปสั้น ๆ: บทความนี้จะแนะนำขั้นตอนแบบครบวงจรในการสร้าง ระบบ 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 จริง ด้วยความมั่นใจและอัตโนมัติเต็มรูปแบบ

บทความล่าสุด

Ready to talk about your project?

Share goals and constraints. We'll assemble architects and engineers to move fast with you.

Get in touch