12 factor - Mrsmithz/Project-SW-Dev-and-Env GitHub Wiki

12 Factor

  1. Codebase ควรใช้ Codebase เดียวกัน หรือมีลักษณะแบบ 1 ต่อ 1 ระหว่าง Codebase และ App เสมอ

  2. Dependencies มีการระบุ Dependencies ให้ชัดเจนว่าใช้ Package อะไร version อะไร

  3. Config มีการจัดการ Config โดยมีการกำหนด Environment Variable ครบทุกตัวที่ใช้ในระบบโดยเก็บแยกไว้เช่น .env

  4. Backing Services มีการเรียกใช้ service ภายนอก

  5. Build, Release, Run เมื่อ Source Code พร้อมที่จะ Deploy แล้ว เราก็จะทำ 3 ขั้นตอน โดยแบ่งเป็น

  • Build stage — คือ แปลงจาก Source Code ไปเป็นซอฟต์แวร์ที่พร้อมจะทำงาน (executable)
  • Release stage — คือ นำซอฟต์แวร์ที่ได้จากขั้นตอน Build มารวมกับ Config เพื่อเตรียมนำไปใช้งาน
  • Run stage (หรือ “runtime”) — นำซอฟต์แวร์ไปใช้งานใน Environment ต่างๆ
  1. Processes Application Application ควรทำงานแบบ Stateless Process คือ จะไม่เก็บข้อมูลบน Server แต่หากจำเป็นต้องเก็บ ต้องทำ Backing Services เก็บข้อมูลแทน

  2. Port Binding ระบุ Port ชัดเจน

  3. Concurrency สามารถปรับ Scale out (Horizontal scaling)

  4. Disposability แอปพลิเคชันเรา Startup Time ต้องไว และมีการจัดการข้อมูลให้เรียบร้อยเมื่อมีการ Shutdown

  5. Dev/prod parity ทำสภาพแวดล้อมของ Development, Staging และ Production ให้เหมือนกันมากที่สุด

  6. Logs ทำ Logs ให้เป็น Event Streams

  7. Admin processes เตรียมคำสั่งสำหรับงานแอดมินเพื่อสร้าง Process ที่ใช้ Release เดียวกับแอปพลิเคชัน

ตัวอย่างการนำไปใช้ 12-Factor

  1. Codebase ใช้ Git Version Control ในการทำงาน

  2. Dependencies มีการกำหนด Dependencies ภายใน package.json ตัวอย่าง

  3. Config มีการกำหนด Environment Variable ภายในไฟล์ .env

  4. Build, release, run มีการใช้ Dockerfile และ docker-compose.ymal

  5. Port binding มีการกำหนด Port ชัดเจน