跳轉到內容

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 測試連線。


華夏公益教科書