diff --git a/public/documents/chapter-4-superadmin-build-and-deploy.md b/public/documents/chapter-4-superadmin-build-and-deploy.md index 1df65424..01091bab 100644 --- a/public/documents/chapter-4-superadmin-build-and-deploy.md +++ b/public/documents/chapter-4-superadmin-build-and-deploy.md @@ -521,72 +521,128 @@ curl http://127.0.0.1:9180/apisix/admin/ssls/1 \ curl https://bma-hrms-id.bangkok.go.th -vvv ``` -### 3rd Party Service (bmahrms-service) +### 3rd Party(bmahrms-service) -โปรแกรมกลุ่มนี้ที่พัฒนาโดย 3rd Party หรือ Frappet ไม่ได้มีฟังก์ชันงานเจาะจงสำหรับ HRMS ถูกใช้โดยโปรแกรมของ HRMS(เช่นฐานข้อมูล,เว็บเซิร์ฟเวอร์ ฯลฯ) จะแยกมาใส่โฟลเดอร์ bmahrms-service -การติดตั้งให้นำ compose.yaml และ คอนฟิกมาใส่โฟลเดอร์ bmahrms-service ให้เรียบร้อยก่อนใช้งาน สร้างโฟลเดอร์แต่ละ servie ทำดังนี้ +โปรแกรมกลุ่มนี้ที่พัฒนาโดย 3rd Party หรือ Frappet ไม่ได้มีฟังก์ชันงานเจาะจงสำหรับ HRMS ถูกใช้โดยโปรแกรมของ HRMS(เช่นฐานข้อมูล,เว็บเซิร์ฟเวอร์ ฯลฯ) การตั้งค่าจะแยกมาใส่โฟลเดอร์ bmahrms-service +การติดตั้งให้นำ compose.yaml และ คอนฟิกมาใส่โฟลเดอร์นี้ให้เรียบร้อยก่อนใช้งาน โปรแกรมมีรายการดังนี้ดังนี้ -- **Keycloak (bmahrms-postgres bmahrms-id)** เซิร์ฟเวอร์สำหรับจัดการยูสเซอร์และการ Authentication ในระบบ -- **MySQL (bmahrms-mysql)** เป็นฐานข้อมูลของระบบ -- **MiniO (bmahrms-s3)** เป็น Object Storage แบบเดียวกับ AWS s3 ใช้สำหรับเก็บไฟล์ มีประสิทธิ์ภาพสูงสามารถรับโหลดหนัก มีความปลอดภัยกว่าเก็บด้วยระบบไฟล์ทั่วไป สามารถขยายเพิ่มได้ในอนาคต ถูกใช้ในหลายระบบที่ต้องการเก็บไฟล์ -- **Windmill** รันเวิร์กโฟลว์การทำงานอัตโนมัติจากสคริปต์ หลักๆใช้เพื่อรันตัวสำรองข้อมูล -- **Portainer (bmahrms-portainer)** ระบบจัดการ container มี UI ใช้งานง่าย สามารถใช้แทนคำสั่ง docker ได้ +#### รายการโปรแกรม 3rd Party - **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-id)** +ใช้สำหรับการ login ในระบบ (Identity Server) เพื่อความปลอดภัยการสื่อสารเฉพาะภายใน จะเป็น https จะสร้าง self-signed certificate ขึ้นมาตัวอย่างนี้มีอายุ 10 ปี -docker/bmahrms-service/service.env -การตั้งค่าและรหัสผ่านของคอนเทนเนอร์ผ่านตัวแปรแวดล้อมทำได้สอบแบบ -- ทำแต่ละ services.service_name.environments ในไฟล์คอมโพส -- แยกออกมาเป็นไฟล์เพื่อใช้ร่วมกันหลาย Service ก็ได้ ในตัวอย่างนี้จะใช้ ไฟล์ service.env + ```sh + cd bmahrms-service/keycloak_config + openssl genrsa -out keycloak.key 2048 + openssl req -new -x509 -sha256 -key keycloak.key -out keycloak.crt -days 3650 + cp keycloak.key keycloak.pem + cat keycloak.crt >> keycloak.pem + cd .. + ``` +- **Portainer (bmahrms-portainer)** +ระบบจัดการ container มี UI ใช้งานง่าย สามารถสั่ง/เปิด/ปิด/แก้ไข การทำงานของคอนเทนเนอร์ได้ แทนการใช้คำสั่ง docker เฉพาะผู้ดูแลระดับสูงถึงจะเข้าใช้งานส่วนนี้ +- **MySQL (bmahrms-postgres)** +เป็นฐานข้อมูลของระบบ ในโฟลเดอร์ init_mysql/\*.sql เป็นที่เก็บ SQL Script สำหรับสร้างฐานข้อมูลตั้งต้น +จะถูกเรียกใช้ครั้งแรกตอนเริ่มฐานข้อมูลเป็นข้อมูลตั้งต้นของระบบ +เนื่องจากไฟล์มีขนาดใหญ่หลายบรรทัดจะไม่ใส่ในเอกสารนี้ +- **Frappet Report Server (bmahrms-report-server)** +เป็น Microservice ใช้สำหรับการออกรายงาน ไม่จำเป็นต้องมี domain ของตัวเอง ให้เป็น path ในโดเมนที่มีอยู่ได้ ให้นำไฟล์ต้นแบบซึ่งสร้างจาก MS Word และ Excel มาไว้ที่โฟลเดอร์นี้ report-server-template/docx/files.docx, report-server-template/xlsx/files.xlsx +- **MiniO (bmahrms-s3)** +เป็น Object Storage แบบเดียวกับ AWS s3 มีประสิทธิ์ภาพสูงสามารถรับโหลดได้หนักและ มีความปลอดภัยกว่าเก็บด้วยระบบไฟล์ทั่วไป สามารถขยายเพิ่มได้ในอนาคต ถูกใช้ในหลายระบบที่ต้องการเก็บไฟล์ Route จะมีส่วน API กับ console การทำ route จะให้ console อยู่ใต้ subfoler https://domain/console +ในการติดตั้งบน production อาจจะไม่ได้อยู่ใน node เดียวกับ hrms และ apisix ดังนั้นควรอ้างเป็นชื่อโดเมนเต็มแทน +- **Windmill** รันเวิร์กโฟลว์การทำงานอัตโนมัติจากสคริปต์ หลักๆใช้เพื่อรันตัวสำรองข้อมูล +- **Frappet EDM (Enterprise Document Management)** +เป็นระบบจัดการเอกสารภายใน ประกอบไปด้วยโปรแกรมหลายตัว + - EDM ตัวโปรแกรมหลัก + - Elasticsearch ฐานข้อมูลดัชนีเอกสารเพื่อการค้นหาภาษาไทยแบบซับซ้อน อ้างผ่าน IP/PORT ไม่มี Route สู่ภายนอก + - Kibana ใน WebUI การจัดการ Elasticsearch มี Route ใช้เฉพาะนักพัฒนา + - RabbitMQ จัดการคิวงาน มี Route ใช้เฉพาะนักพัฒนา + - MiniO ใช้เพื่อเก็บไฟล์ต่างๆ มีหน้า console ใช้เฉพาะนักพัฒนา + +นอกเหนือจาก compose.yaml มีไฟล์คอนฟิกสองไฟล์ + +```sh +nano edm_config/keycloak.json +nano elasticsearch_config/config.yaml +``` + +edm_config/keycloak.json + +```json +{ + "realm": "EDM", + "auth-server-url": "https://bma-hrms-id.bangkok.go.th/", + "ssl-required": "external", + "resource": "EDM-V1", + "public-client": true, + "confidential-port": 0 +} +``` + +elasticsearch_config/config.yaml + +```yaml +network.host: 0.0.0.0 +s3.client.default.endpoint: bma-hrms-s3.bangkok.go.th +``` + +- **Kibana** +เป็น UI สำหรับ Elasticsearch สำหรับนักพัฒนามาตรวจสอบค่า ควรใช้จาก VPN และเน็ตเวิร์กภายในเท่านั้น เพื่อความปลอดภัย จะใช้ API gateway ทำ Basic Authentication และ https สำหรับนักพัฒนาเท่านั้น ใช้ผ่าน VPN หรือเน็ตเวิร์กภายในเท่านั้น + +#### ตัวแปรแวดล้อม 3rd Party service +การตั้งค่าและรหัสผ่านของคอนเทนเนอร์ผ่านตัวแปรแวดล้อมทำได้สองแบบ +- ทำแต่ละ service ใน compose.yaml +- แยกออกมาเป็นไฟล์เพื่อใช้ร่วมกันหลาย Service ก็ได้ ในตัวอย่างนี้จะใช้ ไฟล์ service.env ให้แก้ตัวแปรให้เหมาะสม KEYCLOAK_ADMIN_PASSWORD, KC_DB_PASSWORD, POSTGRES_PASSWORD, MINIO_ROOT_PASSWORD RABBITMQ_DEFAULT_PASS, MYSQL_ROOT_PASSWORD, MYSQL_PASSWORD -``` -# Generic -TZ=Asia/Bangkok -# Keycloak -KEYCLOAK_ADMIN=admin -KEYCLOAK_ADMIN_PASSWORD=put_keycloak_admin_password_here -# Keycloak -KC_DB=postgres -#KC_DB_URL=jdbc:postgresql://postgres:5432/keycloak -KC_DB_URL_HOST=bmahrms-postgres -KC_DB_URL_DATABASE=keycloak -KC_DB_PASSWORD=put_keycloak_db_password_here -KC_DB_USERNAME=keycloak -KC_DB_SCHEMA=public +**docker/bmahrms-service/service.env** + ``` + # Generic + TZ=Asia/Bangkok + # Keycloak + KEYCLOAK_ADMIN=admin + KEYCLOAK_ADMIN_PASSWORD=put_keycloak_admin_password_here -# PostgreSQL (keycloak) -POSTGRES_DB=keycloak -POSTGRES_USER=keycloak -POSTGRES_PASSWORD=put_keycloak_db_password_here + # Keycloak + KC_DB=postgres + #KC_DB_URL=jdbc:postgresql://postgres:5432/keycloak + KC_DB_URL_HOST=bmahrms-postgres + KC_DB_URL_DATABASE=keycloak + KC_DB_PASSWORD=put_keycloak_db_password_here + KC_DB_USERNAME=keycloak + KC_DB_SCHEMA=public -# MiniO -MINIO_ROOT_USER=admin -MINIO_ROOT_PASSWORD=put_minio_admin_password_here -MINIO_BROWSER_REDIRECT_URL=https://bmahrms-s3.bangkok.go.th/console/ + # PostgreSQL (keycloak) + POSTGRES_DB=keycloak + POSTGRES_USER=keycloak + POSTGRES_PASSWORD=put_keycloak_db_password_here -# RabbitMQ -RABBITMQ_DEFAULT_USER=admin -RABBITMQ_DEFAULT_PASS=put_rabbitmq_admin_password_here + # MiniO + MINIO_ROOT_USER=admin + MINIO_ROOT_PASSWORD=put_minio_admin_password_here + MINIO_BROWSER_REDIRECT_URL=https://bmahrms-s3.bangkok.go.th/console/ -# MySQL -MYSQL_ROOT_PASSWORD=put_mysql_admin_password_here -MYSQL_DATABASE=bma_ehr -MYSQL_USER=frappet -MYSQL_PASSWORD=put_mysql_db_password_here + # RabbitMQ + RABBITMQ_DEFAULT_USER=admin + RABBITMQ_DEFAULT_PASS=put_rabbitmq_admin_password_here -# Elasticsearch & Kibana -xpack.security.enabled=false -discovery.type=single-node -ELASTICSEARCH_HOSTS=http://bmahrms-elasticsearch:9200 + # MySQL + MYSQL_ROOT_PASSWORD=put_mysql_admin_password_here + MYSQL_DATABASE=bma_ehr + MYSQL_USER=frappet + MYSQL_PASSWORD=put_mysql_db_password_here -# REDIS -REDIS_PORT=6379 -REDIS_DATABASES=16 -``` + # Elasticsearch & Kibana + xpack.security.enabled=false + discovery.type=single-node + ELASTICSEARCH_HOSTS=http://bmahrms-elasticsearch:9200 -docker/bmahrms-service/compose.yaml จะใช้ docker volume (keycloak_data, minio_data ฯลฯ) แทน file system (ตัวอย่างก่อนหน้า) เพื่อประสิทธิ์ภาพสูงกว่าในการเก็บขอมูลที่มีการเขียนอ่านบ่อย + # REDIS + REDIS_PORT=6379 + REDIS_DATABASES=16 + ``` +#### compose.yaml ของ 3rd Party service +docker/bmahrms-service/compose.yaml จะใช้ docker volume (keycloak_data, minio_data ฯลฯ) แทน file system (ตัวอย่างก่อนหน้า) เพื่อประสิทธิ์ภาพสูงกว่าในการเก็บข้อมูลที่มีการเขียนอ่านบ่อย ให้แก้ค่า PUBLIC_KEY MINIO_ACCESS_KEY,MINIO_SECRET_KEY, ipaddress_bma_hrms_id ให้เหมาะสม @@ -750,7 +806,136 @@ docker compose up -d bmahrms-postgres docker compose up -d bmahrms-id ``` -### BMA HRMS Service +#### Route ของ 3rd Service + +```sh +# Keycloak Route +curl "http://127.0.0.1:9180/apisix/admin/routes" \ +-H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' +{ + "id": "bmahrms-id", + "host": "bma-hrms-id.bangkok.go.th", + "uri": "/*", + "upstream": { + "scheme": "https", + "type": "roundrobin", + "nodes": { + "bmahrms-id:8443": 1 + } + } +}' +# Portainer route +curl "http://127.0.0.1:9180/apisix/admin/routes" \ +-H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' +{ + "id": "bmahrms-portainer", + "host": "bmahrms-portainer.bangkok.go.th", + "uri": "/*", + "upstream": { + "type": "roundrobin", + "nodes": { + "bmahrms-portainer:9000": 1 + } + } +}' +# Report Server Route +curl "http://127.0.0.1:9180/apisix/admin/routes" \ +-H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' +{ + "id": "bmahrms-report-server", + "hosts": ["bma-hrms.bangkok.go.th","bma-hrms-user.bangkok.go.th"], + "uris": ["/api/v1/report-template/*"], + "upstream": { + "type": "roundrobin", + "nodes": { + "bmahrms-report-server:80": 1 + } + } +}' + +# MiniO Rote +curl "http://127.0.0.1:9180/apisix/admin/routes" \ +-H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' +{ + "id": "bmahrms-s3", + "host": "bma-hrms-s3.bangkok.go.th", + "uri": "/*", + "upstream": { + "type": "roundrobin", + "nodes": { + "bmahrms-s3:9000": 1 + } + } +}' +# Health test +curl -k -I https://bma-hrms-s3.bangkok.go.th/minio/health/live +# MiniO Console Route +curl "http://127.0.0.1:9180/apisix/admin/routes" \ +-H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' +{ + "id": "bmahrms-s3-console", + "host": "bma-hrms-s3.bangkok.go.th", + "uri": "/console/*", + "enable_websocket": true, + "plugins": { + "proxy-rewrite": { + "regex_uri": ["^/console/(.*)","/$1"] + } + }, + "upstream": { + "type": "roundrobin", + "nodes": { + "bmahrms-s3:9001": 1 + } + } +}' +# EDM Route +curl "http://127.0.0.1:9180/apisix/admin/routes" \ +-H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' +{ + "id": "bmahrms-edm", + "host": "bma-hrms-edm.bangkok.go.th", + "uri": "/*", + "upstream": { + "type": "roundrobin", + "nodes": { + "bmahrms-edm:80": 1 + } + } +}' +# Kibana Route +curl "http://127.0.0.1:9180/apisix/admin/routes" \ +-H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' +{ + "id": "bmahrms-kibana", + "host": "bma-hrms-kibana.bangkok.go.th", + "uri": "/*", + "plugins": { + "basic-auth": {} + }, + "upstream": { + "type": "roundrobin", + "nodes": { + "bmahrms-kibana:5601": 1 + } + } +}' +# Kibana Basic Authentication +curl http://127.0.0.1:9180/apisix/admin/consumers \ +-H 'X-API-KEY: put_admin_api_key_here' -X PUT -d ' +{ + "username": "admin", + "plugins": { + "basic-auth": { + "username": "admin", + "password": "kibana-password-here" + } + } +}' +``` + + +### BMA HRMS ระบบที่พัฒนาเพื่อ HRMS โดยเฉพาะ จะมี 3 ไฟล์ @@ -791,8 +976,11 @@ docker compose up -d bmahrms-id - bmahrms-development - bmahrms-kpi -docker/bmahrms/fe.env แก้ตัวแปร VITE_CLIENTSECRET_KEYCLOAK KC_SERVICE_ACCOUNT_SECRET +#### ตัวแปรแวดล้อมของ BMA HRMS (Frontend) +**docker/bmahrms/fe.env** + +แก้ตัวแปร VITE_CLIENTSECRET_KEYCLOAK KC_SERVICE_ACCOUNT_SECRET ``` # Frontend Global TZ=Asia/Bangkok @@ -816,8 +1004,10 @@ KC_SERVICE_ACCOUNT_CLIENT_ID=bma-ehr-dev KC_SERVICE_ACCOUNT_SECRET=put_service_account_secret_here MANAGEMENT_ROLE=storage_management ``` +#### ตัวแปรแวดล้อมของ BMA HRMS (Backendend) +**docker/bmahrms/be.env** -docker/bmahrms/be.env แก้ค่าของ DB_PASSWORD,AUTH_PUBLIC_KEY, MINIO_KEY, MINIO_SECRET, STORAGE_SECRET,KC_SERVICE_ACCOUNT_SECRET,REDIS_HOST,KEYCLOAK_KEY,AUTH_PUBLIC_KEY, PUBLIC_KEY +แก้ค่าของ DB_PASSWORD,AUTH_PUBLIC_KEY, MINIO_KEY, MINIO_SECRET, STORAGE_SECRET,KC_SERVICE_ACCOUNT_SECRET,REDIS_HOST,KEYCLOAK_KEY,AUTH_PUBLIC_KEY, PUBLIC_KEY ค่าของ public key ของ keycloak ให้สำเนาจากส่วนนี้ @@ -873,8 +1063,11 @@ ELASTICSEARCH_PORT=9200 ELASTICSEARCH_INDEX=bma-ehr-log-index ``` -docker/bmahrms/compose.yaml +#### compose.yaml ของ BMA HRMS +ใช้สำหรับ Backend และ Frontend +**docker/bmahrms/compose.yaml** +มี Backend และ Frontend ```yaml networks: hrms: @@ -1265,24 +1458,17 @@ services: # End Backend Section ``` -## Configuration +#### Route ของ BMA-HRMS frontend -การตั้งค่าเฉพาะของแต่ละ service มีสองส่วน -- เป็นการตั้งค่าเฉพาะโปรแกรม จะแตกต่างกันไปตามโปรแกรม -- ตั้งค่า route สำหรับโดเมนต่างๆ (สำหรับ Frontend) และ Microservice (เป็นการรวมหลาย backend เข้าในโดเมนเดียวกันแต่อยู่คนละ Subfolder) - -### BMA-HRMS frontend โดเมนสำหรับหน้าโปรแกรมจะมีดังนี้ -bmahrms.bangkok.go.th,bmahrms-user.bangkok.go.th,bmahrms-admin.bangkok.go.th,bmahrms-checkin.bangkok.go.th,bmahrms-recruiting.bangkok.go.th,bmahrms-exam.bangkok.go.th - -จะต้องสร้าง route ให้ตรงกับหน้าที่ใช้งาน +bmahrms.bangkok.go.th,bmahrms-user.bangkok.go.th,bmahrms-admin.bangkok.go.th,bmahrms-checkin.bangkok.go.th,bmahrms-recruiting.bangkok.go.th,bmahrms-exam.bangkok.go.th จะต้องสร้าง route ให้ตรงกับหน้าเวปที่ใช้งาน ใช้แค่ methods GET ```sh curl "http://127.0.0.1:9180/apisix/admin/routes" \ -H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' { "id": "bmahrms", "methods": ["GET"], - "host": "bmahrms.bangkok.go.th", + "host": "bma-hrms.bangkok.go.th", "uri": "/*", "upstream": { "type": "roundrobin", @@ -1297,7 +1483,7 @@ curl "http://127.0.0.1:9180/apisix/admin/routes" \ { "id": "bmahrms-user", "methods": ["GET"], - "host": "bmahrms-user.bangkok.go.th", + "host": "bma-hrms-user.bangkok.go.th", "uri": "/*", "upstream": { "type": "roundrobin", @@ -1311,7 +1497,7 @@ curl "http://127.0.0.1:9180/apisix/admin/routes" \ { "id": "bmahrms-admin", "methods": ["GET"], - "host": "bmahrms-admin.bangkok.go.th", + "host": "bma-hrms-admin.bangkok.go.th", "uri": "/*", "upstream": { "type": "roundrobin", @@ -1325,7 +1511,7 @@ curl "http://127.0.0.1:9180/apisix/admin/routes" \ { "id": "bmahrms-checkin", "methods": ["GET"], - "host": "bmahrms-checkin.bangkok.go.th", + "host": "bma-hrms-checkin.bangkok.go.th", "uri": "/*", "upstream": { "type": "roundrobin", @@ -1337,7 +1523,7 @@ curl "http://127.0.0.1:9180/apisix/admin/routes" \ curl "http://127.0.0.1:9180/apisix/admin/routes" \ -H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' { - "id": "bmahrms-recruiting", + "id": "bma-hrms-recruiting", "methods": ["GET"], "host": "bmahrms-recruiting.bangkok.go.th", "uri": "/*", @@ -1348,237 +1534,320 @@ curl "http://127.0.0.1:9180/apisix/admin/routes" \ } } }' + +``` +Faq and Manual เป็น Micro Frontend เป็นพาร์ทย่อยของโดเมนหลัก +- Faq: /faq +- Manual: /manual + +```sh + curl "http://127.0.0.1:9180/apisix/admin/routes" \ -H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' { - "id": "bmahrms-exam", - "methods": ["GET"], - "host": "bmahrms-exam.bangkok.go.th", - "uri": "/*", - "upstream": { - "type": "roundrobin", - "nodes": { - "bmahrms-exam:80": 1 - } - } -}' -``` -### BMA-HRMS backend - - - -### Keycloak (bmahrms-id) - -ใช้สำหรับการ login ในระบบ (Identity Server) เพื่อความปลอดภัยการสื่อสารเฉพาะภายใน จะเป็น https จะสร้าง self-signed certificate ขึ้นมาตัวอย่างนี้มีอายุ 10 ปี - -```sh -cd bmahrms-service/keycloak_config -openssl genrsa -out keycloak.key 2048 -openssl req -new -x509 -sha256 -key keycloak.key -out keycloak.crt -days 3650 -cp keycloak.key keycloak.pem -cat keycloak.crt >> keycloak.pem -cd .. -``` - -Keycloak Route - -```sh -curl "http://127.0.0.1:9180/apisix/admin/routes" \ --H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' -{ - "id": "bmahrms-id", - "host": "bma-hrms-id.bangkok.go.th", - "uri": "/*", - "upstream": { - "scheme": "https", - "type": "roundrobin", - "nodes": { - "bmahrms-id:8443": 1 - } - } -}' -``` - -### Portainer (bmahrms-portainer) - -เป็นโปรแกรมสำหรับบริหารจัดการ container สามารถสั่งเปิดปิดแก้ไขการทำงานของคอนเทนเนอร์ได้ เฉพาะผู้ดูแลระดับสูงถึงจะเข้าใช้งานส่วนนี้ - -```sh -curl "http://127.0.0.1:9180/apisix/admin/routes" \ --H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f2" -X PUT -d ' -{ - "id": "bmahrms-portainer", - "host": "bmahrms-portainer.bangkok.go.th", - "uri": "/*", - "upstream": { - "type": "roundrobin", - "nodes": { - "bmahrms-portainer:9000": 1 - } - } -}' -``` - -### MySQL (bmahrms-postgres) - -init_mysql/\*.sql เป็นที่เก็บ SQL Script สำหรับสร้างฐานข้อมูลตั้งต้น -จะถูกเรียกใช้ครั้งแรกตอนเริ่มฐานข้อมูลเป็นข้อมูลตั้งต้นของระบบ -เนื่องจากไฟล์มีขนาดใหญ่หลายบรรทัดจะไม่ใส่ในเอกสารนี้ - -### Report Server - -เป็น Microservice ใช้สำหรับการออกรายงาน ไม่จำเป็นต้องมี domain ของตัวเอง ให้เป็น path ในโดเมนที่มีอยู่ได้ ให้นำไฟล์ต้นแบบซึ่งสร้างจาก MS Word และ Excel มาไว้ที่โฟลเดอร์นี้ -report-server-template/docx/files.docx, report-server-template/xlsx/files.xlsx - -```sh -curl "http://127.0.0.1:9180/apisix/admin/routes" \ --H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' -{ - "id": "bmahrms-report-server", - "hosts": ["bma-hrms.bangkok.go.th","bma-hrms-user.bangkok.go.th"], - "uris": ["/api/v1/report-template/*"], - "upstream": { - "type": "roundrobin", - "nodes": { - "bmahrms-report-server:80": 1 - } - } -}' -``` - -### MiniO - -Object Storage ใช้เพื่อเก็บไฟล์ของระบบถูกใช้โดย HRMS และ EDM -Route จะมีส่วน API กับ console การทำ route จะให้ console อยู่ใต้ subfoler https://domain/console -ในการติดตั้งบน production อาจจะไม่ได้อยู่ใน node เดียวกับ hrms และ apisix ดังนั้นควรอ้างเป็นชื่อโดเมนเต็มแทน - -```sh -# bma-hrms-s3.bangkok.go.th -curl "http://127.0.0.1:9180/apisix/admin/routes" \ --H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' -{ - "id": "bmahrms-s3", - "host": "bma-hrms-s3.bangkok.go.th", - "uri": "/*", - "upstream": { - "type": "roundrobin", - "nodes": { - "bmahrms-s3:9000": 1 - } - } -}' -# test -curl -k -I https://bma-hrms-s3.bangkok.go.th/minio/health/live -# bma-hrms-s3.bangkok.go.th/console -curl "http://127.0.0.1:9180/apisix/admin/routes" \ --H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' -{ - "id": "bmahrms-s3-console", - "host": "bma-hrms-s3.bangkok.go.th", - "uri": "/console/*", - "enable_websocket": true, + "id": "bmahrms-faq", + "host": "bma-hrms.bangkok.go.th", + "uri": "/faq/*", "plugins": { "proxy-rewrite": { - "regex_uri": ["^/console/(.*)","/$1"] + "regex_uri": ["^/faq/(.*)","/$1"] } }, "upstream": { "type": "roundrobin", "nodes": { - "bmahrms-s3:9001": 1 + "bmahrms-faq:80": 1 } } }' -``` -### EDM (Enterprixe Document Management) - -เป็นระบบจัดการเอกสารภายใน ประกอบไปด้วยโปรแกรมหลายตัว - -- EDM ตัวโปรแกรมหลัก -- Elasticsearch ฐานข้อมูลดัชนีเอกสารเพื่อการค้นหาภาษาไทยแบบซับซ้อน อ้างผ่าน IP/PORT ไม่มี Route สู่ภายนอก -- Kibana ใน WebUI การจัดการ Elasticsearch มี Route ใช้เฉพาะนักพัฒนา -- RabbitMQ จัดการคิวงาน มี Route ใช้เฉพาะนักพัฒนา -- MiniO ใช้เพื่อเก็บไฟล์ต่างๆ มีหน้า console ใช้เฉพาะนักพัฒนา - -นอกเหนือจาก compose.yaml มีไฟล์คอนฟิกสองไฟล์ - -```sh -nano edm_config/keycloak.json -nano elasticsearch_config/config.yaml -``` - -edm_config/keycloak.json - -```json -{ - "realm": "EDM", - "auth-server-url": "https://bma-hrms-id.bangkok.go.th/", - "ssl-required": "external", - "resource": "EDM-V1", - "public-client": true, - "confidential-port": 0 -} -``` - -elasticsearch_config/config.yaml - -```yaml -network.host: 0.0.0.0 -s3.client.default.endpoint: bma-hrms-s3.bangkok.go.th -``` - -EDM Route - -```sh curl "http://127.0.0.1:9180/apisix/admin/routes" \ --H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f2" -X PUT -d ' +-H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' { - "id": "bmahrms-edm", - "host": "bma-hrms-edm.bangkok.go.th", - "uri": "/*", + "id": "bmahrms-manual", + "host": "bma-hrms.bangkok.go.th", + "uri": "/manual/*", + "plugins": { + "proxy-rewrite": { + "regex_uri": ["^/manual/(.*)","/$1"] + } + }, "upstream": { "type": "roundrobin", "nodes": { - "bmahrms-edm:80": 1 + "bmahrms-manual:80": 1 } } }' ``` +#### Route ของ BMA-HRMS backend -Kibana Route -เป็น UI สำหรับ Elasticsearch สำหรับนักพัฒนามาตรวจสอบค่า ควรใช้จาก VPN และเน็ตเวิร์กภายในเท่านั้น เพื่อความปลอดภัย ให้ API gateway จะช่วยทำ Basic Authentication และ https ให้ ควรใช้ภายในเสำหรับนักพัฒนาเท่านั้น +Route ของ API จะอยู่ในรูปแบบ domain/api/v1/* ```sh curl "http://127.0.0.1:9180/apisix/admin/routes" \ -H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' { - "id": "bmahrms-kibana", - "host": "bma-hrms-kibana.bangkok.go.th", - "uri": "/*", - "plugins": { - "basic-auth": {} - }, + "id": "hrms-backend-org", + "host": "bma-hrms.bangkok.go.th", + "uri": "/api/v1/org/*", "upstream": { "type": "roundrobin", "nodes": { - "bmahrms-kibana:5601": 1 + "bmahrms-org:80": 1 } } }' -# Basic Authentication -curl http://127.0.0.1:9180/apisix/admin/consumers \ --H 'X-API-KEY: put_admin_api_key_here' -X PUT -d ' +curl "http://127.0.0.1:9180/apisix/admin/routes" \ +-H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' { - "username": "admin", - "plugins": { - "basic-auth": { - "username": "admin", - "password": "kibana-password-here" - } + "id": "hrms-backend-recruit", + "host": "bma-hrms.bangkok.go.th", + "uri": "/api/v1/recruit/*", + "upstream": { + "type": "roundrobin", + "nodes": { + "bmahrms-recruit:80": 1 } + } +}' +curl "http://127.0.0.1:9180/apisix/admin/routes" \ +-H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' +{ + "id": "hrms-backend-report", + "host": "bma-hrms.bangkok.go.th", + "uri": "/api/v1/report/*", + "upstream": { + "type": "roundrobin", + "nodes": { + "bmahrms-report:80": 1 + } + } +}' +curl "http://127.0.0.1:9180/apisix/admin/routes" \ +-H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' +{ + "id": "hrms-backend-insignia", + "host": "bma-hrms.bangkok.go.th", + "uri": "/api/v1/insignia/*", + "upstream": { + "type": "roundrobin", + "nodes": { + "bmahrms-insignia:80": 1 + } + } +}' +curl "http://127.0.0.1:9180/apisix/admin/routes" \ +-H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' +{ + "id": "hrms-backend-recruit-exam-cms", + "host": "bma-hrms.bangkok.go.th", + "uri": "/api/v1/cms/*", + "upstream": { + "type": "roundrobin", + "nodes": { + "bmahrms-recruit-exam:80": 1 + } + } +}' +curl "http://127.0.0.1:9180/apisix/admin/routes" \ +-H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' +{ + "id": "hrms-backend-recruit-exam-candidate", + "host": "bma-hrms.bangkok.go.th", + "uri": "/api/v1/candidate/*", + "upstream": { + "type": "roundrobin", + "nodes": { + "bmahrms-recruit-exam:80": 1 + } + } +}' +curl "http://127.0.0.1:9180/apisix/admin/routes" \ +-H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' +{ + "id": "hrms-backend-org-employee", + "host": "bma-hrms.bangkok.go.th", + "uri": "/api/v1/organization-employee/*", + "upstream": { + "type": "roundrobin", + "nodes": { + "bmahrms-org-employee:80": 1 + } + } +}' +curl "http://127.0.0.1:9180/apisix/admin/routes" \ +-H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' +{ + "id": "hrms-backend-placement", + "host": "bma-hrms.bangkok.go.th", + "uri": "/api/v1/placement/*", + "upstream": { + "type": "roundrobin", + "nodes": { + "bmahrms-placement:80": 1 + } + } +}' +curl "http://127.0.0.1:9180/apisix/admin/routes" \ +-H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' +{ + "id": "hrms-backend-retirement", + "host": "bma-hrms.bangkok.go.th", + "uri": "/api/v1/retirement/*", + "upstream": { + "type": "roundrobin", + "nodes": { + "bmahrms-retirement:80": 1 + } + } +}' +curl "http://127.0.0.1:9180/apisix/admin/routes" \ +-H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' +{ + "id": "hrms-backend-report-v2", + "host": "bma-hrms.bangkok.go.th", + "uri": "/api/v2/report/*", + "upstream": { + "type": "roundrobin", + "nodes": { + "bmahrms-report-v2:80": 1 + } + } +}' +curl "http://127.0.0.1:9180/apisix/admin/routes" \ +-H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' +{ + "id": "hrms-backend-probation", + "host": "bma-hrms.bangkok.go.th", + "uri": "/api/v1/probation/*", + "upstream": { + "type": "roundrobin", + "nodes": { + "bmahrms-probation:80": 1 + } + } +}' +curl "http://127.0.0.1:9180/apisix/admin/routes" \ +-H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' +{ + "id": "hrms-backend-command", + "host": "bma-hrms.bangkok.go.th", + "uri": "/api/v1/order/*", + "upstream": { + "type": "roundrobin", + "nodes": { + "bmahrms-command:80": 1 + } + } }' +curl "http://127.0.0.1:9180/apisix/admin/routes" \ +-H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' +{ + "id": "hrms-backend-command-message", + "host": "bma-hrms.bangkok.go.th", + "uri": "/api/v1/message/*", + "upstream": { + "type": "roundrobin", + "nodes": { + "bmahrms-command:80": 1 + } + } +}' + +curl "http://127.0.0.1:9180/apisix/admin/routes" \ +-H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' +{ + "id": "hrms-backend-discipline", + "host": "bma-hrms.bangkok.go.th", + "uri": "/api/v1/discipline/*", + "upstream": { + "type": "roundrobin", + "nodes": { + "bmahrms-discipline:80": 1 + } + } +}' +curl "http://127.0.0.1:9180/apisix/admin/routes" \ +-H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' +{ + "id": "hrms-backend-evaluation", + "host": "bma-hrms.bangkok.go.th", + "uri": "/api/v1/evaluation/*", + "upstream": { + "type": "roundrobin", + "nodes": { + "bmahrms-evaluation:80": 1 + } + } +}' +curl "http://127.0.0.1:9180/apisix/admin/routes" \ +-H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' +{ + "id": "hrms-backend-leave", + "host": "bma-hrms.bangkok.go.th", + "uri": "/api/v1/leave/*", + "upstream": { + "type": "roundrobin", + "nodes": { + "bmahrms-leave:80": 1 + } + } +}' +curl "http://127.0.0.1:9180/apisix/admin/routes" \ +-H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' +{ + "id": "hrms-backend-salary", + "host": "bma-hrms.bangkok.go.th", + "uri": "/api/v1/salary/*", + "upstream": { + "type": "roundrobin", + "nodes": { + "bmahrms-salary:80": 1 + } + } +}' +curl "http://127.0.0.1:9180/apisix/admin/routes" \ +-H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' +{ + "id": "hrms-backend-development", + "host": "bma-hrms.bangkok.go.th", + "uri": "/api/v1/development/*", + "upstream": { + "type": "roundrobin", + "nodes": { + "bmahrms-development:80": 1 + } + } +}' +curl "http://127.0.0.1:9180/apisix/admin/routes" \ +-H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' +{ + "id": "hrms-backend-kpi", + "host": "bma-hrms.bangkok.go.th", + "uri": "/api/v1/kpi/*", + "upstream": { + "type": "roundrobin", + "nodes": { + "bmahrms-kpi:80": 1 + } + } +}' + +curl "http://127.0.0.1:9180/apisix/admin/routes" \ +-H "X-API-KEY: put_admin_api_key_here" -X PUT -d ' +{ + "id": "hrms-backend-metadata", + "host": "bma-hrms.bangkok.go.th", + "uri": "/api/v1/metadata/*", + "upstream": { + "type": "roundrobin", + "nodes": { + "bmahrms-metadata:80": 1 + } + } +}' ``` ## บทสรุป