Installer des plugins sur un site auto-hébergé

: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 « J'aime »

J’ai mis à jour le guide pour utiliser un autre plugin d’exemple au lieu de Discourse Spoiler Alert, qui a été intégré au cœur de Discourse.

J’ai utilisé Discourse Solved, mais faites-moi savoir si un autre serait préférable.

9 « J'aime »

J’ai hébergé discourse sur Digital Ocean et quand j’ai utilisé ce format, j’ai eu cette erreur.

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

Ensuite, j’ai utilisé ce format

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

au lieu de

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 « J'aime »

8 messages ont été déplacées vers un nouveau sujet : Problèmes de mise en forme lors de l’ajout de plugins à app.yml

Désolé pour la question stupide, mais comment savoir s’il faut inclure sudo -E -u discourse ou non pour l’instruction git clone ?

3 « J'aime »

À quoi ressemble votre ligne docker_manager ?

4 « J'aime »

aucune des autres entrées de mon app.yml n’avait la partie sudo, je l’ai donc omise et cela a fonctionné jusqu’à présent.

5 « J'aime »
- exec: echo "Host github.com\n\tStrictHostKeyChecking no\n" >> /user/.ssh/config

Il semble que cette méthode ne fonctionne plus.

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

Avec mon dépôt GIT auto-hébergé, j’aimerais vraiment utiliser des clés SSH.

3 « J'aime »

Vous n’avez pas besoin d’une clé ssh dans le conteneur, supprimez simplement ceci :

1 « J'aime »

Désolé, je ne pense pas suivre…

Mon dépôt est accessible via SSH. Comment puis-je cloner un plugin sans clé SSH ?

1 « J'aime »

Oh. Peut-être que j’ai tort. Alors peut-être que vous devez créer ce répertoire avec les bonnes permissions m

1 « J'aime »

Ce qui est déroutant, c’est qu’une partie des commandes dans les exemples doivent être exécutées en tant que root et une partie en tant qu’utilisateur discourse. Cela ne semble pas très cohérent.

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

Par opposition à

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

Je vais creuser un peu dans le shell du conteneur en cours d’exécution.

L’installation de ce plugin est un peu compliquée. Ce serait formidable si elle pouvait être rendue identique à l’installation d’un thème.

2 « J'aime »

Dashboard.literatecomputing.com installera des plugins en quelques clics. Vous pouvez l’utiliser gratuitement en rejoignant le groupe d’essai gratuit.

4 « J'aime »

@Discourse, Si vous souhaitez mettre à jour le guide, voici le code fonctionnel :

Pour utiliser vos propres clés SSH afin d’accéder à un dépôt privé, suivez ces étapes :

  1. Placez la clé SSH privée dans /var/discourse/shared/standalone/identity/id_rsa (ou un autre emplacement accessible par le conteneur ; si vous choisissez un emplacement différent, n’oubliez pas de mettre à jour le chemin dans le modèle ci-dessous en conséquence).

  2. Utilisez le modèle suivant pour ajouter vos plugins :

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          # Définir l'accès au dépôt privé
          - 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"

          # Mes plugins privés
          - git clone git@example.com:repo/private-discourse-plugin.git

          # Annuler l'accès
          - git config --global --unset core.sshCommand
5 « J'aime »

Merci pour quelque chose dont je n’ai pas besoin, mais je vis avec le simple original.

Voulez-vous expliquer pourquoi nous devrions utiliser votre exemple ? Est-ce à cause de ceci :

utilisez vos propres clés SSH pour accéder à un dépôt privé

1 « J'aime »

Pourquoi ne pas simplement utiliser un jeton dans l’URL ?

1 « J'aime »

Eh bien, nous avons des outils pour résoudre cette énigme :winking_face_with_tongue:

Comprendre l'utilité des extraits de configuration de conteneur IA

Jagster :

Pourquoi quelqu’un voudrait-il utiliser cet extrait dans container/app.ym ?

gpt-4o :

Pour répondre efficacement à votre question, j’ai besoin de comprendre le contexte entourant l’extrait spécifique dans container/app.yml. Pourriez-vous s’il vous plaît fournir plus de détails ou l’extrait réel auquel vous faites référence ? De cette façon, je pourrai vous donner une explication précise et utile.

Jagster :

Désolé, mais j’avais besoin de ce compositeur.

Voici l’extrait :

”””

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          # Définir l'accès au dépôt privé
          - 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"

          # Mes plugins privés
          - git clone git@example.com:repo/private-discourse-plugin.git

          # Annuler l'accès
          - git config --global --unset core.sshCommand

”””

gpt-4o :

Merci d’avoir fourni l’extrait. Cet extrait YAML est destiné à être inclus dans le fichier de configuration container/app.yml pour une instance Discourse. Décomposons ce qu’il fait :

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          # Définir l'accès au dépôt privé
          - 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"

          # Mes plugins privés
          - git clone git@example.com:repo/private-discourse-plugin.git

          # Annuler l'accès
          - git config --global --unset core.sshCommand

Explication

  1. Définition du répertoire :

    cd: $home/plugins
    

    Ceci change le répertoire de travail vers l’emplacement des plugins ($home/plugins).

  2. Définition de l’accès au dépôt privé :

    - 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"
    
    • Change la propriété de la clé privée SSH (id_rsa) à l’utilisateur actuel et définit ses permissions à 600.
    • Configure Git pour utiliser une commande SSH personnalisée qui utilise la clé privée spécifiée et désactive la vérification stricte de la clé hôte.
  3. Clonage du dépôt privé :

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

    Clone un dépôt Git privé contenant un plugin Discourse.

  4. Annulation de la commande SSH :

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

    Réinitialise la configuration de la commande SSH de Git à son état par défaut.

Quand et pourquoi utiliser cet extrait

  1. Dépôts privés : Si vous avez un dépôt de plugin Discourse privé qui n’est pas accessible publiquement et nécessite une authentification basée sur une clé SSH.

  2. Automatisation : Ce script aide à automatiser le processus de configuration de l’accès au dépôt privé, de clonage et de réinitialisation de l’environnement par la suite. Ceci est utile pour les configurations de déploiement continu ou le provisionnement automatisé de serveurs.

  3. Gestion de la sécurité : Il gère les clés SSH en toute sécurité (en définissant les permissions de fichier puis en annulant la commande SSH personnalisée), ce qui est essentiel pour maintenir la posture de sécurité lors des déploiements automatisés.

Considérations importantes

  • Assurez-vous que votre clé SSH privée (id_rsa) est gérée en toute sécurité et n’est pas exposée.
  • Vérifiez que la propriété et les permissions sont correctement définies pour vos politiques de sécurité.

Pour plus d’informations et de contextes sur app.yml et les hooks dans Discourse, vous pouvez consulter la documentation Discourse pertinente.

Si vous avez d’autres questions ou si vous avez besoin de détails supplémentaires sur la configuration, n’hésitez pas à demander !

3 « J'aime »

Salut ! Ça a l’air super ! Mais je ne sais pas comment procéder après avoir rejoint le groupe d’essai gratuit ! S’il vous plaît, @pfaffman, pourriez-vous m’aider ? Je cherche à installer le plugin SAML. Ce serait formidable de tester Literate Computing pour l’installer et le faire fonctionner !

Merci !

2 « J'aime »

Mon extrait de modèle est destiné aux cas où vous n’avez aucun autre moyen d’accéder au dépôt Git qu’une clé SSH (par exemple, avec un dépôt Git auto-hébergé derrière SSH).

5 « J'aime »