FHIR 伺服器建置指南 === [TOC] ## 說明 FHIR 有非常多伺服器端的實作,這邊使用的是 HAPI FHIR。這是一套由加拿大醫療研究組織 UHN 開發的 FHIR 伺服器,有一個還不錯用的前端管理介面,並且是 Open Source Project。 ## 範例實作架構 ### 如果你有多台主機... ![](https://i.imgur.com/HkqOaRc.png) ### 如果你只有一台主機... ![](https://i.imgur.com/aGiEmCl.png) ## 安裝 CentOS 8 CentOS 8 目前還在 Pre-Release 階段,不過已經相當穩定,軟體版本也比較新,可以投入在正式環境上使用。如果還是不放心的話,可以安裝 CentOS 7 就好。 CentOS 8 下載連結:http://isoredirect.centos.org/centos/8-stream/isos/x86_64/CentOS-Stream-x86_64-dvd1.iso 因為安裝方法跟安裝其他 OS 一樣,就懶得寫了,請自行安裝在實體伺服器上。 ## 建置 MariaDB Server ### 安裝 MariaDB 是 MySQL 的 Open Source Alternative Solution,截至目前的穩定版本是 10.4 版,直接上 repo 然後安裝就好。 首先新增 repo 檔案: ```bash= $ vim /etc/yum.repos.d/mariadb.repo ``` 然後貼入以下內容: ```bash= # MariaDB 10.4 CentOS repository list - created 2019-12-17 04:08 UTC # http://downloads.mariadb.org/mariadb/repositories/ [mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.4/centos8-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1 ``` 然後安裝 Sever 後啟動: ```bash= # 新的 CentOS 8 跟 Fedora 一樣都改用 dnf 作為套件管理員 # 不習慣的話也可以繼續用 yum,效果是一樣的 # 安裝服務,並使用我們剛剛新增的 source repo 抓套件 $ sudo dnf install boost-program-options $ sudo dnf install MariaDB-server MariaDB-client --disablerepo=AppStream # 啟動服務 $ sudo systemctl start mariadb # 設定開機自動啟動 $ sudo systemctl enable mariadb ``` 啟動後可以使用以下指令確認服務是否正確開啟: ```bash= $ sudo systemctl status mariadb ``` 看到 ==**Active: active(running)**== 代表成功了 ![](https://i.imgur.com/Pq2xMAt.png) ### 初次設定 先進行初次設定: ```bash= $ sudo mysql_secure_installation Enter current password for root (enter for none): <初次啟動密碼為空,直接 enter 就好> ``` 然後照著畫面指示操作,改完密碼整路 ==Y== 到底,就完成初始化設定了。 ### 新增資料庫 先登入資料庫: ```bash= # 登入 MariaDB server # 第一次登入通常使用者名稱使用 root 就好 # 本機登入的話,主機 IP 輸入 localhost $ mysql -h <主機IP> -u <使用者名稱> -p Enter Password: <輸入密碼> ``` 新增使用者: ```sql= CREATE USER '<使用者名稱>'@'<FHIR 伺服器 IP>' IDENTIFIED BY '<密碼>'; ``` 新增資料庫並設定預設使用 utf8 編碼: ```sql= CREATE DATABASE <資料庫名稱> CHARACTER SET utf8 COLLATE utf8_general_ci; ``` 將資料庫權限給使用者: ```sql= GRANT ALL PRIVILEGES ON <資料庫名稱>.* TO '<使用者名稱>'@'<FHIR 伺服器 IP>' IDENTIFIED BY '<密碼>'; ``` 套用更新: ```sql= FLUSH PRIVILEGES; ``` ## 建置 Docer CE HAPI FHIR 是使用 Java 寫成的,如果會自己架環境的話也可以直接安裝在 Jetty Server 上,考量到操作難易度與易用性問題,這邊會將 HAPI FHIR 封裝成 Docker Image 並跑在 Docker CE 上面。 ### 安裝 Docker 目前有分要錢的 EE 跟社群版的 CE,我們安裝 CE 版本的就可以了。 新增 Repo 檔案: ```bash= $ sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo ``` 然後安裝並啟動服務: ```bash= # 安裝服務 $ sudo dnf install docker-ce --nobest -y # 啟動服務 $ sudo systemctl start docker # 設定開機自動啟動 $ sudo systemctl enable docker ``` ### 測試 Docker 是否正確啟用 直接跑 hello world image 就好了: ```bash= $ sudo docker run hello-world ``` 出現執行畫面就代表成功了 ![](https://i.imgur.com/Vk9LaOQ.png) ## 建置 FHIR Server ### 前置作業 安裝 git 與編譯環境後抓 HAPI FHIR Repo: ```bash= # 安裝 git $ sudo dnf install epel-release $ sudo dnf install git # 安裝編譯環境 $ sudo dnf install java-8-openjdk-devel $ sudo dnf install maven # 抓 repo $ git clone https://github.com/hapifhir/hapi-fhir-jpaserver-starter.git ``` ### 配置組態 #### 配置 Dockerfile 組態 ```bash= $ vim hapi-fhir-jpaserver-starter/Dockerfile ``` 將內容取代為以下設定: ```dockerfile= FROM jetty:9-jre8-alpine USER jetty:jetty ADD ./target/hapi-fhir-jpaserver.war /var/lib/jetty/webapps/root.war EXPOSE 8080 # 可自訂監聽 Port ``` #### 配置 FHIR Server 組態 打開組態檔: ```bash= $ vim hapi-fhir-jpaserver-starter/src/main/resources/hapi.properties ``` 找到以下設定然後編輯: ```bash= fhir_version=R4 server_address=<伺服器位址> datasource.driver=com.mysql.jdbc.Driver datasource.url=jdbc:mysql://<資料庫位址>:3306/<資料庫名稱> hibernate.dialect=org.hibernate.dialect.MySQL5Dialect datasource.username=<資料庫帳號> datasource.password=<資料庫密碼> ``` ## 執行 編譯後包成 docker image: ```bash= # 編譯 $ mvn clean package # 包成 Docker Image # 記得最後面的 . 要打 $ docker build -t <Image 名稱> . ``` 從包好的 Image 建立一個 Instance: ```bash= # 如果剛剛 Dockerfile 有改監聽 port,就要把 8080 改掉 $ docker run -d -p <外部 Port>:8080 <Image 名稱> # 例如把伺服器開在主機的 3000 Port 上 $ docker run -d -p 3000:8080 hapifhir/r4 ``` Docker CE 會回傳一組 ID,即代表這個 Instance 的 Container ID。 建置完成後,打開 **http://<Server IP>:<外網 Port>**,看到以下介面即代表成功: ![](https://i.imgur.com/3H7iCY1.png) 另外也可以透過以下指令監看輸出: ```bash= # 附加至 Container 內查看 $ docker attach <Container ID> # 如果不知道 Container ID 也可以用以下指令查看 $ docker ps ```