Die Datenbank unserer Discourse-Instanz ist kein lokaler Container; stattdessen nutzen wir einen zentralen Datenbankcluster. Kürzlich wurde der zentrale PostgreSQL auf Version 18.3 aktualisiert. Mir ist aufgefallen, dass die Discourse-Sicherung nun fehlschlägt:
[2026-05-19 03:37:37] [GESTARTET]
[2026-05-19 03:37:37] Das System hat die Sicherung gestartet!
[2026-05-19 03:37:37] Sicherung wird als laufend markiert...
[2026-05-19 03:37:37] Sicherstellen, dass '/var/www/discourse/tmp/backups/default/2026-05-19-033737' existiert...
[2026-05-19 03:37:37] Sicherstellen, dass '/var/www/discourse/public/backups/default' existiert...
[2026-05-19 03:37:37] Metadaten werden aktualisiert...
[2026-05-19 03:37:37] Öffentliches Schema der Datenbank wird gedumpt...
[2026-05-19 03:37:37] pg_dump: Fehler: Abbruch aufgrund von Serverversionsinkompatibilität
[2026-05-19 03:37:37] pg_dump: Detail: Serverversion: 18.3 (Ubuntu 18.3-1.pgdg24.04+1); pg_dump-Version: 15.15 (Debian 15.15-1.pgdg12+1)
[2026-05-19 03:37:37] AUSNAHME: pg_dump fehlgeschlagen
[2026-05-19 03:37:37] /var/www/discourse/lib/backup_restore/creator.rb:173:in 'BackupRestore::Creator#dump_public_schema'
/var/www/discourse/lib/backup_restore/creator.rb:36:in 'BackupRestore::Creator#run'
/var/www/discourse/lib/backup_restore.rb:13:in 'BackupRestore.backup!'
/var/www/discourse/app/jobs/regular/create_backup.rb:10:in 'Jobs::CreateBackup#execute'
Das sieht nach einer Versionsinkonsistenz zwischen PostgreSQL-Client und -Server aus.
Das Backup wird im Discourse-Container ausgeführt, in dem pg_dump in der Version 15.15 vorliegt, während der externe PostgreSQL-Server die Version 18.3 hat:
server version: 18.3; pg_dump version: 15.15
Ich wäre vorsichtig, wenn es darum geht, den Discourse-Container zu ändern, es sei denn, das Discourse-Team empfiehlt dies ausdrücklich. Meine erste Reaktion wäre, den externen Datenbankcluster auf die PostgreSQL-Version abzustimmen, die Discourse derzeit erwartet bzw. unterstützt.
OK, verstanden. In diesem Fall hatten wir keine andere Wahl, da wir 18 für ein anderes Projekt benötigten, das denselben Datenbank-Cluster verwendet. Hmm, klingt so, als bräuchten wir einen separaten Datenbankserver mit 15 exklusiv für Discourse.
Vielleicht ist es möglich, den Client vor Ort zu aktualisieren?
Da Sie die Kompatibilität mit PG 18 bereits nachgewiesen zu haben scheinen, da Sie es als Produktionsdatenbank verwenden, erscheint dies als geringes Risiko.
Ich habe zuvor einen kurzen Test mit einer externen PostgreSQL 18 und einer Dummy-Discourse-Installation durchgeführt, der keine Probleme zeigte. Aber um ehrlich zu sein, war das nur ein „schneller und schmutziger“ Test, kein „tiefgehender“. Jedenfalls läuft es seit zwei Wochen, also gehe ich davon aus, dass alles in Ordnung ist. Das einzige bisherige Problem ist das Discourse-interne Backup. Andererseits wird der Datenbankserver selbst (der in einem LXC läuft) separat gesichert.
Die bisherige Politik war es, jede zweite Version zu aktualisieren. Da PostgreSQL 17 jedoch bereits vor 1,5 Jahren veröffentlicht wurde und das offizielle Docker-Image weiterhin Version 15 verwendet, bin ich mir nicht sicher, ob dies noch der Fall ist.
Du kannst deinem app.yml Code hinzufügen, um PostgreSQL auf die passende Version zu aktualisieren. Ich habe das schon einmal gemacht, kann aber meine Notizen nicht finden. Am einfachsten ist es, in den Container zu gehen, die apt-Befehle auszuführen, um die richtigen PostgreSQL-Clients zu installieren, und dann das Backup zu versuchen. Sobald das funktioniert, fügst du diese Befehle als exec-Befehle in deiner app.yml hinzu, damit es nach dem nächsten Neuaufbau funktioniert.
Wenn du jemanden brauchst, der dich dabei begleitet, kannst du mir eine E-Mail schreiben oder im Kanal Marketplace posten.
Dies aktualisiert das postgres-Paket auf V. 18.
Anschließend wird das Backup über die Admin-Oberfläche gestartet, was erfolgreich zu sein scheint.
[2026-05-21 16:26:50] 'admin' hat das Backup gestartet!
[2026-05-21 16:26:50] Backup wird als laufend markiert...
[2026-05-21 16:26:50] Sicherstellen, dass '/var/www/discourse/tmp/backups/default/2026-05-21-162650' existiert...
[2026-05-21 16:26:50] Sicherstellen, dass '/var/www/discourse/public/backups/default' existiert...
[2026-05-21 16:26:50] Metadaten werden aktualisiert...
[2026-05-21 16:26:50] Dump des öffentlichen Schemas der Datenbank wird erstellt...
[2026-05-21 16:26:50] pg_dump: Ausführung von SELECT pg_catalog.set_config('search_path', '', false);
[2026-05-21 16:26:50] pg_dump: letzte eingebaute OID ist 16383
[2026-05-21 16:26:50] pg_dump: Erweiterungen werden gelesen
[2026-05-21 16:26:50] pg_dump: Erweiterungsmember werden identifiziert
[2026-05-21 16:26:50] pg_dump: Schemata werden gelesen
[2026-05-21 16:26:50] pg_dump: benutzerdefinierte Tabellen werden gelesen
[2026-05-21 16:26:50] pg_dump: benutzerdefinierte Funktionen werden gelesen
[2026-05-21 16:26:50] pg_dump: benutzerdefinierte Typen werden gelesen
[2026-05-21 16:26:50] pg_dump: prozedurale Sprachen werden gelesen
[2026-05-21 16:26:50] pg_dump: benutzerdefinierte Aggregatfunktionen werden gelesen
[2026-05-21 16:26:50] pg_dump: benutzerdefinierte Operatoren werden gelesen
[2026-05-21 16:26:50] pg_dump: benutzerdefinierte Zugriffsmethoden werden gelesen
[2026-05-21 16:26:50] pg_dump: benutzerdefinierte Operator-Klassen werden gelesen
[2026-05-21 16:26:50] pg_dump: benutzerdefinierte Operator-Familien werden gelesen
[... .... ...]
[2026-05-21 16:26:57] Backup wird abgeschlossen...
[2026-05-21 16:26:57] Archiv wird erstellt: netzwissen-forum-2026-05-21-162650-v20260520064255.tar.gz
[2026-05-21 16:26:57] Sicherstellen, dass das Archiv noch nicht existiert...
[2026-05-21 16:26:57] Leeres Archiv wird erstellt...
[2026-05-21 16:26:57] Daten-Dump wird archiviert...
[2026-05-21 16:26:57] Uploads werden archiviert...
[2026-05-21 16:26:58] Temporäres Verzeichnis '/var/www/discourse/tmp/backups/default/2026-05-21-162650' wird entfernt...
[2026-05-21 16:26:58] Archiv wird komprimiert, dies kann eine Weile dauern...
Toll! Ich würde wahrscheinlich versuchen, speziell die pg18-Client-Komponenten zu installieren, damit es nicht irgendwann auf 19 wechselt. Außerdem solltest du diese Befehle in deine app.yml aufnehmen, es sei denn, du möchtest dies bei jedem Upgrade manuell durchführen.