PostgreSQL / pgAdmin

PostgreSQL-Server

Optional: Auf dem virtuellen Rechner, der als PostgreSQL-Server dienen soll, werden alle offensichtlich nicht benötigten Programme deinstalliert:
- Thunderbird
- LibreOffice
- CUPS (Druckerverwaltung)
- und andere - allerdings sollten nur eindeutig bekannte Kandidaten entfernt werden, sonst drohen Funktionseinschränkungen. Insbesondere lib*-Dateien bleiben am besten unangetastet, es sei denn, man kennt ihre nicht mehr benötigte Funktion genau …

Nun wird der PostgreSQL-Server aus den Paketen installiert.

sudo apt install postgresql postgresql-contrib --no-install-recommends

Die Option --no-install-recommends kann auch weggelassen werden - dann wird auch die Dokumentation installiert, die hier vorerst nicht benötigt wird.

Andere PostgreSQL-Pakete sind auf dem Server (vorerst) nicht notwendig. Je nach Zeitpunkt der Installation und der eingesetzten Distribution wird die Software in einer der Versionen 14, 15 oder 16 installiert. Grundsätzlich spielt die Version für die Funktionalität keine Rolle, alle genannten Versionen verfügen über die notwendigen Eigenschaften. Das liegt auch daran, dass das GNUmed/Simpelmed-Paket nur sehr zurückhaltende Anforderungen an die Datenbank stellt und auf neue »Gimmicks« bewusst verichtet.
Dennoch wird an dieser Stelle davon abgeraten, die »zu alte« Version 14 oder die »zu neue« Version 16 einzusetzen. Die Version 14 wird nicht mehr lange (von einigen Hilfsprogrammen) unterstützt, Version 16 dagegen noch nicht vollständig. Empfohlen wird ausdrücklich die Version 15, auf die sich auch alle weiteren Infos beziehen. Fast alle Distributionen installieren heute (Stand Jan. 2024) die Version 15.
Im Folgenden wird aus diesen Gründen im Projekt SimpelMed mit Version 15 gearbeitet (auch wenn manchmal in den Listings noch Version 14 auftaucht: alles funktioniert mit Version 15 ganz analog).

Ob alles wie geplant installiert wurde, lässt sich durch folgende Eingaben in einer Konsole überprüfen.

Überprüfen der PostgreSQL-Server-Installation
abc@abc:~$ getent passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
...
hplip:x:127:7:HPLIP system user,,,:/run/hplip:/bin/false
abc:x:1000:1000:abc,,,:/home/abc:/bin/bash
sssd:x:128:138:SSSD system user,,,:/var/lib/sss:/usr/sbin/nologin
vboxadd:x:999:1::/var/run/vboxadd:/bin/false
postgres:x:112:139:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash

Dies zeigt an: Nutzer root verfügt über kein Kennwort. Wie unter Debian/Ubuntu üblich, werden Admin-Aufgaben per sudo ausgeführt.
Unser »normaler« Nutzer ist abc (Kennwort wurde bei Installation beliebig eingegeben).
Wie erwartet, wurde der Nutzer postgres hinzugefügt. Dieser ist der »Superuser« für den PostgreSQL-Server - das hat nichts mit dem Superuser root zu tun.

Status PostgreSQL (leicht gekürzt)
abc@abc:~$ systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
     Active: active (exited) since Fri 2023-07-07 14:57:47 CEST; 4min 55s ago
    Process: 1084 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
   Main PID: 1084 (code=exited, status=0/SUCCESS)
        CPU: 1ms

Jul 07 14:57:47 abc systemd[1]: Starting PostgreSQL RDBMS...
Jul 07 14:57:47 abc systemd[1]: Finished PostgreSQL RDBMS.
abc@abc:~$ systemctl status postgresql@14-main
● postgresql@14-main.service - PostgreSQL Cluster 14-main
     Loaded: loaded (/lib/systemd/system/postgresql@.service; ...)
     Active: active (running) since Fri 2023-07-07 14:57:47 CEST; 5min ago
    Process: 773 ExecStart=/usr/bin/pg_ctlcluster --skip-systemctl-redirect 14-main start (code=exited, status=0/SUCCESS)
   Main PID: 921 (postgres)
      Tasks: 7 (limit: 6730)
     Memory: 36.9M
        CPU: 471ms
     CGroup: /system.slice/system-postgresql.slice/postgresql@14-main.service
             ├─921 /usr/lib/postgresql/14/bin/postgres -D /var/lib/postgresql/14/main -c config_file=/etc/postgresql/14/main/postgresql.conf
             ├─925 "postgres: 14/main: checkpointer " "" "" "" "" """ "" ">
             ├─926 "postgres: 14/main: background writer " "" "" ""  "" "">
             ├─927 "postgres: 14/main: walwriter " "" "" "" "" "" """ "" ">
             ├─928 "postgres: 14/main: autovacuum launcher " "" "" """ "" >
             ├─929 "postgres: 14/main: stats collector " "" "" "" """ "" ">
             └─930 "postgres: 14/main: logical replication launcher "" "" >

