Cloud, Docker และ DevOps — ดีพลอยรวดเร็วและเชื่อถือได้
เราบรรจุทุกแอปพลิเคชันในคอนเทนเนอร์ Docker จัดการด้วย Docker Compose (หรือ Kubernetes สำหรับโปรเจกต์ระดับองค์กร) ตั้งค่า Caddy เป็น reverse proxy พร้อม SSL อัตโนมัติ และทำวงจรการดีพลอยทั้งหมดให้อัตโนมัติผ่าน GitHub Actions — จากคอมมิตถึง production โดยอัตโนมัติ
คอนเทนเนอร์ด้วย Docker และ Docker Compose
แต่ละเซอร์วิสมี Dockerfile แบบ multi-stage ของตัวเอง ได้แก่ สเตจบิลด์ที่ติดตั้ง dependency และคอมไพล์ และสเตจสุดท้ายขนาดเล็ก (distroless หรือ alpine) ที่มีเฉพาะ artefact ที่จำเป็น อิมเมจ Next.js ทั่วไปมีขนาดไม่ถึง 150MB และ FastAPI ไม่ถึง 80MB อิมเมจถูกบิลด์ใหม่ทุกครั้งที่ merge เข้า main และติดแท็กตามเวอร์ชันเชิงความหมาย (`v1.2.3` + `latest`)
Docker Compose กำหนดสแตกทั้งหมด: ฟรอนต์เอนด์, API, DB, Redis, worker ตัวแปรที่เป็นความลับ (รหัสผ่าน DB, API keys, Stripe secret) อยู่ใน `.env` ที่ไม่ถูกเก็บใน git — ไม่ฮาร์ดโค้ดในอิมเมจเด็ดขาด Health checks ใน Compose ทำให้มั่นใจว่า dependency พร้อมก่อนเริ่มทำงาน (DB พร้อม → API เริ่ม → ฟรอนต์เอนด์เริ่ม)
- Build cache ด้วย `--mount=type=cache` — นำแคช npm กลับมาใช้ในการบิลด์ซ้ำบน CI
- จัดลำดับเลเยอร์ให้เหมาะสม: dependency ที่คงที่ → ซอร์สโค้ด
- การจัดการ secrets ด้วย Docker secrets หรือ HashiCorp Vault สำหรับโปรเจกต์ระดับองค์กร
- `restart: unless-stopped` + `docker compose up --no-deps` สำหรับการดีพลอยแบบ atomic
Caddy — reverse proxy สมัยใหม่พร้อม SSL อัตโนมัติ
Caddy 2.8 จัดการ SSL/TLS อัตโนมัติผ่าน ACME (Let's Encrypt หรือ ZeroSSL) — ไม่มีใบรับรองหมดอายุ ไม่ต้องตั้งค่าด้วยมือ เปิดใช้ HTTP/2 และ HTTP/3 (QUIC) เป็นค่าเริ่มต้น Security headers (HSTS, X-Frame-Options, CSP) ตั้งค่าทั้งระบบผ่าน snippet ที่นำกลับมาใช้ซ้ำได้ คอนฟิก Caddyfile แบบ declarative เปรียบเทียบความต่างได้และเก็บเวอร์ชันใน git
Rate limiting, การบีบอัด gzip/brotli และ structured JSON logging เปิดใช้ด้วยดิเรกทีฟเนทีฟของ Caddy — ไม่ต้องใช้โมดูล nginx หรือคอนฟิก Apache ที่ซับซ้อน การเข้าถึงเส้นทางที่ละเอียดอ่อน (`/admin`, `.env`, `.git`) จะตอบ 444 (ไม่ตอบกลับ) ซึ่งตั้งเป็น security snippet ส่วนกลาง
- ใช้ TLS 1.3 เท่านั้นพร้อม cipher suite สมัยใหม่
- On-demand TLS สำหรับ SaaS แบบ multi-tenant ที่มีซับโดเมนแบบไดนามิก
- รีโหลดคอนฟิกด้วย `caddy reload` โดยไม่ตัดการเชื่อมต่อที่ใช้งานอยู่
- Caddy logging → Loki → Grafana — วิเคราะห์ทราฟฟิกและแจ้งเตือนความผิดปกติ
CI/CD ด้วย GitHub Actions และการมอนิเตอร์
ไปป์ไลน์ CI รันในทุก PR: lint, type check, unit test, บิลด์อิมเมจ Docker, สแกนช่องโหว่ (Trivy) หากผ่านทั้งหมด อิมเมจจะถูกพุชไปยัง registry และดีพลอยขึ้น staging โดยอัตโนมัติ Merge เข้า main = ดีพลอยขึ้น production อัตโนมัติพร้อม healthcheck หลังดีพลอย และย้อนกลับอัตโนมัติหาก healthcheck ล้มเหลวภายใน 60 วินาที
มอนิเตอร์ด้วย Grafana + Prometheus สำหรับเมตริกของแอปพลิเคชัน (latency, error rate, ขนาดคิว) และ Loki สำหรับรวบรวม log ตั้งการแจ้งเตือนผ่าน Slack/อีเมล: error rate >1%, latency P95 >500ms, ดิสก์ >85% มอนิเตอร์ uptime ภายนอกด้วย Better Uptime — มีแดชบอร์ด SLA สาธารณะให้เมื่อร้องขอ
- สแกนช่องโหว่ของอิมเมจด้วย Trivy — บล็อกเมื่อพบ CVE ระดับ Critical
- Dependabot + auto-merge สำหรับการอัปเดตแพตช์ (ต้องมี CI เป็นสีเขียว)
- สำรองข้อมูล DB อัตโนมัติไปยังที่เก็บข้อมูลที่เข้ากันได้กับ S3 (ทุกคืน เก็บไว้ 30 วัน)
ข้อดีและข้อจำกัด
ข้อดี
- ดีพลอยพร้อมย้อนกลับอัตโนมัติเมื่อ healthcheck ล้มเหลว
- SSL/TLS อัตโนมัติผ่าน Caddy — ไม่มีใบรับรองหมดอายุจากการดูแลด้วยมือ
- สภาพแวดล้อมที่ทำซ้ำได้: อิมเมจ Docker เดียวกันบน dev, staging และ production
- การมอนิเตอร์และการแจ้งเตือน (Grafana, Loki) — ติดตามเมตริกและ log
ข้อจำกัด
- Docker Compose ขยายขนาดได้ไม่เท่า Kubernetes สำหรับระบบหลายโหนดระดับองค์กร
- การตั้งค่า CI/CD เริ่มต้นต้องใช้เวลาและความเชี่ยวชาญด้าน DevOps
- อิมเมจและ log กินพื้นที่ดิสก์ — ต้องล้างเป็นระยะ
- การมอนิเตอร์เต็มรูปแบบ (Prometheus + Grafana) เพิ่มเซอร์วิสที่ต้องดูแล
สรุปสั้น ๆ
Docker + Caddy + GitHub Actions คือชุดที่เหมาะอย่างยิ่งสำหรับการดีพลอยที่เชื่อถือได้บน VPS หรือไม่กี่โหนด หากมีหลายสิบโหนดที่ต้องการ auto-scaling เข้มข้น ให้ย้ายไปใช้ Kubernetes
ตารางสเปก
| ความสามารถ | ขีดจำกัด / เกณฑ์ | การใช้งานโดยทั่วไป | |
|---|---|---|---|
| การจัดการคอนเทนเนอร์ | Docker Compose, ทั้งสแตก | โหนดเดียว; หลายโหนดต้องใช้ Swarm/K8s | VPS, โปรเจกต์ขนาดเล็กถึงกลาง |
| Reverse proxy | Caddy 2.8, HTTP/3, SSL อัตโนมัติ | กฎที่ซับซ้อนมากต้องใช้คอนฟิกเพิ่มเติม | หลายโดเมน, multi-tenant |
| CI/CD | GitHub Actions, ดีพลอยอัตโนมัติ | นาที CI คิดเงินเมื่อเกินโควตาฟรี | จากคอมมิตถึง production อัตโนมัติ |
| ค่าใช้จ่ายโดยทั่วไป | VPS เริ่มต้น ~€5/เดือน | การมอนิเตอร์ + การสำรองข้อมูลมีค่าใช้จ่ายเพิ่ม | ตั้งแต่เว็บไซต์เดียวจนถึงหลายแบรนด์ |
Docker Compose เทียบกับ Kubernetes
| เกณฑ์ | Docker Compose | Kubernetes |
|---|---|---|
| ความซับซ้อนในการตั้งค่า | ต่ำ | สูง |
| หลายโหนด / auto-scaling | จำกัด (โหนดเดียว) | ยอดเยี่ยม |
| เหมาะที่สุดกับ | VPS, โปรเจกต์ขนาดเล็กถึงกลาง | ฟลีตขนาดใหญ่, ระดับองค์กร |
คำถามที่พบบ่อย
ทำไมใช้ Caddy ไม่ใช้ Nginx?
Caddy จัดการ SSL/TLS อัตโนมัติผ่าน ACME เปิด HTTP/2 และ HTTP/3 เป็นค่าเริ่มต้น และมีคอนฟิกแบบ declarative ที่สั้น ส่วน Nginx ต้องใช้ certbot และตั้งค่าด้วยมือมากกว่าเพื่อให้ได้ผลลัพธ์เดียวกัน
ฉันจำเป็นต้องใช้ Kubernetes หรือไม่?
ไม่ สำหรับเว็บไซต์ส่วนใหญ่ Docker Compose บน VPS รองรับเว็บไซต์หนึ่งแห่งหรือไม่กี่เซอร์วิสได้อย่างเชื่อถือได้ Kubernetes จะมีประโยชน์เมื่อมีหลายสิบโหนดที่ต้องการ auto-scaling เข้มข้นเท่านั้น
การดีพลอยทำงานอย่างไร?
GitHub Actions บิลด์อิมเมจใหม่ เริ่มรันควบคู่กับอิมเมจเก่า รัน healthcheck แล้วจึงสลับทราฟฟิก หาก healthcheck ล้มเหลวภายใน 60 วินาที ระบบจะย้อนกลับไปเวอร์ชันก่อนหน้าโดยอัตโนมัติ
แนะนำการมอนิเตอร์แบบไหน?
Grafana + Prometheus สำหรับเมตริก (latency, error rate) และ Loki สำหรับ log ที่รวบรวมไว้ พร้อมการแจ้งเตือนทาง Slack/อีเมล สำหรับ uptime ภายนอก เราเพิ่มบริการอิสระ เช่น Better Uptime