步骤/目录:
0.准备工作
    (1)购买并设置树莓派
    (2)购买并设置服务器
    (3)准备软件
1.方法一:docker + openmrs
2.方法二:gnuhealth 的树莓派系统
3.方法三:gnuhealth 直接安装(无法使用)
4.了解:新致“开源”医疗
附录:通过公网访问EMR或HIS

本文首发于个人博客https://lisper517.top/index.php/archives/29/,转载请注明出处。
本文的目的是搭建一个可用于小诊所的电子病历系统,省去一笔开支费用。有些方法中会用到docker、docker-compose。
本文实验日期为2022年8月7日。本文使用的云服务器为阿里云轻量应用服务器(杭州),系统镜像为 Docker 19.03;树莓派为 4B 8GB 版,系统镜像是Pi OS的64位桌面版,名为 2022-04-04-raspios-bullseye-arm64.img

笔者有医学背景,最近需要一个电子病历系统。医疗方面的电子化,可分EMR(electronic medical record)和HIS(hospital information system),EMR侧重于电子病历,而HIS侧重于使用计算机技术对整个医院进行管理,HIS包括EMR,HIS也难得多。但是如果只是想拥有一个私人的电子病历系统,或者开小诊所想使用电子病历,那么可以考虑使用一些开源的EMR或HIS(界面都是全英文的,但是一直用就熟练了,可以输入中文)。当然,这里的电子病历比较简陋,只是起到一个记录、方便查阅(相较于纸质病历)的作用,一般不应起法律效力。
如果是单纯的医生、并不懂计算机技术,可以只看这篇文章,遇到中间的注释不懂的,如果没有实际影响可以跳过不看。如果对计算机技术感兴趣的,可从笔者的第一篇文章看起,这里用到的所有技术都能通过之前的文章学会。

最后需要说明,下文中的所有方法,是让EMR或HIS在树莓派(一种微型电脑)上运行,服务器只提供一个公网ip、方便公网访问,如果只是在局域网中用(比如说自己开诊所,把树莓派放到诊所里面运行)就可以不买服务器;如果是上班时间摸鱼,想把病人记在自己的私人病历上,而且上班地方的电脑能连接外网,这种情况就可以买一个服务器。

0.准备工作

准备工作中,需要购买并设置树莓派;购买服务器,对服务器进行一些初始设置;在自己的电脑上准备相关软件。下文中出现的一个或多个X,一般指代不同的变化的数字。

(1)购买并设置树莓派

树莓派的详细介绍可参考 树莓派型号、参数与作用 (笔者之前的文章,赶时间的可以不看),粗略来说树莓派是一种便宜的微型电脑,可以用来运行一些任务。购买渠道上,建议到淘宝搜索 树莓派4B ,购买内存4GB或8GB版的,8GB版的目前(2022年8月)淘宝最便宜的是900¥左右,另外需要购买一个树莓派外壳(挑一个外观好看的)、树莓派官方电源、2张64GB的sd卡(2张以备不时之需)、1个读卡器(用于电脑读取sd卡),大概总成本在1100¥(8GB版)或900¥(4GB版)。另外还应该有一台自己的笔记本或台式机(这里需要是装windows系统,因为有些软件就是windows下运行的)。收到东西后,组装一下,把树莓派装进外壳,插上 type C 电源线,此时先不插sd卡。
现在要准备一些软件。到 这个网址 下载树莓派的官方刻录工具(用于把树莓派的操作系统写入sd卡),下载的文件名为 imager-1.X.X.exe ,其中 1.X.X 是版本号,选最新的版本,下载完成后安装;点击 这个网址 下载树莓派的操作系统,下载的文件名为 20XX-XX-XX-raspios-bullseye-arm64.img.xz ,然后用7z或rar等软件把它解压成 .img 文件。sd卡插上读卡器、连接到自己的电脑,打开官方刻录工具,操作系统选择 使用自定义镜像 ,找到刚才下载的镜像;sd卡选择插上的sd卡(如果同时连了其他U盘,注意不要选到这些其他的设备),点击右下角的齿轮图标(设置),勾选 开启SSH服务 ,在下面的 Set username and password 里设置一个自己喜欢的用户名及密码(后续还要设置很多的密码,笔者建议所有的地方都用同一个密码,这个密码要8个字符以上,同时包含大小写字母和数字),勾选 配置WiFi ,输入自己的wifi名和密码(如果用网线直连树莓派,则可以不设置wifi。推荐用网线直连),点击保存,点击烧录,等待一会儿。之后弹出sd卡(烧录工具会自动弹出sd卡)并拔下读卡器、sd卡,把sd卡插到树莓派上(方向不要插反了,有金手指的一面朝向树莓派板),连上电源即开机(树莓派没有开机键,连上电开机,如果断电就gg)。
接下来使用putty连接到树莓派。首先查找一下树莓派的局域网ip,比如你家里的wifi是路由器开的,那么浏览器登录到路由器的管理页面(详见自己路由器的说明),应该有一个叫 raspberrypi 的设备,记下它的ip地址,一般是 192.168.1.XXX 。然后下载putty,到 putty官网下载页 下载名为 putty-64bit-0.XX-installer.msi 的文件,安装到自己的电脑上。安装好后,打开文件夹内的 putty.exe ,在 Host Name (or IP address) 下面的框中输入树莓派的ip(192.168.1.XXX),右下角点击 Open ,输入烧录镜像时设置的用户名和密码(密码不会显示)即可连接到树莓派上,显示输入命令的界面。以后每次都是这样连接的。
下面对树莓派进行一些初始设置。在设置之前,需要进行一些说明。下文中的命令,应当从浏览器中复制,左键点击putty界面,单击鼠标右键即可粘贴(不要自己手动输入),每次只粘贴一行命令,然后按 enter键 执行这行命令。
确认自己的网速没问题,在putty界面输入以下命令:

sudo su root
passwd root
raspi-config

