Welche Hooks kann ich in app.yml verwenden?

Hallo, ich versuche, einen Hook einzurichten, um automatisch eine Verbindung zu meinem Docker-Netzwerk herzustellen, wenn Discourse neu startet oder nach dem Build wieder hochfährt. Dies dient dazu, den Admin-Web-Updater nutzen zu können, wenn möglich, aber ich versuche herauszufinden, wie ich das am besten bewerkstellige. Die Dokumentation sagt nicht wirklich etwas über die Hook-Typen aus, die ich verwenden kann, und die Suche nach Hooks wie after_post_boot und after_restart bringt nichts. Funktionieren diese Hooks nicht mehr und wenn ja, warum? Hier ist mein Hook-Code.

hooks:

Beginn benutzerdefinierter Netzwerk-Hook

after_restart:

  • exec:
    cmd:
  • bash
  • “-c”
  • |

Verbindung von Discourse zum benutzerdefinierten Docker-Netzwerk herstellen, falls noch nicht verbunden

NETWORK_NAME=“proxy”
CONTAINER_NAME=$(hostname)

        # Netzwerk erstellen, falls es nicht existiert
        if ! docker network inspect "$NETWORK_NAME" >/dev/null 2>&1; then
          echo "Erstelle Docker-Netzwerk: $NETWORK_NAME"
          docker network create "$NETWORK_NAME"
        fi

        # Container mit dem Netzwerk verbinden (ignorieren, falls bereits verbunden)
        echo "Verbinde $CONTAINER_NAME mit $NETWORK_NAME..."
        docker network connect "$NETWORK_NAME" "$CONTAINER_NAME" 2>/dev/null || true

        echo "Netzwerkverbindung abgeschlossen."

Ende benutzerdefinierter Netzwerk-Hook

In app.yml gibt es keine feste globale Liste von Hook-Typen.
Hooks werden dynamisch von Pups bereitgestellt, und Sie können sich nur an die Hooks anhängen, die in den von Ihnen enthaltenen Vorlagen vorhanden sind.


:magnifying_glass_tilted_left: Funktionsweise

Wenn Sie etwas wie folgt sehen:

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

funktioniert das, weil die Vorlagen einen Schritt wie diesen enthalten:

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

Pups ermöglicht es Ihnen, Befehle vor oder nach einem dieser definierten Hook-Punkte anzuhängen.
Wenn eine Vorlage also hook: code definiert, können Sie before_code: oder after_code: verwenden.
Wenn sie hook: assets_precompile definiert, können Sie before_assets_precompile: oder after_assets_precompile: verwenden – und so weiter.

Wenn es kein hook: restart (zum Beispiel) gibt, wird after_restart: einfach nicht ausgelöst.


:white_check_mark: Hooks, die in den Standardvorlagen bekannt sind

