Files
sriphat-dataplatform/tech_stack.md

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