So lösen Sie Pups-Exec-Fehler während des Discourse-Bootstrap

Ich erstelle gerade eine neue Discourse-Instanz von Grund auf für Entwicklungszwecke und sehe diesen Bootstrap-Fehler erneut:

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse & su discourse -c 'bundle exec rake db:migrate' failed with return #<Process::Status: pid 1002 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec failed with the params {"cd"=>"$home", "tag"=>"migrate", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
bootstrap failed with exit code 1

Die Container-Einrichtung erfolgt mit zwei Containern für Web-Only und Data-Only (Redis) und mit einer externen PostgreSQL-Datenbank. Das Auskommentieren der MaxMind-Einstellungen ändert nichts.

Irgendwelche Ideen, was ich hier tun kann?

Die beste Vermutung ist, dass Sie nicht genügend Speicher haben – in diesem Fall fügen Sie Swap hinzu oder wechseln Sie zu einer Instanz mit mehr RAM. Versuchen Sie free -h.

Hmmm, nope, we have 4 GB RAM and plenty of harddisk space (2 x 32 GB), the overall environment is the same as the other docker machine where builds run without problems.

MEM status:

root@docker3a:/var/discourse# free -h
gesamt benutzt frei gemns. Puffer/Cache verfügbar
Speicher: 3,8Gi 819Mi 1,4Gi 22Mi 1,9Gi 3,0Gi
Swap: 974Mi 52Mi 922Mi

1 „Gefällt mir“

Gibt es aktuelle Fehler in der Ausgabe von dmesg, die relevant sein könnten?

Können Sie den gesamten Protokoll weitergeben?

Das ist eine seltsame Vermutung, wir sehen normalerweise keine OoM-Fehler, die Migrationsfehler in Discourses verursachen.

x86_64 arch erkannt.
Stelle sicher, dass der Launcher auf dem neuesten Stand ist
Launcher ist auf dem neuesten Stand
2.0.20250226-0128: Wird aus discourse/base gezogen
Digest: sha256:6f18aa2cd22bba0deb91d69194e577d4f96130ad555ae8ec646a8792cbfe37db
Status: Image ist auf dem neuesten Stand für discourse/base:2.0.20250226-0128
docker.io/discourse/base:2.0.20250226-0128
/usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups.rb
/usr/local/bin/pups --stdin
18:C 19 Apr 2025 16:38:41.670 # oO0OoO0OoO0Oo Redis startet oO0OoO0OoO0Oo
18:C 19 Apr 2025 16:38:41.670 # Redis-Version=7.0.15, Bits=64, Commit=00000000, Geändert=0, PID=18, gerade gestartet
18:C 19 Apr 2025 16:38:41.670 # Konfiguration geladen
18:M 19 Apr 2025 16:38:41.670 * Monotonische Uhr: POSIX clock_gettime
18:M 19 Apr 2025 16:38:41.670 * Ausführungsmodus=standalone, Port=6379.
18:M 19 Apr 2025 16:38:41.670 # Server initialisiert
18:M 19 Apr 2025 16:38:41.671 * Lade RDB, erstellt von Version 7.0.15
18:M 19 Apr 2025 16:38:41.671 * RDB-Alter 72606 Sekunden
18:M 19 Apr 2025 16:38:41.671 * RDB-Speichernutzung bei Erstellung 0,82 MB
18:M 19 Apr 2025 16:38:41.671 * Lade RDB abgeschlossen, Schlüssel geladen: 0, Schlüssel abgelaufen: 0.
18:M 19 Apr 2025 16:38:41.671 * DB von Festplatte geladen: 0,000 Sekunden
18:M 19 Apr 2025 16:38:41.671 * Bereit für Verbindungsannahme
999:C 19 Apr 2025 16:39:59.006 # oO0OoO0OoO0Oo Redis startet oO0OoO0OoO0Oo
999:C 19 Apr 2025 16:39:59.006 # Redis-Version=7.0.15, Bits=64, Commit=00000000, Geändert=0, PID=999, gerade gestartet
999:C 19 Apr 2025 16:39:59.006 # Konfiguration geladen
999:M 19 Apr 2025 16:39:59.006 * Monotonische Uhr: POSIX clock_gettime
999:M 19 Apr 2025 16:39:59.006 # Warnung: Konnte keine TCP-Server-Listening-Socket erstellen *:6379: bind: Adresse bereits in Verwendung
999:M 19 Apr 2025 16:39:59.006 # Fehler beim Lauschen auf Port 6379 (TCP), Abbruch.
18:signal-handler (1745080813) SIGTERM empfangen, Herunterfahren wird geplant...
18:M 19 Apr 2025 16:40:13.541 # Benutzer hat das Herunterfahren angefordert...
18:M 19 Apr 2025 16:40:13.541 * Speichere den finalen RDB-Snapshot vor dem Beenden.
18:M 19 Apr 2025 16:40:13.549 * DB auf Festplatte gespeichert
18:M 19 Apr 2025 16:40:13.549 # Redis ist nun bereit zum Beenden, auf Wiedersehen...


