Plugins auf einer selbstgehosteten Website installieren

:warning: This guide assumes that you have a self-hosted standard installation. We only support the standard method of install here, so these instructions assume you have a standard install.

:warning: This guide only applies to self-hosted Discourse instances. If you are using a managed hosting service, the available plugins are controlled by your hosting provider. For example, on our hosting these specific plugins are available by hosting tier.

In this tutorial, we’ll install the Discourse Solved plugin.

This tutorial requires an understanding of how to use GitHub repos, specifically, how to get or copy the git clone URL and how to edit YAML (*.yml) files via the terminal using nano, specifically how to save and exit on nano. YAML files strongly follow indentations, so be sure to respect these as you copy and paste and edit the necessary *.yml for your Discourse instance.

  • Copy the plugin’s GitHub git clone url.

  • Access your container’s app.yml file (present in /var/discourse/containers/)

    cd /var/discourse
    nano containers/app.yml
    
  • Add the plugin’s repository URL to your container’s app.yml file:

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

    Add the plugin’s git clone url just below the line containing git clone https://github.com/discourse/docker_manager.git)

    Follow the existing format of the docker_manager.git line; if it does not contain sudo -E -u discourse then insert - git clone https://github.com/discourse/discourse-solved.git.

  • Rebuild the container:

    cd /var/discourse
    ./launcher rebuild app
    

    That’s it, you’ve successfully installed the Discourse Solved plugin on your Discourse instance!


If your plugin is hosted in a private repository

You must use an OAuth token:

With the OAuth token, you can install your plugin in the same way as a public repo, and you don’t need to create a SSH key.

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
              - sudo -E -u discourse git clone https://<token>@github.com/owner/repo.git

We strongly advise you to use OAuth tokens for plugins in private repositories. However, if you cannot, see below.

SSH Key Private Install Steps
run:
  - exec: echo "Beginning of custom commands"
  
  - exec: cd /var/www/discourse && sudo -u discourse bundle install --deployment --without test --without development
  - exec: echo "Host github.com\n\tStrictHostKeyChecking no\n" >> /user/.ssh/config
  - file:
      path: /user/.ssh/id_rsa
      chmod: 600
      contents: |
        -----BEGIN RSA PRIVATE KEY-----
        MIIEogIBAAKCAQEArCQG213utzqE5YVjTVF5exGRCkE9OuM7LCp/FOuPdoHrFUXk
           .... etc ....
        -----END RSA PRIVATE KEY-----
  - file:
      path: /user/.ssh/id_rsa.pub
      chmod: 600
      contents: ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAklOUpkDHrfHY17SbrmTIpNLTGK9Tj .... etc .... user@discourse
  - exec: cd $home/plugins && git clone git@github.com:SecretOrg/secret-plugin.git
  - exec: cd $home && sudo -E -u discourse bundle exec rake db:migrate
  - exec: cd $home && rm -fr tmp/cache
  - exec: cd $home &&  sudo -E -u discourse bundle exec rake assets:precompile
  - exec: rm /user/.ssh/id_rsa
  - exec: rm /user/.ssh/id_rsa.pub

  - exec: echo "End of custom commands"
  • Rebuild the container:
cd /var/discourse
./launcher rebuild app

Your private plugin should be installed on your Discourse instance.

How to uninstall a plugin

To remove a plugin, simply remove the - git clone https://github.com/... line from your app.yml file and rebuild your site via

cd /var/discourse
./launcher rebuild app
173 „Gefällt mir“

Ich habe den Leitfaden aktualisiert, um ein anderes Beispiel-Plugin anstelle von Discourse Spoiler Alert zu verwenden, das in den Kern integriert wurde.

Ich habe Discourse Solved verwendet, aber lassen Sie mich wissen, wenn ein anderes besser wäre.

9 „Gefällt mir“

Ich habe Discourse auf Digital Ocean gehostet und als ich dieses Format verwendet habe, wurde mir dieser Fehler angezeigt.

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse/plugins && sudo -E -u discourse git clone https://github.com/discourse/docker_manager.git - sudo -E -u discourse git clone https://github.com/discourse/discourse-solved.git failed with return #<Process::Status: pid 252 exit 129>
Location of failure: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec failed with the params {"cd"=>"$home/plugins", "cmd"=>["sudo -E -u discourse git clone https://github.com/discourse/docker_manager.git - sudo -E -u discourse git clone https://github.com/discourse/discourse-solved.git"]}
bootstrap failed with exit code 129
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.
2a49220a4ff35feac3c1a9a4a9c1cad1094bde4c9ba321975ebc9ae7ead2bbee

Dann habe ich dieses Format verwendet

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - sudo -E -u discourse git clone https://github.com/discourse/docker_manager.git && sudo -E -u discourse git clone https://github.com/discourse/discourse-solved.git

