跳转到内容

GNU Health/联合体技术指南

来自维基教科书,开放世界中的开放书籍



GNU Health 联合体组件

在本章中,我们将介绍 GNU Health 联合体背后的技术方面。

GNU Health 联合体有三个主要组件

  • 节点
  • 消息服务器
  • 健康信息系统/个人主索引

HMIS 节点的安装和配置已在前面的章节中进行了描述。在本章中,我们将主要关注健康信息系统和消息/身份验证服务器(丘脑)。


健康信息系统服务器 (HIS) 配置

[编辑 | 编辑源代码]

个人主索引和健康信息系统都包含在 GNU Health 联合体的 HIS 组件中。

丘脑配置

[编辑 | 编辑源代码]

丘脑项目为所有 GNU Health 联合体节点提供了一个 RESTful API 集线器。主要功能包括

  1. 消息服务器:GNU Health 联合体和 GNU Health 信息系统中参与节点之间的一个集中器和消息中继。一些参与节点包括 GNU Health HMIS、移动 PHR 应用程序、实验室、研究机构和民政办公室。
  2. 身份验证服务器:丘脑还充当与 GNUHealth 信息系统交互的身份验证和授权服务器


RESTful API:丘脑使用 REST(表述性状态转移)架构风格,由 Flask 技术提供支持

丘脑将执行 CRUD(创建、读取、更新、删除)操作。它们将通过以下方法对资源及其实例进行操作。

  • GET : 读取
  • POST : 创建
  • PATCH : 更新
  • DELETE : 删除。

DELETE 操作将是最少的。

JSON:信息将以 JSON 格式编码。

使用 PostgreSQL 权限创建一个新的丘脑用户

[编辑 | 编辑源代码]
  • 安装 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


为 HIS 和个人主索引初始化 PostgreSQL

[编辑 | 编辑源代码]

以下文档适用于一个演示/测试数据库,我们将其称为“联合体”

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 容器运行丘脑,如下一节所述。

从 WSGI 容器运行丘脑

[编辑 | 编辑源代码]

在生产环境中,出于性能原因,您应该使用 HTTP 服务器。您将找到从uWSGIgunicorn运行丘脑的示例。

从 uWSGI 运行丘脑

[编辑 | 编辑源代码]

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

所有这些参数也可以传递到命令行。

从 Gunicorn 运行丘脑

[编辑 | 编辑源代码]

注意:在 vueJS 门户上使用 gunicorn 的 SSL 时,请求和关闭连接存在一些延迟问题。

Gunicorn 本机支持 WSGI,并且作为 Python 包提供。我们包含了一个简单的默认配置文件(etc/gunicorn.cfg),用于从启用 SSL 的 Gunicorn 运行丘脑。

例如,您可以按如下方式从 Gunicorn 运行丘脑应用程序。默认配置文件使用安全 (SSL) 连接

$ gunicorn --config etc/gunicorn.cfg thalamus:app

启用 SSL 以进行加密通信

[编辑 | 编辑源代码]

获取官方证书或生成自签名证书和私钥

$ 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

创建 systemd 服务

[编辑 | 编辑源代码]

为了使用 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_userhealth_professionalroot


[
    {"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 测试连接。


华夏公益教科书