Jul 07 14:57:35 abc systemd[1]: Starting PostgreSQL Cluster 14-main...
Jul 07 14:57:47 abc systemd[1]: Started PostgreSQL Cluster 14-main.
~$

Ja, und in der Tat, der Dienst »postgresql« läuft, hier wiederum die Version 14 des Servers. Für unsere Version »15« sieht die Meldung entsprechend aus. Diese Statusmeldungen entsprechen dem normalen Verhalten.
Schauen wir mal in den Server hinein:

abc@abc:~$ sudo -u postgres psql
[sudo] Passwort für abc:
could not change directory to "/home/abc": Keine Berechtigung
psql (14.8 (Ubuntu 14.8-0ubuntu0.22.04.1))
Type "help" for help.

postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 |
 template0 | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(3 rows)

postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

postgres=# \q

abc@abc:~$

Der Admin-Nutzer postgres hat - wie hier zu sehen - nach der Installation kein Kennwort.
\l (list) zeigt alle Datenbanken, \du (display user) alle eingerichteten Nutzer für PostgreSQL. Auch hier entspricht alles dem Standard einer frischen Installation.

Test-Datenbank und Test-Nutzer einrichten

Für die weiteren Schritte ist es zur späteren Kontrolle sinnvoll, auf dem PostgreSQL-Server eine kleine Datenbank einzurichten. Darüber hinaus ist es zur Vereinfachung der manchmal verwirrenden Rechte- und Nutzerverwaltung unter PostgreSQL zu empfehlen, einen Nutzer mit der identischen Bezeichnung wie den Standard-Nutzer unter Ubuntu/Mint einzurichten - hier also abc.

Datenbank und/oder Nutzer einrichten

Hinzufügen eines Datenbank-Nutzers und einer Tabelle
abc@abc:~$ sudo -u postgres psql
[sudo] Passwort für abc:
postgres=#
postgres=# CREATE ROLE abc;
CREATE ROLE
postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 |
 template0 | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(3 rows)

postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 abc       | Cannot login                                               | {}
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

postgres=# CREATE DATABASE abc;
CREATE DATABASE
postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 abc       | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 |
 postgres  | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 |
 template0 | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(4 rows)

postgres=# ALTER DATABASE abc OWNER TO abc;
ALTER DATABASE
postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 abc       | abc      | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 |
 postgres  | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 |
 template0 | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(4 rows)

postgres=# \q

abc@abc~$ psql
psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL:  role "abc" is not permitted to log in
abc@abc:~$ \sudo -u postgres psql
[sudo] Passwort für abc:
could not change directory to "/home/abc": Keine Berechtigung
psql (14.8 (Ubuntu 14.8-0ubuntu0.22.04.1))
Type "help" for help.

postgres=# ALTER ROLE abc WITH LOGIN;
ALTER ROLE
postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 abc       | abc      | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 |
 postgres  | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 |
 template0 | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(4 rows)

postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 abc       |                                                            | {}
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

postgres=# ALTER ROLE abc WITH CREATEDB;
ALTER ROLE
postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 abc       | Create DB                                                  | {}
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

postgres=# \q

abc@abc:~$ psql
psql (14.8 (Ubuntu 14.8-0ubuntu0.22.04.1))
Type "help" for help.

abc=> \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 abc       | abc      | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 |
 postgres  | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 |
 template0 | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(4 rows)

abc=> \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 abc       | Create DB                                                  | {}
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

abc=> CREATE TABLE kolleginnen(
kollid SMALLINT PRIMARY KEY,
name VARCHAR(20),
spitzname VARCHAR(20),
telnr INT)
;
CREATE TABLE
abc=> \dt
          List of relations
 Schema |    Name     | Type  | Owner