第二个命令是设置root用户的密码,需要输入。自己设置一个好记的密码,可以和刚才烧录镜像时设置的密码一样,然后会让你再输入确认一次。设置好root的密码后,以后用 sudo su root 可能需要输入root的密码。
执行第三个命令时,会进入一个设置页面。按上下移动,到 Advanced Options ,按 enter ,选 Expand Filesystem 。回到一开始的界面,按左右移动,选择右下角的 Finish ,会询问是否现在重启,选择 Yes ,这时putty界面会断开连接,关掉即可。等待一会儿后,重新用putty连接,进行如下操作:

sudo su root
apt-get update
apt-get -y install vim
apt-get -y upgrade

如果提示中看到了 packagekitd ,则等上10min后再执行上面的命令。第四个命令可能要执行一会儿,可以先看后面((2)购买并设置服务器)。执行完后,再输入以下的命令:

cd /tmp
curl https://get.docker.com/ > ./docker_install.sh
chmod +x docker_install.sh
sh docker_install.sh –mirror Aliyun
rm docker_install.sh
curl -L https://github.com/docker/compose/releases/download/v2.10.0/docker-compose-`uname -s`-`uname -m` > /usr/bin/docker-compose
chmod +x /usr/bin/docker-compose
docker-compose -v
reboot

reboot 命令也是重启。putty会断开连接,关掉,等待1min左右,打开一个新的putty、重新连接。
最后,需要设置一下root的登录(后面用WinSCP需要):

sudo su root
vim /etc/ssh/sshd_config

这里对vim命令进行说明。使用vim命令一般是要对文件内容进行更改,以这里为例,执行 vim /etc/ssh/sshd_config 后会进入展示文件内容的页面(这里是修改一个已存在的文件,所以会显示该文件的原有内容。后面涉及到新建文件,则会显示空的内容),键盘输入 i ,进入编辑模式,可以按方向键上下左右进行移动;然后对文件内容进行修改(这里的修改是复制内容到文件中,所以需要复制内容,点击putty界面,按 shift+鼠标右键 进行粘贴),修改完毕后,按 ESC ,再按 shift+: (这里的 + 表示按住shift键不放,然后按 : ,最后一起松开,后面同理),输入 wq (页面底部会显示 :wq),最后按 enter 即可保存文件并退出。
在这个文件的第一行加上:

PermitRootLogin yes

按上面的方法保存,然后执行命令:

service sshd reload
rm /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
date

最后的 date 可输出当前时间,这里设置的是上海时间。另外,这里的第三条命令输入的路径较长,像这种路径在输入的时候可以不输入完,而是输入前几个字母后按 tab键 进行匹配,如果前几个字母没有重名的就会自动补全路径。
至此,树莓派设置完毕。如果要关机,使用 shutdown now 命令,开机就是连上电源。最后,有时觉得命令行界面输出的内容太多了,可使用 clear 命令清屏。

(2)购买并设置服务器

购买服务器的主要目的是提供一个公网ip,这样就能从公网访问到自己的EMR或HIS了。如果确定自己只在局域网中用EMR或HIS,也可以只买树莓派。
比较大的提供服务器的厂商有阿里云、腾讯云、百度云、华为云等,其中阿里云起步最早、技术最成熟、市场份额最大,价格要贵一些(又称套路云,因为第一年价格便宜、续费价格贵);腾讯云起步晚一些、技术也不错,价格稍便宜;其他的厂商就不推荐了。总结一下,不差钱就买阿里云,否则就用腾讯云,但实际上两者相差不大。
这里以阿里云为例,登录 阿里云官网 ,用支付宝、淘宝等阿里系(qq、微信就是腾讯系)的app扫码登录,在上方的 产品 中找到 热门产品 -> 轻量应用服务器 ,这里选择内地服务器(香港或海外服务器有时网络会有波动),选择一个配置的服务器,先买一个月的低配置服务器,以后再续费和升级。这里的服务器只是负责提供一个公网ip,所以服务器的配置主要看月流量、峰值带宽,一般来说小诊所,1T、5Mbps(原价100¥/月)应该够用了,仅限个人使用的话,400GB、3Mbps(原价60¥/月)也可以。购买之前还可以比比阿里云和腾讯云的价格,有时候赶上优惠活动还能便宜点。
购买好服务器后,服务器的镜像选择 Docker ,确认后等待服务器初始化完成。在上方进入 控制台 -> 轻量应用服务器 ,这里是服务器的后台管理页面(或者直接访问 swas.console.aliyun.com )。这里可以看到服务器的公网ip,就是下面的 47.xx.xx.xx (可能前两个数字会有不同),这个ip需要用到。点击这个服务器、进入详情页面,点击右上角的 远程连接 即可连接到服务器。
连接到服务器后,需要进行一些初始设置。需要提前说明一些基础操作:
如果远程连接后弹出来的是一整个黑色页面,则按 ctrl+C 、ctrl+V 可以正常进行复制粘贴;若弹出来一个小的黑色框,它和putty是一样的,即可以在自己的电脑上用 ctrl+C 复制文字,在黑色框中单击鼠标右键粘贴。另外,有时某些命令输入后需要确认(弹出一行英文,末尾一般是 [y/n] ),那么就输入 y ,然后按 enter ;有时也可能提示输入 yes ,那么就输入 yes 后 enter ;有些时候可能要输入密码、用户名之类的,也是输入后按enter,但注意这里输入密码时不会显示。
下面对服务器初始设置,进行如下操作(有具体操作说明):

sudo su root
passwd root

第二条命令是设置root用户的密码,输入一个好记的密码,再输入一次确认密码。尽量确保这个密码不要丢失。
然后进行如下操作:

curl -L https://github.com/docker/compose/releases/download/v2.10.0/docker-compose-`uname -s`-`uname -m` > /usr/bin/docker-compose
chmod +x /usr/bin/docker-compose
docker-compose -v

这一步的目的是安装docker-compose,成功的话会输出版本信息。

最后需要开放服务器的8081端口。在云服务器的控制后台点进刚才购买的服务器,在左边的 安全 里有一个 防火墙 ,点击右上角的 添加规则 ,端口范围填 8081 ,然后确定即可。

至此,服务器设置完成。最后,有时觉得命令行界面输出的内容太多了,可使用 clear 命令清屏。

(3)准备软件

