Arbeitsumgebung

SimpelMed / PostgreSQL / Python

Benötigt werden:

  • ein Arbeitsrechner mit genügend RAM (mindestens 8 GB, besser 16 GB) und ausreichend schneller Festplatte (vorzugseise SSD)

  • eine PostgreSQL-Datenbank, Server sinnvollerweise in virtueller Maschine

  • (optional, aber empfehlenswert) eine weiterere virtuelle Maschine mit der DB-Management-Oberfläche pgadmin4

  • diese »drei« Rechner werden über ein lokales Netz verbunden und sind gegenseitig ansprechbar/erreichbar.

Die Login-Namen der Standard-Nutzer des Host- und der Gastrechner sind unerheblich und könnten ohne Einschränkungen sogar identisch sein. Namen sind wie fast immer nur Schall und Rauch.

VirtualBox oder KVM (virt-manager)

Pro Virtualbox:
Netzwerk-Bridging einfach einzustellen ohne eigene Konfiguration

Contra:
erheblicher Overhead mit spürbarer Herabsetzung der Ausführungsgeschwindigkeit
sehr langsam sowie sehr hohe Zahl an Zugriffen bei Installation des Image auf eine herkömmliche SATA-Platte → dringend auf eine SSD ausweichen!

Pro KVM:
Schneller, performanter, kein Overhead

Contra:
Umkonfigurierung der Netzwerkeinstellungen notwendig (Bridging)
dies kan aber durch ein »einfaches (Python-)Script« durchgeführt werden

Beide Lösungen ermöglichen auch den Datenaustausch zwischen den (virtuellen) Rechnern;
beide Lösungen simulieren den Einsatz der Software in einem Client-Server-Umfeld.

Im Folgenden werden beide Lösungen beschrieben; beide Lösungen wurden getestet.

Virtualbox

Wichtig: Beim Starten/Installieren wird als »Netzwerk« gewählt:
Adapter … Netzwerkbrücke, nicht die Versäumniseinstellung »NAT«.

Als Distribution für die PostgreSQL-Datenbank kommen in die Auswahl:
1a) Ubuntu-Server oder
1b) Mint (Xfce).
Obwohl 1b) eine grafische Oberfläche bedienen muss, gibt es hier keinen nenennswerten, messbaren Performance-Abfall. Im Folgenden wird nur noch Mint (Xfce) betrachtet. Als Distri für pgAdmin4 wird
1c) https://q4os.org/ q4OS gewählt.


Grundsätzlich steht die Wahl der Linux-Distribution im Ermessen des Anwenders - auch Windows10/11 ist möglich (aber nicht empfehlenswert). Alle Installationsvorgaben gehen vom Einsatz einer von Debian abgeleiteten Distri aus - Damit sind wir mit Ubuntu/Mint/q4os auf dem richtigen Weg. Die Clients z.B. im Praxisbetrieb können auch unter Windows laufen ...

