medical
公開
fhir
hl7
keycloak
kong
opa
rails
architecture
FHIR 交換架構設計(簡化版)
以 Kong + Keycloak + OPA + Rails Gateway + HAPI FHIR 建構安全可擴展的 FHIR 資料交換平台,支援地端與雲端混合部署
|
匯入於 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 政策限制
使用場景
- 醫院內部查詢:醫師查詢病患記錄 -> Rails Gateway 路由到地端 HAPI FHIR -> 返回完整資料
- 跨院所查詢:病患轉院 -> Rails Gateway 同時查詢多個醫院的 FHIR Server -> 聚合返回完整病歷
- 研究資料匯出:研究人員申請資料 -> 從雲端 FHIR Server 匯出去識別化資料
- 災難復原:地端服務中斷 -> Rails Gateway 自動切換到雲端 FHIR Server