Add diagram

This commit is contained in:
oom 2024-11-12 13:43:48 +07:00
parent 5868a10605
commit 4a1593080d
4 changed files with 37 additions and 32 deletions

View file

@ -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) เพื่อให้ไฟล์นั้นสามารถถูกเรียกใช้ได้

View file

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB