前言
經過前 27 天的迭代,我們從醫療標準規範、臨床業務模型、後端 API 開發、前端床邊介面,一路推進到資安去識別化與高併發單元測試。然而,任何無法一鍵交付、在不同主機環境表現不一致的醫療資訊系統,都稱不上真正就緒的生產級系統。
現代醫療資訊系統由多個異質元件共同組成:
-NIS Core Backend: 基於 Node.js / Express 的核心業務中樞與即時 WebSocket 警報伺服器。
-內部關聯式資料庫: 負責高頻量測時序儲存與行級鎖交易的 PostgreSQL 15。
-快取與非同步任務中樞: 承載即時通訊與 BullMQ 同步佇列的 Redis。
-標準醫療交換核心: 符合 HL7 FHIR R4 標準的 HAPI FHIR JPA Server(Java / Spring Boot 架構)。
若依賴手動安裝設定,開發者與院內維運人員常會遭遇環境變數不合、PostgreSQL 擴充套件缺失、Java 執行階段記憶體不足等災難。今天我們將以 Docker 與 Docker Compose 實現全系統的標準容器化編排,打造支援健康檢查、容器依賴等待與資料持久化的現代醫療服務架構。
一、全系統容器拓撲與網路隔離架構
為了兼顧資安防護與維運效率,全系統容器不應全數暴露在公有網路上,而是透過內部虛擬網路(Docker Bridge Network)隔離:
架構核心考量:
1.內部網域名稱解析(DNS Resolution): 容器間通信直接使用服務名稱(如 postgres-db、redis-broker),不依賴宿主機 IP。
2.多階段建構(Multi-stage Build): 針對 Node.js 服務,將編譯期(TypeScript 編譯、DevDependencies)與執行期(僅保留 Production Node Modules 與編譯後 JS)徹底分離,縮減 Image 體積至 150MB 以下並降低 CVE 安全漏洞暴露面。
3.啟動順序防呆(Healthcheck & Depends_on): 後端服務必須等到 PostgreSQL 真正通過 pg_isready 測試後才開始啟動與執行資料表 Migration。
二、後端服務 Dockerfile:多階段極簡建構
在後端專案根目錄建立 Dockerfile:
三、全系統編排:docker-compose.yml
在專案最外層建立 docker-compose.yml,將關聯資料庫、快取、標準 FHIR 伺服器與 NIS 後端集中管理:
四、資料庫自動化初始化腳本實作
在 docker-compose.yml 中,我們掛載了 ./init-scripts 目錄至 /docker-entrypoint-initdb.d。這能確保全新環境初次部署時,容器會自動依序載入 Day 10 定義的 UUID 模組、核心資料表以及索引規劃。
建立 ./init-scripts/01-init-schema.sql:
五、部署驗證與指令操作手冊
完成上述配置後,即可在伺服器終端機執行一鍵拉起全系統:
六、醫療系統容器化部署的最佳安全實務
在醫療機房落地容器技術時,請落實以下四項安全要求:
1.拒絕 Root 容器: Dockerfile 內必須配置獨立的非特權使用者(如範例中的 nisuser),防止容器逃逸(Container Escape)攻擊危害宿主機。
2.嚴格禁止密鑰硬編碼: 所有資料庫密碼、JWT Secret 與去識別化 Pepper 必須透過 .env 檔案或院內機密管理工具(如 HashiCorp Vault)注入,嚴禁 Commit 至公開 Git Repository。
3.資料庫獨立 Volume 與排程備份: pg_data 必須使用具名磁碟區掛載,並在實體主機設置每日排程 pg_dump 異地備份,符合病歷保存法規要求。
4.時區一致性(Timezone Consistency): 醫療系統對時間極度敏感,所有容器在啟動時應統一掛載主機時區
小結
今天我們完成了現代化系統維運的關鍵躍升:
1.規劃了清晰的容器拓撲架構,透過內部 Bridge Network 隔離內部儲存庫與外部交換埠。
2.撰寫了符合生產標準的多階段(Multi-stage)Dockerfile,兼顧輕量化與非 root 安全防護。
3.透過 docker-compose.yml 實現 PostgreSQL、Redis、HAPI FHIR 與 NIS 後端的一鍵依賴編排與自動初始化。
全系統已能隨處部署、穩定運行。明天 Day 29 我們將專注於系統穩定性與高併發承載力:效能調優與監控——PostgreSQL 查詢優化、連線池壓測與系統健全度監控(Prometheus / Grafana 指標導出)!