[FHIR 从入门到放弃] Day 03-FHIR 服务器安装

说明


关於 FHIR 服务器

FHIR 有非常多服务器端的实作,这边使用的是 HAPI FHIR。这是一套 FHIR 的服务器,有一个还不错用的前端管理介面。HAPI FHIR 早期由加拿大医疗研究组织 UHN 开发,後来发展成 Open Source Project 并有自己的专案开源社群,使用的也是很友善的 Apache 2.0 授权条款,可以拿来作为商业用途。

关於本教学

这篇文将会使用 Rocky Linux 8.4 做为教学用的系统,Rocky Linux 8 简单来说是 CentOS 8 的替代版本,用起来一模一样,如果你没看过,现在让你看看:

Rocky Linux 8 官方网站https://rockylinux.org/zh-tw/

如果你有在使用 VMWare、VirtualBox 等虚拟化平台,可以考虑改用 Proxmox VE。他是一个开放原始码的虚拟化平台,并提供一个类似 VMWare vCloud 的 Web 管理工具。你可以在上面开 QEMU VM 跟LXC Container,也可以在上面实现 Ceph、HA Cluster 等机制,全部都滑鼠点一点就好。

Proxmox VE 上面已经有 Rocky Linux 8 的 LXC Image,直接抓下来开就行了,请参考以下说明,或是你也可以参考 Jason(Proxmox VE 专家,江湖人称"节神")的系列文章:

Proxmox VE 官方网站https://pve.proxmox.com/wiki/Main_Page
节省工具箱部落格https://blog.jason.tools/

由於本篇文章是比较新手向的教学,目标是给完全没接触过 HAPI FHIR 架设的初学者使用的(当然建议还是要知道怎麽操作 Linux 作业系统),在接下来的教学中,你将学会如何从官方的 GitHub Repository 把 HAPI FHIR 服务器抓下来,设定好 PostgreSQL 资料库後,直接把服务器跑起来。

下面会详细纪录每个安装步骤以及指令,这篇很长,你忍一下

如果你懒得自己架设,台湾也有公开测试服务器,请参考:https://hapi.fhir.tw

环境设定与安装


安装 EPEL 8 扩展套件库

安装 EPEL8 扩展套件库并更新系统,中间会跳出提示,直接 y 到底就好

$ dnf install epel-release -y
$ dnf update -y

安装 PostgreSQL 14

安装 PostgreSQL 套件库,中间会跳出提示,直接 y 到底就好

$ dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
$ dnf update -y

把内建的 PostgreSQL 套件库停用

$ dnf -qy module disable postgresql

安装 PostgreSQL 14 服务器(写这篇文的时候刚好 14 stable 版本 release 出来了,就直接用这个版本吧!)

$ dnf install postgresql14 postgresql14-server -y

安装好之後确认一下 PostgreSQL 版本对不对

$ psql -V

开始之前要先初始化 PostgreSQL 14 资料库

$ /usr/pgsql-14/bin/postgresql-14-setup initdb

确认版本没问题後,就可以启动并设定开机自动启用

$ systemctl enable postgresql-14
$ systemctl start postgresql-14

检查一下 PostgreSQL 是否正常启动

$ systemctl status postgresql-14

设定 PostgreSQL

安装好後,PostgreSQL 预设会帮你建立一个叫 ==postgres== 的使用者,记得先改密码

$ passwd postgres

切换到 postgres 这个使用者

$ su - postgres

改资料库管理员 ==postgres== 的预设密码

$ psql -c "ALTER USER postgres WITH PASSWORD '新密码';"

显示 ALTER ROLE 代表有改成功

注意
这边密码设 1234 是只做教学展示用途,好孩子请不要学,否则你的资料库会被打到不要不要的 ˊ_>ˋ

新建 FHIR 用的资料库

连线进去资料库

$ psql

进来後你会看到这样的提示:

新建使用者

$ create user fhir with encrypted password 'hapifhir';

# 语法长这样
$ create user 使用者名称 with encrypted password '密码';

注意
还是要强调,密码请设定强密码,否则你的资料库会被打到连你老板都认不出来 ˊ_>ˋ

新建资料库

$ create database hapifhir with owner fhir template template0;

# 语法长这样
$ create database 资料库名称 with owner 资料库拥有者名称 template template0;

将所有权限给这个使用者

$ grant ALL privileges on database hapifhir to fhir;

# 语法长这样
$ grant ALL privileges on database 资料库名称 to 使用者名称;

设定资料库时区为台湾时区

$ alter database hapifhir set timezone to 'ROC';

# 语法长这样
$ alter database 资料库名称 set timezone to '时区代码';

