GNUmed Datenbank Installation
Fahrplan
In mehreren Schritten wird nun eine »leere« GNUmed-Datenbank installiert und eingerichtet, auf der die darauf folgenden Entwicklungsschritte stattfinden werden.
Etwas vereinfacht sieht dies wie folgt aus:
1) Server-Pakete aus den Debian-Repos installieren,
2) Anpassung an deutsche Sprachversion vornehmen,
3) → Bugfix durchführen ← (je nach verwendeter Version der Daten lässt sich GNUmed sonst nicht installieren! siehe unten),
4) Bootstrap der GNUmed-Datenbank und schließlich
5) weitere Anpassungen vornehmen.
Pakete aus dem Repo
Der erste Schritt ist schnell durchgeführt. Die GNUmed-Server-Pakete werden installiert.
apt install --no-install-recommends --no-install-suggests postgresql-client
apt install --no-install-recommends --no-install-suggests gnumed-server
Erläuterung: Die empfohlenen und/oder vorgeschlagenen Paktete braucht es vorerst nicht. Falls noch kein PostgreSQL installiert ist, geschieht dies spätestens jetzt zusammen mit gnumed-server. Es ist allerdings sicherer, PostgreSQL vorab wie in unserem Vorgehen zu installieren, damit sichergestellt ist, dass nicht z.B. Version 16 (die ist noch zu »frisch«) und die US-Tastatur gewählt wird.
Versucht der geneigte Anwender, nun gleich gm-bootstrap_server auszuführen, wird dies (Stand Okt. '23) leider nicht immer fuktionieren. Das Programm bricht ab mit folgender Meldung.
...
==> transferring users ...
... skipped (unconfigured)
==> bootstrapping "v2-v3-dynamic" ...
Cannot bootstrap bundles.
Please check the log file for details:
/var/log/gnumed/server/bootstrap-latest.log
Bootstrapping "gnumed_v22" did not finish successfully (1). Aborting.
...
Im erwähnten Log-File (gekürzt …) könnte Folgendes zu lesen sein:
...
2023-09-22 14:37:42 DEBUG gm.db_pool [140273691701248 MainThread] ..
2023-09-22 14:37:42 DEBUG gm.db_pool [140273691701248 MainThread] ..
2023-09-22 14:37:42 INFO gm.bootstrapper [140273691701248 MainThread] .
2023-09-22 14:37:42 ERROR gm.bootstrapper [140273691701248 MainThread] .
Traceback (most recent call last):
File "/var/lib/gnumed/server/bootstrap/./bootstrap_gm_db_system.py", line 641, in __bootstrap
text = gmPG2.get_db_fingerprint(conn = self.conn, eol = '\n')
File "/var/lib/gnumed/Gnumed/pycommon/gmPG2.py", line 483, in get_db_fingerprint
curs.execute(cmd)
File "/usr/lib/python3/dist-packages/psycopg2/extras.py", line 146, in execute
return super().execute(query, vars)
psycopg2.errors.InvalidSchemaName: schema "gm" does not exist
LINE 1: SELECT md5(gm.concat_table_structure())
^
2023-09-22 14:37:42 DEBUG gm.cfg [140273691701248 MainThread] ..
2023-09-22 14:37:42 WARNING gm.bootstrapper [140273691701248 MainThread] ..
2023-09-22 14:37:42 INFO gm.bootstrapper [140273691701248 MainThread] ..
...
Leider läuft der fehlschlagende Installationsversuch noch einige Meldungen weiter, gezeigt im obigen Ausschnitt ist nur die erste Fehlermeldung.
Es kann aber auch auf andere Weise »schief gehen«. Dringend zu empfehlen oder sogar unumgänglich sind deshalb folgenden Maßnahmen.
Anpassung an die Sprache Deutsch
Die Standard-Sprache des Gnumed-Server-Pakets ist englisch. Das ist auch nicht weiter tragisch, wenn der Nutzer hierzulande einige Hinweise beachtet. Wurde der PostgreSQL-Server wie dargestellt schon vor den GNUmed-Paketen installiert, ist in der Regel für alle Datenbanken der Zeichensatz de_DE.utf8 voreingestellt. Dies sollte nicht geändert werden, um die Umlaute korrekt darzustellen. Damit ist dieser Punkt bereits durch eine Standard-Installation der PostgreSQL-Pakete erledigt.
Bugfix für bestimmte Distributionen
Sobald das Kommando gm-bootstrap_server (zwingend als root/mittels sudo) aufgerufen wird, führt das Programm im Folgenden auch das Skript bootstrap-latest.sh aus. Diese Datei befindet sich im Ordner /var/lib/gnumed/server/bootstrap. Einige Betriebssystem-Plattformen kommen mit folgender Zeile nicht zurecht, die deshalb angepasst werden sollte.
Eine Zeile der Datei muss geändert werden:
# vorher
CONF="bootstrap-latest.conf"
# nachher
CONF="./bootstrap-latest.conf"
Noch einmal zur Wiederholung: Dieser Schritt ist keineswegs zwingend, sondern nur für einige Betriebssysteme überhaupt notwendig.
Falsche Datei-Version
Weitaus häufiger tritt folgender Fehler auf. In manchen älteren Repos und Download-Dateien findet sich noch eine veraltete Version der Datei ../server/sql/v2-v3/dynamic/cfg-set_option.sql. Zu erkennen ist die veraltete Version z.B. auf diese Weise:
b@bpc~$ sed -n 95,100p /var/lib/gnumed/server/sql/v2-v3/dynamic/cfg-set_option.sql
(gekürzt)
begin
-- determine data type
if _value is of (text, char, varchar, name) then
val_type := ''string'';
elsif _value is of (smallint, integer, bigint, numeric, boolean) then
val_type := ''numeric'';
b@bpc:~$
Die gewünschte neuere Version lieferte hier:
b@bpc~$ sed -n 85,100p /var/lib/gnumed/server/sql/v2-v3/dynamic/cfg-set_option.sql
(gekürzt)
begin
-- determine data type
if pg_typeof(_value) in (''text''::regtype, ''char'': <gekürzt> ...::regtype) then
val_type := ''string'';
elsif pg_typeof(_value) in (''smallint''::regtype, <gekürzt> ... ::regtype) then
val_type := ''numeric'';
b@bpc:~$
Der Unterschied ist klar: in der neuen Version wird die eingebaute Funktion pg_typeof() verwendet.
Repo SimpelMed
Bei Bedarf findet sich die korrekte Version - wie alle erwähnten Dateien - im
Bootstrap der GNUmed-Datenbank
Nun ist es an der Zeit, endlich die eigene GNUmed-Datenbank zu erzeugen:
h@hpc:~$ sudo gm-bootstrap_server
===========================================================
Bootstrapping latest GNUmed database.
This will set up a GNUmed database of version v22
with the name "gnumed_v22".
Creating module import symlink ...
real dir: /var/lib/gnumed/server
link: /var/lib/gnumed/Gnumed
Adjusting PYTHONPATH ...
=======================================
Bootstrapping GNUmed database system...
=======================================
You are about to install the following parts of GNUmed:
-------------------------------------------------------
bundle "config" in <gnumed_v2> (or overridden) on <>
bundle "reference" in <gnumed_v2> (or overridden) on <>
bundle "demographics" in <gnumed_v2> (or overridden) on <>
bundle "clinical" in <gnumed_v2> (or overridden) on <>
bundle "documents" in <gnumed_v2> (or overridden) on <>
bundle "office" in <gnumed_v2> (or overridden) on <>
-------------------------------------------------------
This will set up a monolithic GNUmed backend with all bundles
...
...
==> bootstrapping "v9-v10-static" ...
==> cloning [gnumed_v9] (23 MB) as target database [gnumed_v10] ...
==> reindexing target database (can take a while) ...
==> revalidating constraints in target database (can take a while) ...
==> transferring users ...
==> bootstrapping "v9-v10-dynamic" ...
==> bootstrapping "v10-fixups" ...
==> setting up auditing ...
... skipped (disabled)
==> setting up encounter/episode FKs and IDXs ...
==> upgrading reference data sets ...
... skipped (no scripts to run)
You are about to install the following parts of GNUmed:
-------------------------------------------------------
bundle "v10_fixups-pre_v11" in <gnumed_v11> (or overridden) on <>
bundle "v10-v11-static" in <gnumed_v11> (or overridden) on <>
bundle "v10-v11-dynamic" in <gnumed_v11> (or overridden) on <>
bundle "v11-fixups" in <gnumed_v11> (or overridden) on <>
bundle "v11-test_data" in <gnumed_v11> (or overridden) on <>
-------------------------------------------------------
This will update an existing GNUmed version 10
database to the version 11 schema. It does not do
any harm to the data contained within.
...
...
This will update an existing GNUmed version 21
database to the version 22 schema. It does not do
any harm to the data contained within.
...
...
==> checking migrated data for plausibility ...
==> sanity checking PostgreSQL authentication settings ...
Note that even after successfully bootstrapping the GNUmed
database PostgreSQL may still need to be configured to
allow GNUmed clients to connect to it.
In many standard PostgreSQL installations this amounts to
adding (or uncommenting) the authentication directive:
"local samerole +gm-logins md5"
in the proper place of the file:
/etc/postgresql/15/main/pg_hba.conf
For details refer to the GNUmed documentation at:
http://wiki.gnumed.de/bin/view/Gnumed/ConfigurePostgreSQL
Done bootstrapping GNUmed database: We very likely succeeded.
log: /var/log/gnumed/server/bootstrap-latest.log
Dropping obsoleted staging database gnumed_v2 ...
...
...
Dropping obsoleted staging database gnumed_v20 ...
(you may need to provide the password for root)
h@hpc:~$
Dieser Vorgang benötigt auch auf einem modernen, schnellen PC ca. vier Minuten …
Download vorkonfigurierter GNUmed-Datenbanken
Falls die Erstellung der eigenen Datenbank - aus welchen Gründen auch immer - nicht vollständig durchläuft oder das Bootstrapping umgangen werden soll, stehen »fertige« Pakete zum Download bereit. Das Download-Verzeichnis wird bereitgestellt unter https://datenbahn.de/simpelmed
Im Einzelnen sind das folgende Varianten.
pg15gnumed.tar
Dies ist das Archiv einer frischen, vollständig installierten, sonst »leeren«, GNUmed-PostgreSQL Datenbank. Nur verwendbar mit Version 15 und nur auf einer Debian oder Ubuntu Plattform eines GNU/Linux-Systems. Darüber hinuas müssen natürlich noch die entsprechenden Berechtigungen in den PostgreSQL-Konfigurationsdateien eingerichtet werden.
Alle Dateien des Postgres-Clusters werden durch diesen Vorgang unwiederbringlich gelöscht! Alle Tabellen, Schemata, Nutzer etc. des bisherigen PostgreSQL-Servers werden ohne Warnung und ohne Backup überschrieben und sind ->* weg *<- !
Vorgehen:
1) Download des Archivs
2) Stoppen des PostgreSQL-15 Servers
3) Überprüfung des Inhaltes der tar-Datei
Wird das Archiv tatsächlich an den korrekten Ort installiert, z.B.
/var/lib/postgresql/15/main?
4) Installation/Entpacken
Die Option -C und das schließende / sind notwendig!
5) Starten des PostgreSQL-15 Servers
dumpall_gnumed_simpelmed_start.sql
Dies ist ein vollständiger Dump der Datenbank nach Installation des GNUmed-Servers aus den Repos. Der Vorteil dieses Vorgehens besteht darin, daß auch andere Versionen als 15 Zielserver sein können; auch ein Plattformwechsel zu Nicht-Debian oder hin zu Windows ist möglich. Hier werden darüber hinaus keine Dateien überschrieben oder gehen verloren, es dürfen allerdings keine GNUmed-Datei oder gleichnamige Nutzer vorhanden sein.
Vorgehen:
1) Download des Dumps
2) Der PostgreSQL-Servers muss laufen - überprüfen mit
3) Einspielen der Dump-Datei
Zur Vermeidung der Fehlermeldung 'cannot execute CREATE TABLE in a read-only transaction' und ähnlichem wurde die Dump-Datei an zwei Stellen modifiziert.
Vorher:
ALTER DATABASE gnumed_v21 SET default_transaction_read_only TO on;
nachher:
ALTER DATABASE gnumed_v21 SET default_transaction_read_only TO off;
Analog in der Zeile ALTER DATABASE gnumed_v22 SET default_ …
Einmal also für gnumed_v21, einmal für gnumed_v22.
Dies ist auch mit folgendem kurzen Python-Programm möglich, bitte setzen Sie die eigenen Parameter ein:
#!/usr/bin/env python3
""" Setze alle 'default_transaction_read_only' auf 'off'
Autor: Berthold Gehrke <kontakt@simpelmed.de>
(c) 2023, GPLv3
"""
#import re # für diese einfache Aufgbae nicht notwendig, auskommentieren bei Bedarf
# Eingabe-Datei
eingabe = '/home/<user>/original.sql'
ausgabe = '/home/<user>/bearbeitet.sql'
# Die Original-Datei wird gelesen - diese wird nicht verändert.
with open(eingabe, "r") as die_eingabe:
a = die_eingabe.read()
print("Eingabe:", eingabe)
print("Ausgabe:", ausgabe)
a, zaehler = re.subn(r"SET default_transaction_read_only TO 'on';", r"SET default_transaction_read_only TO 'off';", a)
print("")
print("Bearbeite die Ersetzung vorher - SET default_transaction_read_only TO 'on' - jetzt - SET default_transaction_read_only TO 'off';")
print("")
print("Die Ersetzung wurde wie oft durchgeführt?", zaehler, "Mal.")
a, zaehler = re.subn(r"SET default_transaction_read_only = on;", r"SET default_transaction_read_only = off;", a)
print("")
print("Bearbeite die Ersetzung vorher - SET default_transaction_read_only = on; - jetzt - SET default_transaction_read_only = off;")
print("")
print("Die Ersetzung wurde wie oft durchgeführt?", zaehler, "Mal.")
with open(ausgabe, "w") as die_ausgabe:
die_ausgabe.write(a)
Fazit bis hier: Die Installation der GNUmed-Pakete aus den Repos sollte nun abgeschlossen sein. Der nächste Schritt besteht darin, die internationale Standard Erstinstallation für die weiteren Zwecke einzurichten.
Diese oben unter »Punkt 5) weitere Anpassungen vornehmen« Schritte werden im nächsten Abschnitt »gnumed-einrichtung« beschrieben.
-> Zurück zu arbeitsumgebung.
-> Zurück zu postgresql-pgadmin.
-> Weiter zu gnumed-einrichtung.