anstelle von

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - sudo -E -u discourse git clone https://github.com/discourse/docker_manager.git
          - sudo -E -u discourse git clone https://github.com/discourse/discourse-solved.git
4 „Gefällt mir“

8 Beiträge wurden in ein neues Thema aufgeteilt: Formatierungsprobleme beim Hinzufügen von Plugins zu app.yml

Entschuldigen Sie die dumme Frage, aber woher weiß ich, ob ich sudo -E -u discourse für die git clone-Anweisung einschließen muss oder nicht?

3 „Gefällt mir“

Wie sieht Ihre docker_manager-Zeile aus?

4 „Gefällt mir“

Keine der anderen Einträge in meiner app.yml hatten den sudo-Teil, also habe ich ihn weggelassen und es hat bisher funktioniert

5 „Gefällt mir“
- exec: echo "Host github.com\n\tStrictHostKeyChecking no\n" >> /user/.ssh/config

Es scheint, dass diese Methode nicht mehr funktioniert.

sh: 1: cannot create /user/.ssh/config: Directory nonexistent

Mit meinem selbst gehosteten GIT-Repository möchte ich wirklich SSH-Schlüssel verwenden.

3 „Gefällt mir“

Sie benötigen keinen SSH-Schlüssel im Container, löschen Sie einfach Folgendes:

1 „Gefällt mir“

Entschuldigung, ich glaube, ich verstehe nicht ganz…

Mein Repository ist per SSH erreichbar. Wie kann ich ein Plugin klonen, ohne einen SSH-Schlüssel zu verwenden?

1 „Gefällt mir“

Oh. Vielleicht liege ich falsch. Dann müssen Sie dieses Verzeichnis möglicherweise mit den richtigen Berechtigungen erstellen.

1 „Gefällt mir“

Verwirrend ist, dass ein Teil der Befehle in den Beispielen als root und ein Teil als Benutzer discourse ausgeführt werden soll. Das scheint nicht sehr konsistent zu sein.

  - exec: cd $home/plugins && git clone git@github.com:SecretOrg/secret-plugin.git

Im Gegensatz zu

  - exec: cd $home && sudo -E -u discourse bundle exec rake db:migrate

Ich werde im Shell des laufenden Containers nachforschen.

Die Installation dieses Plugins ist etwas kompliziert. Es wäre großartig, wenn es so gemacht werden könnte wie die Installation eines Themes.

2 „Gefällt mir“

Dashboard.literatecomputing.com installiert Plugins mit wenigen Klicks. Sie können es kostenlos nutzen, indem Sie der kostenlosen Testgruppe beitreten.

4 „Gefällt mir“

@Discourse, Wenn du die Anleitung aktualisieren möchtest, hier ist der funktionierende Code:

Um deine eigenen SSH-Schlüssel für den Zugriff auf ein privates Repository zu verwenden, befolge diese Schritte:

  1. Platziere den privaten SSH-Schlüssel in /var/discourse/shared/standalone/identity/id_rsa (oder an einem anderen Ort, auf den der Container zugreifen kann; wenn du einen anderen Ort wählst, denke daran, den Pfad in der folgenden Vorlage entsprechend zu aktualisieren).

  2. Verwende die folgende Vorlage, um deine Plugins hinzuzufügen:

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          # Private Repo-Zugriff einrichten
          - chown $(whoami) /shared/identity/id_rsa && chmod 600 /shared/identity/id_rsa
          - git config --global core.sshCommand "ssh -o StrictHostKeyChecking=no -o IdentitiesOnly=yes -i /shared/identity/id_rsa"

          # Meine privaten Plugins
          - git clone git@example.com:repo/private-discourse-plugin.git

          # Zugriff aufheben
          - git config --global --unset core.sshCommand
5 „Gefällt mir“

Danke für etwas, das ich nicht brauche, aber ich lebe mit dem Einfachen, Ursprünglichen.

Möchten Sie erklären, warum wir Ihr Beispiel verwenden sollten? Liegt es daran:

Verwenden Sie Ihre eigenen SSH-Schlüssel für den Zugriff auf ein privates Repository

1 „Gefällt mir“

Warum nicht einfach ein Token in der URL verwenden?

1 „Gefällt mir“

Nun, wir haben Werkzeuge, um dieses Rätsel zu lösen :winking_face_with_tongue:

Die Nützlichkeit von Container-Konfigurations-Snippets verstehen KI

Jagster:

Warum sollte jemand dieses Snippet in container/app.ym verwenden wollen?

gpt-4o:

Um Ihre Frage effektiv zu beantworten, muss ich den Kontext des spezifischen Snippets in container/app.yml verstehen. Könnten Sie bitte weitere Details oder das eigentliche Snippet angeben, auf das Sie sich beziehen? So kann ich Ihnen eine präzise und hilfreiche Erklärung geben.

Jagster:

Entschuldigung, aber ich brauchte diesen Komponisten.

Dies ist das Snippet:

”””

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          # Private Repo-Zugriff einrichten
          - chown $(whoami) /shared/identity/id_rsa &amp;&amp; chmod 600 /shared/identity/id_rsa
          - git config --global core.sshCommand "ssh -o StrictHostKeyChecking=no -o IdentitiesOnly=yes -i /shared/identity/id_rsa"

          # Meine privaten Plugins
          - git clone git@example.com:repo/private-discourse-plugin.git

          # Zugriff aufheben
          - git config --global --unset core.sshCommand

”””

gpt-4o:

Vielen Dank, dass Sie das Snippet bereitgestellt haben. Dieses YAML-Snippet soll in die Konfigurationsdatei container/app.yml für eine Discourse-Instanz aufgenommen werden. Lassen Sie uns aufschlüsseln, was es tut:

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          # Private Repo-Zugriff einrichten
          - chown $(whoami) /shared/identity/id_rsa &amp;&amp; chmod 600 /shared/identity/id_rsa
          - git config --global core.sshCommand "ssh -o StrictHostKeyChecking=no -o IdentitiesOnly=yes -i /shared/identity/id_rsa"

          # Meine privaten Plugins
          - git clone git@example.com:repo/private-discourse-plugin.git

          # Zugriff aufheben
          - git config --global --unset core.sshCommand

Erklärung

  1. Verzeichnis festlegen:

    cd: $home/plugins
    

    Dies ändert das Arbeitsverzeichnis zu dem Ort, an dem Plugins gespeichert sind ($home/plugins).

  2. Zugriff auf private Repositories einrichten:

    - chown $(whoami) /shared/identity/id_rsa &amp;&amp; chmod 600 /shared/identity/id_rsa
    - git config --global core.sshCommand "ssh -o StrictHostKeyChecking=no -o IdentitiesOnly=yes -i /shared/identity/id_rsa"
    
    • Ändert den Besitz des SSH-Privatschlüssels (id_rsa) auf den aktuellen Benutzer und setzt seine Berechtigungen auf 600.
    • Konfiguriert Git so, dass ein benutzerdefinierter SSH-Befehl verwendet wird, der den angegebenen Privatschlüssel verwendet und die Überprüfung des Host-Schlüssels deaktiviert.
  3. Privates Repository klonen:

    - git clone git@example.com:repo/private-discourse-plugin.git
    

    Klonen eines privaten Git-Repositorys, das ein Discourse-Plugin enthält.

  4. SSH-Befehl aufheben:

    - git config --global --unset core.sshCommand
    

    Setzt die Git-SSH-Befehlskonfiguration auf ihren Standardzustand zurück.

Wann und warum dieses Snippet verwendet werden sollte

  1. Private Repositories: Wenn Sie ein privates Discourse-Plugin-Repository haben, das nicht öffentlich zugänglich ist und eine SSH-Schlüssel-basierte Authentifizierung erfordert.

  2. Automatisierung: Dieses Skript hilft bei der Automatisierung des Prozesses der Einrichtung des Zugriffs auf das private Repository, des Klonens und der Sicherstellung, dass die Umgebung anschließend zurückgesetzt wird. Dies ist nützlich für Continuous-Deployment-Setups oder die automatisierte Serverbereitstellung.

  3. Sicherheitsmanagement: Es verwaltet die SSH-Schlüssel sicher (Festlegen von Dateiberechtigungen und anschließendes Aufheben des benutzerdefinierten SSH-Befehls), was für die Aufrechterhaltung der Sicherheit während automatisierter Bereitstellungen von entscheidender Bedeutung ist.

Wichtige Überlegungen

  • Stellen Sie sicher, dass Ihr privater SSH-Schlüssel (id_rsa) sicher verwaltet und nicht offengelegt wird.
  • Überprüfen Sie, ob Besitz und Berechtigungen gemäß Ihren Sicherheitsrichtlinien korrekt festgelegt sind.

Für detailliertere Informationen und Kontexte zu app.yml und Hooks in Discourse finden Sie relevante Discourse-Dokumentation.

Wenn Sie weitere Fragen haben oder zusätzliche Details zur Konfiguration benötigen, fragen Sie einfach!

3 „Gefällt mir“

Hallo! Das klingt großartig! Aber ich weiß nicht, wie ich vorgehen muss, nachdem ich der kostenlosen Testgruppe beigetreten bin! Können Sie mir bitte helfen, @pfaffman? Ich möchte das SAML-Plugin installieren. Es wäre großartig, Literate Computing zu testen, um es installiert und lauffähig zu bekommen!

Danke!

2 „Gefällt mir“

Mein Vorlagen-Snippet ist für Fälle gedacht, in denen Sie keine andere Möglichkeit haben, auf das Git-Repository zuzugreifen, als über einen SSH-Schlüssel (z. B. bei einem selbst gehosteten Git-Repository hinter SSH).

5 „Gefällt mir“