上面全部设定完之後就退出 PostgreSQL 并退出 postgres 帐号

postgres=# \q
$ exit

安装 HAPI FHIR 服务器


我们会直接使用最新版的 HAPI FHIR 服务器,并设定使用 R4(FHIR 4.0.1) 版本。

因为这个是用 Java 写的,所以会需要准备 Java 跟 Maven 环境。另外各版本 HAPI FHIR 支援的 Java 版本都不一样,记得参考以下网站:
https://hapifhir.io/hapi-fhir/docs/getting_started/versions.html

在最新版本的 HAPI FHIR 里面,官方虽然将最小 Java 版本订为 Java 8,不过实际上 Java 8 会编译失败,因此要改用 Java 11 或是 Java 16,这边我们以 Java 11 为例。

安装必要套件

安装必要套件

$ dnf install -y vim git make gcc gcc-c++ tmux

安装 Java 11(你也可以试试看 Java 16) 跟 Maven

$ dnf install java-11-openjdk-devel maven

由於 Maven 3.5.4 预设使用 Java 8,因此要把版本切换回 Java 11

$ alternatives --config java
$ alternatives --config javac

让 Maven 预设使用 Java 11

$ vim /etc/profile

最下面加入这行

export JAVA_HOME=/usr/lib/jvm/java-11-openjdk

让他生效

$ source /etc/profile

下载并设定 HAPI FHIR 服务器

从 GitHub 把 Repository 抓下来

$ git clone https://github.com/hapifhir/hapi-fhir-jpaserver-starter.git

设定 HAPI FHIR Server 组态

$ cd hapi-fhir-jpaserver-starter/
$ vim src/main/resources/application.yaml

把资料库改为 PostgreSQL 并设定连线资讯

spring:
  datasource:
    url: 'jdbc:postgresql://localhost:5432/hapifhir'
    username: fhir
    password: hapifhir
    driverClassName: org.postgresql.Driver

设定使用 FHIR R4 版本:

hapi:
  fhir:
    ### This is the FHIR version. Choose between, DSTU2, DSTU3, R4 or R5
    fhir_version: R4                       # 指定使用 FHIR R4(也可以改其他版本)
    server_address: http://<服务器URL>/fhir # 设定服务器 URL
    default_encoding: JSON                 # 预设使用 JSON(也可以改 XML)
    default_pretty_print: true             # 预设格式化输出
    default_page_size: 20                  # 预设搜寻结果分页数量(选填)
    graphql_enabled: true                  # 启用 GraphQL(选填)
    cors:                                  # 启用 CORS 设定(选填)
      allow_Credentials: true
      allowed_origin:
        - '*'
    tester:
        home:
          name: Local Tester
          server_address: 'http://<服务器URL>/fhir' # 设定服务器位址
          refuse_to_fetch_third_party_urls: false
          fhir_version: R4
    validation:                            # 设定服务器端验证(选填)
      requests_enabled: true
      responses_enabled: true

编译并执行

进入 tmux 虚拟视窗

$ tmux

编译成 war 可执行档,编译後会放在 target/ROOT.war 里面

$ mvn clean package spring-boot:repackage -Pboot

上面这条指令预设以 Single Thread 模式执行,如果你的主机是多核心,也可以加入-T <thread>参数,几核心就打多少数字,像这样:

$ mvn clean package spring-boot:repackage -Pboot -T 20

看到 BUILD SUCCESS 就代表编译成功了

用 Java 执行

$ java -jar target/ROOT.war

只要不跳错误,并且看到 Completed initialization in ....ms 这行就代表启动成功了

服务器预设会开在 8080 Port,请直接打开浏览器输入 http://<IP>:8080即可看到 HAPI FHIR 页面


<<:  Day 29 通信

>>:  近似最短路径 (9)

Day30- 最後完成代办事项 To DO List 小工具

大家好,来到 IT 铁人赛最後一天了,终於要进入尾声了! 今天我们要整合这三十天来所学到的知识量,...

[重构倒数第12天] - Vue3 directive 与 Skeleton 实战组合应用

前言 该系列是为了让看过Vue官方文件或学过Vue但是却不知道怎麽下手去重构现在有的网站而去规画的系...

Day 18 储存宝石:【Lab】S3 储存类别 & 生命周期管理 (下)

今天,我们要来示范如何去还原存在 Glacier 里头的档案,并观察整个过程所需的时程。 Glac...

27.Copmuted vs Watcher

一般情况下,使用 computed 比起 watcher 更简洁,如下: new Vue({ dat...

前端工程学习日记第4天

#使用 margin(向外)、padding(向内) 来推挤距离 css: .box{border:...