สร้างระบบ 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
- สร้าง SSH Key:
ssh-keygen -t ed25519 -C "your_email@example.com"
- นำ public key ไปใส่ใน
/home/deploy/.ssh/authorized_keys
บน VM - นำ 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
Related Posts
- ทำไม Test-Driven Development (TDD) ถึงตอบโจทย์ธุรกิจยุคใหม่
- สร้างระบบแนะนำสินค้าในอีคอมเมิร์ซด้วย LangChain, Ollama และ Open-source Embedding แบบ Local
- คู่มือปี 2025: เปรียบเทียบเฟรมเวิร์กสร้างแอปมือถือยอดนิยม (Flutter, React Native, Expo, Ionic และอื่น ๆ)
- เข้าใจการใช้ `np.meshgrid()` ใน NumPy: ทำไมถึงจำเป็น และจะเกิดอะไรขึ้นถ้าสลับลำดับ?
- วิธีใช้ PyMeasure เพื่อควบคุมเครื่องมือวัดและทดลองในห้องแล็บโดยอัตโนมัติ
- ยกระดับแชทบอทของคุณด้วยบริการเชื่อมต่อ API กับระบบธุรกิจ
- เดา “สมการ” โดยไม่ต้องใช้คณิตศาสตร์: สำรวจความสัมพันธ์ระหว่างแมวกับนก
- วิธีสร้างโปรเจกต์ที่ทนทานต่อ AI: ไอเดียที่เน้นการปฏิสัมพันธ์ของมนุษย์
- สร้างห้องทดลองความปลอดภัยไซเบอร์ด้วย GNS3 + Wazuh + Docker ฝึก ตรวจจับ และป้องกันภัยคุกคามในระบบเดียว
- วิธีจำลองและฝึกฝนการตั้งค่าอุปกรณ์เครือข่ายด้วย GNS3
- LMS คืออะไร? และทำไมคุณควรรู้จัก Frappe LMS
- Agentic AI ในโรงงานอุตสาหกรรม: ระบบที่คิดเอง ปรับตัวเอง และทำงานได้อัตโนมัติ
- ควบคุมยานยนต์ไฟฟ้าได้อย่างชาญฉลาด ปลอดภัย และทันสมัย ด้วยระบบ Geo-Fencing และติดตามแบบเรียลไทม์
- วิธีเชื่อมต่อระบบ Single Sign-On (SSO) ด้วย Google OAuth ใน FastAPI
- สร้างแอปจองแท็กซี่ของคุณเองกับ Simplico: ปลอดภัย ขยายได้ และพร้อมเปิดตัวทันที
- วางระบบ Backend สำหรับสถานีชาร์จ EV ที่พร้อมขยายตัว — ออกแบบโดย Simplico
- วิธีจัดการราคาซับซ้อนสำหรับสินค้าสั่งทำพิเศษ (Made-to-Order) ใน Odoo
- วิธีสร้างระบบสั่งผลิตสินค้าเฉพาะลูกค้า (Made-to-Order) เพื่อเพิ่มยอดขายและความพึงพอใจ
- ปรับธุรกิจให้ฉลาดขึ้นด้วย Agentic AI อัตโนมัติเต็มรูปแบบ
- จัดการเครื่องทดสอบใยแก้วนำแสง EXFO อย่างง่าย ด้วยระบบ Admin Panel น้ำหนักเบา