บันทึก

เริ่ม project ใหม่จาก Cloudflare

📝 Journal

ต้องการ runtime อะไร แล้ว platform ไหนให้มันมาเลย

ช่วงหลัง ๆ เวลาเริ่ม project ใหม่ ผมแทบไม่ได้เริ่มจาก Docker แล้ว ผมเริ่มจาก Cloudflare เลย

Stack ที่ใช้บ่อยขึ้นเรื่อย ๆ คือ Worker, Hono, D1, R2, Access แล้วจัดการทุกอย่างผ่าน Wrangler สิ่งที่ผมชอบคือ infrastructure หลายอย่างที่เมื่อก่อนต้องแยกไปจัดการ กลายเป็นส่วนหนึ่งของ project ไปเลย

Runtime อยู่ติดกับ infrastructure

Backend ผมใช้ Hono รันบน Cloudflare Workers เส้น API เขียนตามปกติ

const app = new Hono()

app.get('/users', async (c) => {
  // ...
})

export default app

ที่ต่างคือ runtime กับ infrastructure อยู่ใกล้กันมาก Database bind D1 เข้า Worker ผ่าน configuration ได้เลย Storage ใช้ R2 ส่วน secret หรือ service อื่น ๆ ผูกผ่าน environment ของ Worker

ระบบ login ด้วย OTP ทาง email ก็ไม่ต้องตั้ง SMTP server หรือทำ service แยก แค่ผูก email service เข้า environment แล้วเรียกใช้จาก Worker

Deployment ก็ไม่ต้อง SSH เข้า server อยากเปลี่ยน domain หรือเพิ่ม subdomain ก็จัดการผ่าน Wrangler กับ config ได้เลย

ของที่เคยต้อง “ไปจัดการ” กลายเป็นของที่ “ประกาศไว้ใน project” ได้

ลองของบน branch ก่อนเข้า production

อีกอย่างที่ผมใช้เยอะคือ Preview Deployment push branch ขึ้นไป ก็มี environment ของ branch นั้นให้ลองระบบก่อน merge เข้า production

สำหรับผมมันเปลี่ยน workflow ไปพอสมควร จากเดิม

GitHub
   ↓
CI
   ↓
Build Docker Image
   ↓
Push Image
   ↓
Deploy Server
   ↓
Configure Nginx
   ↓
Configure Domain

กลายเป็นประมาณนี้

Git Push
   ↓
Wrangler
   ↓
Cloudflare
   ├── Worker
   ├── D1
   ├── R2
   ├── Domain
   ├── Access
   └── Preview Environment

ช่วงหลังผมยังย้ายบางส่วนของ CI/CD จาก GitHub ไปให้ Cloudflare เป็นคน build และ deploy ด้วย

Docker ยังอยู่ เมื่อต้องคุมเอง

ไม่ได้หมายความว่า Docker หรือ VM ไม่ดี สำหรับระบบที่ต้องการ control runtime, networking, dependency หรือ infrastructure มาก ๆ ผมก็ยังเลือก Docker อยู่

แต่ project ใหม่บางประเภท โดยเฉพาะ API หรือ web application ที่ไม่ได้ต้องการ control ระดับนั้น การมี platform ที่ให้ runtime, database, storage, การเข้าถึง และ deployment อยู่ใน ecosystem เดียวกัน ทำให้เริ่มได้เร็วมาก

Hono เป็นอีกชิ้นที่ทำให้เรื่องนี้ลงตัว เพราะมันไม่ได้พยายามซ่อนความเป็น HTTP server มากเกินไป แต่ก็ไม่ได้บังคับให้ผูกกับ infrastructure แบบใดแบบหนึ่ง

คำถามตอนเริ่ม project

สิ่งที่เปลี่ยนไปจริง ๆ คือคำถามตอนเปิด project

เมื่อก่อนผมเริ่มด้วย จะเอา server ที่ไหนมารัน

เดี๋ยวนี้ผมเริ่มด้วย ต้องการ runtime อะไร แล้ว platform ไหนให้มันมาเลย

พอ infrastructure กลายเป็น configuration และ code มากขึ้น การเริ่ม project ใหม่ก็กลายเป็นเรื่องของการเขียน application มากขึ้น และเรื่องการดูแลเครื่องน้อยลง