这里准备的软件是安装在windows笔记本或台式机上的(用MAC的自求多福)。需要的软件有WinSCP、7z、SD Card Formatter。
有时候需要在自己的电脑和服务器之间拷贝文件,对于大多数的windows系统用户,可以选择WinSCP。到 WinSCP的下载页 ,点击 DOWNLOAD WINSCP X.XX.X (XX MB) 下载并安装。在WinSCP的使用上,比如要连到自己的服务器,文件协议选 SCP ,主机名填 自己服务器的公网ip ,用户名为 root ,密码为刚才设置的root密码,点击登录即可;树莓派也选SCP,填其局域网ip,用户名也是root,进行登录。WinSCP连接后的默认界面,左边是自己电脑上的东西,右边是服务器上的东西,互相可以拖动文件拷贝;或者打开 我的电脑 也可往服务器上拷。
7z则是一个解压或压缩文件的软件,下载地址在 https://www.7-zip.org/ ,选 Download .exe 32-bit x86 1.2 MB 这个即可,下载完后安装。
SD Card Formatter是格式化sd卡的工具,在这篇教程中不会直接用到,但在日常使用中可能会用到。比如一张sd卡以前写入过操作系统,现在不需要了(可能是系统有问题),就用SD Card Formatter把sd卡格式化、写入其他操作系统。SD Card Formatter的下载地址在 https://www.sdcardformatter.com/download/ ,下载windows版的,安装即可。使用时选 quick format 。

1.方法一:docker + openmrs

这个方法应该要用树莓派。笔者实验时,试图把openmrs运行在云服务器上,但是2核服务器性能不够、跑不了openmrs,表现为卡在 Create OpenMRS tables 中的某一步;4核的服务器说不定可以,但是太贵了。
openmrs是一个应用比较广泛的EMR了。openmrs提供了一个演示网页,访问 演示网页 即可试用openmrs。登录用户名密码为admin和Admin123,选择 Outpatient Clinic (门诊),注册病人(Register a patient)、点进病人详情后写一个 Visit Note ,即可体验写简单的门诊病历。下面开始在自己的树莓派上布置一个openmrs。另外,为了节约时间,建议从笔者这里下载后面会用到的东西,下载地址为 https://lisper517.top/resources/OpenMRS/all.zip ,将其下载后解压,里面文件的用途见下文。

openmrs的下载页 ,提供了四种下载选择,其中 Reference Application - 2.12 - Standalone EditionPlatform 2.5.0 - Standalone Edition 是傻瓜包,安装即用(安装在windows系统上的),安装好后要自己安装扩展,不推荐用于实际环境; Reference Application 2.12 - Advanced InstallationPlatform 2.5.0 - WAR (for Enterprise) 是推荐用于实际环境的,但是需要自己另外搭建数据库(mysql)、Java应用容器(指Apache Tomcat,其一般也可简称为Tomcat),搭建完成后也要自己安装扩展,不得不说openmrs搭建比较复杂。这里笔者使用的就是 Platform 2.5.0 - WAR (for Enterprise) 这个包,其下载速度非常慢,笔者提供的文件里的 openmrs.war 就是下载好的包,其大小为122MB。之后开始搭建,这里使用docker搭建运行openmrs。
在树莓派上运行:

mkdir -p /docker/openmrs/data/mysql
mkdir -p /docker/openmrs/conf/mysql
docker pull tomcat:7.0.109
docker pull mysql:8.0.29

笔者试用两个Standalone Edition时发现都用的是tomcat:7.0.50,但是这个版本docker官方仓库没有,就用的tomcat:7里最新的7.0.109。不要用8~10版本的tomcat,可能有些小问题。
另外需要说明,tomcat的/usr/local/tomcat目录大概可以理解为nginx的/var/www/html,之后将在tomcat容器的/usr/local/tomcat/webapps里放上刚才下载的war包。第一次运行时需要开一次容器复制一下/usr/local/tomcat里的文件,进行如下操作:

docker run -itd --name tomcat --rm tomcat:7.0.109
docker cp tomcat:/usr/local/tomcat /docker/openmrs
docker container stop tomcat
mv /docker/openmrs/tomcat /docker/openmrs/www
rmdir /docker/openmrs/www/webapps
mv /docker/openmrs/www/webapps.dist /docker/openmrs/www/webapps

注意要用webapps.dist代替webapps,否则看不到webapps里的网页。
然后编写compose模板(这里对vim开头的命令做一个说明,不会的可以看):

vim /docker/openmrs/docker-compose.yml

写入以下内容

version: "3.9"

services:
  tomcat:
    image: tomcat:7.0.109
    ports:
      - "8081:8080"
    volumes:
      - /docker/openmrs/www:/usr/local/tomcat
    depends_on:
      - mysql
    logging: 
      driver: syslog
  
  mysql:
    image: mysql:8.0.29
    command: "mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci"
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    volumes:
      - /docker/openmrs/data/mysql:/var/lib/mysql
      - /docker/openmrs/conf/mysql:/etc/mysql/conf.d
    restart: always
    logging: 
      driver: syslog

其中 MYSQL_ROOT_PASSWORD: 123456 是指定数据库的root用户密码,可以把这个密码改的复杂一点,但是没必要记住,因为写在文件中了。
另外,这里最好是mysql开启后再开启tomcat,笔者在tomcat服务里使用了 depends_on 来限定,并且tomcat没有设置 restart: always (这样树莓派开机的时候就只有mysql打开,而tomcat还没有打开),这是因为如果tomcat在mysql之前打开的话,openmrs可能会因为找不到数据库而以为自己没有初始化过,后面访问的时候会变成初始的页面,那么之前存储的病人数据虽然没丢,但是找回来也是有些麻烦的。
保存完这个文件后,开启服务:

cd /docker/openmrs
docker-compose config
docker-compose up

第一次运行需要等待一两分钟,当没有新的日志输出时,浏览器访问 树莓派ip:8081 即可看到tomcat介绍页面(左上角粗体黑字 Apache Tomcat/7.0.109)。接下来把刚才下载的openmrs.war这个文件用WinSCP放到树莓派的/docker/openmrs/www/webapps里,然后tomcat日志会输出以下内容:

