diff --git a/README.md b/README.md index c65cb692..68048a7f 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ ในรูปแบบที่คนทั่วไปสามารถเห็นได้อย่างเช่น Obsidian ที่สามารถเขียน Note เป็น Markdown และแสดงออกมาเหมือนหน้าเว็บ หรือ GitHub MD File ที่สามารถ Preview ผลลัพธ์ ออกมาทางหน้าเว็บได้ -การ Preview มีปัญหาเรื่อง การแสดงรูปภาพ เนื่องจากเมื่อนำไปใช้ในการ แสดงผลบนหน้าเว็บ จะต้องมีการระบุตำแหน่งของ รูปภาพให้เป็น absolute path +การ Preview มีปัญหาเรื่อง การแสดงรูปภาพ เนื่องจากเมื่อนำไปadminใช้ในการ แสดงผลบนหน้าเว็บ จะต้องมีการระบุตำแหน่งของ รูปภาพให้เป็น absolute path ไม่สามารถใช้ relative path ได้ทำให้ เมื่อต้องการจัด หรือโยกย้ายตำแหน่งของ ไฟล์ md สามารถทำได้ง่าย และไม่รวมอยู่ในตำแหน่งเดียวกันได้ หากมีการเพิ่ม หรือลบไฟล์ .md ให้ทำการแก้ไข [public/toc.json](public/toc.json) เพื่อให้ไฟล์นั้นสามารถถูกเรียกใช้ได้ diff --git a/public/documents/chapter-4-superadmin-build-and-deploy.md b/public/documents/chapter-4-superadmin-build-and-deploy.md index e1dd2335..cdcd5002 100644 --- a/public/documents/chapter-4-superadmin-build-and-deploy.md +++ b/public/documents/chapter-4-superadmin-build-and-deploy.md @@ -1,9 +1,11 @@ # Deploy Document -เอกสารสำหรับการติดตั้งระบบของ BMA HRMS โปรแกรมในยุคปัจจุบันจะทำงานบนเทคโนโลยีคอนเทนเนอร์ เพื่อยืดหยุ่นในการทำงาน ตั้งแต่การพัฒนา ทดสอบและ ใช้งานจริง (Production) จำเป็นต้องเข้าใจการทำงาน Docker เสียก่อน เมื่อเข้าใจหลักการทำงานแล้ว ในอนาคตมีบริการเพิ่มเติมเข้ามาก็จะใช้รูปแบบเดียวกันในการตั้งค่า +เอกสารสำหรับการติดตั้งระบบของ BMA HRMS โปรแกรมในยุคปัจจุบันจะทำงานบนเทคโนโลยีคอนเทนเนอร์ เพื่อยืดหยุ่นในการทำงาน ตั้งแต่การพัฒนา ทดสอบและ ใช้งานจริง (Production) จำเป็นต้องเข้าใจพื้นฐานการทำงาน Docker เสียก่อน ก็จะสามารถจัดการบริการเพิ่มเติมที่จะเกิดขึ้นอนาคต เนื่องจากการใช้งานเป็นรูปแบบเดียวกัน นอกจากการใช้งานผ่านคำสั่งแล้วสามารถใช้ Portainer ในการจัดการผ่าน Web UI ได้ การติดตั้งจะอยู่ในเอกสารนี้ + +![Network Diagram](images/buildanddeploy/build-network-diagram.png) ## ติดตั้ง Docker Docker คอนเทนเนอร์สามารถเรียนรู้ ตั้งค่า ดูแล รักษาได้ง่ายและรวดเร็ว รองรับการขยายตัว สามารถเพิ่มคลัสเตอร์ได้ง่าย และสามารถปรับเปลี่ยนเป็น Kubernates ได้ในอนาคต -สำหรับเอกสารนี้จะเป็นการติดตั้ง Docker บน debian 12 +สำหรับเอกสารนี้จะเป็นการติดตั้ง Docker บน debian 12 สำหรับบนวินโดว์(เพื่อการทดสอบเท่านั้น)ให้ติดตั้งบน WSL2 หรือใช้ Linux VM การติดตั้งโดยละเอียดดูได้จาก [คู่มือในเวปของ Docker](https://docs.docker.com/engine/install/debian/) วิธีการติดตั้งแบบย่อผ่าน [convenience script](https://docs.docker.com/engine/install/debian/#install-using-the-convenience-script) ทำตามวิธีการนี้ @@ -14,7 +16,7 @@ sudo sh get-docker.sh sudo usermod -aG docker user_name sudo usermod -aG sudo user_name ``` -แทน user_name ด้วยยูสเซอร์ที่ใช้ดูแลระบบ ในตัวอย่างให้สิทธิ์ sudo ด้วยเพื่อจะได้มีสิทธิ์ในจัดการไฟล์ที่เกิดจาก docker +แทน user_name ด้วยยูสเซอร์ที่ใช้ดูแลระบบ ในตัวอย่างจะให้อยู่ในกรุป docker และ sudo เพื่อให้มีสิทธิ์ในจัดการ service และไฟล์ที่เกิดจาก docker ## คำสั่ง Docker พื้นฐาน @@ -24,33 +26,34 @@ docker ps # ดูรายการคอนเทนเนอร์ท docker images # ดูรายการอิมเมจที่มีในระบบ docker pull [image_name:tag] # ดึงอิมเมจมาในระบบ docker network ls # แสดงรายการเน็ตเวิร์กของ docker -docker network crate [network_name] # สร้างเน็ตเวิร์กของ docker +docker network create [network_name] # สร้างเน็ตเวิร์กของ docker ``` docker compose จะรันคอนเทนเนอร์ของ docker หลายๆตัวพร้อมกันได้ โดยดูการตั้งค่าจากไฟล์ compose.yaml หรือ docker-compose.yaml -ที่อยู่ในโฟลเดอร์ที่เรียกคำสั่ง ในการทำงานทั่วไปเพื่อที่จะให้ง่ายต่อการใช้งาน จะใช้ docker compose เป็นหลัก +ที่อยู่ในโฟลเดอร์ที่เรียกคำสั่ง ในการทำงานทั่วไปเพื่อที่จะให้ง่ายต่อการใช้งาน จะใช้ docker compose เป็นหลัก ซึ่งจะมีผลเฉพาะ service ที่เขียนไว้ในไฟล์ compose -คำสั่ง docker compose พื้นฐาน (ต้องมีไฟล์ compose ในโฟลเดอร์ที่เรียกคำสั่ง) +คำสั่ง docker compose พื้นฐาน (ต้องมีไฟล์ compose.yaml หรือ docker-compose.yaml ในโฟลเดอร์ที่เรียกคำสั่ง) ```sh -docker compose ps -docker compose up -d -docker compose up -d [service_name] +docker compose ps # ดูรายการ service ที่ทำงานอยู่ +docker compose up -d # เรียกทุก service ขึ้นมาทำงาน +docker compose up -d [service_name] # เรียกเฉพาะ serfvice ที่ต้องการขึ้นมาทำงาน ``` -โฟลเดอร์ที่ใช้เริ่มต้นสร้างโปรแกรม บริการต่างๆในหัวข้อต่อๆไปจะสร้างภายใต้ ~/docker/hrms และใช้เน็ตเวิร์กชื่อ hrms ในการสื่อสารระหว่างกัน -``` -docker network create hrms -mkdir -p ~/docker/hrms -cd ~/docker/hrms +โฟลเดอร์ที่ใช้เริ่มต้นสร้างโปรแกรม บริการต่างๆในหัวข้อต่อๆไปจะสร้างภายใต้ ~/docker/hrms และใช้เน็ตเวิร์กชื่อ hrms ในการสื่อสารระหว่างกัน ทำให้สามารถเรียกใช้ชื่อ service แทน IP Address ได้เหมือนมี DNS ภายใน +```sh +docker network create hrms # สร้างเน็ตเวิร์ก hrms +mkdir -p ~/docker/hrms # สร้างโฟลเดอร์ +cd ~/docker/hrms # เข้าไปในโฟลเดอร์ ``` ทดสอบการทำงานของ docker ให้สร้างโฟลเดอร์ simple-web มีไฟล์ compose.yaml สร้างโฟลเดอร์ html แล้วสร้างไฟล์ html/index.html ในโฟลเดอร์นั้นพร้อมเนื้อหาเรียกคำสั่ง docker compose up -d -เป็นตัวอย่างแบบง่ายเพื่อใช้งาน nginx ไฟล์เวปเก็บในโฟลเดอร์ เปิดพอร์ต 9082 บนเครื่องโฮส ถ้าไม่สั่งหยุดการทำงานจะเริ่มเองถ้าโฮสเปิดขึ้นมาใหม่ ทำงานในเน็ตเวิร์ก hrms ```sh mkdir -p simple-web/html cd simple-web -nano compose.yaml -nano html/index.html +nano compose.yaml # สร้างไฟล์ compose +nano html/index.html # สร้างหน้าเวปสำหรับทดสอบ ``` ไฟล์ compose.yaml +เป็นตัวอย่างแบบง่ายเพื่อใช้งาน nginx เป็นเวปเซิร์ฟเวอร์ ที่พอร์ต 9082 บนเครื่องโฮส ถ้าไม่สั่งหยุดการทำงาน nginx จะเริ่มตัวเองเองถ้าโฮสเปิดขึ้นเครื่องใหม่ ทำงานในเน็ตเวิร์ก hrms การใช้งานใช้เว็บบราวเซอร์ไปที่ http://IP:9082 + ```yaml services: web: @@ -69,6 +72,7 @@ networks: ## Services การออกแบบใช้สถาปัตยกรรม Microservice จะประกอบจากหลาย Service เพื่อความเป็นระเบียบจะแบ่งไว้สามโฟลเดอร์ apisix(API Gateway), bmahrms-service(3rd Party service), bmahrms(HRMS services) + ```sh mkdir -P apisix mkdir -p bmahrms-service/{edm_config,elasticsearch_config,init_mysql,keycloak_config,report-server-templates} @@ -76,9 +80,9 @@ mkdir -p bmahrms-service/{edm_config,elasticsearch_config,init_mysql,keycloak_co mkdir -p bmahrms ``` -### APISIX +### APISIX (API Gateway) ทำหน้าที่จัดการ https, limit, security, load balance,reverse proxy, และ route ใน Microservice ก่อนใช้งานให้ตั้งค่าโดเมนกับ Public IP ให้เรียบร้อยแล้ว Forward Port 80/443 มาที่เครื่องนี้ -การตั้งค่า route จะทำผ่าน curl(Web API) +การตั้งค่าต่างๆจะทำผ่าน Web API ในตัวอย่างจะใช้ curl ```sh mkdir -p apisix/apisix_conf/ nano apisix/apisix_conf/config.yaml # configuration @@ -113,7 +117,8 @@ plugin_attr: ip: "0.0.0.0" port: 9091 ``` -apisix/compose.yaml > +apisix/compose.yaml จะมีสอง service ตัว apisix จะเป็นโปรแกรมหลัก ส่วน etcd ฐานข้อมูลแบบกระจายตัว ใช้สำหรับเก็บการตั้งค่าของ apisix + ```yaml services: apisix: @@ -163,8 +168,9 @@ volumes: ให้นำ root CA รวมกับ intermediate เพื่อให้พร้อมใช้งาน การตั้งค่า APISIX จะทำผ่าน Web API ใช้ curl และ api-key ที่ตั้งไว้ ```sh +# รวม intermediate เข้ากับ certificate หลัก cat star_bangkok.go.th_2024.crt 'GeoTrust TLS RSA CA G1.crt' > star_bangkok.go.th_2024.ca-bundle -# ใส่ใน APISIX +# ตั้งค่าใน APISIX curl http://127.0.0.1:9180/apisix/admin/ssls/1 \ -H 'X-API-KEY: put_admin_api_key_here' -X PUT -d ' { @@ -180,19 +186,18 @@ curl https://bma-hrms-id.bangkok.go.th -vvv ### 3rd Party Service (bmahrms-service) -โปรแกรมที่พัฒนาโดย 3rd Party หรือ Frappet ถูกใช้โดยโปรแกรมของ HRMS จะแยกมาใส่โฟลเดอร์ bmahrms-service +โปรแกรมกลุ่มนี้ที่พัฒนาโดย 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 ใช้สำหรับเก็บไฟล์ประสิทธิ์ภาพสูงสามารถรับโหลดหนัก การเรียกใช้รวมเร็วปลอดภัยกว่าระบบไฟล์ทั่วไป สามารถขยายเพิ่มได้ในอนาคต ถูกใช้ในหลายระบบที่ต้องการเก็บไฟล์ -- Windmill รันโฟลว์การทำงานอัตโนมัติจากสคริปต์ หลักๆใช้เพื่อรันตัวสำรองข้อมูล -- Portainer(bmahrms-portainer) ระบบจัดการ container มี UI ใช้งานง่าย -- RabbitMQ(bmahrms-mq) ระบบจัดคิวในการสือสารใน Microservice ทำให้รับโหลดหนักๆในช่วงเวลาสั้นๆได้ เช่นระบบการลงเวลา EDM -- Frappet Report Server(bmahrms-report-server) ใช้สำหรับสร้างรายงานจากเอกสารต้นแบบที่ออกแบบเองได้ ส่งออกเป็น docx, xlsx, pdf -- Frappet EDM(bmahrms-edm,bmahrms-elasticsearch,bmahrms-kibana,bmahrms-mq) ใช้สำหรับจัดการเอกสารที่ปลอดภัยรองรับโหลดจำนวนมากได้ จะมีระบบย่อยเบื่องหลังหลายตัว +- 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 +docker/bmahrms-service/compose.yaml ให้แก้ตัวแปรให้เหมาะสมตาม ```yaml networks: hrms: @@ -313,7 +318,7 @@ services: volumes: - ./edm_config/keycloak.json:/app/static/keycloak.json:ro environment: - - PUBLIC_KEY=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvfonxaaTELBLHYHTUxateIYMdjGP/yKuzTnNmuinplH2e0QbDJ2q7NsQh2X0YndiQ1uJEU5dFWWFi1D8TEnoVmqW7dxoQ1yXdNB1GvUbhgdT2btoRzzbXeluIVM2oNPtTHu5q5yhnEq/3ldWIkJwQjEkoKv50biDUSTxA0c/R3BLTIMIO6ZUe4ael06e34iSxdP3Dyw3IKTEHaqG1d37SMhfaZ25lA8QGjygiq733l2PfBiVgnjqcy+uvyXkWTjthTNSic3eaSXiIEtxyC4kAGrR/3qClZC8JEgf6mOFmoHna/eSStYodCTOj7SVUmujlMyvE8mGI9BslU/n4RLCuQIDAQAB + - PUBLIC_KEY=REALMS_PUBLIC_KEY - REALM_URL=https://bma-hrms-id.bangkok.go.th/realms/EDM - PREFERRED_AUTH=online - MANAGEMENT_ROLE=doc-management diff --git a/public/images/buildanddeploy/build-network-diagram.png b/public/images/buildanddeploy/build-network-diagram.png new file mode 100644 index 00000000..28ef771c Binary files /dev/null and b/public/images/buildanddeploy/build-network-diagram.png differ diff --git a/public/images/buildanddeploy/build-public-key.png b/public/images/buildanddeploy/build-public-key.png new file mode 100644 index 00000000..6b23f94a Binary files /dev/null and b/public/images/buildanddeploy/build-public-key.png differ