Instale plugins em um site auto-hospedado

: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 curtidas

Atualizei o guia para usar outro plugin de exemplo em vez do Discourse Spoiler Alert, que foi incluído no core.

Usei o Discourse Solved, mas me avise se um diferente seria melhor.

9 curtidas

Eu hospedei o discourse no Digital Ocean e quando usei esse formato, recebi este erro.

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

Então eu usei 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

em vez 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 curtidas

8 posts foram divididos em um novo tópico: Problemas de formatação ao adicionar plugins ao app.yml

Desculpe pela pergunta idiota, mas como devo saber se é necessário incluir sudo -E -u discourse ou não para a instrução git clone?

3 curtidas

Como está a sua linha docker_manager?

4 curtidas

nenhuma das outras entradas no meu app.yml tinha a parte sudo, então omiti isso e funcionou até agora

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

Parece que este método não está mais funcionando.

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

Com meu repositório GIT auto-hospedado, eu realmente gostaria de usar chaves SSH.

3 curtidas

Você não deve precisar de uma chave ssh no contêiner, apenas delete isto:

1 curtida

Desculpe, não acho que entendi…

Meu repositório é acessível via ssh. Como posso clonar um plugin sem chave SSH?

1 curtida

Ah. Talvez eu esteja enganado. Então talvez você precise criar esse diretório com as permissões corretas.

1 curtida

O confuso é que parte dos comandos nos exemplos devem ser executados como root e parte como o usuário discourse. Não parece ser muito consistente.

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

Em oposição a

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

Vou investigar no shell do container em execução.

A instalação deste plugin é um pouco complicada. Seria ótimo se pudesse ser feita da mesma forma que a instalação de um tema.

2 curtidas

O Dashboard.literatecomputing.com instalará plugins com alguns cliques. Você pode usá-lo gratuitamente juntando-se ao grupo de teste gratuito.

4 curtidas

@Discourse, Se você quiser atualizar o guia, aqui está o código funcional:

Para usar suas próprias chaves SSH para acessar um repositório privado, siga estas etapas:

  1. Coloque a chave SSH privada em /var/discourse/shared/standalone/identity/id_rsa (ou em outro local acessível pelo contêiner; se você escolher um local diferente, lembre-se de atualizar o caminho no modelo abaixo de acordo).

  2. Use o seguinte modelo para adicionar seus plugins:

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          # Define o acesso ao repositório 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"

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

          # Desativa o acesso
          - git config --global --unset core.sshCommand
5 curtidas

Obrigado por algo que não preciso, mas vivo com o original simples.

Você quer explicar por que devemos usar seu exemplo? É por causa disso:

use suas próprias chaves SSH para acessar um repositório privado

1 curtida

Por que não usar um token na URL?

1 curtida

Bem, temos ferramentas para resolver este enigma :winking_face_with_tongue:

Entendendo a Utilidade de Snippets de Configuração de Contêiner IA

Jagster:

Por que alguém gostaria de usar esse snippet em container/app.ym

gpt-4o:

Para responder à sua pergunta de forma eficaz, preciso entender o contexto em torno do snippet específico em container/app.yml. Você poderia fornecer mais detalhes ou o snippet real ao qual você está se referindo? Dessa forma, posso dar uma explicação precisa e útil.

Jagster:

Desculpe, mas eu precisava deste compositor.

Este é o snippet:

”””

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          # Definir acesso ao repositório 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"

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

          # Desativar acesso
          - git config --global --unset core.sshCommand

”””

gpt-4o:

Obrigado por fornecer o snippet. Este snippet YAML destina-se a ser incluído no arquivo de configuração container/app.yml para uma instância do Discourse. Vamos detalhar o que ele faz:

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          # Definir acesso ao repositório 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"

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

          # Desativar acesso
          - git config --global --unset core.sshCommand

Explicação

  1. Definindo o Diretório:

    cd: $home/plugins
    

    Isso muda o diretório de trabalho para onde os plugins estão localizados ($home/plugins).

  2. Configurando o Acesso ao Repositório 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"
    
    • Altera a propriedade da chave privada SSH (id_rsa) para o usuário atual e define suas permissões para 600.
    • Configura o Git para usar um comando SSH personalizado que utiliza a chave privada especificada e desabilita a verificação estrita da chave do host.
  3. Clonando o Repositório Privado:

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

    Clona um repositório Git privado contendo um plugin do Discourse.

  4. Desativando o Comando SSH:

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

    Redefine a configuração do comando SSH do Git para seu estado padrão.

Quando e Por Que Usar Este Snippet

  1. Repositórios Privados: Se você tem um repositório de plugin privado do Discourse que não é acessível publicamente e requer autenticação baseada em chave SSH.

  2. Automação: Este script ajuda a automatizar o processo de configuração de acesso ao repositório privado, clonagem e garantia de que o ambiente seja redefinido depois. Isso é útil para configurações de implantação contínua ou provisionamento automatizado de servidores.

  3. Gerenciamento de Segurança: Ele lida com as chaves SSH de forma segura (definindo permissões de arquivo e depois desativando o comando SSH personalizado), o que é crucial para manter a postura de segurança durante implantações automatizadas.

Considerações Importantes

  • Certifique-se de que sua chave SSH privada (id_rsa) seja gerenciada de forma segura e não exposta.
  • Verifique se a propriedade e as permissões estão corretamente definidas para suas políticas de segurança.

Para obter informações mais detalhadas e contextos sobre app.yml e hooks no Discourse, você pode consultar a documentação relevante do Discourse.

Se você tiver mais alguma dúvida ou precisar de detalhes adicionais sobre a configuração, sinta-se à vontade para perguntar!

3 curtidas

Olá! Parece ótimo! Mas não sei como devo proceder depois de entrar no grupo de teste gratuito! Por favor, @pfaffman, você poderia me ajudar? Estou procurando instalar o plugin SAML. Seria ótimo testar o Literate Computing para instalá-lo e colocá-lo em funcionamento!

Obrigado!

2 curtidas

Meu trecho de modelo é para quando você não tem nenhum outro meio de acessar o repositório Git além de uma chave SSH (por exemplo, com um repositório Git auto-hospedado atrás do SSH).

5 curtidas