Es werden unter Virtualbox zwei Maschinen eingerichtet, der einfacheren Bedienung wegen jeweils mit Gasterweiterungen und gemeinsamen Ordner: je einmal Mint (Download der Xfce-Edition https://linuxmint.com/edition.php?id=304) für den PostgreSQL-Server und einmal q4os (Download der empfehlenswerten Trinity-Version https://sourceforge.net/projects/q4os/files/stable/q4os-4.12-x64-instcd.r1.iso/download) für pgAdmin4.

Das eigentliche Einrichten/Installieren von VirtualBox und seinen virtuellen Maschinen wird hier nicht beschrieben. Es lässt sich falls gewünscht durch ein Script automatisieren: https://blogs.oracle.com/virtualization/post/guide-for-virtualbox-vm-unattended-installation oder https://www.youtube.com/watch?v=ypkItN4d4Y0

KVM/Qemu

Statt eines »Virtualbox-Netzwerkes« kann das benötigte Schema mit den drei virtuellen Rechnern auch über KVM/Qemu aufgebaut werden. Diese Lösung scheint nach unserer Erfahrung etwas bessere bzw. stabilere Ergebnisse zu zeigen. Alle weiteren Arbeitsschritte finden deswegen auf dieser Plattform statt.

Als Voreinstellung nutzt KVM/Qemu zur Netzanbindung NAT; das ist allerdings hier nicht geeignet, da sich damit die virtuellen Maschinen nicht »sehen« können. Durch das folgende (Python-)Skript kann aber problemlos eine virtuelle Brücke »Bridge« eingerichtet werde. Diese stört den sonstigen Internetverkehr in keinster Weise.

Bridge für KVM

Im ersten Schritt führen Sie das folgende Kommando aus, um die Daten für Ihren (Host-)Rechner zu erhalten:
(Ausgabe leicht gekürzt …)

bge ~ > ip -a address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc ... UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc ...  default qlen 1000
    link/ether 24:be:05:17:7c:e2 brd ff:ff:ff:ff:ff:ff
    altname enp0s25
    inet 192.168.178.20/24 brd 192.168.178.255 scope ... noprefixroute eno1
       valid_lft 858650sec preferred_lft 858650sec
<...>

Daraus ist zu entnehmen: der Ethernet-Adapter hat die Bezeichnung eno1, diesem ist die IP-Adresse 192.168.178.20/24 zugeteilt.
Mit diesen Angaben kann das folgende Skript seine Aufgabe erfüllen:
Die im Programm gekennzeichneten IP-Adressen des Host-Rechners und des Gateways müssen Sie natürlich an Ihre Daten anpassen!

Die gewünschten Information lassen sich auch durch folgendes kleines Python-Programm auslesen. Sie können die Werte dann Variablen zuweisen und müssen bridge.py nicht manuell konfigurieren. So wie hier geht es etwas schneller, darüber hinaus ist dieser Schritt nur einmal notwendig und eine Optimierung des Vorgehens scheint überflüssig.

Python3 Netzwerkkarte/Gateway
#!/usr/bin/env python3
""" Ermittel den »Namen« der Netzwerkkarte und die TCP/IP-Adresse
    des Gateways.

    Root-Rechte sind nicht erforderlich.
    Beispielhafte Ausgabe:
    [(1, 'lo'), (2, 'eno1')]
    127.0.1.1
    192.168.178.20
    Falls die Bridge schon eingerichtet wurde, sieht die Ausgabe wie folgt aus:
    [(1, 'lo'), (2, 'eno1'), (3, 'brbr0'), (4, 'taptap0'), (5, 'vnet0')]
    127.0.1.1
    192.168.178.20"""

import socket

print(socket.if_nameindex())
print(socket.gethostbyname(socket.gethostname()))
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
print(s.getsockname()[0])
s.close()

Mit den jetzt vorliegenden Infos kann die virtuelle Bridge eingerichtet werden.

Python3 Einrichten einer virtuellen Bridge (bridge.py)
#!/usr/bin/env python3
"""Richtet eiine virtuelle Bridge auf der vorhandenen Netzwerkkarte ein,
   damit Gäste untereinander und den Host-Rechner über TCP/IP »sehen« können.

Angelehnt an: »QEMU - Bridged Networking«
https://www.youtube.com/watch?v=VCAqkyVd7dM

Muss als root/sudo gestartet werden!
'subprocess' wäre streng genommen gegenüber 'os.system' zu bevorzugen ..."""

import os
import time

print("Start ...")
try:
    os.system("modprobe tun tap")
    print("modprobe tun tap ... ok")
    time.sleep(1)
    # 'brbr0' ist ein beliebiger Platzhalter
    os.system("ip link add brbr0 type bridge")
    print("ip link add brbr0 type bridge ... ok")
    time.sleep(1)
    # 'taptap0' ist ein beliebiger Platzhalter
    os.system("ip tuntap add dev taptap0 mode tap")
    print("tuntap add dev taptap0 mode tap ... ok")
    time.sleep(1)
    # 'eno1' ist die Bezeichnung der Netzwerkkarte
    os.system("ip link set dev eno1 master brbr0")
    print("ip link set dev eno1 master brbr0 ... ok")
    time.sleep(1)
    os.system("ip link set dev taptap0 master brbr0")
    print("ip link set dev taptap0 master brbr0 ... ok")
    time.sleep(1)
    os.system("ip link set dev brbr0 up")
    print("ip link set dev brbr0 up ... ok")
    time.sleep(1)
    # IP-Adresse entsprechend einsetzen
    os.system("ip address delete 192.168.178.20/24 dev eno1")
    print("ip address delete 192.168.178.20/24 dev eno1 ... ok")
    time.sleep(1)
    os.system("ip address add 192.168.178.20/24 dev brbr0")
    print("ip address add 192.168.178.20/24 dev brbr0 ... ok")
    time.sleep(1)
    # Diese IP-Adresse benennt den Gateway
    os.system("ip route add default via 192.168.178.1 dev brbr0")
    print("ip route add default via 192.168.178.1 dev brbr0 ... ok")
    time.sleep(1)
    os.system("resolvectl dns brbr0 192.168.178.1")
    print("resolvectl dns brbr0 192.168.178.1 ... ok")
    time.sleep(1)
    os.system("systemctl restart systemd-resolved.service")
    print("systemctl restart systemd-resolved.service ... ok")
    time.sleep(1)
    print("... fertig!")
except OSError:
    print("ERROR!")

Installation der Virtuellen Maschinen

Ganz analog zum Vorgehen bei VirtualBox werden nun zwei Maschinen installiert.
Wie bereits erwähnt, kommen hier sinnvollerweise alle Debian-Derivate in Frage. Gewählt wurde in unserer Umgebung LMDE (Linux Mint Debian Edition) - möglich wäre auch Mint Xfce, das ist Geschmacksache. Als zweites System kommt wie oben q4os zum Zuge (q4os.org).

Netzwerk einrichten und prüfen

Egal ob die Virtualbox- oder wie hier im Folgenden die KVM/Qemu-Lösung (über den virtuellen Netzwerkmanager apt-get install virt-manager) gewählt wird:
Für die weitere Administration des »Netzwerkes« aus Host und den beiden Guests benötigen wir noch jeweils die internen IP-Adressen. Diese werden mit folgendem Schritt mit dem Kommando ip a ermittelt. (Ausgabe leicht gekürzt …)

<home>:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue ...default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc ... default qlen 1000
    link/ether 08:00:27:db:24:da brd ff:ff:ff:ff:ff:ff
    inet 192.168.178.63/24 brd 192.168.178.255 scope global dynamic noprefixroute enp0s3
       valid_lft 863740sec preferred_lft 863740sec
    inet6 fd00::f17e:19b1:ac43:e604/64 scope global temporary dynamic
       valid_lft 6943sec preferred_lft 3343sec
    inet6 fd00::f4c:fcb9:430b:bf80/64 scope global dynamic mngtmpaddr noprefixroute
       valid_lft 6943sec preferred_lft 3343sec
    inet6 2001:a61:ad3:4c01:2146:46a7:6de2:4847/64 scope global temporary dynamic
       valid_lft 5852sec preferred_lft 2252sec
    inet6 2001:a61:ad3:4c01:d799:6115:804c:b43f/64 scope ... noprefixroute
       valid_lft 5852sec preferred_lft 2252sec
    inet6 fe80::d228:2500:56e8:ada7/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

Die Loopback-Adresse lautet erwartungsgemäß 127.0.0.1/8; diese wird nicht weiter benötigt. Unsere virtuelle Bridge liefert 192.168.178.63/24.
Analog gehen wir mit allen virtuellen Maschinen und unserem Gastrechner vor. Als Ergebnis haben wird schließlich drei IP-Adressen, die unser virtuelles Netzwerk bilden, z.B.:
192.168.178.63/24 für virtuelle Maschine Eins,
192.168.178.82/24 für virtuelle Maschine Zwei und schließlich
192.168.178.20/24 für den Wirtrechner.

Jede der Maschinen kann jeweils die beiden anderen über TCP/IP erreichen, das kann z.B. mit einem Ping bestätigt werden.

bge ~ > ping 192.168.178.63
PING 192.168.178.63 (192.168.178.63) 56(84) bytes of data.
64 bytes from 192.168.178.63: icmp_seq=1 ttl=64 time=0.263 ms
64 bytes from 192.168.178.63: icmp_seq=2 ttl=64 time=0.299 ms
64 bytes from 192.168.178.63: icmp_seq=3 ttl=64 time=0.307 ms
64 bytes from 192.168.178.63: icmp_seq=4 ttl=64 time=0.337 ms
^C
--- 192.168.178.36 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3075ms
rtt min/avg/max/mdev = 0.263/0.301/0.337/0.026 ms
bge ~ >

DHCP konfigurieren

Der Arbeitsplatz bekommt vom DHCP-Server (z.B. einer Fritz-Box, einem Speedport oder ähnliches) die Adresse zugeteilt, hier 192.168.178.20/24. Wegen unserer Bridge erhalten auch die Virtuellen Maschinen eigene IP-Adressen. Es ist für die spätere Arbeit sehr hilfreich, wenn diese Adressen auch nach einem Neustart identisch sind. Andernfalls müsste z.B. pgAdmin4 und der GNUmed-Client jedes Mal neu auf die richtige Adresse eingerichtet werden.

In der Fritz-Box wird dies erreicht mittels

Startseite -> Heimnetz -> Netzwerk öffnen

Im Reiter Netzwerkverbindungen erscheinen unsere drei Netzrechner mit den eben ermittelten IP-Adressen.
Jetzt das Zeichen Bearbeiten (in der Fritz-Box ein Bleistift) anklicken, im nächsten Schritt die Zeile Adressen im Heimnetz (IP-Adressen) anklicken und einen Haken bei »Diesem Netzwerkgerät immer die gleiche IPv4-Adresse zuweisen.« Dann noch »Übernehmen«. Diese Schritte wie gesagt für alle beteiligten drei (virtuellen) Rechner durchführen. Diese festen Adressen beeinflussen das übrige Heimnetz nicht - auch wenn diese nicht online sind, verfügt die FritzBox über mehr als genug freie Adressen.


Fazit bis hier: Das Netz sollte jetzt stehen und einsatzbereit sein. Im nächsten Schritt folgen die Einrichtung des PostgreSQL-Servers und von pgAdmin4. Im übernächsten geht es dann (endlich) um die Installation der GNUmed-Pakete.



-> Weiter zu postgresql-pgadmin.