Pull to refresh
medical Public fhir hl7 keycloak kong opa rails architecture

FHIR 交換架構設計(簡化版)

以 Kong + Keycloak + OPA + Rails Gateway + HAPI FHIR 建構安全可擴展的 FHIR 資料交換平台,支援地端與雲端混合部署

| Ingested 2026-04-06 |

專案概述

建立一個安全、可擴展的 FHIR 資料交換平台,整合:
- Kong API Gateway - 負載平衡與流量管理
- Keycloak - OAuth2/OIDC 認證授權
- Open Policy Agent - 細粒度權限控制
- Rails FHIR Gateway - 資源路由與整合(參見 nicklecheng-project-architecture
- HAPI FHIR Server - 實際的 FHIR 資源儲存(地端 + 雲端)

符合 medstandard 所規範的台灣醫療資料交換標準。

系統架構圖

整體架構

graph TD
    Client[用戶端<br/>Web/Mobile]
    Traefik[Traefik<br/>Load Balancer<br/>SSL/TLS]
    Kong[Kong<br/>API Gateway<br/>Rate Limiting]
    Keycloak[Keycloak<br/>OAuth2]
    OPA[OPA<br/>Policy Engine]
    Rails[Rails<br/>FHIR Gateway]
    HAPI_OnPrem[HAPI FHIR Server<br/>地端醫院]
    HAPI_Cloud[HAPI FHIR Server<br/>雲端 SaaS]

    Client -->|HTTPS| Traefik
    Traefik -->|Load Balance| Kong
    Kong -->|Verify Token| Keycloak
    Kong -->|Check Policy| OPA
    Kong -->|Forward| Rails
    Rails -->|Route| HAPI_OnPrem
    Rails -->|Route| HAPI_Cloud

詳細架構(混合部署)

graph TB
    Client[用戶端<br/>Web/Mobile Clients]
    Traefik[Traefik Load Balancer<br/>SSL/TLS + Let's Encrypt]
    Kong[Kong API Gateway<br/>Rate Limiting]
    Keycloak[Keycloak<br/>OAuth2/OIDC]
    OPA[OPA<br/>Policy Engine]
    Rails1[Rails Instance 1<br/>FHIR Gateway]
    Rails2[Rails Instance 2<br/>FHIR Gateway]
    Rails3[Rails Instance 3<br/>FHIR Gateway]
    PG[PostgreSQL<br/>Metadata & Logs]
    Redis[Redis<br/>Cache & Session]
    HAPI_OnPrem[HAPI FHIR Server<br/>地端醫院]
    DB_OnPrem[Hospital Database<br/>地端]
    HAPI_Cloud[HAPI FHIR Server<br/>雲端 SaaS]
    DB_Cloud[Cloud Database<br/>雲端]

    Client -->|1. HTTPS Request| Traefik
    Traefik -->|2. Load Balance| Kong
    Kong -->|3a. Verify Token| Keycloak
    Kong -->|3b. Check Policy| OPA
    Kong -->|4. Forward| Rails1
    Kong -->|4. Forward| Rails2
    Kong -->|4. Forward| Rails3
    Rails1 & Rails2 & Rails3 -->|Metadata| PG
    Rails1 & Rails2 & Rails3 -->|Cache| Redis
    Rails1 & Rails2 & Rails3 -->|5a. FHIR API| HAPI_OnPrem
    Rails1 & Rails2 & Rails3 -->|5b. FHIR API| HAPI_Cloud
    HAPI_OnPrem -->|Store| DB_OnPrem
    HAPI_Cloud -->|Store| DB_Cloud

核心元件說明

1. Traefik Load Balancer

  • SSL/TLS 終止與 Let's Encrypt 自動憑證
  • 負載平衡
  • 健康檢查

2. Kong API Gateway

  • API 路由與轉發
  • Rate Limiting 流量控制
  • 請求/回應轉換
  • CORS 管理

3. Keycloak (OAuth2/OIDC)

  • 使用者認證與身份管理
  • OAuth2 Token 發放與驗證
  • 單一登入 (SSO)
  • 使用者角色管理

4. Open Policy Agent (OPA)

  • 政策基礎存取控制
  • RBAC(角色基礎)與 ABAC(屬性基礎)
  • 動態政策評估

5. Rails FHIR Gateway

  • 作為 FHIR 資源的中介層
  • 整合多個 FHIR Server
  • 智慧路由(地端/雲端)
  • 資源快取與聚合
  • Metadata 記錄

6. HAPI FHIR Server

  • 地端:醫院內部部署,存放敏感資料
  • 雲端:SaaS 部署,存放一般資料
  • 符合 FHIR R4 標準

資料流程

認證流程

sequenceDiagram
    participant User as 用戶
    participant Frontend as 前端應用
    participant Keycloak as Keycloak

    User->>Frontend: 登入請求
    Frontend->>Keycloak: OAuth2 授權請求
    Keycloak->>User: 登入頁面
    User->>Keycloak: 使用者憑證
    Keycloak->>Frontend: Authorization Code
    Frontend->>Keycloak: Exchange Code for Token
    Keycloak->>Frontend: Access Token + Refresh Token

FHIR 資源存取流程

sequenceDiagram
    participant Frontend as 前端
    participant Kong as Kong
    participant OPA as OPA
    participant Rails as Rails App
    participant DB as Database

    Frontend->>Kong: FHIR API 請求 + Access Token
    Kong->>Kong: JWT 驗證
    Kong->>OPA: 授權檢查請求
    OPA->>Kong: 授權決策

    alt 允許存取
        Kong->>Rails: 轉發請求
        Rails->>DB: 查詢 FHIR 資源
        DB->>Rails: 資料
        Rails->>Kong: FHIR 資源回應
        Kong->>Frontend: 回應
    else 拒絕存取
        Kong->>Frontend: 403 Forbidden
    end

FHIR 資源建立流程

sequenceDiagram
    participant Frontend as 前端
    participant Kong as Kong
    participant Keycloak as Keycloak
    participant OPA as OPA
    participant Rails as Rails App
    participant FHIR as HAPI FHIR

    Frontend->>Kong: POST /fhir/Patient + Token + FHIR JSON
    Kong->>Keycloak: 驗證 Token
    Keycloak->>Kong: Token 有效
    Kong->>OPA: 檢查建立權限
    OPA->>Kong: allow: true
    Kong->>Rails: 轉發 POST 請求
    Rails->>FHIR: 建立 FHIR 資源
    FHIR->>Rails: 201 Created
    Rails->>Kong: 回應
    Kong->>Frontend: 201 Created + Location

混合架構優勢

  • 彈性部署:敏感資料存放地端(符合法規),一般資料可存放雲端(彈性擴展),統一的存取介面
  • 高可用性:地端服務中斷時可切換到雲端,Rails Gateway 提供故障轉移
  • 資料主權:符合醫療資料本地化要求,跨機構資料交換,災難復原與備份
  • 安全性:多層防護(SSL -> Gateway -> Auth -> Policy),OAuth2/OIDC 標準認證,細粒度權限控制

支援的 FHIR 資源

Phase 資源
Phase 1(核心) Patient, Practitioner, Observation
Phase 2(擴展) Condition, Medication, MedicationRequest, Procedure, AllergyIntolerance
Phase 3(管理) Organization, Location, Encounter

技術棧

元件 技術 版本
API Gateway Kong 3.5+
認證授權 Keycloak 23.0+
政策引擎 Open Policy Agent latest
FHIR Gateway Ruby on Rails 8.x
FHIR Server HAPI FHIR R4
資料庫 PostgreSQL 15+
快取 Redis 7.x
部署工具 Kamal 2.x
FHIR 標準 HL7 FHIR R4 (4.0.1)

安全考量

  • 傳輸層:強制 HTTPS/TLS 1.3,Let's Encrypt 自動憑證
  • 認證:OAuth2/OIDC 標準,Access Token 15 分鐘有效,支援 MFA
  • 授權:最小權限原則,動態政策評估,稽核所有存取決策
  • 資料:敏感欄位加密儲存,PHI 特殊處理,定期備份
  • API:Rate Limiting, Input Validation, CORS 政策限制

使用場景

  1. 醫院內部查詢:醫師查詢病患記錄 -> Rails Gateway 路由到地端 HAPI FHIR -> 返回完整資料
  2. 跨院所查詢:病患轉院 -> Rails Gateway 同時查詢多個醫院的 FHIR Server -> 聚合返回完整病歷
  3. 研究資料匯出:研究人員申請資料 -> 從雲端 FHIR Server 匯出去識別化資料
  4. 災難復原:地端服務中斷 -> Rails Gateway 自動切換到雲端 FHIR Server

© 2025-2026 Nickle Cheng Built with Ruby Ruby on Rails