Major-Upgrade

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.

Keineswegs darf bei Verfügbarkeit einer neuen Major-Version von PostgreSQL einfach die neue Versionsnummer in die compose.yaml eingetragen werden. PostgreSQL wird dann nicht mehr starten!

Minor-Versionen vs. Major-Versionen

  • 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.

Schritt-für-Schritt-Anleitung für Major-Upgrade

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 aktualisiert werden.

Bitte führe die folgenden Schritte sorgfältig durch und versuche zu verstehen, was passiert. Bei Fehlern kann es passieren, dass SOLECTRUS nicht mehr startet.

In neueren SOLECTRUS-Installationen heißt der PostgreSQL-Service postgresql, in älteren Versionen hingegen wurde er db genannt. Ersetze in den folgenden Befehlen postgresql durch db, falls deine Installation den älteren Service-Namen verwendet.

Möglich ist auch, dass der Ordner mit der Datenbank nicht postgresql/ heißt, sondern anders oder an einem ganz anderen Ort liegt. Auch dann sind einige Befehle (mv, mkdir und rm) anzupassen.

1. In SOLECTRUS-Ordner wechseln

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

cd /pfad/zu/solectrus

2. Container-Status prüfen

Stelle sicher, dass die Docker-Container laufen:

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).

3. Backup erstellen

Erstelle ein Backup der bestehenden Datenbank:

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

4. Container stoppen

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

docker compose stop postgresql

5. Datenverzeichnis umbenennen

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

mv postgresql postgresql.bak
mkdir postgresql

6. compose.yaml aktualisieren

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

7. Neue PostgreSQL-Version starten

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.

8. Backup wiederherstellen

Warte, bis PostgreSQL vollständig gestartet ist:

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:

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.

9. Prüfen

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!

10. Aufräumen (optional)

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

# 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).