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