¿Cuáles son todos los hooks que puedo usar en app.yml?

Hola, estoy intentando configurar un hook para conectarme automáticamente a mi red de Docker cuando Discourse se reinicia o se inicia después de compilar. Esto es para poder usar el actualizador web de administración cuando pueda, pero estoy tratando de averiguar la mejor manera de hacerlo. La documentación no dice realmente todos los tipos de hooks que puedo usar y buscar hooks como after_post_boot y after_restart no da resultados. ¿Estos hooks ya no funcionan y, si es así, por qué? Aquí está mi código de hooks.

hooks:

inicio hook de red personalizado

after_restart:

  • exec:
    cmd:
    - bash
    - “-c”
    - |
    # Conectar Discourse a la red Docker personalizada si aún no está conectada
    NETWORK_NAME=“proxy”
    CONTAINER_NAME=$(hostname)

      ```yaml
              # Crear la red si no existe
              if ! docker network inspect "$NETWORK_NAME" >/dev/null 2>&1; then
                echo "Creando red Docker: $NETWORK_NAME"
                docker network create "$NETWORK_NAME"
              fi
    
              # Conectar el contenedor a la red (ignorar si ya está conectado)
              echo "Conectando $CONTAINER_NAME a $NETWORK_NAME..."
              docker network connect "$NETWORK_NAME" "$CONTAINER_NAME" 2>/dev/null || true
    
              echo "Conexión de red completa."
      ```
    

fin hook de red personalizado

En realidad, no hay una lista global fija de tipos de “hooks” en app.yml.
Los “hooks” son proporcionados dinámicamente por Pups, y solo puedes adjuntarte a los que existen dentro de las plantillas que incluyes.


:magnifying_glass_tilted_left: Cómo funciona

Cuando ves algo como:

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

eso funciona porque las plantillas contienen un paso como:

- hook: code
  run:
    - exec: ...

Pups te permite adjuntar comandos antes o después de cualquiera de esos puntos de “hook” definidos.
Así que si una plantilla define hook: code, puedes usar before_code: o after_code:.
Si define hook: assets_precompile, puedes usar before_assets_precompile: o after_assets_precompile: — y así sucesivamente.

Si no hay hook: restart (por ejemplo), entonces after_restart: simplemente no se activará.


:white_check_mark: Hooks conocidos que existen en las plantillas predeterminadas

De las plantillas predeterminadas templates/*.yml enviadas con Discourse Docker:

Nombre del hook Uso común Funciona con
code Etapa principal de configuración para clonación de plugins, ediciones de archivos personalizados, etc. before_code: / after_code:
assets_precompile Después de que los activos de Rails se compilan (por ejemplo, subir a S3, limpiar) after_assets_precompile:
web Para ajustes de último minuto antes de que arranque el proceso web before_web:

A menudo verás after_code: y before_code: usados en ejemplos de instalación de plugins — estos son los únicos necesarios en la mayoría de las configuraciones.


:cross_mark: Hooks que no existen por defecto

Nombres como after_restart o after_post_boot no corresponden a ningún hook: dentro de las plantillas estándar, por lo que Pups no sabe dónde adjuntarlos.
No se activarán a menos que agregues un paso hook: restart coincidente en una plantilla personalizada.


:toolbox: Cómo encontrar todos los hooks disponibles en tu sistema

Desde tu carpeta /var/discourse, ejecuta:

grep -R "hook:" -n templates/ samples/

Eso listará cada nombre de “hook” compatible con las plantillas que incluyes actualmente.
Cualquier cosa que encuentres allí se puede usar como before_<nombre>: o after_<nombre>: dentro de tu bloque hooks:.


:blue_book: Referencia

Este comportamiento se explica brevemente en el README de Pups (la herramienta de gestión de configuración utilizada por la configuración Docker de Discourse):

“Los hooks son puntos en las plantillas que permiten inyectar comandos antes o después de un paso etiquetado con hook:.”


:puzzle_piece: En la práctica

  • Usa after_code: para la mayoría de los comandos de shell personalizados (como instalaciones de plugins).
  • Para cosas que deberían ocurrir al arrancar o reiniciar el contenedor, usa un pequeño script de inicio o una tarea de supervisord en lugar de inventar nuevos nombres de “hooks”.
  • Para agregar tu propio tipo de “hook”, crea una nueva plantilla con una entrada hook: algo personalizada, luego apúntala desde app.yml.

TL;DR:
Solo existen los nombres de “hooks” que realmente aparecen como entradas hook: en tus plantillas.
En el Discourse Docker predeterminado, esos son básicamente code, assets_precompile y web.

2 Me gusta

Como referencia, creo que el repositorio de pups está aquí:

@Ethsim2 No veo nada sobre

Quizás deberías revisar la respuesta de IA antes de publicarla :slightly_smiling_face:.

Del README:

Ejecuta comandos antes y después de un comando específico definiendo un hook.

1 me gusta

¿Qué tal?

Los hooks te permiten ejecutar comandos personalizados antes o después de un paso de compilación específico, definiendo before_<nombre>: o after_<nombre>: correspondientes a una etiqueta hook: <nombre> en una plantilla.

1 me gusta

No creo que los hooks te vayan a ayudar. ¿Estás diciendo que cuando ejecutas el actualizador web tu contenedor se desconecta de la red de docker?

Estoy bastante seguro de que el actualizador web no reinicia el contenedor; así es como puede ejecutarse sin apagar Discourse.

1 me gusta

Esto es correcto.

También cabe señalar que los hooks se ejecutan dentro del contenedor, para construir la imagen de discourse. Nada allí se ejecuta en el host, y no hay forma a través de las funciones del lanzador de recrear o destruir redes de docker.

Quizás sería mejor explicar qué problema estás encontrando en tu alojamiento para que tengamos una mejor comprensión de lo que intentas resolver.

1 me gusta

Solo se actualizó a través de la CLI y eso se desconecta de la red de Docker, pero eso es solo porque el contenedor se reinicia a partir de ese punto. Intentaré con el actualizador web, ya que aún no lo he probado con esta configuración. Pensé que el mismo comportamiento ocurriría aquí también, pero si el actualizador web no apaga los contenedores, entonces realmente no hay nada de qué preocuparse. La razón por la que dije todo esto fue porque vi que la gente tenía problemas al ejecutar el actualizador web en ese momento. pero intentaré con el actualizador y veré cómo va.

¡Jonnyboy! ¡Los iPhones son geniales!