tomcat_1  | Aug 09, 2022 1:29:00 PM org.apache.catalina.startup.HostConfig deployWAR
tomcat_1  | INFO: Deploying web application archive [/usr/local/tomcat/webapps/openmrs.war]
tomcat_1  | Aug 09, 2022 1:29:14 PM org.apache.catalina.startup.TldConfig execute
tomcat_1  | INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
tomcat_1  | WARN - OpenmrsUtil.getRuntimePropertiesFilePathName(2128) |2022-08-09T13:29:17,146| Unable to find a runtime properties file at /usr/local/tomcat/openmrs-runtime.properties
tomcat_1  | WARN - OpenmrsUtil.getRuntimePropertiesFilePathName(2156) |2022-08-09T13:29:17,225| Unable to find properties file: /root/.OpenMRS/openmrs-runtime.properties
tomcat_1  | WARN - OpenmrsUtil.getRuntimeProperties(2089) |2022-08-09T13:29:17,227| Unable to find a runtime properties file. Initial setup is needed. View the webapp to run the setup wizard.
tomcat_1  | WARN - OpenmrsUtil.getRuntimePropertiesFilePathName(2128) |2022-08-09T13:29:17,901| Unable to find a runtime properties file at /usr/local/tomcat/openmrs-runtime.properties
tomcat_1  | WARN - OpenmrsUtil.getRuntimePropertiesFilePathName(2156) |2022-08-09T13:29:17,903| Unable to find properties file: /root/.OpenMRS/openmrs-runtime.properties
tomcat_1  | WARN - OpenmrsUtil.getRuntimeProperties(2089) |2022-08-09T13:29:17,904| Unable to find a runtime properties file. Initial setup is needed. View the webapp to run the setup wizard.
tomcat_1  | Aug 09, 2022 1:29:17 PM org.apache.catalina.startup.HostConfig deployWAR
tomcat_1  | INFO: Deployment of web application archive [/usr/local/tomcat/webapps/openmrs.war] has finished in [17,598] ms

最后一行说明openmrs应用已成功部署,这时浏览器访问 树莓派ip:8081/openmrs 即可看到openmrs初始化界面(版本2.5.0),这里讲一下初始设置:
第一个页面语言选择 English (没有中文),第二个页面(选择安装模式)选 Advanced ,第三个页面(数据库相关设置)在 Database connection 里将 localhost 改为 mysql ,修改前:

jdbc:mysql://localhost:3306/@DBNAME@?autoReconnect=true&sessionVariables=default_storage_engine=InnoDB&useUnicode=true&characterEncoding=UTF-8

修改后:

jdbc:mysql://mysql:3306/@DBNAME@?autoReconnect=true&sessionVariables=default_storage_engine=InnoDB&useUnicode=true&characterEncoding=UTF-8

这里是因为用容器运行mysql,所以ip填容器名;另外下面选择No,Password填123456(或者自己改的其他密码)。第四个页面(数据库相关设置)第三个问题是填openmrs使用的数据库用户,选No、Password填123456(自建用户总是有一些错误,不如直接把数据库的root给openmrs,反正是容器),第五个页面不改动,第六个页面填两次Admin123(或者自己设置密码,这个密码需要记住,满足下面的4条要求即可,建议所有涉及密码的地方都用一个统一的密码),第七个页面不用填,第八个页面确认一下设置即可开始初始化(没什么好确认的),第九个页面显示初始化进度,需要等待大约6~10分钟。
初始化完成后,网页显示登录页面,输入刚才设置的admin、Admin123(或其他密码),会进入Add On Manager页面,这里是管理扩展(modules,也称mod)的页面(用openmrs:2.4.3版本时第一次admin登录说不是admin、无权限管理扩展,这是自带扩展的一个bug;笔者教程中使用的是2.5.0版本,不会遇到这个问题)。现在还不能进入EMR,因为刚安装好的openmrs只是内核、还没有交互界面。openmrs官方mod站在 http://addons.openmrs.org ,上面的mod比较多。官方mod站中间上面点击RefApp 2.11,这里列出的扩展大概是功能比较齐全的,都装上就差不多了,但是这里下载也是太慢了,在笔者提供的压缩文件中,modules文件夹里面就是下载好的扩展。这里要安装的扩展比较多,先在putty里按一下 ctrl+C 停止openmrs,然后把这些扩展(omod文件)用WinSCP移动到 /docker/openmrs/www/webapps/openmrs/WEB-INF/bundledModules 目录下(这个目录下不应该出现文件夹,而只应该有omod文件),另外要注意该目录下已经有fhir2、owa、webservices.rest三个扩展,把它们3个删掉。移动完毕后,再次启动openmrs:

cd /docker/openmrs
docker-compose up

等待大约8分钟后,不再有新日志输出,最后一行日志为:

INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.

浏览器访问 树莓派ip:8081/openmrs ,可看到页面UI比较完善了。以用户密码admin、Admin123(或自己设置的密码),选择 Outpatient Clinic (门诊)登录系统并试用。这里讲一下openmrs的基础操作,主要是门诊病历书写:
书写病历首先需要一个病人。如果是以前看过的病人,在 Find Patient Record 里可以找到;如果是新病人则需要注册,选择 Register a patient,按步骤填入病人信息(推荐middle name写中文,其他两个写拼音),注意有些信息可以不填。在 Find Patient Record 里找到病人后点击该病人,或者注册病人后自动跳转,都会来到这个病人的详情页,点击右侧 General Actions 里的 Start Visit 即可开始接诊,新建 Visit Note 即可开始写病历。这个病历比较简陋,只有诊断和病历主体;诊断方面,比如输入 pulp ,有一个牙髓根尖周疾病的诊断,可以添加为主诊断,然后添加第二、第三诊断,就是背这些疾病的英文名比较麻烦,也可以自己写中文诊断,诊断字典里没有的也可以;病历主体方面,需要自己准备病历模板。由于这个病历主要是自己能看懂,所以写一些关键的就行了,比如做根管时几个根管的长度;病人有没有全身疾病等。另外需要注意,openmrs里使用的时区和中国时区不同,笔者暂时没找到改时区的方法。一般openmrs里的时间比中国上海时间早8个小时。

