จากศูนย์สู่การใช้งานจริง: FastAPI บน Fly.io และ GitHub Actions
คุณ push code ไปที่ main จากนั้น test จะทำงาน และ API ของคุณจะออนไลน์ภายในไม่กี่นาทีต่อมา
นี่คือวิธีที่คุณสร้าง deployment pipeline แบบมืออาชีพ คุณไม่จำเป็นต้องใช้ database หรือ Redis สำหรับการตั้งค่านี้ คุณต้องการเพียงแค่ FastAPI app หนึ่งตัว, Docker image หนึ่งตัว, ไฟล์ config แบบ YAML หนึ่งไฟล์ และ GitHub Actions workflow หนึ่งชุด
Workflow จะมีลักษณะดังนี้: git push → GitHub Actions → run tests → build image → deploy to Fly.io → live
ระบบนี้ประกอบด้วยสามส่วนหลัก:
- FastAPI app ของคุณ คุณจะแพ็กมันไว้ใน Docker image เพื่อให้มันทำงานได้เหมือนกันในทุกที่
- Fly.io ทำหน้าที่รัน image ของคุณบนเครื่องขนาดเล็ก และจัดการเรื่อง routing กับ health checks ให้คุณ
- GitHub Actions คอยเฝ้าดู code ของคุณและทำการ deploy โดยอัตโนมัติในทุกครั้งที่มีการ push
เพื่อความปลอดภัย ให้ใช้ scoped deploy token อย่าใช้ personal Fly API token ของคุณ ให้สร้าง token ที่มีสิทธิ์เข้าถึงเฉพาะแอปที่กำหนดเท่านั้น แล้วเก็บ token นี้ไว้ใน GitHub Secrets ในชื่อ FLY_API_TOKEN
รายละเอียดทางเทคนิคที่สำคัญสำหรับการตั้งค่าของคุณ:
- ใช้ Dockerfile ที่มี non-root user เพื่อเพิ่มความปลอดภัย
- Bind แอปของคุณเข้ากับ
0.0.0.0ใน Dockerfile หากคุณใช้127.0.0.1Fly จะไม่สามารถเข้าถึงแอปของคุณได้ - ใช้ไฟล์
fly.yamlไฟล์นี้คือแหล่งข้อมูลอ้างอิงหลัก (source of truth) ซึ่งจะกำหนด region, memory และ port ของคุณ - ตั้งค่า health check endpoint ใน FastAPI โดย Fly จะใช้สิ่งนี้เพื่อตรวจสอบให้แน่ใจว่าแอปของคุณกำลังทำงานอยู่ก่อนที่จะส่ง traffic เข้ามา ซึ่งจะช่วยให้สามารถทำ zero-downtime deployments ได้
ใน GitHub Actions workflow ให้ใช้คำสั่ง "needs: test" เพื่อให้แน่ใจว่าแอปจะ deploy ก็ต่อเมื่อการทดสอบผ่านเท่านั้น หาก code ของคุณมีปัญหา pipeline จะหยุดทำงานก่อนที่จะถึงขั้นตอน production
การตั้งค่านี้สามารถขยายตามการเติบโตของคุณได้ คุณสามารถเพิ่ม environment สำหรับ staging และ production ได้โดยใช้ไฟล์ config ที่ต่างกัน เช่น fly.stg.yaml และ fly.prod.yaml
เลิก deploy แบบ manual ได้แล้ว เปลี่ยนจาก "รันได้แค่บนแล็ปท็อปของฉัน" เป็น "ส่งมอบงานได้ในทุกการ merge"
ที่มา: https://dev.to/devded/zero-to-production-fastapi-on-flyio-and-github-actions-1ejo
