Comment résoudre les erreurs d'exécution Pups lors du bootstrap de Discourse

Je crée une nouvelle instance de Discourse à partir de zéro à des fins de développement et je rencontre à nouveau cette erreur de bootstrap :

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

La configuration du conteneur se fait avec deux conteneurs pour webonly et dataonly (redis) et avec une base de données postgresql externe. Commenter les paramètres maxmind ne change rien.

Des idées sur ce que je peux faire ici ?

La meilleure supposition serait que vous n’avez pas assez de mémoire - dans ce cas, ajoutez du swap ou passez à une instance avec plus de RAM. Essayez free -h.

Hmmm, non, nous avons 4 Go de RAM et beaucoup d’espace disque (2 x 32 Go), l’environnement global est le même que celui de l’autre machine Docker où les builds s’exécutent sans problème.

Statut de la mémoire :

root@docker3a:/var/discourse# free -h
total utilisé libre partagé Entrées/Sorties/Cache disponible
Mémoire : 3,8Gi 819Mi 1,4Gi 22Mi 1,9Gi 3,0Gi
Swap : 974Mi 52Mi 922Mi

1 « J'aime »

Des erreurs récentes dans la sortie de dmesg qui pourraient être pertinentes ?

Pouvez-vous partager le journal complet ?

C’est une supposition étrange, nous ne voyons généralement pas les erreurs OoM causer des erreurs de migration dans Discourses.

x86_64 arch détecté.
Mise à jour du lanceur en cours
Le lanceur est à jour
2.0.20250226-0128 : Extraction de discourse/base
Digest : sha256:6f18aa2cd22bba0deb91d69194e577d4f96130ad555ae8ec646a8792cbfe37db
Statut : L'image est à jour pour 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 démarre oO0OoO0OoO0Oo
18:C 19 Apr 2025 16:38:41.670 # Version Redis=7.0.15, bits=64, commit=00000000, modifié=0, pid=18, vient de démarrer
18:C 19 Apr 2025 16:38:41.670 # Configuration chargée
18:M 19 Apr 2025 16:38:41.670 * Horloge monotone : POSIX clock_gettime
18:M 19 Apr 2025 16:38:41.670 * Mode d'exécution=standalone, port=6379.
18:M 19 Apr 2025 16:38:41.670 # Serveur initialisé
18:M 19 Apr 2025 16:38:41.671 * Chargement du RDB produit par la version 7.0.15
18:M 19 Apr 2025 16:38:41.671 * Âge du RDB 72606 secondes
18:M 19 Apr 2025 16:38:41.671 * Utilisation de la mémoire RDB lors de la création 0.82 Mo
18:M 19 Apr 2025 16:38:41.671 * Chargement du RDB terminé, clés chargées : 0, clés expirées : 0.
18:M 19 Apr 2025 16:38:41.671 * DB chargée depuis le disque : 0.000 secondes
18:M 19 Apr 2025 16:38:41.671 * Prêt à accepter les connexions
999:C 19 Apr 2025 16:39:59.006 # oO0OoO0OoO0Oo Redis démarre oO0OoO0OoO0Oo
999:C 19 Apr 2025 16:39:59.006 # Version Redis=7.0.15, bits=64, commit=00000000, modifié=0, pid=999, vient de démarrer
999:C 19 Apr 2025 16:39:59.006 # Configuration chargée
999:M 19 Apr 2025 16:39:59.006 * Horloge monotone : POSIX clock_gettime
999:M 19 Apr 2025 16:39:59.006 # Avertissement : Impossible de créer le socket d'écoute TCP du serveur *:6379 : bind : Adresse déjà utilisée
999:M 19 Apr 2025 16:39:59.006 # Échec de l'écoute sur le port 6379 (TCP), abandon.
18:gestionnaire-de-signaux (1745080813) SIGTERM reçu, planification de l'arrêt...
18:M 19 Apr 2025 16:40:13.541 # Arrêt demandé par l'utilisateur...
18:M 19 Apr 2025 16:40:13.541 * Sauvegarde du dernier instantané RDB avant de quitter.
18:M 19 Apr 2025 16:40:13.549 * DB sauvegardée sur disque
18:M 19 Apr 2025 16:40:13.549 # Redis est maintenant prêt à quitter, au revoir...


ÉCHEC
--------------------
Pups::ExecError : cd /var/www/discourse &amp;&amp; su discourse -c 'bundle exec rake db:migrate' a échoué avec le retour #&lt;Process::Status: pid 1002 exit 1&gt;
Emplacement de l'échec : /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec a échoué avec les paramètres {"cd"=&gt;"$home", "tag"=&gt;"migrate", "hook"=&gt;"db_migrate", "cmd"=&gt;["su discourse -c 'bundle exec rake db:migrate'"]}
bootstrap a échoué avec le code de sortie 1
** ÉCHEC DU BOOTSTRAP ** veuillez faire défiler vers le haut et rechercher les messages d'erreur précédents, il peut y en avoir plus d'un.
./discourse-doctor peut aider à diagnostiquer le problème.
48b8aa6c912bbabc42d6b9373808088f5aa9079de1e1f7360fc858891a48556b

Si ce conteneur est uniquement destiné au web, pourquoi contient-il redis ?

Pouvez-vous partager vos définitions de conteneurs yml ? Et pourquoi exécutez-vous une installation à deux conteneurs ?

Salut Falco
tu as raison et je suis stupide :wink:
Je vais corriger ça…