现在已经完成了openmrs的搭建。如果想在实际环境中使用这种方法,为了安全,可对openmrs进行备份,树莓派上输入:

mkdir -p /backup/openmrs
crontab -e

加上一行:

0 6-20/1 * * * /usr/bin/zip -r /backup/openmrs/backup.zip /docker/openmrs

这样就在6点到20点之间,每小时对openmrs备份一次。如果某天openmrs不能进入,可用WinSCP把/backup/openmrs目录下的这个backup.zip备份文件复制到自己的电脑上后解压(建议每过几天就把这个文件转移到自己的电脑上一次),按前面 0.准备工作-(1)购买并设置树莓派 的方法重新准备一张写入树莓派系统的sd卡,在新的树莓派系统中使用 mkdir /docker 命令,然后把解压后的文件夹用WinSCP放到/docker目录下,最后输入下面两行命令:

cd /docker/openmrs
docker-compose start mysql
docker-compose up

即可,非常的简单。

另外需要提醒,如果在实际环境中使用此方法,放到公网上的话(通过公网访问树莓派的方法见附录),建议晚上不开,需要写病历的时候再开(每次打开需要等待10min左右):

#这两行是关闭openmrs的命令
cd /docker/openmrs
docker-compose stop
#这三行是打开openmrs的命令
cd /docker/openmrs
docker-compose start mysql
docker-compose up -d

注意打开的命令稍微有所变化, docker-compose start mysql 输入后建议等待至少2min后再输入 docker-compose up -d ,保证mysql服务在tomcat之前打开;使用 docker-compose up -d 时不会输出日志,也可以安全关闭putty。
而且openmrs自带了4个其他用户,为了安全,建议在 System Administration - Manage Accounts 里把这4个用户 retire 掉。

最后,其实openmrs在github上提供了 官方compose模板 ,但是比较难用,因为maven(一种包管理器)在国内下载太慢,感兴趣的可以通过 v2ray + v2rayA 连接到国外源试试(见 Docker实践——如何查阅wiki百科及V2Ray )。官方compose的使用方法是点击 Code ,在下拉菜单中点击 Download ZIP ,下载后把zip包解压,改名为openmrs,在树莓派上用 mkdir /docker 创建一个目录,把这个openmrs文件夹放到/docker目录下,进行如下操作:

cd /docker/openmrs
docker-compose build
docker-compose up

即可安装openmrs,同样在浏览器中访问,只是把 树莓派ip:8081/openmrs 改成 树莓派ip:8080/openmrs 。但由于网络问题,多半无法用官方模板构建,笔者即使成功构建,也无法正常访问openmrs。

到这里已经完成openmrs的介绍。如果想试试后面的方法,可使用如下命令把树莓派系统恢复到初始状态(先按 ctrl+C 再执行下列命令):

cd /docker/openmrs
docker-compose stop
docker container rm openmrs-tomcat-1
docker container rm openmrs-mysql-1
docker image rm tomcat:7.0.109
docker image rm mysql:8.0.29
docker network rm openmrs_default
cd /
rm -r /docker/openmrs

若提示 Error: No such container: openmrs-tomcat-1 ,则把所有 - 换成 _ 试试。

总结一下,openmrs比较简洁,可以根据需要自己安装不同的扩展、满足多种需要。但是openmrs需要自己下扩展,算是一个扣分项(不过笔者提供的扩展已经够用了)。可根据自己的情况决定是否要用openmrs。

2.方法二:gnuhealth 的树莓派系统

gnuhealth是一个开源的HIS系统,2008年由一个西班牙医生 Luis Falcón 创立。gnuhealth的安装可分为两种方法,一是系统镜像法,二是正常安装。gnuhealth也提供了一个试用的网页,地址为 http://federation.gnuhealth.org:8000/ ,用户名是admin,密码为gnusolidario。gnuhealth的使用将在后面说明。
下面这两个网页提供给懂linux的读者,gnuhealth的安装说明在 https://en.wikibooks.org/wiki/GNU_Health/Installation ,embedded版的初步说明则在 https://en.wikibooks.org/wiki/GNU_Health/Embedded (这个基本没用)。若无法访问,可从笔者的网页备份查看,即 安装说明embedded版说明 。方法二、三都主要参照了第一个网页。

gnuhealth官网 上提供了树莓派版本的embedded系统镜像,可以将树莓派打造成一个HIS的服务器(调度中心)。它的用法和写入树莓派系统镜像是一样的,也是用烧录工具把一个img文件写入sd卡中,然后树莓派插上sd卡就完事。镜像的官网下载页面在 https://gnuhealth.org/embedded.html (这个网页可以不看),实际的树莓派4系统镜像下载页面在 https://www.gnuhealth.org/downloads/embedded/raspberry/rpi4/ ,下载.gz结尾的文件,解压得到img镜像(本文写作时,镜像名为 gnuhealth-3.6.4-rpi4-SD-opensuse-leap15.2-xfce.img ),用树莓派官方烧录工具写到sd卡(这一次只选镜像和sd卡,不用改设置)、插到树莓派上,树莓派插上网线开机。注意一定要插上网线,因为这里写入操作系统时没法设置wifi。

开机大约3min后,同样是在路由器里找到树莓派的局域网ip,用putty连接(如果 connetion refused 就再等一会儿)。系统有两个用户,分别是root和gnuhealth,密码都是 freedom ,用root进入系统(后面每次重启都是用root进系统),进行以下操作:

passwd root
passwd gnuhealth
vim /etc/sysconfig/network/config

前两行命令是更改root和gnuhealth用户的密码,把密码改成自己的。第三行命令会打开/etc/sysconfig/network/config这个文件,其中有一行是 NETCONFIG_DNS_STATIC_SERVERS="" (按ESC,按 / 后粘贴内容,然后按enter,可以查找),把它改成:

NETCONFIG_DNS_STATIC_SERVERS="8.8.8.8 8.8.4.4"

这是因为gnuhealth没有设置DNS服务器(DNS可以把域名解析成公网ip),所以添加了google的两个DNS服务器。然后进行以下操作:

