diff --git a/public/documents/chapter-4-superadmin-build-and-deploy.docx b/public/documents/chapter-4-superadmin-build-and-deploy.docx index d8a6fd47..8b57acba 100644 Binary files a/public/documents/chapter-4-superadmin-build-and-deploy.docx and b/public/documents/chapter-4-superadmin-build-and-deploy.docx differ diff --git a/public/documents/chapter-4-superadmin-build-and-deploy.md b/public/documents/chapter-4-superadmin-build-and-deploy.md index 7c70c038..242e52a0 100644 --- a/public/documents/chapter-4-superadmin-build-and-deploy.md +++ b/public/documents/chapter-4-superadmin-build-and-deploy.md @@ -60,19 +60,20 @@ Container คือ เทคโนโลยีที่แบ่งแยกแ # สรุปเปรียบเทียบ -ต่อไปนี้เป็นตารางเปรียบเทียบระหว่าง Virtual Machine (VM) และ Container ที่แสดงให้เห็นความแตกต่างในด้านต่างๆ: -| **คุณสมบัติ** | **Virtual Machine (VM)** | **Container** | -|----------------------------|---------------------------------------------------------------|----------------------------------------------------------| -| **สถาปัตยกรรม** | ใช้ Hypervisor เพื่อสร้าง VM แยกแต่ละตัว พร้อม Guest OS | ใช้ Host OS ร่วมกันในระดับโปรเซส ไม่ต้องใช้ Hypervisor | -| **Guest OS** | แต่ละ VM มี Guest OS ของตนเอง | ไม่มี Guest OS แยก ใช้ OS เดียวกันทั้งหมด | -| **ขนาด** | มีขนาดใหญ่ เนื่องจากต้องรวม Guest OS | ขนาดเล็กกว่า เนื่องจากใช้ OS ร่วมกัน | -| **ประสิทธิภาพ** | ประสิทธิภาพต่ำกว่าเนื่องจากมี Overhead ของ Guest OS | ประสิทธิภาพสูงกว่า เนื่องจากไม่มี Overhead ของ OS แยก | -| **การเริ่มต้นใช้งาน** | ใช้เวลานาน เนื่องจากต้องบูท Guest OS | ใช้เวลาน้อยกว่าเนื่องจากไม่ต้องบูท OS | -| **การใช้งานทรัพยากร** | ใช้ทรัพยากรสูง เนื่องจากต้องแยก OS และ Kernel | ใช้ทรัพยากรน้อยกว่าเนื่องจากใช้ OS ร่วมกัน | -| **ความยืดหยุ่นในการพกพา** | พกพาได้เฉพาะบนแพลตฟอร์มที่รองรับ Hypervisor | พกพาสะดวก ใช้ได้ทุกที่ที่มี Container Engine | -| **การแยกความปลอดภัย** | การแยกระดับสูงเนื่องจากมี Kernel และ OS แยกแต่ละตัว | การแยกระดับโปรเซส อาจมีข้อจำกัดด้านความปลอดภัย | -| **การจัดการ** | ซับซ้อนกว่าในการจัดการเนื่องจากต้องดูแล OS และ Kernel แยกกัน | จัดการง่ายกว่าเพราะใช้ OS เดียวกันทั้งหมด | -| **กรณีใช้งาน** | ใช้ในศูนย์ข้อมูลขนาดใหญ่หรือการทดสอบแยกหลายระบบ | ใช้ใน DevOps การพัฒนาแอปฯที่ต้องการยืดหยุ่นสูง | +| **คุณลักษณะ** | **Virtual Machine (VM)** | **Container** | +|-------------------------|-----------------------------------------------|--------------------------------------------| +| **การจำลองระบบ** | จำลองระบบปฏิบัติการทั้งหมด | ใช้เคอร์เนลร่วมกับโฮสต์ | +| **ระบบปฏิบัติการ** | แต่ละ VM มีระบบปฏิบัติการของตัวเอง | ใช้ระบบปฏิบัติการเดียวกับโฮสต์ | +| **ประสิทธิภาพ** | ใช้ทรัพยากรมากเพราะต้องรัน OS ทั้งระบบ | ใช้ทรัพยากรน้อยเพราะแชร์ OS กับโฮสต์ | +| **ขนาดไฟล์** | ขนาดใหญ่ (รวม OS และแอปพลิเคชัน) | ขนาดเล็ก (มีเพียงแอปพลิเคชันและไลบรารี) | +| **เวลาในการเริ่มต้น** | ช้ากว่า เนื่องจากต้องบูต OS | เร็วกว่า เพราะรันแค่กระบวนการของแอป | +| **การแยกการทำงาน** | แยกการทำงานได้เต็มรูปแบบ | แยกผ่าน namespace และ cgroups | +| **การพกพา (Portability)** | ขึ้นอยู่กับ Hypervisor และ OS | ง่ายต่อการพกพาผ่าน Docker หรือ Podman | +| **การใช้งาน** | เหมาะสำหรับแอปพลิเคชันขนาดใหญ่หรือหลาย OS | เหมาะสำหรับแอปพลิเคชันที่ปรับขยายได้ | +| **การจัดการ** | ซับซ้อนกว่า เพราะต้องจัดการทั้ง VM และ OS | ง่ายกว่า โดยใช้เครื่องมือจัดการ Container | +| **ทรัพยากรที่ใช้** | ใช้ CPU, RAM และ Storage มากกว่า | ใช้น้อยกว่าเพราะไม่มี OS เต็มรูปแบบ | +| **ตัวอย่างเครื่องมือ** | VMware, Hyper-V, VirtualBox | Docker, Kubernetes, Podman | + # Docker คืออะไร? @@ -295,6 +296,57 @@ docker network ls # แสดงรายการเน็ต docker network create [network_name] # สร้างเน็ตเวิร์กของ docker ``` +# การใช้งานไฟล์ Docker Compose +## Docker Compose File คืออะไร? +**Docker Compose File** เป็นไฟล์ที่มีรูปแบบเป็น YAML (มักมีชื่อไฟล์ docker-compose.yml) ซึ่งใช้สำหรับการกำหนดค่าและจัดการการทำงานของ **หลายคอนเทนเนอร์** ในโปรเจกต์เดียวกัน ช่วยให้นักพัฒนาสามารถกำหนดบริการต่างๆ ที่คอนเทนเนอร์จะต้องรัน เช่น ฐานข้อมูล เว็บเซิร์ฟเวอร์ และบริการอื่นๆ ได้ในที่เดียว + +## Docker Compose File มีไว้ทำไม? +1. จัดการบริการหลายตัวพร้อมกัน +เมื่อโปรเจกต์มีหลายคอนเทนเนอร์ เช่น ฐานข้อมูล (MySQL), แอปพลิเคชัน (Node.js), และเครื่องมืออื่นๆ Docker Compose จะช่วยจัดการทุกอย่างในไฟล์เดียว + +2. ลดความซับซ้อนของคำสั่ง +แทนที่จะต้องใช้คำสั่ง docker run หลายครั้งเพื่อรันคอนเทนเนอร์ต่างๆ สามารถใช้คำสั่งเดียว (docker-compose up) เพื่อรันทุกบริการพร้อมกัน + +3. กำหนดค่าที่ซับซ้อน +สามารถกำหนดค่าเครือข่าย, การเชื่อมโยงคอนเทนเนอร์, พอร์ต, Volume, และ Environment Variable ได้ในไฟล์เดียว + +4. ทำให้การพกพาโปรเจกต์ง่ายขึ้น +แชร์ docker-compose.yml ไฟล์ให้ผู้อื่นเพื่อสร้างสภาพแวดล้อมที่เหมือนกันได้อย่างง่ายดาย + +## Docker Compose File ใช้งานเพื่ออะไร? +1. การตั้งค่าบริการในระบบที่ซับซ้อน +เช่น การตั้งค่าแอปพลิเคชันที่ต้องใช้ฐานข้อมูล Redis และ RabbitMQ ร่วมกัน + +2. การพัฒนาและทดสอบในเครื่อง +สร้างสภาพแวดล้อมที่เหมือนกับ Production บนเครื่องนักพัฒนา + +3. การจัดการ Volume และ Network +กำหนด Volume สำหรับเก็บข้อมูล และ Network เพื่อให้บริการต่างๆ สื่อสารกัน + +4. รองรับการสเกลระบบ +สามารถเพิ่มจำนวนคอนเทนเนอร์ในแต่ละบริการได้ง่ายโดยใช้ docker-compose up --scale + +## ตัวอย่างของไฟล์ docker-compose.yaml +เป็นตัวอย่างแบบง่ายเพื่อใช้งาน nginx เป็นเวปเซิร์ฟเวอร์ ที่พอร์ต 9082 บนเครื่องโฮส ถ้าไม่สั่งหยุดการทำงาน nginx จะเริ่มตัวเองเองถ้าโฮสเปิดขึ้นเครื่องใหม่ ทำงานในเน็ตเวิร์ก hrms การใช้งานใช้เว็บบราวเซอร์ไปที่ http://IP:9082 + +```yaml +services: + web: + image: nginx + volumes: + - ./html:/usr/share/nginx/html:ro + ports: + - "9082:80" + restart: unless-stopped + networks: + hrms: +networks: + hrms: + external: true +``` + +## การใช้งานคำสั่ง docker compose + docker compose จะรันคอนเทนเนอร์ของ docker หลายๆตัวพร้อมกันได้ โดยดูการตั้งค่าจากไฟล์ compose.yaml หรือ docker-compose.yaml ที่อยู่ในโฟลเดอร์ที่เรียกคำสั่ง ในการทำงานทั่วไปเพื่อที่จะให้ง่ายต่อการใช้งาน จะใช้ docker compose เป็นหลัก ซึ่งจะมีผลเฉพาะ service ที่เขียนไว้ในไฟล์ compose @@ -303,7 +355,13 @@ docker compose จะรันคอนเทนเนอร์ของ docker ```sh docker compose ps # ดูรายการ service ที่ทำงานอยู่ docker compose up -d # เรียกทุก service ขึ้นมาทำงาน -docker compose up -d [service_name] # เรียกเฉพาะ serfvice ที่ต้องการขึ้นมาทำงาน +docker compose up -d [service_name] # เรียกเฉพาะ service ที่ต้องการขึ้นมาทำงาน + +docker compose down # หยุดและลบบริการทั้งหมด + +docker compose logs # ดู Log ของบริการทั้งหมด + +docker compose logs -f [service_name] # ดู Log เฉพาะ service ที่ต้องการ ``` โฟลเดอร์ที่ใช้เริ่มต้นสร้างโปรแกรม บริการต่างๆในหัวข้อต่อๆไปจะสร้างภายใต้ ~/docker/hrms และใช้เน็ตเวิร์กชื่อ hrms ในการสื่อสารระหว่างกัน ทำให้สามารถเรียกใช้ชื่อ service แทน IP Address ได้เหมือนมี DNS ภายใน @@ -323,25 +381,6 @@ nano compose.yaml # สร้างไฟล์ compose nano html/index.html # สร้างหน้าเวปสำหรับทดสอบ ``` -ไฟล์ compose.yaml -เป็นตัวอย่างแบบง่ายเพื่อใช้งาน nginx เป็นเวปเซิร์ฟเวอร์ ที่พอร์ต 9082 บนเครื่องโฮส ถ้าไม่สั่งหยุดการทำงาน nginx จะเริ่มตัวเองเองถ้าโฮสเปิดขึ้นเครื่องใหม่ ทำงานในเน็ตเวิร์ก hrms การใช้งานใช้เว็บบราวเซอร์ไปที่ http://IP:9082 - -```yaml -services: - web: - image: nginx - volumes: - - ./html:/usr/share/nginx/html:ro - ports: - - "9082:80" - restart: unless-stopped - networks: - hrms: -networks: - hrms: - external: true -``` - ## Services การออกแบบใช้สถาปัตยกรรม Microservice จะประกอบจากหลาย Service เพื่อความเป็นระเบียบจะแบ่งไว้สามโฟลเดอร์ apisix(API Gateway), bmahrms-service(3rd Party service), bmahrms(HRMS services) @@ -470,14 +509,14 @@ curl https://bma-hrms-id.bangkok.go.th -vvv โปรแกรมกลุ่มนี้ที่พัฒนาโดย 3rd Party หรือ Frappet ไม่ได้มีฟังก์ชั่นงานเจาะจงสำหรับ HRMS ถูกใช้โดยโปรแกรมของ HRMS(เช่นฐานข้อมูล,เวปเซิร์ฟเวอร์ ฯลฯ) จะแยกมาใส่โฟลเดอร์ bmahrms-service การติดตั้งให้นำ compose.yaml และ คอนฟิกมาใส่โฟลเดอร์ bmahrms-service ให้เรียบร้อยก่อนใช้งาน สร้างโฟลเดอร์แต่ละ servie ทำดังนี้ -- Keycloak(bmahrms-postgres bmahrms-id) เซิร์ฟเวอร์สำหรับจัดการยูสเซอร์และการ Authentication ในระบบ -- MySQL(bmahrms-mysql) เป็นฐานข้อมูลของระบบ -- MiniO(bmahrms-s3) เป็น Object Storage แบบเดียวกับ AWS s3 ใช้สำหรับเก็บไฟล์ มีประสิทธิ์ภาพสูงสามารถรับโหลดหนัก มีความปลอดภัยกว่าเก็บด้วยระบบไฟล์ทั่วไป สามารถขยายเพิ่มได้ในอนาคต ถูกใช้ในหลายระบบที่ต้องการเก็บไฟล์ -- Windmill รันเวิร์กโฟลว์การทำงานอัตโนมัติจากสคริปต์ หลักๆใช้เพื่อรันตัวสำรองข้อมูล -- Portainer(bmahrms-portainer) ระบบจัดการ container มี UI ใช้งานง่าย สามารถใช้แทนคำสั่ง docker ได้ -- RabbitMQ(bmahrms-mq) ระบบจัดคิวในการสือสารใน Microservice มีความน่าเชื่อถือสูง สามารถรับโหลดหนักๆในช่วงเวลาสั้นๆได้ โดยไม่ต้องเพิ่มทรัพยากรโดยไม่จำเป็น เช่นระบบการลงเวลา -- Frappet Report Server(bmahrms-report-server) ใช้สำหรับสร้างรายงานจากเอกสารต้นแบบ ออกแบบเองได้ในรูปของ ไฟล์ docx และ xlsx เอกสารที่สร้างสามารถส่งออกเป็น docx, xlsx, pdf ได้ -- Frappet EDM ใช้สำหรับจัดการเอกสารที่ปลอดภัยรองรับโหลดจำนวนมากได้ จะมีระบบย่อยเบื้องหลังหลายตัว (bmahrms-edm,bmahrms-elasticsearch,bmahrms-kibana,bmahrms-mq) +- **Keycloak (bmahrms-postgres bmahrms-id)** เซิร์ฟเวอร์สำหรับจัดการยูสเซอร์และการ Authentication ในระบบ +- **MySQL (bmahrms-mysql)** เป็นฐานข้อมูลของระบบ +- **MiniO (bmahrms-s3)** เป็น Object Storage แบบเดียวกับ AWS s3 ใช้สำหรับเก็บไฟล์ มีประสิทธิ์ภาพสูงสามารถรับโหลดหนัก มีความปลอดภัยกว่าเก็บด้วยระบบไฟล์ทั่วไป สามารถขยายเพิ่มได้ในอนาคต ถูกใช้ในหลายระบบที่ต้องการเก็บไฟล์ +- **Windmill** รันเวิร์กโฟลว์การทำงานอัตโนมัติจากสคริปต์ หลักๆใช้เพื่อรันตัวสำรองข้อมูล +- **Portainer (bmahrms-portainer)** ระบบจัดการ container มี UI ใช้งานง่าย สามารถใช้แทนคำสั่ง docker ได้ +- **RabbitMQ (bmahrms-mq)** ระบบจัดคิวในการสือสารใน Microservice มีความน่าเชื่อถือสูง สามารถรับโหลดหนักๆในช่วงเวลาสั้นๆได้ โดยไม่ต้องเพิ่มทรัพยากรโดยไม่จำเป็น เช่นระบบการลงเวลา +- **Frappet Report Server (bmahrms-report-server)** ใช้สำหรับสร้างรายงานจากเอกสารต้นแบบ ออกแบบเองได้ในรูปของ ไฟล์ docx และ xlsx เอกสารที่สร้างสามารถส่งออกเป็น docx, xlsx, pdf ได้ +- **Frappet EDM** ใช้สำหรับจัดการเอกสารที่ปลอดภัยรองรับโหลดจำนวนมากได้ จะมีระบบย่อยเบื้องหลังหลายตัว (bmahrms-edm,bmahrms-elasticsearch,bmahrms-kibana,bmahrms-mq) docker/bmahrms-service/compose.yaml ให้แก้ตัวแปรให้เหมาะสมตาม @@ -1160,7 +1199,7 @@ services: การตั้งค่าเฉพาะของแต่ละ service และการตั้งค่า route การตั้งค่า route ส่วนใหญ่จะทำคล้ายๆกัน ส่วนที่เป็น Frontend จะเป็นการเซ็ตโดเมน(URL)ของแต่ละโปรแกรม ส่วนที่เป็น Backend จะเป็นการรวมหลาย backend เข้าในโดเมนเดียวกันแต่อยู่คนละ Subfolder ซึ่งเป็นการรวม Microservice เข้าด้วยกัน -### keycloak (bmahrms-id) +### Keycloak (bmahrms-id) ใช้สำหรับการ login ในระบบ (Identity Server) การสือสารหลัง API Gateway จะเป็น https แบบ self-signed @@ -1212,7 +1251,7 @@ curl "http://127.0.0.1:9180/apisix/admin/routes" \ }' ``` -### MySQL(bmahrms-postgres) +### MySQL (bmahrms-postgres) init_mysql/\*.sql เป็นที่เก็บ SQL Script สำหรับสร้างฐานข้อมูลตั้งต้น จะถูกเรียกใช้ครั้งแรกตอนเริ่มฐานข้อมูลเป็นข้อมูลตั้งต้นของระบบ @@ -1371,3 +1410,8 @@ curl http://127.0.0.1:9180/apisix/admin/consumers \ }' ``` + +# บทสรุป +ในยุคดิจิทัลที่เทคโนโลยีเปลี่ยนแปลงอย่างรวดเร็ว การออกแบบระบบซอฟต์แวร์ให้ตอบสนองความต้องการที่ซับซ้อนและเปลี่ยนแปลงได้ตลอดเวลาเป็นสิ่งจำเป็น สถาปัตยกรรม Microservice เป็นหนึ่งในแนวทางที่ได้รับการยอมรับอย่างกว้างขวาง เนื่องจากมีจุดเด่นด้านความยืดหยุ่น การปรับขยาย และการแยกส่วนการทำงานของระบบให้เป็นอิสระต่อกัน การนำเทคโนโลยีทันสมัยอย่าง Docker, RabbitMQ, Keycloak และ MinIO มาร่วมใช้งานใน Microservice ทำให้ระบบมีประสิทธิภาพยิ่งขึ้น ทั้งในด้านการพัฒนา การจัดการ และการรองรับการใช้งานในระดับสูง + +การผสมผสานเทคโนโลยีอย่าง Docker, RabbitMQ, Keycloak และ MinIO ช่วยยกระดับความสามารถของระบบให้สอดคล้องกับความต้องการทางธุรกิจในยุคที่การแข่งขันสูง สถาปัตยกรรมนี้ไม่เพียงตอบสนองต่อความซับซ้อนของการพัฒนา แต่ยังช่วยเพิ่มความเร็ว ความเสถียร และความปลอดภัยของระบบ ทำให้ Microservice เป็นทางเลือกที่ทันสมัยและเหมาะสมสำหรับการพัฒนาระบบในยุคปัจจุบัน \ No newline at end of file diff --git a/public/documents/output.docx b/public/documents/output.docx new file mode 100644 index 00000000..dcb4e3d8 Binary files /dev/null and b/public/documents/output.docx differ diff --git a/public/documents/~$apter-4-superadmin-build-and-deploy.docx b/public/documents/~$apter-4-superadmin-build-and-deploy.docx new file mode 100644 index 00000000..cfddaa38 Binary files /dev/null and b/public/documents/~$apter-4-superadmin-build-and-deploy.docx differ diff --git a/public/output.docx b/public/output.docx new file mode 100644 index 00000000..3f1f3cb6 Binary files /dev/null and b/public/output.docx differ