Déplacement de la base de données postgres vers le serveur de base de données central : erreur de compilation

Salut,

Je suis en train de migrer d’une configuration classique à deux conteneurs (conteneurs web_only et data séparés) vers une configuration où la base de données est hébergée sur un serveur de base de données central (pas à l’intérieur d’un conteneur Docker).

La base de données centrale a été créée à partir du dump.sql qui fait partie du fichier de sauvegarde. Le fichier web_only.yaml de Docker Compose utilise :

connexion à la base de données PostgreSQL centrale

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

Pendant la construction de web_only, j’obtiens l’erreur suivante :

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' failed with return #<Process::Status: pid 741 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:migrate'"]}
bootstrap failed with exit code 1
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.

L’hôte de la base de données est accessible avec ces données. Des idées sur ce qui se passe ici ? La même construction avec le conteneur de base de données standard se termine avec succès.

Êtes-vous sûr que la base de données distante est disponible depuis le serveur ? Il semble que non. Pouvez-vous utiliser telnet sur le port de la base de données depuis la machine du serveur web ?

Salut Jay,

J’ai suivi le fil de discussion de Falco sur Configure Discourse to use a separate PostgreSQL server. Le serveur de base de données est accessible depuis la VM :

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

(les connexions sont acceptées)

Le nom de la base de données, l’utilisateur et le mot de passe dans web_only.yml sont également corrects. L’erreur de compilation est :

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

Je ne suis pas un expert en Ruby, j’aurais donc besoin d’aide pour le débogage à partir de l’erreur qui apparaît ici.

Au revoir, Thommie

Dans ce cas :

Quels plugins avez-vous ? Avez-vous le plugin IA ?

Quelle version de postgres utilisez-vous ?

  • PostgreSQL 13.12
  • aucun plugin IA
  • 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

Pouvez-vous

?

Le message d’erreur exact dans la trace d’appels nous dira exactement quel est le problème :smile:

Votre plan est-il de supprimer le conteneur de données ?

1 « J'aime »

code d’erreur :

> ÉCHEC
> --------------------
> Pups::ExecError: cd /var/www/discourse & su discourse -c 'bundle exec rake db:migrate' a échoué avec le retour #<Process::Status: pid 816 exit 1>
> Emplacement de l'échec : /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
> exec a échoué avec les paramètres {"cd"=>"$home", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
> bootstrap a échoué avec le code de sortie 1

Sur le nouveau système, les données doivent provenir de la base de données centrale au lieu de la base de données Docker si possible.

Je me demande si le fait de définir cette valeur sur vide plutôt que de ne pas la définir causera des problèmes.

Dans tous les cas, veuillez publier la sortie complète.

1 « J'aime »

le journal de build complet après

./launcher rebuild web_only

web_only_build.zip (9.4 KB)

le yaml

web_only.zip (2.4 KB)

Concernant le DISCOURSE_DB_SOCKET : « » : comme nous utilisons une connexion à distance, je suppose que la valeur du socket n’est pas pertinente dans les deux cas (données dockérisées ou données distantes)

1 « J'aime »

L’erreur se trouvait plus loin dans le journal de build :

…
docker_manager est déjà à la dernière version compatible
wp-discourse est déjà à la dernière version compatible

I, [2023-11-10T21:08:17.388213 #1]  INFO -- : cd /var/www/discourse & su discourse -c 'bundle exec rake db:migrate'
Le nom du plugin est 'discourse-topic-voting', mais le répertoire du plugin est nommé 'discourse-voting'
rake aborted!
ActiveRecord::StatementInvalid: PG::InsufficientPrivilege: ERROR:  permission denied for table users (ActiveRecord::StatementInvalid)

Alors bonnes nouvelles ! La connexion fonctionne, ce sont les permissions de la base de données qui doivent être ajustées.

2 « J'aime »

Hmmmm, étrange, l’utilisateur de la base de données discourse a

postgres=# GRANT ALL ON DATABASE discourse TO discourse;

sur le serveur postgres central. Avons-nous besoin d’autre chose pour ce rôle ?

Cela n’affecte pas les tables existantes.

De mémoire, peut-être :

ALTER DATABASE "discourse" OWNER TO "discourse";

ou :

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

Les logs de postgres devraient également vous indiquer plus en détail quelles opérations échouent.

4 « J'aime »

… ok ok, il semble que j’aie encore des problèmes de permissions ici, voir /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, comme toujours, c’était un « problème de couche 8 » :smiling_face_with_tear:

J’avais déjà une base de données discourse dans postgres, mais l’utilisateur/rôle discourse n’avait pas tous les privilèges requis sur celle-ci. Et j’ai manqué certaines différences « comportementales » majeures entre mariadb et postgres…

Maintenant, j’ai tout recréé : utilisateur, base de données, permissions pour l’utilisateur/rôle (y compris ALTER DEFAULT PRIVILEGES FOR ROLE discourse IN SCHEMA public GRANT ALL ON TABLES TO “discourse”; pour correspondre aux tables créées par cet utilisateur à l’avenir)

La construction est terminée et l’instance fonctionne bien avec le serveur postgres distant, elle est donc prête à importer la sauvegarde de l’ancienne instance.

4 « J'aime »

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