reboot
apt-get update
apt-get upgrade -y
reboot

第三个命令可能要执行一会儿。重启、重新用putty连接后,输入以下命令:

rm /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
date
apt-get install -y xrdp
systemctl enable xrdp
systemctl start xrdp

前三条命令用于更换时区为上海,使用 date 命令可显示正确的时间。后三条命令是安装xrdp(远程桌面相关),接下来试试用远程桌面连接到树莓派,gnuhealth用的OpenSUSE,自带tigervnc,也就是Xvnc,开启时先设置一个密码:

vncpasswd

这个是tigervnc的密码,建议可以和root、gnuhealth用户的密码一样;需要输入两次,另外还会提示是否输入一个只能看的密码(用这个密码连接远程桌面时只能看不能动),这个可以不设置。然后在自己的笔记本或台式机上,按 win+R ,输入 mstsc 后执行,打开windows的远程桌面(或者在搜索框中,就是关机键旁边的放大镜图标中搜索远程桌面),输入树莓派的局域网ip,连接,选择 Xvnc ,用户名和密码就是gnuhealth(这里不要用root登录)和刚才设置的密码。桌面左下角第四个图标是 xterm ,打开后执行:

/home/gnuhealth/.local/bin/gnuhealth-client

就会打开gnuhealth的客户端,可以直接连入试用(大概看一下界面即可),密码是gnusolidario。这里的数据库是health36rpi,用户名是admin,需要记住。
然后在windows机器上用对应的tryton客户端5.0.23版本查看,访问 tryton客户端5.0.23下载地址 ,安装后,使用方法和刚才一样,Host填 树莓派ip:8000,Database是health36rpi,User name为admin,输入密码登录。

这里的gnuhealth版本比较老( ls -al /home/gnuhealth 可以看到有个 gnuhealth-3.6.4 ,说明这个版本是3.6.4;另外这里用的tryton是5.0.23版,最新的已经到6.0.17版了),可以升级一下(下面的操作不建议跟做,因为最后有一些问题)。根据 gnuhealth升级教程 (或 升级教程备份网页),进行下面的操作:

su root
systemctl stop gnuhealth
mkdir -p /backup/gnuhealth
chown -R gnuhealth:users /backup/gnuhealth
su gnuhealth
~/gnuhealth/tryton/server/util/gnuhealth-control backup --backdir /backup/gnuhealth --database health36rpi
mv ~/gnuhealth ~/gnuhealth_3.6.4

如果下载版本不同,可能 health36rpi 这里要改动。到这里为止就把老版本的gnuhealth进行了备份,接下来安装新版本的gnuhealth:

cd ~
wget https://ftp.gnu.org/gnu/health/gnuhealth-latest.tar.gz
tar -xzf gnuhealth-latest.tar.gz
rm gnuhealth-latest.tar.gz
ls -al

笔者下载时,最新版本为 gnuhealth-4.0.4

cd gnuhealth-4.0.4
wget -qO- https://ftp.gnu.org/gnu/health/gnuhealth-setup-latest.tar.gz | tar -xzvf -
mkdir ~/.pip
vim ~/.pip/pip.conf

pip.conf 中写入以下内容:

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host=mirrors.aliyun.com

这步操作是把python源换成国内的。然后继续执行:

pip install --upgrade pip
bash ./gnuhealth-setup install
cd ..
source ~/.gnuhealthrc
createdb test
cdexe
python3 ./trytond-admin --all --database=test

本来这里的 --database= 应该用 health36rpi 或者 ghdemo40 的,由于笔者在使用原来的demo或者后来新的demo数据库时有些问题(缺各种module),所以这里用 createdb test 命令新建了一个新的test库(由于是空数据库,后面登录查看是完全没有数据的)。最后一个命令要运行几分钟,之后会要求输入一个邮箱,可以填自己的邮箱(也可以随便填);设置两次密码,还是建议用通用密码。最后开启服务:

su root
systemctl start gnuhealth

然后就可以用最新的tryton客户端查看了,比如在windows机器上访问 tryton客户端下载地址 ,安装后,使用方法和刚才一样,Host填 树莓派ip:8000,Database是test,User name为admin,输入密码登录,但是数据库是空的。
gnuhealth的树莓派系统差不多就是这样使用,它的优点是使用较简单;缺点是扩展性差,比如不能装docker,因为这个发行版是OpenSUSE;但是docker对HIS功能完全没有影响,如果只用树莓派跑gnuhealth还是完全ok的;还有就是gnuhealth的升级(迁移旧的数据库)有些问题,笔者不知道如何解决,如果自己新建一个数据库又不知道怎么把它打造成和官方的demo一样;如果新的tryton客户端能支持访问老版本也好,可惜不能,只能用老版本的tryton客户端;或者好像也可以不用下tryton客户端、直接用网页访问gnuhealth。可惜gnuhealth在这三个方面都介绍的语焉不详,感觉并不是很方便。所以在下一种方法中,笔者试着从树莓派的官方镜像开始,搭建gnuhealth,可惜遇到了同样的问题。

3.方法三:gnuhealth 直接安装(无法使用)

(1)购买并设置树莓派 中的方法准备一个树莓派的操作系统,然后开始安装。

根据 安装说明 ,gnuhealth需要的环境有:

Operating system: GNU/Linux or FreeBSD for the server.
RDBMS Database: PostgreSQL >= 10.x
Document-oriented Database for Health Information System / Person Master Index: PostgreSQL  :>= 10.x
Python: >= 3.6
Gunicorn : 19.9 # WSGI HTTP服务器,用pip安装
Flask : 1.0 # python写的Web应用框架
Tryton 6.0 # python写的,提供登录和界面,以及客户端
Bash shell
PIP for Python 3 # 要求用pip命令时是pip3

但这里面只有postgresql是需要自己准备的,其他的东西要不就是不重要,要不就是树莓派系统自带,要不就是gnuhealth提供了一个安装脚本、可自动安装。唯一一个例外是Gunicorn,根据gnuhealth的wiki手册,gnuhealth默认使用的HTTP服务器是Werkzeug、使用时要下载tryton客户端,如果换成Gunicorn就可以从浏览器打开、不用装tryton客户端,可惜介绍的并不是很详细,笔者也没有兴趣继续探索(openmrs已经能完全满足笔者需要了),希望懂行的朋友可以在评论不吝赐教。

