GNU Health/联合体技术指南
在本章中,我们将介绍 GNU Health 联合体背后的技术方面。
GNU Health 联合体有三个主要组件
- 节点
- 消息服务器
- 健康信息系统/个人主索引
HMIS 节点的安装和配置已在前面的章节中进行了描述。在本章中,我们将主要关注健康信息系统和消息/身份验证服务器(丘脑)。
在本章中,我们以示例的形式显示了用户和密码。切勿在生产环境中使用这些密码。 |
个人主索引和健康信息系统都包含在 GNU Health 联合体的 HIS 组件中。
丘脑项目为所有 GNU Health 联合体节点提供了一个 RESTful API 集线器。主要功能包括
- 消息服务器:GNU Health 联合体和 GNU Health 信息系统中参与节点之间的一个集中器和消息中继。一些参与节点包括 GNU Health HMIS、移动 PHR 应用程序、实验室、研究机构和民政办公室。
- 身份验证服务器:丘脑还充当与 GNUHealth 信息系统交互的身份验证和授权服务器
RESTful API:丘脑使用 REST(表述性状态转移)架构风格,由 Flask 技术提供支持
丘脑将执行 CRUD(创建、读取、更新、删除)操作。它们将通过以下方法对资源及其实例进行操作。
- GET : 读取
- POST : 创建
- PATCH : 更新
- DELETE : 删除。
DELETE 操作将是最少的。
JSON:信息将以 JSON 格式编码。
- 安装 PostgreSQL
- 找到 pg_hba.conf 文件并添加以下行
local all all trust
如果找不到该文件,请参考验证 PostgreSQL 身份验证方法
- 重启 PostgreSQL
$ sudo systemctl restart postgresql.service
- 授予新创建的丘脑用户权限
$ sudo su - postgres -c "createuser --createdb --no-createrole --no-superuser thalamus"
丘脑是一个 flask 应用程序,并且可以通过 pip 安装。使用丘脑操作系统用户在本地安装丘脑服务器。
$ pip3 install --user wheel
$ pip3 install --user thalamus
$ pip3 install --user flask-cors
以下文档适用于一个演示/测试数据库,我们将其称为“联合体”
1) 创建数据库
$ createdb federation
2) 定位丘脑
$ pip3 show thalamus
$ cd /path/thalamus/demo/
3) 创建联合体 HIS 模式
在丘脑的“demo”目录中执行以下 SQL 脚本
$ psql -d federation < federation_schema.sql
4) 设置演示数据的 PostgreSQL URI
在import_pg.py中调整变量 PG_URI 以适应您的需求。如果您的设置符合默认设置,只需将“dbname='federation'”放入 psycopg2.connect(...) 中即可。
5) 初始化联合体演示数据库
$ bash ./populate.sh
6) 设置运行时的 PostgreSQL URI
就像第二步一样,修改etc/thalamus.cfg中的POSTGRESQL_URI或直接修改thalamus.py(不在演示目录中)中的 psycopg2.connect(...)。
此时,您可以直接从 Flask Werkzeug 服务器运行并测试丘脑,
$ python3 ./thalamus.py
这对于开发和测试环境是可以的,但对于生产站点,始终从 WSGI 容器运行丘脑,如下一节所述。
在生产环境中,出于性能原因,您应该使用 HTTP 服务器。您将找到从uWSGI和gunicorn运行丘脑的示例。
uWSGI 是一款非常强大且快速的应用程序,在丘脑的上下文中用作 Web 服务器网关接口,将来自其他应用程序(例如,联合体门户或 HMIS 节点)的请求转发到丘脑。
首先在您的操作系统上安装 uWSGI 及其用于 HTTP 和 Python 的插件。例如,在 Ubuntu 上
$ sudo apt install uwsgi uwsgi-plugin-router-access uwsgi-plugin-python3
我们包含了一个 uwsgi 示例配置文件 (etc/thalamus_uwsgi.ini)。为了使用 HTTP 测试 uWSGI,将其更改为以下内容
[uwsgi]
master = 1
# https = 0.0.0.0:8443,/opt/gnuhealth/certs/gnuhealthfed.crt,/opt/gnuhealth/certs/gnuhealthfed.key
http = 0.0.0.0:8080
wsgi-file = thalamus.py
callable = app
processes = 4
threads = 2
block-size = 32000
stats = 127.0.0.1:9191
plugins = http,python
使用默认配置文件执行丘脑
$ uwsgi --ini etc/thalamus_uwsgi.ini
所有这些参数也可以传递到命令行。
注意:在 vueJS 门户上使用 gunicorn 的 SSL 时,请求和关闭连接存在一些延迟问题。
Gunicorn 本机支持 WSGI,并且作为 Python 包提供。我们包含了一个简单的默认配置文件(etc/gunicorn.cfg
),用于从启用 SSL 的 Gunicorn 运行丘脑。
例如,您可以按如下方式从 Gunicorn 运行丘脑应用程序。默认配置文件使用安全 (SSL) 连接
$ gunicorn --config etc/gunicorn.cfg thalamus:app
获取官方证书或生成自签名证书和私钥
$ sudo openssl req -newkey rsa:2048 -new -x509 -days 3650 -nodes -out gnuhealthfed.crt -keyout gnuhealthfed.key
如果 uWSGI 应该处理 HTTPS,请将证书 (gnuhealthfed.crt) 和私钥 (gnuhealthfed.key) 放置在丘脑用户具有读取权限的目录中。然后使用正确的路径将 etc/thalamus_uwsgi 从 HTTP 更改为 HTTPS。将它们的备份保存在安全的地方。
或者将 uWSGI 作为内部 HTTP 服务器,并配置 HTTPS 反向代理。使用 apache2,您可以创建一个文件 thalamus.conf 作为具有以下内容的站点
<IfModule mod_ssl.c>
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /etc/ssl/certs/gnuhealthfed.crt
SSLCertificateKeyFile /etc/ssl/private/gnuhealthfed.key
ServerName domain
ProxyPass / http://your_host:8080/
ProxyPassReverse / http://your_host:8080/
</VirtualHost>
</IfModule>
根据操作系统将其放置在 /etc/apache2/vhosts.d/(openSUSE)或 /etc/apache2/sites-available/(Debian/Ubuntu)中。对于最后一种情况,之后使用a2ensite命令启用它。最后启用一些模块并重启 apache
$ sudo a2enmod headers ssl proxy proxy_http
$ sudo systemctl restart apache2.service
为了使用 systemctl 控制丘脑并在启动后启用它,请创建一个服务文件 thalamus.service,其内容如下
[Unit]
Description=Thalamus Server
After=network.target
[Service]
User=thalamus
WorkingDirectory=/path/thalamus
ExecStart=uwsgi --ini etc/thalamus_uwsgi.ini
Restart=on-abort
Type=notify
KillSignal=SIGQUIT
StandardError=syslog
[Install]
WantedBy=multi-user.target
对于工作目录,请取上面 pip 目录的路径。
将此文件放入适合您操作系统的目录中:例如,在 Debian/Ubuntu 上为 /etc/systemd/system/,在 openSUSE 上为 /usr/lib/systemd/system/。然后启动并启用服务。
$ sudo systemctl start thalamus.service
$ sudo systemctl enable thalamus.service
如果您想使用虚拟环境,请在安装 Thalamus 之前创建并激活虚拟环境。
python3 -m venv /home/thalamus/venv
source /home/thalamus/venv/bin/activate
此外,请在 etc/thalamus_uwsgi.ini 中添加以下行。
venv = /home/thalamus/venv/
Thalamus 使用与授权相关的“角色”方法。它简单易用,但功能强大。
每个角色都具有以下方法权限:GET、PATCH、POST、DELETE
权限在端点级别起作用。端点的示例包括“人员”或生命中的“页面”。
以下是“roles.cfg”文件的示例,其中显示了三个主要角色:end_user、health_professional 和 root。
[
{"role": "end_user",
"permissions": {
"GET": ["person", "book","page","password"],
"PATCH": ["person","page"],
"POST": ["page", "password"],
"DELETE": [],
"global": "False"
}
},
{"role": "health_professional",
"permissions": {
"GET": ["people","person","book","page"],
"PATCH": ["person", "page"],
"POST": ["person", "page"],
"DELETE": [],
"global": "True"
}
},
{"role": "root",
"permissions": {
"GET": ["people","person","book", "page","password"],
"PATCH": ["person","page"],
"POST": ["person","page", "password"],
"DELETE": ["person","page"],
"global": "True"
}
}
]
一旦用户提供了正确的凭据,他/她将拥有访问与角色关联的文档的权限级别。一个用户可以拥有一个或多个角色。例如,一名医疗专业人员通常属于两个组。
- person : 他/她创建和读取自己的文档,更改密码等。通常,其域仅限于他/她自己。他/她不能操作其他人的文档。
- health_professional : 他/她可以查看其患者的病历,但不能更改其密码。
如果您执行了populate.sh,则可以使用用户/密码组合 ITAPYT999HON:gnusolidario 测试连接。