Zum Inhalt springen

Upgrade von PostgreSQL

PostgreSQL wird kontinuierlich weiterentwickelt und verbessert. Neue Versionen enthalten Fehlerbehebungen, Leistungsverbesserungen und neue Funktionen. Daher ist es empfehlenswert, PostgreSQL regelmäßig zu aktualisieren, um von diesen Verbesserungen zu profitieren.

Bei PostgreSQL wird zwischen Minor-Versionen und Major-Versionen unterschieden. Minor-Versionen enthalten in der Regel nur kleinere Verbesserungen und Fehlerbehebungen, während Major-Versionen umfangreiche Änderungen und neue Funktionen mit sich bringen.

PostgreSQL erscheint jährlich in einer neuen Major-Version. Ein Upgrade auf eine neue Major-Version erfordert ein Backup/Restore, da PostgreSQL keine automatische Migration zwischen Major-Versionen durchführt.

  • Minor-Versionen (z.B. 17.0 → 17.1): Können (und sollten) problemlos eingespielt werden, ohne dass ein Backup/Restore erforderlich ist. Darum kümmert sich idealerweise Watchtower automatisch.

  • Major-Versionen (z.B. 17 → 18): Erfordern ein manuelles Upgrade mit Backup/Restore.

Die folgende Anleitung beschreibt das Upgrade auf eine neue Major-Version, z.B. von PostgreSQL 17 auf PostgreSQL 18. Auch ältere Versionen (z.B. 13, 14, 15, 16) können auf diese Weise auf den aktuellen Stand gebracht werden.

Wechsle in den SOLECTRUS-Ordner, der die compose.yaml und .env Dateien enthält:

Terminal-Fenster
cd /pfad/zu/solectrus

Stelle sicher, dass die Docker-Container laufen:

Terminal-Fenster
docker compose ps

In der ausgegeben Liste muss ein Eintrag für PostgreSQL vorhanden sein, z.B.:

...
solectrus-postgresql-1 postgres:17-alpine "docker-entrypoint.s…" postgresql 2 days ago Up 2 days (healthy). 5432/tcp
...

Wichtig ist, dass der Status Up ist, hier zu sehen in Up 2 days (healthy).

Erstelle ein Backup der bestehenden Datenbank:

Terminal-Fenster
docker compose exec postgresql pg_dumpall -U postgres | gzip > postgresql_backup.sql.gz

Stoppe nun den PostgreSQL-Container, während die anderen SOLECTRUS-Dienste weiterlaufen sollen:

Terminal-Fenster
docker compose stop postgresql

Benenne das bestehende PostgreSQL-Datenverzeichnis um (falls etwas schief gehen sollte) und erstelle ein neues, leeres Verzeichnis:

Terminal-Fenster
mv postgresql postgresql.bak
mkdir postgresql

Aktualisiere die PostgreSQL-Version in deiner compose.yaml auf die gewünschte Version (aktuell ist 18). Wichtig: Bei Upgrade auf Version 18 muss auch das Volume-Mapping angepasst werden:

services:
# ...
postgresql:
image: postgres:18-alpine
# ...
volumes:
- ${DB_VOLUME_PATH}:/var/lib/postgresql # Unterordner 'data' entfernt!
# ... Rest der Konfiguration bleibt unverändert
Terminal-Fenster
docker compose up -d postgresql

Es wird das neue Docker-Image heruntergeladen (sofern noch nicht vorhanden) und ein Container gestartet. PostgreSQL wird eine neue, leere Datenbank erstellen.

Warte, bis PostgreSQL vollständig gestartet ist:

Terminal-Fenster
docker compose logs -f postgresql

Es muss darin (nach kurzer Zeit) folgende Meldung erscheinen:

postgresql-1 | starting PostgreSQL 18.0 on aarch64-unknown-linux-musl, compiled by gcc (Alpine 14.2.0) 14.2.0, 64-bit
...
postgresql-1 | database system is ready to accept connections

Wichtig ist, dass wirklich die gewünschte Versionsnummer erscheint (hier: 18.0) und dass die letzte Zeile database system is ready to accept connections lautet. Beende die Protokoll-Ausgabe mit Strg + C.

Stelle nun dann das Backup wieder her:

Terminal-Fenster
zcat postgresql_backup.sql.gz | docker compose exec -T postgresql psql -U postgres

Die Ausgabe ist etwas kryptisch und enthält diverse SQL-Befehle wie SET, CREATE DATABASE, ALTER TABLE usw. Es darf hier keine Fehlermeldung erscheinen. Einzige Ausnahme ist die Zeile ERROR: role "postgres" already exists, diese Meldung kann ignoriert werden.

Prüfe nun, ob alles funktioniert, indem du SOLECTRUS im Browser aufrufst. Es muss alles wie gewohnt funktionieren und insbesondere müssen alle Einstellungen (z.B. Preise) noch vorhanden sein. Bitte prüfe das sorgfältig!

Nach erfolgreichem Upgrade (alles geprüft?) kannst du die Backup-Dateien aufräumen:

Terminal-Fenster
# Altes Datenverzeichnis entfernen (ggfs. sudo erforderlich)
rm -rf postgresql.bak
# Backup-Datei löschen
rm postgresql_backup.sql.gz

Fertig! Das Upgrade ist abgeschlossen und du hast jetzt ein Jahr lang wieder Ruhe, Minor-Versionen werden ja automatisch eingespielt (sofern Watchtower läuft).