用root用户登录树莓派,在树莓派上进行如下操作:

adduser gnuhealth
apt-get install -y postgresql postgresql-client
service postgresql start
su - postgres -c "psql -t -P format=unaligned -c 'show hba_file'"

注意第二个命令执行时需要设置密码,另外还有 Full Name 这些东西(这些可直接按enter跳过)。最后一个命令会显示 /etc/postgresql/XX/main/pg_hba.conf (或者是 /var/lib/pgsql/data/pg_hba.conf ),记住数字(笔者实验时为13),备份并修改这个文件:

su postgres
cp /etc/postgresql/XX/main/pg_hba.conf /etc/postgresql/XX/main/pg_hba.conf_backup
vim /etc/postgresql/XX/main/pg_hba.conf

对没有注释的部分,改成下面这样:

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
#local   all             all                                     peer
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            ident
host    replication     all             ::1/128                 ident

然后进行以下操作:

su root
service postgresql restart
su - postgres -c "createuser --createdb --no-createrole --no-superuser gnuhealth"
su gnuhealth
cd ~
wget https://ftp.gnu.org/gnu/health/gnuhealth-latest.tar.gz
tar -xzf gnuhealth-latest.tar.gz
rm gnuhealth-latest.tar.gz
ls -al

这时应该会显示一些文件,其中有一个的名字为 gnuhealth-X.X.X ,笔者实验时的版本为 gnuhealth-4.0.4 ,下面以 gnuhealth-X.X.X 指代:

cd gnuhealth-X.X.X
./scripts/demo/install_demo_database.sh 40
wget -qO- https://ftp.gnu.org/gnu/health/gnuhealth-setup-latest.tar.gz | tar -xzvf -
mkdir ~/.pip
vim ~/.pip/pip.conf

这里的第二行命令是用gnuhealth自带的脚本下载demo数据库,其数据库下载网页为 这个网页 ,如果要下载其他的就把 40 改成 3234 等。
最后一行命令,也是修改一下python源,写入:

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host=mirrors.aliyun.com

然后安装gnuhealth

pip install --upgrade pip
bash ./gnuhealth-setup install
cd ..
source ~/.gnuhealthrc
createdb test
cdexe
python3 ./trytond-admin --all --database=test

本来应该 --database=ghdemo40 ,但是demo数据库有些问题。同样用 createdb test 创建test数据库代替。
这里也会要求输入一个邮箱,可以填自己的邮箱(也可以随便填);设置两次密码,还是用通用密码。
然后继续执行:

su root
vim /etc/systemd/system/gnuhealth.service

写入:

[Unit]
Description=GNU Health Server
After=network.target

[Service]
Type=simple
User=gnuhealth
WorkingDirectory=/home/gnuhealth
ExecStart=/home/gnuhealth/start_gnuhealth.sh
Restart=on-abort

[Install]
WantedBy=multi-user.target

然后修改一下 start_gnuhealth.sh

su gnuhealth
vim /home/gnuhealth/start_gnuhealth.sh

将最后一行的:

python3 ./trytond $@ || bailout

改成:

python3 ./trytond $@ --logconf /home/gnuhealth/gnuhealth/tryton/server/config/gnuhealth_log.conf || bailout

这是设置gnuhealth的log格式,在上一个方法中其实也可以这样写。
最后开启gnuhealth:

su root
systemctl enable gnuhealth
systemctl start gnuhealth

同样在windows机器上访问 tryton客户端下载地址 下载tryton客户端,安装后,使用方法和刚才一样,Host填 树莓派ip:8000,Database是test,User name为admin,输入密码登录,但是数据库是空的。
从树莓派系统搭建的gnuhealth扩展性强了,可以装docker,但是笔者同样不知道如何安装demo数据库、用gunicorn从网页访问gnuhealth。

4.了解:新致“开源”医疗

新致“开源”医疗的官网为 http://code.tntlinking.com/#/detail/1 ,打着开源的噱头,其实是商业公司开发的产品。它的官网是面对企业开发者的,需要关注微信公众号,手机号注册签约,并同意签约协议才能下载源码,协议内容如下:

新致开源医疗项目商业合作协议
更新日期:2022年6月6日

新致开源医疗项目商业合作协议(下称“本协议”)包含您在经销新致开源医疗平台的商品或服务时所应遵守的条款和条件。本协议由武汉新致医卫信息技术有限公司(下称“本公司”或“我们”)与您或您所代表的实体(下称“用户”或“您”)签订。如果您代表某一实体签订本协议,您向我们声明并保证,您具有合法代表该实体之权限且有可约束该实体遵守本协议条款与条件之合法权限。除非我们另有通知,本协议自您接受之日起生效。您与本我们在下文中单独提及时会被称作一方,一同提及时会被称作双方。

根据《中华人民共和国民法典》的有关规定,经双方友好协商,本着长期平等合作,互利互惠的原则,为实现“新致开源医疗产品(HIS)商业发行版”(以下简称“发行版”)的商业推广和联合运营,创造良好的经济效益和社会效益,达成以下协议:

一、合作宗旨

促进国内普惠医疗数字化的发展,利用您广泛的市场资源优势,发挥我们医疗软件的研发能力,合作实现发行版的技术升级与市场营运。

二、合作范围

1、市场推广

1.1、双方共同对发行版进行推广、销售,包括但不限于直接或间接参加医院系统的招投标、代理招募和中小规模诊疗机构推广;

1.2、双方共同对发行版进行品牌力提升,包括但不限于参加国内各类重大医疗行业大会。

2、产品研发

2.1、推动发行版和其他系统进行兼容、集成;

2.2、对发行版进行迭代开发,遵循GPL开源协议(《GNU GENERAL PUBLIC LICENSE》)。

三、合作方式

1、您以现有的市场营销网络及社会资源为基础,进一步的开发市场潜力,逐步形成一个规范化且有区域影响力的营销网络;