OK, j’ai corrigé la séparation de web_only et redis. Le message d’erreur est maintenant :

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse & su discourse -c 'bundle exec rake db:migrate' a échoué avec le retour #<Process::Status: pid 981 exit 1>
Emplacement de l'échec : /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec a échoué avec les paramètres {\"cd\"=>\"$home\", \"tag\"=>\"migrate\", \"hook\"=>\"db_migrate\", \"cmd\"=>[\"su discourse -c 'bundle exec rake db:migra
te'\"]}
bootstrap a échoué avec le code de sortie 1
** ÉCHEC DU BOOTSTRAP ** veuillez faire défiler vers le haut et rechercher les messages d'erreur précédents, il peut y en avoir plus d'un.
./discourse-doctor peut aider à diagnostiquer le problème.
801049b69a89d38b1ae5c299d356fc5f8dc6a8f518b1260c2dde05e0b6081556

Mais peut-être est-ce un malentendu / manque de connaissances de ma part :

La base de données doit être externe sur un autre conteneur lxc qui a une base de données postgresql. L’utilisateur de la base de données et la base de données existent, mais la base de données est vide avant le premier bootstrap de web_only. Le script crée-t-il lui-même la base de données sur le système distant lors de la première construction ? Ou dois-je d’abord créer le conteneur de base de données, puis exporter manuellement son schéma par défaut et les données vers le démon postgresql externe ?

Visualisation de la configuration globale

forum2 Setup.excalidraw

Merci pour le diagramme. C’est une configuration assez sophistiquée - vous le feriez si vous aviez une bonne raison et connaissiez le territoire.

Si vous voyez toujours ce qui suit, je pense que c’est l’indication de ce qui ne va pas. Redis ne peut pas ouvrir le port sur lequel il doit écouter.

Les questions portent donc sur le fait que redis devrait faire cela, dans ce conteneur, et si oui, où d’autre sur la machine une autre instance de redis est en cours d’exécution. lsof pourrait être un outil utile ici.

Salut @Ed_S
merci pour l’indice concernant le port manquant. Je veux d’abord attendre la réponse de Falco concernant mes questions sur la configuration générale de Discourse avec une base de données PostgreSQL externe.

Oui, la configuration est un peu sophistiquée par rapport à la norme avec un seul conteneur d’application. J’exécute tout sur une machine root dédiée avec Proxmox (https://p\u003eroxmox.com) comme environnement de virtualisation chez hetzner.de

1 « J'aime »

Vous devez toujours partager les journaux complets, y compris la partie où la migration a échoué. Ma supposition (et c’est une supposition puisque vous n’avez pas partagé l’erreur) est que vous utilisez le plugin IA et que votre base de données n’a pas le module complémentaire requis.

Non, c’est une installation sans le plugin IA, bien que cette instance servira de terrain de jeu pour les fonctionnalités d’IA à l’avenir.

Ci-joint une archive tar avec

./launcher bootstrap web_only >> web_only_bootstrap.log

et les ymls pour redis et web_only, les mots de passe sont supprimés.

forum2_build.tar.gz (3,3 Ko)

Longshot :

links :
  - link :
      name : redis
      alias : data

pourquoi ce n’est pas alias: redis ?

1 « J'aime »

le fichier de /samples/web_only.yml contient

# Use 'links' key to link containers together, aka use Docker --link flag.
links:
- link:
name: data
alias: data

Dans mon cas, le conteneur de données est un conteneur redis

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
a27999b28a90 local_discourse/redis \"/sbin/boot\" 2 days ago Up 20 hours

donc name: redis and alias: data

Selon la documentation Docker, il s’agit d’une fonctionnalité obsolète, mais elle est toujours utilisable, voir Legacy container links | Docker Docs

Je pense maintenant que la meilleure approche serait de créer d’abord une configuration standard « tout-en-un » (app.yml). Et ensuite, faire un dump SQL du schéma et des données initiaux du conteneur vers une machine postgres externe. @Falco qu’en penses-tu ?

Mais ce ne sont que 28 lignes, donc il en manque la plupart.

Ma nouvelle hypothèse est qu’il ne contacte pas du tout votre base de données, bien que ce puisse être redis à qui il ne parle pas.

Essayez

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

L’installateur créera automatiquement tout ce qui est nécessaire tant qu’il dispose d’informations d’identification valides et qu’il peut atteindre la base de données. Ceci est documenté dans Configurer Discourse pour utiliser un serveur PostgreSQL séparé

web_only_bootstrap2.tar.gz (9.1 Ko)

Celui-ci devrait être meilleur :wink:

S’agit-il d’une nouvelle installation ou d’un déplacement vers un nouveau serveur ?

Vous devez donc consulter le fichier journal et rechercher « migrate » pour trouver l’erreur de migration.

Voici l’erreur :

PG::DuplicateObject: ERROR:  type "hotlinked_media_status" already exists

Il pourrait s’agir d’un problème avec quelque chose qui a été migré puis qu’un commit a été annulé. Ceci est lié, mais ce n’est pas votre solution : Restore fails with "hotlinked_media_status" already exists. Peut-être ceci : Upgrading 2.7 to 3.1 failing: "hotlinked_media_status" already exists - #5 by merefield

De plus, vous devriez corriger ceci, bien que cela ne nuise pas vraiment à quoi que ce soit :

Le nom du plugin est 'discourse-topic-voting', mais le répertoire du plugin est nommé 'discourse-voting'

Si vous refaites cela, veuillez simplement lier le fichier sans le mettre dans une archive.

1 « J'aime »