--------+-------------+-------+-------
 public | kolleginnen | table | abc
(1 row)

abc=> INSERT INTO kolleginnen
(kollid, name, spitzname, telnr)
VALUES (1, 'Anne', 'Aennchen', 12345);
INSERT 0 1
abc=> INSERT INTO kolleginnen
(kollid, name, spitzname, telnr)
VALUES (2, 'Bilal', 'Billie', 5682);
INSERT 0 1
abc=> INSERT INTO kolleginnen
(kollid, name, spitzname, telnr)
VALUES (8, 'Norbert', 'Nobsi', 4321);
INSERT 0 1
abc=> \dt
          List of relations
 Schema |    Name     | Type  | Owner
--------+-------------+-------+-------
 public | kolleginnen | table | abc
(1 row)

abc=> SELECT * FROM kolleginnen;
 kollid |  name   | spitzname | telnr
--------+---------+-----------+-------
      1 | Anne    | Aennchen  | 12345
      2 | Bilal   | Billie    |  5682
      8 | Norbert | Nobsi     |  4321
(3 rows)

abc=> \q

Datenbank entfernen

Gelegentlich wird natürlich auch das Löschen von Datenbanken und/oder Nutzern notwendig. Für diese Fälle hier ein Beispiel.
Falls eine »frische« Datenbank vorliegt, bitte gleich weiter.

Entfernen einer Tabelle bzw. eines Datenbank-Mutzers
abc@abc~$ sudo -u postgres psql
[sudo] Passwort für abc:
could not change directory to "/home/abc": Keine Berechtigung
psql (14.8 (Ubuntu 14.8-0ubuntu0.22.04.1))
Type "help" for help.

postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 abc       | abc      | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 |
 postgres  | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 |
 template0 | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(4 rows)

postgres=# \c abc
You are now connected to database "abc" as user "postgres".
abc=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 abc       | abc      | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 |
 postgres  | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 |
 template0 | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(4 rows)

abc=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 abc       | Create DB                                                  | {}
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

abc=# \dt
        List of relations
 Schema |  Name   | Type  | Owner
--------+---------+-------+-------
 public |  test   | table | abc
(1 row)

abc=# DROP TABLE test;
DROP TABLE
abc=# \dt
Did not find any relations.
abc=# \c postgres
You are now connected to database "postgres" as user "postgres".
postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 abc       | abc      | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 |
 postgres  | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 |
 template0 | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(4 rows)

postgres=# DROP DATABASE abc;
DROP DATABASE
postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 |
 template0 | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | de_DE.UTF-8 | de_DE.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(3 rows)

postgres=# DROP ROLE abc;
DROP ROLE
postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

postgres=# \q

PostgreSQL-Client einrichten

Auf dem PostgreSQL-Server läuft (wer hätte das gedacht?) PostgreSQL. Kommandos werden mittels der Konsole psql abgesetzt, die z.B. mit sudo -u postgres psql gestartet wird. Dies wurde in den obigen Protokollen bereits demonstriert. Andere Rechner, die auf den Server lesend zugreifen oder ihn sogar steuern sollen, benötigen zwingend eine Schnittstelle zum Server, den PostgreSQl-Client. Dieser wird installiert mittels

sudo apt install postgresql-client

Es ist in der Regel nicht notwendig, dass die Server- bzw. Client-Versionen exakt identisch sind. So dürfte die Client-Version 14 mit dem Server Version 15 (oder auch andersherum) im hier betrachteten Szenario »nahtlos« funktionieren. Falls die Oberfläche pgAdmin4 genutzt wird (siehe unten), ist die explizite Installierung eines Clients nicht notwendig (aber möglich), da dieser in pgAdmin gewissermaßen enthalten ist.

PostgreSQL Server-Konfiguration / Zugriffsrechte

Der PostgreSQL-Server kommt nach einer frischen Installation aus Sicherheitsgründen mit einer relativ restriktiven Nutzerverwaltung daher. Für einen produktiven Einsatz müssen daher die entsprechenden Werte in den diversen Konfigurationsdateien angepasst werden.

Zuerst muss der Datenbank-Administrator natürlich herausfinden - wenn er/sie/div nicht sowieso die Lokalisation kennt -, wo sich diese befinden. Das entsprechende Verzeichnis kennt natürlich auch PostgreSQL selbst:

abc@abc:~$ psql
...
Type "help" for help.

abc=> SHOW config_file;
          config_file
    -----------------------
  /etc/postgresql/15/main/postgresql.conf
...
abc=> \q

Dies ist das Standard-Verzeichnis unter Debian-basierten Distris: /etc/postgresql/<version>/main/, andere GNU/Linux-Varianten mögen andere Eigenschaften besitzen.

In diesem Verzeichnis liegen die zentralen Konfigurations-Dateien

  • conf.d (Verzeichnis) *

  • environment *

  • pg_ctl.conf *

  • pg_hba.conf

  • pg_ident.conf *

  • postgresql.conf

  • start.conf *

Die Dateien/Verzeichnisse mit Stern * sind im Moment nicht interessant, ediert werden vorerst nur pg_hba.conf und postgresql.conf.

Konfiguration postgresql.conf

Zur Bearbeitung sind Root-Rechte erforderlich: su oder sudo. Das Anlegen einer Sicherheitskopie ist immer eine gute Idee. Statt vim kann natürlich jeder andere Editor nach Belieben genutzt werden.

abc@abc:sudo cp /etc/postgresql/15/main/postgresql.conf /etc/postgresql/15/main/postgresql_conf.ori
abc@abc:sudo vim /etc/postgresql/15/main/postgresql.conf
....

In der Datei wird nur eine Zeile geändert, in der localhost durch * ersetzt wird. Danach sieht Inhalt ungefähr so aus:

postgresql.conf nach Änderung
...
#listen_addresses = 'localhost'     # what IP address(es) to listen on;
listen_addresses = '*'              # what IP address(es) to listen on;
                                    # comma-separated list of addresses;
                                    # defaults to 'localhost'; use '*' for all
                                    # (change requires restart)
...

Das bedeutet vereinfacht gesagt, dass der Server jetzt auch auf Rechner reagiert, die über ein TCP/IP-Netz auf ihn zugreifen (wollen). In der Standardeinstellung funktioniert dies nur vom physikalisch identischen Rechner - also wenn der anfragende Nutzer vor dem Rechner sitzt, auf dem auch der Server läuft. Das entspricht nicht dem Nutzungsszenario. Der * zeigt an, dass der Server auf allen seinen Netzwerkschnittstellen »lauscht«. In aller Regel hat ein Rechner nur eine Netzwerkkarte, so dass hier keine Sicherheitsschwachstelle entsteht.

Alternativ - gewissermaßen als Paranoia-Einstellung - kann aber auch die eigene IP-Adresse im Netz eingetragen werden, die mittels ip -a ermittel wurde (cave: eben nicht die Adresse der anfragenden Rechner!).

postgresql.conf mit eigener Netzadresse
...
#listen_addresses = 'localhost'         # what IP address(es) to listen on;
listen_addresses = 'localhost, 192.168.178.38' # what IP address(es) to listen on;
                                           # comma-separated list of addresses;
                           # defaults to 'localhost'; use '*' for all
                                       # (change requires restart)
                       # 192.168.178.38 ist die *eigene* Adresse!
...                       .

Konfiguration pg_hba.conf

Im nächsten Schritt muss die Nutzerverwaltung, die Datei pg_hba.conf ediert werden.
Vorerst für die Entwicklung reicht es aus, allen anfragenden Nutzern den Zugriff zu gestatten. Im Produktionsbetrieb muss dies selbstverständlich angepasst werden. Im Vorgriff auf die Arbeit mit unserer GNUmed-Datenbank tragen wir auch schon die dazu notwendigen Nutzer ein.
Nach dem Edieren sieht die Datei ungefähr aus wie folgt:

Nutzerverwaltung pg_hba.conf
...
# DO NOT DISABLE!
# If you change this first entry you will need to make sure that the
# database superuser can access the database using some other method.
# Noninteractive access to all databases is required during automatic
# maintenance (custom daily cronjobs, replication, and similar tasks).
#

# Database administrative login by Unix domain socket
local   all             postgres                                peer

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   samegroup       +gm-logins                              scram-sha-256
local   all             all                                     peer

# IPv4 local connections:
host    all             all             127.0.0.1/32            scram-sha-256
host    all             all             192.168.178.31/32       trust