2、您根据市场客群需求,推广发行版,收集反馈用户需求;

3、我们通过天天数链平台(www.tntlinking.com)提供经过确权的发行版源代码及相关资料库。

四、权力及义务

1、您的义务

1.1、您承诺并同意在发行版合作期内,必须遵守国家相关法律、正规合法运营及缴纳税收,如发生任何违法违纪行为所产生的一切法律责任及赔偿均由您独立承担;

1.2、您严格在我们许可下使用发行版,需在系统中保留“武汉新致医卫信息技术有限公司@2017开源授权”的字样;

1.3、根据商业化推广要求,您在与客户完成签约后10日之内,向我们报备客户相关信息,提供签章合同扫描件的关键页。

2、您的权利

2.1、我们授权您对发行版进行销售、修改,修改过程中需遵守本协议第四条4.1.2款约定;

2.2、您在发行版销售过程中,有权自主决定目标客户、销售价格、服务条款等相关内容。

3、我们的义务

3.1、提供给您的发行版拥有原始且完整的著作权;

3.2、对发行版产品进行持续研发和升级;

3.3、在合作过程中,对涉及到您的有关机密数据进行严格保密。

4、我们的权利

4.1、我们对您推广发行版的市场情况具有知情权;

4.2、我们对您使用发行版运营收益情况具有知情权;

4.3、我们可书面询问您上述两款的情况,您应于5个工作日内进行答复并对我们提出的疑义提供材料证明。

五、利益分配

1、分配规则

1.1、若报价以产品加实施的方式成交,则我们收取产品成交价的40%;

1.2、除上述5.1.1所述的报价方式外成交的,我们收取项目成交价的15%。

2、支付方式

2.1、您应在收到客户第一笔款后的7日内告知我们,在收到我们按照同比例额度开具的增值税专用发票(税率:6%)后30日内支付给我们;

2.2、您应在收到客户最后一笔款后的7日内告知我们,在收到我们按照剩余额度开具的增值税专用发票(税率:6%)后30日内支付给我们;

2.3、我们须保证所提供发票的真实有效合法性。您逾期告知或逾期付款的,每逾期一天,应按逾期款的1%(百分之一)向我们支付违约金,直至支付完毕之日止。逾期若达30日,我们有权单方面解除本协议。

六、其它

1、适用法律及管辖

本协议适用法律为中华人民共和国法律。您和平台同意,本协议签订地为中国上海市浦东新区。在合同履行过程中双方如发生纠纷,应协商解决;协商不成的,双方应向协议签订地有管辖权的人民法院以诉讼的方式解决。

2、声明

您在使用本公司提供的签约下载服务之前,请您务必审慎阅读、充分理解本协议各条款内容,包括但不限于免除或者限制责任的条款。如您不同意本服务协议及/或随时对其的修改,您可以主动停止使用新致公司提供的签约下载服务;您一旦使用本公司提供的签约下载服务,即视为您已了解并完全同意本服务协议各项内容,包括本公司对服务协议随时所做的任何修改,并成为我们的用户。

该协议有几个关键点:
(1)使用GPL开源协议。GPL要求必须开放源码,不能做成闭源的商业软件发布,但是可以做成开源的商业软件收钱。
(2)如果开发者二次开发的产品卖出钱了,该公司收取40%或15%。
(3)一旦同意该协议,公司后续若对该协议进行更改,也视为自动同意。或者也可以选择解约。
光同意该协议还没完,后面需要输入公司信息等,所以这个“开源”系统不是面对个人开发者的,主要是卖钱的。
这其实也是一个缩影。在github或sourceforge上可以找到国外真正开源的HIS,虽然别人打着援助落后地区的旗号、可能不适用于国内医院,但确实是真开源;国内的市场太小,也没有这种需求,难以找到真正免费开源的HIS。

附录:通过公网访问EMR或HIS

这里用到了frp,并且是通过docker运行frp。更详细的内容见 Docker树莓派实践——frp(附dashboard开启https、frp双向验证) 。在方法二中,系统镜像为OpenSUSE、装不了docker,则也可以在树莓派上直接安装frp,其下载地址为 https://github.com/fatedier/frp/releases
在方法一中,openmrs使用的是树莓派的8081端口;在方法二、三中,gnuhealth使用的是8000端口。
在购买的云服务器上进行如下操作(云服务器使用Docker镜像):

sudo su root
mkdir -p /docker/frps/conf
vim /docker/frps/conf/frps.ini

写入如下内容:

[common]
bind_port = 7000
token = 你的密码
dashboard_port = 7500
dashboard_user = wuhuqifei
dashboard_pwd = wuhuqifei
kcp_bind_port = 7000

token即密码,要设置的复杂一点;dashboard_user和dashboard_pwd也可自行更改。
然后在云服务器的防火墙中打开7000、7500端口。注意,是在云服务器详情的 安全-防火墙 中新增两个个规则,打开这两个端口;另外,在刚才云服务的设置里,应该也打开了8081端口。
然后在云服务器上继续操作:

docker run -d --name frps -v /docker/frps/conf/frps.ini:/etc/frp/frps.ini --network host --restart=always snowdreamtech/frps

之后可以查看 云服务器公网ip:7500 ,输入dashboard_user和dashboard_pwd即用户名和密码,查看frps的运行情况。

在树莓派上进行如下操作:

mkdir -p /docker/frpc/conf
nano /docker/frpc/conf/frpc.ini

写入如下内容:

[common]
server_addr = 云服务器公网ip地址
server_port = 7000
token = 你的密码
login_fail_exit = false


[pi4B-http-1]
type = tcp
local_ip = localhost
local_port = 8081 #如果是gnuhealth,则改成8000
remote_port = 8081

然后执行:

docker run -d --name frpc -v /docker/frpc/conf/frpc.ini:/etc/frp/frpc.ini --network host --restart=always snowdreamtech/frpc

最后访问 云服务器公网ip:8081/openmrs ,即可从公网访问到自己的openmrs;或者在tryton客户端的Host填 云服务器公网ip:8081 ,可通过公网访问gnuhealth。

标签: 树莓派, docker, docker-compose, MRS, HIS

添加新评论