Instalar plugins en un sitio autohospedado

: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 Me gusta

Actualicé la guía para usar otro plugin de ejemplo en lugar de Discourse Spoiler Alert, que se ha incluido en el núcleo.

Usé Discourse Solved, pero házmelo saber si uno diferente sería mejor.

9 Me gusta

Alojé Discourse en Digital Ocean y cuando usé ese formato me apareció este error.

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

Luego usé este formato

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

en lugar 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 Me gusta

8 publicaciones se dividieron en un nuevo tema: Problemas de formato al agregar plugins a app.yml

Disculpa la pregunta tonta, pero ¿cómo sé si es necesario incluir sudo -E -u discourse o no para la declaración git clone?

3 Me gusta

¿Cómo se ve tu línea docker_manager?

4 Me gusta

ninguna de las otras entradas en mi app.yml tenía la parte de sudo, así que la omití y hasta ahora ha funcionado.

5 Me gusta
- exec: echo "Host github.com\n\tStrictHostKeyChecking no\n" >> /user/.ssh/config

Parece que este método ya no funciona.

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

Con mi repositorio GIT autohospedado, me gustaría mucho usar claves SSH.

3 Me gusta

No deberías necesitar una clave ssh en el contenedor, solo elimina esto:

1 me gusta

Lo siento, no creo que te siga…

Mi repositorio es accesible a través de SSH. ¿Cómo puedo clonar un plugin sin clave SSH?

1 me gusta

Oh. Quizás me equivoqué. Entonces, tal vez necesites crear ese directorio con los permisos correctos m

1 me gusta

Lo confuso es que parte de los comandos en los ejemplos deben ejecutarse como root y parte como el usuario discourse. No parece ser muy consistente.

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

En contraposición a

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

Investigaré en el shell del contenedor en ejecución.

La instalación de este plugin es un poco complicada. Sería genial si se pudiera hacer lo mismo que instalar un tema.

2 Me gusta

Dashboard.literatecomputing.com instalará complementos con unos pocos clics. Puedes usarlo gratis uniéndote al grupo de prueba gratuito.

4 Me gusta

@Discourse, si deseas actualizar la guía, aquí tienes el código funcional:

Para usar tus propias claves SSH para acceder a un repositorio privado, sigue estos pasos:

  1. Coloca la clave SSH privada en /var/discourse/shared/standalone/identity/id_rsa (o en otra ubicación accesible por el contenedor; si eliges una ubicación diferente, recuerda actualizar la ruta en la plantilla a continuación en consecuencia).

  2. Usa la siguiente plantilla para agregar tus plugins:

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          # Establecer acceso a repositorio privado
          - 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"

          # Mis plugins privados
          - git clone git@example.com:repo/private-discourse-plugin.git

          # Desactivar acceso
          - git config --global --unset core.sshCommand
5 Me gusta

Gracias por algo que no necesito, pero vivo con lo simple original.

¿Quieres explicar por qué deberíamos usar tu ejemplo? ¿Es por esto:

usa tus propias claves SSH para acceder a un repositorio privado

1 me gusta

¿Por qué no usar simplemente un token en la URL?

1 me gusta

Bueno, tenemos herramientas para resolver este acertijo :winking_face_with_tongue:

Entendiendo la Utilidad de los Fragmentos de Configuración de Contenedores IA

Jagster:

¿Por qué alguien querría usar ese fragmento en container/app.ym?

gpt-4o:

Para responder a tu pregunta de manera efectiva, necesito entender el contexto del fragmento específico en container/app.yml. ¿Podrías proporcionar más detalles o el fragmento real al que te refieres? De esta manera, podré darte una explicación precisa y útil.

Jagster:

Lo siento, pero necesitaba este compositor.

Este es el fragmento:

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          # Establecer acceso al repositorio privado
          - 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"

          # Mis plugins privados
          - git clone git@example.com:repo/private-discourse-plugin.git

          # Anular acceso
          - git config --global --unset core.sshCommand

gpt-4o:

Gracias por proporcionar el fragmento. Este fragmento YAML está destinado a incluirse en el archivo de configuración container/app.yml para una instancia de Discourse. Analicemos lo que hace:

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          # Establecer acceso al repositorio privado
          - 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"

          # Mis plugins privados
          - git clone git@example.com:repo/private-discourse-plugin.git

          # Anular acceso
          - git config --global --unset core.sshCommand

Explicación

  1. Establecer Directorio:

    cd: $home/plugins
    

    Esto cambia el directorio de trabajo a donde se encuentran los plugins ($home/plugins).

  2. Establecer Acceso al Repositorio Privado:

    - 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"
    
    • Cambia la propiedad de la clave privada SSH (id_rsa) al usuario actual y establece sus permisos en 600.
    • Configura Git para usar un comando SSH personalizado que utiliza la clave privada especificada y deshabilita la verificación estricta de claves de host.
  3. Clonar Repositorio Privado:

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

    Clona un repositorio Git privado que contiene un plugin de Discourse.

  4. Anular Comando SSH:

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

    Restablece la configuración del comando SSH de Git a su estado predeterminado.

Cuándo y Por Qué Usar Este Fragmento

  1. Repositorios Privados: Si tienes un repositorio privado de plugins de Discourse que no es accesible públicamente y requiere autenticación basada en clave SSH.

  2. Automatización: Este script ayuda a automatizar el proceso de configuración del acceso al repositorio privado, clonarlo y asegurarse de que el entorno se restablezca después. Esto es útil para configuraciones de implementación continua o aprovisionamiento automatizado de servidores.

  3. Gestión de Seguridad: Maneja las claves SSH de forma segura (estableciendo permisos de archivo y luego anulando el comando SSH personalizado), lo cual es fundamental para mantener la postura de seguridad durante las implementaciones automatizadas.

Consideraciones Importantes

  • Asegúrate de que tu clave SSH privada (id_rsa) se gestione de forma segura y no se exponga.
  • Verifica que la propiedad y los permisos se establezcan correctamente según tus políticas de seguridad.

Para obtener información y contextos más detallados sobre app.yml y los hooks en Discourse, puedes consultar la documentación relevante de Discourse.

Si tienes alguna otra pregunta o necesitas detalles adicionales sobre la configuración, ¡no dudes en preguntar!

3 Me gusta

¡Hola! ¡Suena genial! ¡Pero no sé cómo debo proceder después de unirme al grupo de prueba gratuita! Por favor, @pfaffman, ¿podrías ayudarme? Estoy buscando instalar el complemento SAML. ¡Sería genial probar Literate Computing para instalarlo y ponerlo en marcha!

¡Gracias!

2 Me gusta

Mi fragmento de plantilla es para cuando no tienes ningún otro medio de acceder al repositorio Git además de una clave SSH (por ejemplo, con un repositorio Git autoalojado detrás de SSH).

5 Me gusta