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.

Installation der Debian-Pakete
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.

Abbruch der GNUmed-Server-Installation
...
==> 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:

Log-Meldungen zum Abbruch (Ausschnnitt)
...
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:

Bugfix GNUmed Installation, Datei /var/lib/gnumed/server/bootstrap
# 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:

Veraltete Version cfg-set_option.sql
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:

Korrekte Version cfg-set_option.sql
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

Simpelmed-Repo.

Bootstrap der GNUmed-Datenbank

Nun ist es an der Zeit, endlich die eigene GNUmed-Datenbank zu erzeugen:

Bootstrap (erfolgreich - Ausgabe gekürzt!)
 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

wget https://datenbahn.de/simpelmed/pg15gnumed.tar

2) Stoppen des PostgreSQL-15 Servers

sudo systemctl stop postgresql

3) Überprüfung des Inhaltes der tar-Datei

tar -tvf ./pg15gnumed.tar

Wird das Archiv tatsächlich an den korrekten Ort installiert, z.B.
/var/lib/postgresql/15/main?

4) Installation/Entpacken

sudo tar -xzf ./pg15gnumed.tar -C /

Die Option -C und das schließende / sind notwendig!

5) Starten des PostgreSQL-15 Servers

sudo systemctl start postgresql

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

wget https://datenbahn.de/simpelmed/dumpall_gnumed_simpelmed_start.sql

2) Der PostgreSQL-Servers muss laufen - überprüfen mit

sudo systemctl status postgresql

3) Einspielen der Dump-Datei

sudo -u postgres psql < dumpall_gnumed_simpelmed_start.sql



   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.