Come risolvere gli errori Pups exec durante il bootstrap di Discourse

Sto creando una nuova istanza di discourse da zero per scopi di sviluppo e vedo di nuovo questo errore di bootstrap:

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' è fallito con ritorno #<Process::Status: pid 1002 exit 1>
Posizione del fallimento: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec fallito con i parametri {"cd"=>"$home", "tag"=>"migrate", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
bootstrap fallito con codice di uscita 1

La configurazione del container è con due container per webonly e dataonly (redis) e con un database postgresql esterno. Commentare le impostazioni di maxmind non cambia nulla.

Qualche idea su cosa posso fare qui?

La migliore ipotesi è che non si disponga di memoria sufficiente, nel qual caso aggiungere swap o passare a un’istanza con più RAM. Provare free -h.

Hmmm, no, abbiamo 4 GB di RAM e molto spazio su disco (2 x 32 GB), l’ambiente generale è lo stesso dell’altra macchina Docker dove le build funzionano senza problemi.

Stato della memoria:

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 Mi Piace

Ci sono stati errori recenti nell’output di dmesg che potrebbero essere rilevanti?

Puoi condividere l’intero log?

È un’ipotesi strana, di solito non vediamo errori di migrazione causati da OoM in Discourse.

x86_64 arch rilevata.
Assicurazione che il launcher sia aggiornato
Il launcher è aggiornato
2.0.20250226-0128: Estrazione da discourse/base
Digest: sha256:6f18aa2cd22bba0deb91d69194e577d4f96130ad555ae8ec646a8792cbfe37db
Stato: L'immagine è aggiornata per 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 si sta avviando oO0OoO0OoO0Oo
18:C 19 Apr 2025 16:38:41.670 # Versione Redis=7.0.15, bit=64, commit=00000000, modificato=0, pid=18, appena avviato
18:C 19 Apr 2025 16:38:41.670 # Configurazione caricata
18:M 19 Apr 2025 16:38:41.670 * Orologio monotono: POSIX clock_gettime
18:M 19 Apr 2025 16:38:41.670 * Modalità di esecuzione=standalone, porta=6379.
18:M 19 Apr 2025 16:38:41.670 # Server inizializzato
18:M 19 Apr 2025 16:38:41.671 * Caricamento RDB prodotto dalla versione 7.0.15
18:M 19 Apr 2025 16:38:41.671 * Età RDB 72606 secondi
18:M 19 Apr 2025 16:38:41.671 * Utilizzo memoria RDB al momento della creazione 0.82 Mb
18:M 19 Apr 2025 16:38:41.671 * Caricamento RDB completato, chiavi caricate: 0, chiavi scadute: 0.
18:M 19 Apr 2025 16:38:41.671 * DB caricato dal disco: 0.000 secondi
18:M 19 Apr 2025 16:38:41.671 * Pronto per accettare connessioni
999:C 19 Apr 2025 16:39:59.006 # oO0OoO0OoO0Oo Redis si sta avviando oO0OoO0OoO0Oo
999:C 19 Apr 2025 16:39:59.006 # Versione Redis=7.0.15, bit=64, commit=00000000, modificato=0, pid=999, appena avviato
999:C 19 Apr 2025 16:39:59.006 # Configurazione caricata
999:M 19 Apr 2025 16:39:59.006 * Orologio monotono: POSIX clock_gettime
999:M 19 Apr 2025 16:39:59.006 # Attenzione: Impossibile creare il socket di ascolto TCP del server *:6379: bind: Indirizzo già in uso
999:M 19 Apr 2025 16:39:59.006 # Impossibile ascoltare sulla porta 6379 (TCP), interruzione.
18:signal-handler (1745080813) Ricevuto SIGTERM, pianificazione spegnimento...
18:M 19 Apr 2025 16:40:13.541 # Spegnimento richiesto dall'utente...
18:M 19 Apr 2025 16:40:13.541 * Salvataggio dello snapshot RDB finale prima dell'uscita.
18:M 19 Apr 2025 16:40:13.549 * DB salvato su disco
18:M 19 Apr 2025 16:40:13.549 # Redis è ora pronto per uscire, arrivederci...


FALLITO
--------------------
Pups::ExecError: cd /var/www/discourse &amp;&amp; su discourse -c 'bundle exec rake db:migrate' fallito con ritorno #&lt;Process::Status: pid 1002 exit 1&gt;
Posizione del fallimento: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec fallito con i parametri {"cd"=&gt;"$home", "tag"=&gt;"migrate", "hook"=&gt;"db_migrate", "cmd"=&gt;["su discourse -c 'bundle exec rake db:migrate'"]}
bootstrap fallito con codice di uscita 1
** FALLITO IL BOOTSTRAP ** si prega di scorrere verso l'alto e cercare messaggi di errore precedenti, potrebbero essercene più di uno.
./discourse-doctor potrebbe aiutare a diagnosticare il problema.
48b8aa6c912bbabc42d6b9373808088f5aa9079de1e1f7360fc858891a48556b

Se questo è un container web_only, perché ha redis al suo interno?

Puoi condividere le definizioni dei tuoi container yml? E perché stai eseguendo un’installazione a due container?

Ehi Falco
hai ragione e io sono stupido :wink:
Lo correggerò…

OK, ho corretto la separazione di web_only e redis. Il messaggio di errore ora è

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse & su discourse -c 'bundle exec rake db:migrate' fallito con ritorno #<Process::Status: pid 981 exit 1>
Posizione del fallimento: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec fallito con i parametri {"cd"=>"$home", "tag"=>"migrate", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migra
te'"]}
bootstrap fallito con codice di uscita 1
** FAILED TO BOOTSTRAP ** si prega di scorrere verso l'alto e cercare messaggi di errore precedenti, potrebbero essercene più di uno.
./discourse-doctor può aiutare a diagnosticare il problema.
801049b69a89d38b1ae5c299d356fc5f8dc6a8f518b1260c2dde05e0b6081556

Ma forse è un malinteso / mancanza di conoscenza da parte mia:

Il database dovrebbe essere esterno su un altro container lxc che ha un database postgresql. L’utente del database e il database esistono, ma il database è vuoto prima del primo bootstrap di web_only. Lo script crea il database stesso sul sistema remoto al primo build? O devo prima creare il container del database e poi esportare manualmente il suo schema predefinito e i dati al demone postgresql esterno?

Visualizzazione della configurazione generale

forum2 Setup.excalidraw

Grazie per il diagramma. È una configurazione piuttosto sofisticata: lo faresti se avessi una buona ragione e conoscessi il territorio.

Se stai ancora vedendo quanto segue, penso che sia l’indicazione di ciò che non va. Redis non riesce ad aprire la porta su cui deve essere in ascolto.

Quindi le domande riguardano se redis dovrebbe farlo, in questo container, e se sì, dove altro sulla macchina è in esecuzione un altro redis. lsof potrebbe essere uno strumento utile qui.

Ciao @Ed_S
grazie per l’indizio sulla porta mancante. Voglio prima attendere la risposta di Falco riguardo alle mie domande sulla configurazione generale di Discourse con un database PostgreSQL esterno.

Sì, la configurazione è un po’ sofisticata rispetto allo standard con un solo container dell’app. Eseguo tutto su una macchina dedicata con Proxmox (https://proxmox.com) come ambiente di virtualizzazione su hetzner.de

1 Mi Piace

Devi ancora condividere i log completi, inclusa la parte in cui la migrazione è fallita. La mia ipotesi (ed è un’ipotesi dato che non hai condiviso l’errore) è che tu stia usando il plugin AI e il tuo database non abbia il componente aggiuntivo richiesto.

No, è un’installazione senza il plugin AI, anche se questa istanza sarà in futuro un terreno di gioco per le funzionalità AI.

In allegato un tarball con

./launcher bootstrap web_only >> web_only_bootstrap.log

e gli yml per redis e web_only, le password sono state rimosse.

forum2_build.tar.gz (3,3 KB)

Longshot:

links:
  - link:
      name: redis
      alias: data

perché non è alias: redis?

1 Mi Piace

il file da /samples/web_only.yml ha

# Usa la chiave 'links' per collegare i container tra loro, ovvero usa il flag Docker --link.
links:
- link:
name: data
alias: data

Nel mio caso il container data è un container redis

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
a27999b28a90 local_discourse/redis \"/sbin/boot\" 2 giorni fa Su 20 ore

quindi name: redis e alias: data

Secondo la documentazione di Docker questa è una funzionalità legacy, ma è ancora utilizzabile, vedi Legacy container links | Docker Docs

Ora penso che l’approccio migliore sarebbe creare prima una configurazione standard “all in one” (app.yml). E poi fare un dump SQL dello schema iniziale e dei dati dal container in una macchina postgres esterna. @Falco cosa ne pensi?

Ma sono solo 28 righe, quindi mancano la maggior parte.

La mia nuova ipotesi è che non stia contattando affatto il tuo database, anche se potrebbe essere redis a cui non sta parlando.

Prova

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

L’installer creerà automaticamente tutto ciò che è necessario, purché gli vengano fornite credenziali valide e sia in grado di raggiungere il database. Questo è documentato su Configurare Discourse per utilizzare un server PostgreSQL separato

web_only_bootstrap2.tar.gz (9.1 KB)

Questo dovrebbe essere migliore :wink:

Si tratta di una nuova installazione o di una che stai spostando su un nuovo server?

Quindi dovresti esaminare il file di log e cercare “migrate” per trovare l’errore di migrazione.

Ecco l’errore:

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

Potrebbe essere un problema con qualcosa che è stato migrato e poi un commit è stato annullato. Questo è correlato, ma non è la tua soluzione: Restore fails with "hotlinked_media_status" already exists. Forse questo: Upgrading 2.7 to 3.1 failing: "hotlinked_media_status" already exists - #5 by merefield

Inoltre, dovresti correggere questo, anche se in realtà non sta danneggiando nulla:

Il nome del plugin è 'discourse-topic-voting', ma la directory del plugin si chiama 'discourse-voting'

Se lo fai di nuovo, per favore collega solo il file senza metterlo in un tar.

1 Mi Piace