Postgres-Datenbank auf zentralen DB-Server verschieben: Build-Fehler

Hallo,
ich migriere derzeit von einem klassischen Zwei-Container-Setup (getrennte Web-Only- und Datencontainer) zu einem Setup, bei dem die Datenbank auf einem zentralen Datenbankserver gehostet wird (nicht innerhalb eines Docker-Containers).

Die zentrale Datenbank wurde aus dem dump.sql erstellt, das Teil der Sicherungsdatei ist. Der Docker Compose web_only.yaml verwendet

Verbindung zur zentralen PostgreSQL-Datenbank

DISCOURSE_DB_SOCKET: ‘’
DISCOURSE_DB_USERNAME: discourse
DISCOURSE_DB_PASSWORD: xxxx
DISCOURSE_DB_HOST: 10.10.10.xx
DISCOURSE_DB_NAME: discourse

Während des Builds von web_only erhalte ich folgende Fehlermeldung:

FEHLGESCHLAGEN
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' fehlgeschlagen mit Rückgabewert #<Process::Status: pid 741 exit 1>
Ort des Fehlschlags: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec fehlgeschlagen mit den Parametern {"cd"=>"$home", "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.

Der Datenbankhost ist mit diesen Daten erreichbar. Irgendwelche Ideen, was hier passiert? Der gleiche Build mit dem Standard-Datenbankcontainer wird erfolgreich abgeschlossen.

Sind Sie sicher, dass die Remote-Datenbank vom Server aus verfügbar ist? Es sieht so aus, als ob sie es nicht ist. Können Sie von der Webserver-Maschine aus eine Telnet-Verbindung zum Datenbankport herstellen?

Hallo Jay,

Ich habe den Thread von Falco unter Configure Discourse to use a separate PostgreSQL server verfolgt. Der Datenbankserver ist von der VM aus erreichbar:

root@docker2:/var/discourse# pg_isready -d discourse -h 10.10.10.18 -p 5432 -U discourse    
10.10.10.18:5432 - Verbindungen werden angenommen

(Verbindungen werden angenommen)

Der DB-Name, Benutzer und das Passwort in web_only.yml sind ebenfalls korrekt. Der Build-Fehler lautet:

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

Ich bin kein Ruby-Experte und benötige daher Hilfe bei der Fehlersuche, beginnend mit dem Fehler, der hier auftritt.

Tschüss, Thommie

In diesem Fall:

Welche Plugins hast du? Hast du das KI-Plugin?

Welche Version von Postgres verwendest du?

  • PostgreSQL 13.12
  • kein KI-Plugin
  • Plugins:
cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-shared-edits.git
          - git clone https://github.com/discourse/discourse-chat-integration
          - git clone https://github.com/discourse/wp-discourse
          - git clone https://github.com/discourse/discourse-openid-connect
          - git clone https://github.com/discourse/discourse-calendar
          - git clone https://github.com/discourse/discourse-data-explorer
          - git clone https://github.com/paviliondev/discourse-events
          - git clone https://github.com/paviliondev/discourse-locations
          - git clone https://github.com/discourse/discourse-reactions
          - git clone https://github.com/discourse/discourse-chat
          - git clone https://github.com/discourse/discourse-voting.git
          - git clone https://github.com/discourse/discourse-user-notes.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-footnote.git
          - git clone https://github.com/discourse/discourse-docs.git
          - git clone https://github.com/discourse/discourse-docs-card-filter.git
          - git clone https://github.com/discourse/discourse-assign.git
          - git clone https://github.com/discourse/discourse-templates.git
          - git clone https://github.com/discourse/discourse-saved-searches.git
          - git clone https://github.com/discourse/discourse-tooltips
          - git clone https://github.com/nathan-nz/discourse-wikified-posts
          - git clone https://github.com/discourse/discourse-post-voting.git
          - git clone https://github.com/discourse/discourse-encrypt.git
          - git clone https://github.com/discourse/discourse-zoom.git
          - git clone https://github.com/discourse/discourse-spoiler-alert.git
          - git clone https://github.com/discourse/discourse-category-experts.git

Kannst du

?
Die genaue Fehlermeldung im Backtrace wird uns genau sagen, was das Problem ist :smile:

Ist dein Plan, den Datencontainer aufzugeben?

1 „Gefällt mir“

Fehlercode:

> FEHLGESCHLAGEN
> --------------------
> Pups::ExecError: cd /var/www/discourse & su discourse -c 'bundle exec rake db:migrate' fehlgeschlagen mit Rückgabe #<Process::Status: pid 816 exit 1>
> Ort des Fehlschlags: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
> exec fehlgeschlagen mit den Parametern {"cd"=>"$home", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
> bootstrap fehlgeschlagen mit Exit-Code 1

Auf dem neuen System sollen die Daten nach Möglichkeit aus der zentralen DB und nicht aus der Docker-DB stammen.

Ich frage mich, ob es Probleme verursachen wird, wenn dieser Wert auf einen leeren Wert und nicht auf nicht gesetzt gesetzt wird.

Bitte posten Sie auf jeden Fall die vollständige Ausgabe.

1 „Gefällt mir“

der vollständige Build-Log nach

./launcher rebuild web_only

web_only_build.zip (9,4 KB)

das YAML

web_only.zip (2,4 KB)

Betreffend DISCOURSE_DB_SOCKET: „“: Da wir eine Remote-Verbindung verwenden, würde ich vermuten, dass der Socket-Wert in beiden Fällen (docked data oder remote data) nicht relevant ist.

1 „Gefällt mir“

Der Fehler lag weiter oben im Build-Log:

…
docker_manager ist bereits in der neuesten kompatiblen Version
wp-discourse ist bereits in der neuesten kompatiblen Version

I, [2023-11-10T21:08:17.388213 #1]  INFO -- : cd /var/www/discourse & su discourse -c 'bundle exec rake db:migrate'
Plugin-Name ist 'discourse-topic-voting', aber das Plugin-Verzeichnis heißt 'discourse-voting'
rake abgebrochen!
ActiveRecord::StatementInvalid: PG::InsufficientPrivilege: ERROR:  permission denied for table users (ActiveRecord::StatementInvalid)

Also gute Nachrichten! Es stellt eine Verbindung her, die DB-Berechtigungen müssen angepasst werden.

2 „Gefällt mir“

Hmmmm, seltsam, der discourse-Datenbankbenutzer hat

postgres=# GRANT ALL ON DATABASE discourse TO discourse;

auf dem zentralen Postgres-Server. Benötigen wir sonst noch etwas für diese Rolle?

Das wirkt sich nicht auf bestehende Tabellen aus.

Aus dem Stegreif, vielleicht:

ALTER DATABASE "discourse" OWNER TO "discourse";

oder:

ALTER DEFAULT PRIVILEGES IN SCHEMA "public" GRANT ALL ON TABLES TO "discourse";

Die Postgres-Logs sollten Ihnen auch detaillierter mitteilen, welche Operationen fehlschlagen.

4 „Gefällt mir“

… ok ok, es sieht so aus, als hätte ich hier weitere Berechtigungsprobleme, siehe /var/log/postgresql/postgresql-13-main.log:

2023-11-10 22:07:58.371 UTC [196127] postgres@postgres STATEMENT: ALTER DEFAULT PRIVILEGES IN SCHEMA 'public' GRANT ALL ON TABLES TO 'discourse';
2023-11-10 22:10:18.270 UTC [196160] discourse@discourse ERROR: permission denied for table site_settings
2023-11-10 22:10:18.270 UTC [196160] discourse@discourse STATEMENT: SELECT name, data_type, value FROM site_settings
2023-11-10 22:10:18.313 UTC [196160] discourse@discourse ERROR: permission denied for table users
2023-11-10 22:10:18.313 UTC [196160] discourse@discourse STATEMENT: SELECT COUNT(*) FROM (SELECT 1 AS one FROM "users" LIMIT 20) subquery_for_count

OK, wie immer war es ein „Layer 8 Problem“ :smiling_face_with_tear:
Ich hatte zwar schon eine Discourse-Datenbank in Postgres, aber der Discourse-Benutzer/die Rolle hatte nicht alle erforderlichen Berechtigungen dafür. Und ich habe einige wesentliche „Verhaltensunterschiede“ zwischen MariaDB und Postgres übersehen …

Jetzt habe ich alles neu erstellt: Benutzer, Datenbank, Berechtigungen für den Benutzer/die Rolle (einschließlich ALTER DEFAULT PRIVILEGES FOR ROLE discourse IN SCHEMA public GRANT ALL ON TABLES TO “discourse”; um auch zukünftig von diesem Benutzer erstellte Tabellen abzudecken)

Der Build ist abgeschlossen und die Instanz läuft einwandfrei mit dem Remote-Postgres-Server, sodass sie bereit für den Import des Backups von der älteren Instanz ist.

4 „Gefällt mir“

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.