6.1 KiB
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