add files infra docker service for data platform
This commit is contained in:
165
tech_stack.md
Normal file
165
tech_stack.md
Normal file
@@ -0,0 +1,165 @@
|
||||
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
|
||||
Reference in New Issue
Block a user