Auto-deploy ทำงานยังไง (ตัวอย่างจากเว็บนี้)
จาก git push ถึงเว็บอัปเดตในไม่กี่นาที — GitHub Actions, SSH, Reverse Proxy และ HTTPS อัตโนมัติ
- CI/CD = ให้เครื่องทำงานซ้ำๆ แทนคน: build → ทดสอบ → ส่งขึ้น server ทุกครั้งที่ push
- GitHub Actions เป็นคนลงมือ โดยใช้ SSH key เข้า server แทนการพิมพ์รหัสผ่าน
- Caddy (reverse proxy) รับทุก request ที่เข้ามา, ส่งต่อไปยังเว็บที่ถูกโดเมน และออก HTTPS ให้เอง
ทำไมต้อง auto-deploy
deploy ด้วยมือคือ build เอง → อัปโหลดไฟล์ → SSH เข้าไป restart ช้าและพลาดง่าย ลืมขั้นเดียวเว็บก็พังได้ auto-deploy ทำให้ทุกครั้ง ทำเหมือนเดิมเป๊ะ และย้อนกลับได้เมื่อมีปัญหา
ภาพรวมทั้งระบบ
ทีละขั้น
- 1
Trigger — workflow ทำงานเมื่อมี push เข้า
mainหรือกดปุ่ม Run workflow เอง - 2
Build — เครื่องของ GitHub ติดตั้ง Node แล้วรัน
npm run buildแปลงไฟล์ Markdown ทั้งหมดเป็น HTML ในdist/ถ้าเนื้อหามีจุดผิด เช่น ไม่มี title ขั้นนี้จะ fail และไม่มีอะไรขึ้นเว็บ - 3
ส่งไฟล์ — ใช้ SSH key ที่เก็บใน GitHub Secrets ส่งไฟล์ไปที่ VPS
- 4
เปลี่ยนเวอร์ชันอย่างปลอดภัย — ไฟล์ CSS/JS มี hash อยู่ในชื่อ เช่น
style.3fa9c1.cssจึงวางไฟล์ใหม่ไว้ข้างไฟล์เก่าได้ก่อน แล้วค่อยเปลี่ยนหน้า HTML ให้ชี้ไปที่ไฟล์ใหม่ ผู้ใช้จึงไม่เคยเจอหน้าใหม่ที่ CSS ยังเป็นของเก่า และ server เก็บ build ย้อนหลังไว้ 5 ชุดสำหรับ rollback - 5
ตรวจสอบ — workflow เรียก
https://learn.exztech.com/version.txtว่าได้เวอร์ชันใหม่จริงไหม
Reverse Proxy คืออะไร
VPS เครื่องเดียวรันหลายเว็บได้ เพราะมี reverse proxy ยืนอยู่หน้าบ้าน ทุก request เข้ามาที่ port 443 ก่อน แล้ว proxy ดูว่าขอโดเมนไหนจึงส่งต่อให้ถูกที่
- Caddy เสิร์ฟไฟล์ HTML/CSS/JS จากโฟลเดอร์ตรงๆ
- ไม่มี backend จึงเร็วมากและแทบไม่มีอะไรให้พัง
- เหมาะกับ: เว็บเนื้อหา, docs, landing page
- Caddy ส่งต่อ request ไปที่ container ของแอป
- รองรับ login, ฐานข้อมูล, API
- เหมาะกับ: ระบบสมาชิก, หลังบ้าน, ร้านค้า
ทำไมใช้ SSH key ไม่ใช้รหัสผ่าน
เก็บไว้ใน GitHub Secrets เท่านั้น ห้าม commit ลง repo
วางไว้บน server ใน authorized_keys ให้ server รู้ว่าใครเข้ามาได้
ถ้า key ของเว็บหนึ่งหลุด ลบแค่บรรทัดเดียวบน server โดยไม่กระทบเว็บอื่น
ย้อนกลับเมื่อมีปัญหา
server เก็บ build ล่าสุดไว้ 5 ชุด ถ้าเวอร์ชันใหม่มีปัญหา ไปที่ GitHub → Actions → Deploy → Run workflow → เลือก rollback แล้ว server จะนำ build ก่อนหน้ากลับขึ้นมาภายในไม่กี่วินาที โดยไม่ต้อง build ใหม่
ทบทวน
style.3fa9c1.css?เนื้อหาเปลี่ยน hash ก็เปลี่ยน ชื่อไฟล์จึงเปลี่ยนตาม เบราว์เซอร์มองว่าเป็นไฟล์ใหม่และโหลดใหม่เอง (ไม่ต้องกด Ctrl+F5) และระหว่าง deploy ไฟล์เก่ากับใหม่อยู่ร่วมกันได้ หน้าเว็บจึงไม่เพี้ยน