Cómo resolver errores de Pups exec durante el bootstrap de Discourse

Estoy creando una nueva instancia de Discourse desde cero con fines de desarrollo y veo este error de arranque de nuevo:

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' falló con retorno #<Process::Status: pid 1002 exit 1>
Ubicación del fallo: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec falló con los parámetros {"cd"=>"$home", "tag"=>"migrate", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
el arranque falló con el código de salida 1

La configuración del contenedor es con dos contenedores para webonly y dataonly (redis) y con una base de datos postgresql externa. Comentar la configuración de maxmind no cambia nada.

¿Alguna idea de qué puedo hacer aquí?

La mejor suposición sería que no tienes suficiente memoria; en ese caso, agrega swap o muévete a una instancia con más RAM. Intenta free -h.

Hmmm, no, tenemos 4 GB de RAM y mucho espacio en el disco duro (2 x 32 GB), el entorno general es el mismo que el de la otra máquina Docker donde las compilaciones se ejecutan sin problemas.

Estado de la memoria:

root@docker3a:/var/discourse# free -h
total used free shared buff/cache available
Mem: 3.8Gi 819Mi 1.4Gi 22Mi 1.9Gi 3.0Gi
Swap: 974Mi 52Mi 922Mi

1 me gusta

¿Hay algún error reciente en la salida de dmesg que pueda ser relevante?

¿Puedes compartir el registro completo?

Esa es una suposición extraña, no solemos ver que los errores OoM causen errores de migración en Discourses.

Se detectó la arquitectura x86_64.
Asegurando que el lanzador esté actualizado
El lanzador está actualizado
2.0.20250226-0128: Extrayendo de discourse/base
Digest: sha256:6f18aa2cd22bba0deb91d69194e577d4f96130ad555ae8ec646a8792cbfe37db
Estado: La imagen está actualizada para 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 está iniciando oO0OoO0OoO0Oo
18:C 19 Apr 2025 16:38:41.670 # Versión de Redis=7.0.15, bits=64, commit=00000000, modificado=0, pid=18, recién iniciado
18:C 19 Apr 2025 16:38:41.670 # Configuración cargada
18:M 19 Apr 2025 16:38:41.670 * Reloj monotónico: POSIX clock_gettime
18:M 19 Apr 2025 16:38:41.670 * Modo de ejecución=standalone, puerto=6379.
18:M 19 Apr 2025 16:38:41.670 # Servidor inicializado
18:M 19 Apr 2025 16:38:41.671 * Cargando RDB producido por la versión 7.0.15
18:M 19 Apr 2025 16:38:41.671 * Edad del RDB 72606 segundos
18:M 19 Apr 2025 16:38:41.671 * Uso de memoria del RDB al crearse 0.82 Mb
18:M 19 Apr 2025 16:38:41.671 * RDB cargado, claves cargadas: 0, claves expiradas: 0.
18:M 19 Apr 2025 16:38:41.671 * DB cargado desde disco: 0.000 segundos
18:M 19 Apr 2025 16:38:41.671 * Listo para aceptar conexiones
999:C 19 Apr 2025 16:39:59.006 # oO0OoO0OoO0Oo Redis está iniciando oO0OoO0OoO0Oo
999:C 19 Apr 2025 16:39:59.006 # Versión de Redis=7.0.15, bits=64, commit=00000000, modificado=0, pid=999, recién iniciado
999:C 19 Apr 2025 16:39:59.006 # Configuración cargada
999:M 19 Apr 2025 16:39:59.006 * Reloj monotónico: POSIX clock_gettime
999:M 19 Apr 2025 16:39:59.006 # Advertencia: No se pudo crear el socket de escucha TCP del servidor *:6379: bind: Dirección ya en uso
999:M 19 Apr 2025 16:39:59.006 # Falló la escucha en el puerto 6379 (TCP), abortando.
18:signal-handler (1745080813) Señal SIGTERM recibida, programando apagado...
18:M 19 Apr 2025 16:40:13.541 # Solicitud de apagado del usuario...
18:M 19 Apr 2025 16:40:13.541 * Guardando la instantánea final de RDB antes de salir.
18:M 19 Apr 2025 16:40:13.549 * DB guardado en disco
18:M 19 Apr 2025 16:40:13.549 # Redis está listo para salir, adiós...


FALLÓ
--------------------
Pups::ExecError: cd /var/www/discourse &amp;&amp; su discourse -c 'bundle exec rake db:migrate' falló con el retorno #&lt;Process::Status: pid 1002 exit 1&gt;
Ubicación del fallo: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec falló con los parámetros {"cd"=>"$home", "tag"=>"migrate", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
falló el arranque con el código de salida 1
** FALLÓ EL ARRANQUE ** por favor desplácese hacia arriba y busque mensajes de error anteriores, puede haber más de uno.
./discourse-doctor puede ayudar a diagnosticar el problema.
48b8aa6c912bbabc42d6b9373808088f5aa9079de1e1f7360fc858891a48556b

Si este es un contenedor solo para web, ¿por qué tiene redis?

¿Puedes compartir las definiciones de tus contenedores yml? ¿Y por qué estás ejecutando una instalación de dos contenedores?

Hola Falco
tienes razón y soy estúpido :wink:
Lo corregiré …

OK, he arreglado la separación de web_only y redis. El mensaje de error ahora es

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse &amp;&amp; su discourse -c 'bundle exec rake db:migrate' falló con el código de retorno #&lt;Process::Status: pid 981 exit 1&gt;
Ubicación del fallo: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec falló con los parámetros {\"cd\"=&gt;\"$home\", \"tag\"=&gt;\"migrate\", \"hook\"=&gt;\"db_migrate\", \"cmd\"=&gt;[\"su discourse -c 'bundle exec rake db:migra
te'\"]}
bootstrap falló con el código de salida 1
** FALLÓ EL BOOTSTRAP ** por favor, desplázate hacia arriba y busca mensajes de error anteriores, puede haber más de uno.
./discourse-doctor puede ayudar a diagnosticar el problema.
801049b69a89d38b1ae5c299d356fc5f8dc6a8f518b1260c2dde05e0b6081556

Pero tal vez sea un malentendido / falta de conocimiento de mi parte:

La base de datos debería ser externa en otro contenedor lxc que tiene una base de datos postgresql. El usuario y la base de datos existen, pero la base de datos está vacía antes del primer bootstrap de web_only. ¿El script crea la base de datos por sí mismo en el sistema remoto al primer build? ¿O primero tengo que crear el contenedor de la base de datos y luego exportar su esquema predeterminado y los datos manualmente al demonio postgresql externo?

Visualización de la configuración general

forum2 Setup.excalidraw

Gracias por el diagrama. Es una configuración bastante sofisticada; lo harías si tuvieras una buena razón y conocieras el territorio.

Si todavía estás viendo lo siguiente, creo que es la indicación de lo que está mal. Redis no puede abrir el puerto en el que necesita estar escuchando.

Así que las preguntas son si redis debería estar haciendo eso, en este contenedor, y si es así, dónde más en la máquina se está ejecutando otro redis. lsof podría ser una herramienta útil aquí.

Hola @Ed_S
gracias por la pista sobre el puerto que faltaba. Primero quiero esperar la respuesta de Falco sobre mis preguntas sobre la configuración general de Discourse con una base de datos PostgreSQL externa.

Sí, la configuración es un poco sofisticada en comparación con la estándar con solo un contenedor de aplicaciones. Ejecuto todo en una máquina raíz dedicada con Proxmox (https://p\u003eroxmox.com) como entorno de virtualización en hetzner.de.

1 me gusta

Aún necesitas compartir los registros completos, incluida la parte en la que falló la migración. Mi suposición (y es una suposición ya que no has compartido el error) es que estás usando el plugin de IA y tu base de datos no tiene el complemento requerido.

No, es una instalación sin el plugin de IA, aunque esta instancia será un campo de pruebas para funciones de IA en el futuro.

Adjunto un tarball con

./launcher bootstrap web_only >> web_only_bootstrap.log

y los ymls para redis y web_only, las contraseñas se eliminan.

forum2_build.tar.gz (3.3 KB)

Longshot:

links:
  - link:
      name: redis
      alias: data

¿por qué no es alias: redis?

1 me gusta

el archivo de /samples/web_only.yml tiene

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

En mi caso, el contenedor de datos es un contenedor de redis

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

por lo tanto name: redis y alias: data

Según la documentación de Docker, esta es una característica heredada, pero aún se puede usar, véase Legacy container links | Docker Docs

Ahora creo que el mejor enfoque sería crear primero una configuración estándar “todo en uno” (app.yml). Y luego volcar el esquema y los datos iniciales del contenedor en una máquina postgres externa. @Falco ¿qué opinas?

Pero solo son 28 líneas, así que faltan la mayoría.

Mi nueva suposición es que no se está contactando con tu base de datos en absoluto, aunque podría ser redis con lo que no está hablando.

Prueba

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

El instalador creará automáticamente todo lo que sea necesario siempre que se le proporcionen credenciales válidas y pueda acceder a la base de datos. Esto está documentado en Configurar Discourse para usar un servidor PostgreSQL separado

web_only_bootstrap2.tar.gz (9.1 KB)

Este debería ser mejor :wink:

¿Es esta una instalación nueva o una que estás moviendo a un nuevo servidor?

Entonces querrás mirar el archivo de registro y buscar “migrate” para encontrar el error de migración.

Aquí está el error:

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

Podría ser un problema con algo que se migró y luego se revirtió un commit. Esto está relacionado, pero no es tu solución: Restore fails with "hotlinked_media_status" already exists. Quizás esto: Upgrading 2.7 to 3.1 failing: "hotlinked_media_status" already exists - #5 by merefield

Además, deberías arreglar esto, aunque en realidad no está causando ningún daño:

El nombre del plugin es 'discourse-topic-voting', pero el directorio del plugin se llama 'discourse-voting'

Si vuelves a hacer esto, por favor, solo enlaza el archivo sin meterlo en un tar.

1 me gusta