FEHLGESCHLAGEN
--------------------
Pups::ExecError: cd /var/www/discourse & su discourse -c 'bundle exec rake db:migrate' fehlgeschlagen mit Rückgabe #<Process::Status: pid 1002 exit 1>
Ort des Fehlers: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec fehlgeschlagen mit den Parametern {"cd"=>"$home", "tag"=>"migrate", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
bootstrap fehlgeschlagen mit Exit-Code 1
** BOOTSTRAP FEHLGESCHLAGEN ** Bitte scrollen Sie nach oben und suchen Sie nach früheren Fehlermeldungen, es kann mehr als eine geben.
./discourse-doctor kann bei der Diagnose des Problems helfen.
48b8aa6c912bbabc42d6b9373808088f5aa9079de1e1f7360fc858891a48556b

Wenn dies ein reiner Web-Container ist, warum hat er dann Redis darauf?\n\nKönnen Sie Ihre YML-Containerdefinitionen teilen? Und warum betreiben Sie überhaupt eine Zwei-Container-Installation?

Hey Falco
du hast Recht und ich bin dumm :wink:
Ich werde das korrigieren …

OK, ich habe die Trennung von web_only und redis behoben. Die Fehlermeldung lautet jetzt:

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse & su discourse -c 'bundle exec rake db:migrate' fehlgeschlagen mit Rückgabewert #<Process::Status: pid 981 exit 1>
Ort des Fehlers: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec fehlgeschlagen mit den Parametern {\"cd\"=>\"$home\", \"tag\"=>\"migrate\", \"hook\"=>\"db_migrate\", \"cmd\"=>[\"su discourse -c 'bundle exec rake db:migra
te'\"]}
bootstrap fehlgeschlagen mit Exit-Code 1
** BOOTSTRAP FEHLGESCHLAGEN ** Bitte scrollen Sie nach oben und suchen Sie nach früheren Fehlermeldungen, es kann mehr als eine geben.
./discourse-doctor kann bei der Diagnose des Problems helfen.
801049b69a89d38b1ae5c299d356fc5f8dc6a8f518b1260c2dde05e0b6081556

Aber vielleicht ist das ein Missverständnis / mangelndes Wissen meinerseits:

Die Datenbank sollte extern in einem anderen LXC-Container liegen, der eine PostgreSQL-Datenbank hat. Der Datenbankbenutzer und die Datenbank existieren, aber die Datenbank ist vor dem ersten Bootstrap von web_only leer. Erstellt das Skript die Datenbank selbst auf dem Remote-System beim ersten Build? Oder muss ich zuerst den Datenbankcontainer erstellen und dann sein Standardschema und die Daten manuell auf den externen PostgreSQL-Daemon exportieren?

Visualisierung des Gesamtaufbaus

forum2 Setup.excalidraw

Vielen Dank für das Diagramm. Das ist eine ziemlich ausgeklügelte Einrichtung – das würde man tun, wenn man einen guten Grund hätte und das Gebiet kennen würde.

Wenn Sie immer noch Folgendes sehen, glaube ich, dass dies der Hinweis darauf ist, was falsch ist. Redis kann den Port, auf dem es lauschen soll, nicht öffnen.

Die Fragen drehen sich also darum, ob Redis das tun sollte, in diesem Container, und wenn ja, wo sonst auf der Maschine noch ein Redis läuft. lsof könnte hier ein nützliches Werkzeug sein.

Hallo @Ed_S
danke für den Hinweis auf den fehlenden Port. Ich möchte erst die Antwort von Falco bezüglich meiner Fragen zum allgemeinen Setup von Discourse mit einer externen PostgreSQL-Datenbank abwarten.

Ja, das Setup ist im Vergleich zum Standard mit nur einem App-Container etwas anspruchsvoll. Ich betreibe alles auf einem dedizierten Root-Server mit Proxmox (https://proxmox.com) als Virtualisierungsumgebung bei hetzner.de.

1 „Gefällt mir“

Sie müssen immer noch die vollständigen Protokolle teilen, einschließlich des Teils, in dem die Migration fehlgeschlagen ist. Meine Vermutung (und es ist eine Vermutung, da Sie den Fehler nicht geteilt haben) ist, dass Sie das KI-Plugin verwenden und Ihre Datenbank nicht das erforderliche Add-on hat.

Nein, es ist eine Installation ohne das KI-Plugin, obwohl diese Instanz in Zukunft ein Spielplatz für KI-Funktionen sein wird.

Anbei ein Tarball mit

./launcher bootstrap web_only >> web_only_bootstrap.log

und den YMLs für Redis und web_only, Passwörter sind entfernt.

forum2_build.tar.gz (3,3 KB)

Longshot:

links:
  - link:
      name: redis
      alias: data

Warum ist es nicht alias: redis?

1 „Gefällt mir“

Die Datei aus /samples/web_only.yml hat

# Verwenden Sie den Schlüssel 'links', um Container miteinander zu verknüpfen, d. h. verwenden Sie das Docker --link Flag.
links:
- link:
name: data
alias: data

In meinem Fall ist der Datencontainer ein Redis-Container

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
a27999b28a90 local_discourse/redis „/sbin/boot“ 2 Tage her Vor 20 Stunden hoch

daher name: redis und alias: data

Laut der Docker-Dokumentation ist dies eine Legacy-Funktion, aber sie ist immer noch nutzbar, siehe Legacy container links | Docker Docs

Ich denke jetzt, dass der bessere Ansatz darin besteht, zuerst ein Standard-„All-in-One“-Setup zu erstellen (app.yml). Und dann den initialen Schema- und Daten-Dump aus dem Container in eine externe PostgreSQL-Maschine zu exportieren. @Falco, was meinst du?

Aber es sind nur 28 Zeilen, also fehlen die meisten.

Meine neue Vermutung ist, dass es überhaupt keine Verbindung zu Ihrer Datenbank aufnimmt, obwohl es Redis sein könnte, mit dem es nicht spricht.

Versuchen Sie

./launcher bootstrap web_only >> web_only_bootstrap.log 2>&1

Das Installationsprogramm erstellt automatisch alles, was notwendig ist, solange gültige Anmeldeinformationen angegeben werden und die Datenbank erreichbar ist. Dies ist unter Discourse für die Verwendung eines separaten PostgreSQL-Servers konfigurieren dokumentiert.

web_only_bootstrap2.tar.gz (9,1 KB)

Dieses sollte besser sein :wink:

Handelt es sich um eine Neuinstallation oder um eine, die Sie auf einen neuen Server verschieben?

Sie sollten sich also die Protokolldatei ansehen und nach „migrate“ suchen, um den Migrationsfehler zu finden.

Hier ist der Fehler:

PG::DuplicateObject: ERROR:  type „hotlinked_media_status“ already exists

Es könnte ein Problem mit etwas sein, das migriert wurde und dann ein Commit rückgängig gemacht wurde. Dies ist verwandt, aber nicht Ihre Lösung: Restore fails with "hotlinked_media_status" already exists. Vielleicht dies: Upgrading 2.7 to 3.1 failing: "hotlinked_media_status" already exists - #5 by merefield

Außerdem sollten Sie dies beheben, obwohl es nicht wirklich schadet:

Plugin name is 'discourse-topic-voting', but plugin directory is named 'discourse-voting'

Wenn Sie dies erneut tun, verlinken Sie bitte einfach die Datei, ohne sie in ein Tar zu packen.

1 „Gefällt mir“