165 lines
6.1 KiB
Markdown
165 lines
6.1 KiB
Markdown
Sriphat Hospital Data Platform Blueprint
|
|
|
|
พิมพ์เขียวชุดนี้ออกแบบมาเพื่อสร้างระบบ Data Platform ที่ทันสมัย (Modern Data Stack) โดยเน้นความปลอดภัย (Security), การรองรับข้อมูลหลายรูปแบบ (Versatility), และการเชื่อมต่อแบบ Single Sign-On (SSO)
|
|
|
|
🏗️ 1. Architecture Overview (Tech Stack)
|
|
|
|
เราใช้แนวคิดแบบ "Modular Architecture" ผ่าน Docker Compose เพื่อให้ระบบยืดหยุ่นและดูแลรักษาง่าย
|
|
|
|
Layer
|
|
|
|
Tools
|
|
|
|
Functionality
|
|
|
|
Gateway
|
|
|
|
Nginx Proxy Manager
|
|
|
|
จัดการ Domain, SSL (HTTPS) และทางเข้า Service ทั้งหมด
|
|
|
|
Identity (SSO)
|
|
|
|
Keycloak
|
|
|
|
ระบบยืนยันตัวตนกลาง (OIDC/OAuth2) รองรับ LDAP/AD โรงพยาบาล
|
|
|
|
Ingestion
|
|
|
|
Airbyte
|
|
|
|
ดึงข้อมูลจาก SQL Server, Oracle, REST API, Excel, CSV
|
|
|
|
Warehouse
|
|
|
|
Supabase (PostgreSQL)
|
|
|
|
จัดเก็บข้อมูล ประมวลผล และสร้าง API อัตโนมัติ (PostgREST)
|
|
|
|
Transformation
|
|
|
|
dbt (data build tool)
|
|
|
|
จัดการ Logic การแปลงข้อมูลดิบให้เป็นข้อมูลพร้อมใช้ด้วย SQL
|
|
|
|
BI Layer
|
|
|
|
Apache Superset
|
|
|
|
สร้าง Dashboard และ Visualization เชื่อมต่อ SSO กับ Keycloak
|
|
|
|
📂 2. Project Folder Structure
|
|
|
|
การแยกโฟลเดอร์ช่วยให้การ Update และจัดการ Resource ทำได้ง่าย (Isolation)
|
|
|
|
sriphat-data-stack/
|
|
├── .env # ไฟล์รวมรหัสผ่านและค่า Config ทั้งหมด (สำคัญมาก)
|
|
├── start-all.sh # สคริปต์สำหรับสั่งรันทุกโฟลเดอร์พร้อมกัน
|
|
├── 01-infra/ # Nginx Proxy Manager และ Keycloak
|
|
│ └── docker-compose.yml
|
|
├── 02-storage/ # Supabase (Postgres, Studio, PostgREST)
|
|
│ └── docker-compose.yml
|
|
├── 03-ingestion/ # Airbyte
|
|
│ └── docker-compose.yml
|
|
└── 04-analytics/ # Apache Superset
|
|
└── docker-compose.yml
|
|
|
|
|
|
🔑 3. Global Environment Variables (.env)
|
|
|
|
ใช้ไฟล์นี้ไฟล์เดียวเพื่อคุมความลับทั้งระบบ (Single Source of Truth)
|
|
|
|
# --- GENERAL ---
|
|
PROJECT_NAME=sriphat-data
|
|
DOMAIN=sriphat.local
|
|
|
|
# --- DATABASE (Supabase) ---
|
|
DB_PASSWORD=Secure_Hospital_Pass_2026
|
|
JWT_SECRET=long-random-string-for-supabase-security
|
|
# กำหนด Schema ที่จะให้ API เข้าถึงได้
|
|
PGRST_DBSCHEMAS=public,raw_data,analytics
|
|
|
|
# --- AUTH (Keycloak) ---
|
|
KEYCLOAK_ADMIN=admin
|
|
KEYCLOAK_ADMIN_PASSWORD=admin_secret_pass
|
|
|
|
# --- BI (Superset) ---
|
|
SUPERSET_SECRET_KEY=another-random-string
|
|
|
|
|
|
🛠️ 4. Docker Compose Samples
|
|
|
|
01-Infra: Authentication & Gateway
|
|
|
|
# 01-infra/docker-compose.yml
|
|
services:
|
|
nginx-proxy:
|
|
image: jc21/nginx-proxy-manager:latest
|
|
ports: ['80:80', '443:443', '81:81']
|
|
volumes: ['./data:/data', './letsencrypt:/etc/letsencrypt']
|
|
networks: ['shared_data_network']
|
|
|
|
keycloak:
|
|
image: quay.io/keycloak/keycloak:latest
|
|
command: start-dev
|
|
environment:
|
|
KC_BOOTSTRAP_ADMIN_USERNAME: ${KEYCLOAK_ADMIN}
|
|
KC_BOOTSTRAP_ADMIN_PASSWORD: ${KEYCLOAK_ADMIN_PASSWORD}
|
|
networks: ['shared_data_network']
|
|
|
|
networks:
|
|
shared_data_network:
|
|
external: true
|
|
|
|
|
|
02-Storage: Supabase Layer (Core)
|
|
|
|
# 02-storage/docker-compose.yml
|
|
services:
|
|
db:
|
|
image: supabase/postgres:15.1.0.117
|
|
environment:
|
|
POSTGRES_PASSWORD: ${DB_PASSWORD}
|
|
volumes: ['./data:/var/lib/postgresql/data']
|
|
networks: ['shared_data_network']
|
|
|
|
rest-api:
|
|
image: postgrest/postgrest:v10.1.1
|
|
environment:
|
|
PGRST_DB_URI: postgres://postgres:${DB_PASSWORD}@db:5432/postgres
|
|
PGRST_DB_SCHEMAS: ${PGRST_DBSCHEMAS}
|
|
PGRST_JWT_SECRET: ${JWT_SECRET}
|
|
networks: ['shared_data_network']
|
|
|
|
networks:
|
|
shared_data_network:
|
|
external: true
|
|
|
|
|
|
🔒 5. Security Strategy (Hospital Standard)
|
|
|
|
Centralized Auth (SSO): ผู้ใช้ล็อกอินผ่าน Keycloak เพียงที่เดียว เพื่อเข้าถึง Superset และดูข้อมูลใน Supabase
|
|
|
|
Schema Separation:
|
|
|
|
raw_data: เก็บข้อมูลดิบจาก Airbyte (จำกัดสิทธิ์สูงสุด)
|
|
|
|
analytics: เก็บข้อมูลที่คลีนแล้วสำหรับ Superset (Read-only for BI)
|
|
|
|
Row-Level Security (RLS): ใช้ฟีเจอร์ของ PostgreSQL ใน Supabase เพื่อกำหนดให้ "แพทย์แผนก A เห็นได้เฉพาะคนไข้แผนก A" แม้จะอยู่ในตารางเดียวกัน
|
|
|
|
Network Isolation: ทุก Service ทำงานใน shared_data_network และเปิดออกภายนอกผ่าน Nginx Proxy Manager เท่านั้น
|
|
|
|
🚀 6. Steps to Launch
|
|
|
|
เตรียม Network: docker network create shared_data_network
|
|
|
|
เตรียม Folder: สร้างโฟลเดอร์และไฟล์ตามโครงสร้างด้านบน
|
|
|
|
รัน Infra: เข้าไปที่ 01-infra แล้วสั่ง docker-compose up -d
|
|
|
|
ตั้งค่า Keycloak: สร้าง Realm และ Client สำหรับ Superset/Supabase
|
|
|
|
รัน Storage & Analytics: รันโฟลเดอร์ 02, 03 และ 04 ตามลำดับ
|
|
|
|
Config Proxy: ใน Nginx Proxy Manager ให้ชี้ Domain ไปที่ IP/Port ของแต่ละ Service |