Aus den Standardvorlagen templates/*.yml, die mit Discourse Docker geliefert werden:

Hook-Name Häufige Verwendung Funktioniert mit
code Haupt-Setup-Phase für Plugin-Klone, benutzerdefinierte Dateibearbeitungen usw. before_code: / after_code:
assets_precompile Nach der Kompilierung von Rails-Assets (z. B. Upload nach S3, Bereinigung) after_assets_precompile:
web Für letzte Anpassungen, bevor der Webprozess gestartet wird before_web:

Sie werden oft after_code: und before_code: in Plugin-Installationsbeispielen sehen – diese sind in den meisten Setups die einzigen, die benötigt werden.


:cross_mark: Hooks, die standardmäßig nicht existieren

Namen wie after_restart oder after_post_boot entsprechen keinem hook: innerhalb der Standardvorlagen, sodass Pups nicht weiß, wo sie angehängt werden sollen.
Sie werden nicht ausgelöst, es sei denn, Sie fügen einen passenden hook: restart-Schritt in einer benutzerdefinierten Vorlage hinzu.


:toolbox: So finden Sie alle auf Ihrem System verfügbaren Hooks

Führen Sie von Ihrem /var/discourse-Ordner aus Folgendes aus:

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

Dies listet jeden Hook-Namen auf, der von den Vorlagen unterstützt wird, die Sie derzeit einschließen.
Alles, was Sie dort finden, kann als before_<name>: oder after_<name>: in Ihrem hooks:-Block verwendet werden.


:blue_book: Referenz

Dieses Verhalten wird kurz in der Pups README (dem Konfigurationsmanagement-Tool, das von Discourse’s Docker-Setup verwendet wird) erklärt:

„Hooks sind Punkte in Vorlagen, die es ermöglichen, Befehle vor oder nach einem Schritt einzufügen, der mit hook: gekennzeichnet ist.“


:puzzle_piece: In der Praxis

  • Verwenden Sie after_code: für die meisten benutzerdefinierten Shell-Befehle (wie Plugin-Installationen).
  • Für Dinge, die beim Containerstart oder -neustart geschehen sollen, verwenden Sie stattdessen ein kleines Startskript oder eine supervisord-Aufgabe, anstatt neue Hook-Namen zu erfinden.
  • Um Ihren eigenen Hook-Typ hinzuzufügen, erstellen Sie eine neue Vorlage mit einem benutzerdefinierten hook: something-Eintrag und zielen Sie dann von app.yml darauf ab.

TL;DR:
Nur die Hook-Namen, die tatsächlich als hook:-Einträge in Ihren Vorlagen erscheinen, existieren.
Im Standard-Discourse-Docker sind das im Grunde code, assets_precompile und web.

2 „Gefällt mir“

Als Referenz glaube ich, dass das Pups-Repository hier ist:

@Ethsim2 Ich sehe nichts über

Vielleicht solltest du die Antwort der KI durchsehen, bevor du sie postest :slightly_smiling_face: .

Aus der README:

Führe Befehle vor und nach einem bestimmten Befehl aus, indem du einen Hook definierst.

1 „Gefällt mir“

Wie wäre es damit?

Hooks ermöglichen die Ausführung benutzerdefinierter Befehle vor oder nach einem bestimmten Build-Schritt, indem before_<name>: oder after_<name>: definiert wird, die einem hook: <name>-Label in einem Template entsprechen.

1 „Gefällt mir“

Ich glaube nicht, dass Hooks dir helfen werden. Du sagst, dass sich dein Container vom Docker-Netzwerk trennt, wenn du den Web-Updater ausführst?

Ich bin ziemlich sicher, dass der Web-Updater den Container nicht neu startet – so kann er laufen, ohne Discourse herunterzufahren.

1 „Gefällt mir“

Das ist korrekt.

Es sollte auch angemerkt werden, dass Hooks innerhalb des Containers ausgeführt werden, um das Discourse-Image zu erstellen. Nichts davon wird auf dem Host ausgeführt, und es gibt keine Möglichkeit, Docker-Netzwerke über Launcher-Funktionen neu zu erstellen oder zu zerstören.

Vielleicht wäre es besser zu erklären, auf welches Problem Sie beim Hosting stoßen, damit wir besser verstehen, was Sie zu lösen versuchen.

1 „Gefällt mir“

Nur über die CLI aktualisiert, die die Verbindung zum Docker-Netzwerk trennt, aber das liegt nur daran, dass der Container von diesem Punkt aus neu startet. Ich werde den Web-Updater ausprobieren, da ich das mit diesem Setup noch nicht versucht habe. Ich dachte, das gleiche Verhalten würde auch hier auftreten, aber wenn der Web-Updater die Container nicht herunterfährt, gibt es wirklich nichts zu befürchten. Der Grund, warum ich all das gesagt habe, war, dass ich gesehen habe, dass Leute Probleme hatten, als sie den Web-Updater zu diesem Zeitpunkt ausgeführt haben. Aber ich werde den Updater ausprobieren und sehen, wie es läuft.

Jonnyboy! iPhones rocken!