# IPv6 local connections:
host    all             all             ::1/128                 reject

# Allow replication connections from localhost, by a user with the
# replication privilege.

local   replication     all                                     peer
host    replication     all             127.0.0.1/32            scram-sha-256
host    replication     all             ::1/128                 scram-sha-256
...

Erläuterung:
Der Datenbank-Admin-Nutzer postgres hat unbeschränkten Zugriff, falls er vom Server-Rechner zugreift. Diese Einstellung sollte auf keinen Fall geändert werden, ggf. ist sonst überhaupt keine Bearbeitung mehr möglich.
Die Zeile local samegroup +gm-logins gibt allen autorisierten GNUmed-Nutzern Zugriffsrechte (mit Kennwortangabe). Alle Anfragen vom Rechner 192.168.178.31/32 - das ist der pgAdmin-Rechner (siehe unten) - bekommen Zugriff ohne Kennwortabfrage (trust, im Produktionsbetrieb bitte anpassen). Schließlich sperren wir alle Anfragen über IPv6: reject.

Neustart des Datenbank-Servers

Nach jeder Änderung in einer Konfigurationsdatei muss der Server neu gestartet werden.

Neustart PostgreSQL-Server und Statuskontrolle
# Neustart
sudo systemctl restart postgresql

# Kontrolle der Betriebsbereitschaft
sudo systemctl status postgresql
# oder
sudo pg_isready

pgAdmin einrichten

Auf der zweiten virtuellen Maschine (hier unser q4os-Rechner) wird - auch hier haben wir vorher einige speicherplatz- und leistungshungrige Standardprogramme wie Thunderbird, LibreOffice und CUPS deinstalliert - die sehr empfehlenswerte grafische PostgreSQL-Verwaltung pgAdmin (in seiner Version pgAdmin4) eingerichtet.
Die notwendigen Pakete finden sich nicht in den Debian-Repos, sondern nur direkt auf der Homepage. Dort stehen alle Varianten bereit, z.B. für unsere Zwecke auf der entsprechende Download-Seite. Die Installation selbst ist dort jeweils ausführlich beschrieben. Für unsere Zwecke reicht die Desktop-Version.

Parameter für pgAdmin

Um den PostgreSQL-Server mittels pgAdmin über das Netz zwischen den beiden virtuallen Rechnern zu erreichen, sind folgende Schritte notwendig:

1) Start pgAdmin, entweder in einer Konsole mit /usr/pgadmin4/bin/pgadmin4 oder durch Anklicken des Desktop-Symbols.
2) (optional) Eingabe bzw. Festlegung eines Kennwortes (im Produktionsbetrieb sicherlich zwingend!)
3) Reiter Dashboard anklicken → Quick Links / Add New Server anklicken → im sich öffnenden Fenster
4) Reiter General einen beliebigen Namen vergeben → Klick Save
5) zum Reiter Connection wechseln, dort die IP-Adresse des PostgreSQL-Servers eingeben, z.B. 192.168.178.36, den Port 5432 unverändert lassen, ebenso die Maintenance database postgres; schließlich
6) den zugreifenden Nutzer angeben: entweder den Superuser postgres oder einen anderen, der natürlich vorher in der Datenbank eingerichtet werden muss.
Im Produktivbetrieb muss selbstverständlich ein expliziter pgAdmin-Nutzer eingerichtet werden mit Superuser-Rechten auf der GNUmed-Datenbank und mit (sehr!) starkem Kennwort, wenn die Bedienung über diese Plattform erwünscht ist. pgAdmin kann auch als »Fernzugriff«-Werkzeug genutzt werden von externen Dienstleistern, in diesem Fall ist deshalb hier besondere Vorsicht geboten.
Für die Entwicklungsdatenbank gelten nicht so strikte Regeln, da (noch) nicht mit realen Gesundheitsdaten gearbeitet wird.


Fazit bis hier: Das virtuelle Netz mit den beiden Rechnern, einem mit dem PostgreSQL-Server, der zweite mit pgAdmin (der dritte ist unser Gastgeber-/Hostrechner) ist installiert und eingerichtet. Im nächsten Schritt folgt die Installierung der GNUmed-Pakete (Server/Client) und die Konfiguration als Test- bzw. Entwicklungsumgebung.



-> Zurück zu arbeitsumgebung.

-> Weiter zu gnumed-installation.