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