Instale Discourse no CloudPanel

:warning: Este método de instalação não é oficialmente endossado. Use por sua conta e risco.

A equipe do Discourse recomenda apenas a instalação usando o guia de instalação oficial

:information_source: Esta é uma instalação sem suporte, adequada para quem tem experiência com o CloudPanel, é administrador de sistemas experiente, está confortável com Docker, proxies reversos e já completou com sucesso uma instalação padrão.

Por que o CloudPanel

Por que você pode querer instalar um Fórum Discourse em um VPS ou Servidor Dedicado rodando CloudPanel?

Aqui estão minhas razões:

Eu prefiro usar uma interface gráfica para administração do servidor e do site. Já usei a maioria dos painéis de controle de hospedagem web em algum momento.

Em comparação com os demais, o CloudPanel é muito leve e minimalista e descomplicado. Tem todos os recursos que preciso, apresentados de forma muito simples e intuitiva. E é isso. Não tem nada que eu não precise.

Eu desenvolvo, hospedo e gerencio muitos blogs Ghost, sites Wordpress, sites Drupal e outros tipos de sites, além de fóruns Discourse. Eu realmente preciso apenas de um servidor onde posso hospedar meus fóruns Discourse junto com meus blogs Ghost e meus sites Wordpress e Drupal. (Eu não quero pagar e manter um servidor separado para cada instância do Discourse.)

O CloudPanel inclui (direto da caixa) Nginx embutido e uma interface simples para configurar e gerenciar Proxies Reversos, que são necessários para rodar uma ou mais instâncias do Discourse no mesmo servidor ou junto com outros tipos de sites.

A equipe do Discourse (e a equipe do fórum Meta aqui) não oferece suporte para ambientes de servidor alternativos como Cpanel, Plesk ou (como neste caso) CloudPanel, ou outros que surgem a partir da linha de comando.

Então, pensei em compartilhar minha configuração e meu processo, caso haja outras pessoas que possam achar útil.

[Se alguém tentar este método, por favor, me avise como funcionou para você, ou se posso melhorar este tutorial! :heart_eyes:]

Instalar o Docker

No Putty (ou outro terminal), a partir do diretório raiz, execute:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu focal stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt-get install docker-ce docker-ce-cli docker-compose containerd.io

Criar um Site de Proxy Reverso no CloudPanel

→ Clicamos no botão + Adicionar Site

Para minha instância do Discourse, estou usando meu domínio noobish.me, então daqui para frente, sempre que vir isso nas instruções restantes, substitua noobish.me pelo seu domínio real (por exemplo, seusite.com)

→ Criamos um novo “Site de Proxy Reverso” no CloudPanel para o domínio onde queremos hospedar nosso fórum Discourse (obviamente, o registro A do DNS do domínio precisa estar apontando para o mesmo endereço IP do nosso CloudPanel.)

Preparar o Domínio e Configurar o SSL

Para meu site, estou usando os servidores de nomes do Cloudflare para apontar o domínio. No Cloudflare, configurei o SSL como Full ou Full (estrito).

Também criei uma Regra de Página do Cloudflare. Visite este post para saber o motivo.

Estou também usando um Certificado de Origem SSL gratuito do Cloudflare para meu domínio, que eu “Importei” no CloudPanel nas configurações do site “SSL/TLS” para aquele site (simplesmente colando tanto o Certificado quanto a Chave Privada que eu havia baixado para aquele nome de domínio da minha conta Cloudflare.)

Instalar o Discourse

De volta ao Putty (ou outro terminal), a partir do diretório raiz (c d Enter para voltar à raiz) → Instale a Instalação Padrão do Discourse usando estes comandos…

git clone https://github.com/discourse/discourse_docker.git /var/discourse

Enter

cd /var/discourse

Enter

chmod 700 containers

Copiar a Configuração Standalone

Agora copiamos o arquivo /var/discourse/standalone.yml para /var/discourse/containers/ como app.yml antes de editá-lo de acordo com as configurações do nosso site.

cp /var/discourse/samples/standalone.yml /var/discourse/containers/app.yml

Editar o arquivo app.yml

Além de modificar o arquivo app.yml de acordo com nossas configurações específicas do site, precisamos alterar 3 coisas a mais naquele arquivo antes de salvá-lo…

Na seção templates:, precisamos adicionar:

  - "templates/web.socketed.template.yml"

Como estou usando o Cloudflare, na seção templates:, também adiciono:

  - "templates/cloudflare.template.yml"

Na seção expose:, precisamos comentar:

  #- "80:80"   # http
  #- "443:443" # https

Na seção env:, precisamos adicionar:

   DISCOURSE_FORCE_HTTPS: true
Para referência, você pode Clicar Aqui para ver o conteúdo do meu app.yml funcional em noobish.me, onde estou usando tanto o Cloudflare quanto o Mailgun...
## este é o modelo de container Docker Discourse tudo-em-um, standalone
##
## Após fazer alterações neste arquivo, você DEVE reconstruir
## /var/discourse/launcher rebuild app
##
## TENHA *MUITO* CUIDADO AO EDITAR!
## ARQUIVOS YAML SÃO SUPER SUPER SENSÍVEIS A ERROS DE ESPAÇAMENTO OU ALINHAMENTO!
## visite http://www.yamllint.com/ para validar este arquivo conforme necessário

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/web.socketed.template.yml"
  - "templates/cloudflare.template.yml"

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Defina db_shared_buffers para no máximo 25% da memória total.
  ## será definido automaticamente pelo bootstrap com base na RAM detectada, ou você pode substituir
  db_shared_buffers: "4096MB"

  ## pode melhorar o desempenho de ordenação, mas adiciona uso de memória por conexão
  #db_work_mem: "40MB"

  ## Qual revisão do Git este container deve usar? (padrão: tests-passed)
  #version: tests-passed

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  DISCOURSE_FORCE_HTTPS: true

  ## Quantas solicitações web concorrentes são suportadas? Depende de memória e núcleos de CPU.
  ## será definido automaticamente pelo bootstrap com base nas CPUs detectadas, ou você pode substituir
  UNICORN_WORKERS: 8

  ## TODO: O nome de domínio ao qual esta instância do Discourse responderá
  ## Obrigatório. O Discourse não funcionará com um número IP puro.
  DISCOURSE_HOSTNAME: 'noobish.me'

  ## Descomente se quiser que o container seja iniciado com o mesmo
  ## hostname (opção -h) especificado acima (padrão "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Lista de e-mails separados por vírgula que serão feitos administradores e desenvolvedores
  ## no cadastro inicial, exemplo 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'admin@noobish.me'

  ## TODO: O servidor de e-mail SMTP usado para validar novas contas e enviar notificações
  # ENDEREÇO SMTP, nome de usuário e senha são obrigatórios
  # AVISO: o caractere '#' na senha SMTP pode causar problemas!
  DISCOURSE_SMTP_ADDRESS: smtp.mailgun.org
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: postmaster@noobish.me
  DISCOURSE_SMTP_PASSWORD:  pYdRLyQW
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (opcional, padrão true)
  #DISCOURSE_SMTP_DOMAIN: noobish.me    # (obrigatório por alguns provedores)
  DISCOURSE_NOTIFICATION_EMAIL: noreply@noobish.me    # (endereço para enviar notificações)

  ## O endereço CDN http ou https para esta instância do Discourse (configurado para buscar)
  ## veja https://meta.discourse.org/t/14857 para detalhes
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

  ## A chave de endereço IP do geolocalização Maxmind para consulta de endereço IP
  ## veja https://meta.discourse.org/t/-/137387/23 para detalhes
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## O container Docker é sem estado; todos os dados são armazenados em /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Plugins vão aqui
## veja https://meta.discourse.org/t/19157 para detalhes
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## Quaisquer comandos personalizados para executar após a construção
run:
  - exec: echo "Início dos comandos personalizados"
  ## Se quiser definir o endereço de e-mail 'De' para seu primeiro cadastro, descomente e altere:
  ## Após obter o primeiro e-mail de cadastro, recomente a linha. Só precisa rodar uma vez.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "Fim dos comandos personalizados"

Então salvamos e saímos do arquivo app.yml…

CTRL-X

y

Enter

Em seguida, definimos as permissões para o arquivo app.yml…

chmod o-rwx containers/app.yml

então…

Inicializar o App

cd /var/discourse
./launcher bootstrap app

Isso levará um tempo considerável. No final do processo de inicialização, você será solicitado a:

./launcher start app

Editar o Arquivo Vhost

Agora voltamos ao nosso CloudPanel e colamos o código abaixo no “Editor Vhost” para nosso site Discourse (sobrescrevendo o que já está lá). Obviamente, substitua seusite.com pelo seu domínio real.

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  {{ssl_certificate_key}}
  {{ssl_certificate}}
  server_name yoursite.com;
  {{root}}

  {{nginx_access_log}}
  {{nginx_error_log}}

  if ($scheme != "https") {
    rewrite ^ https://$host$uri permanent;
  }

  location ~ /.well-known {
    auth_basic off;
    allow all;
  }

  {{settings}}

  add_header Cache-Control no-transform;

  location / {
                proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
                proxy_set_header Host $http_host;
                proxy_http_version 1.1;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Real-IP $remote_addr;

  }
}

Reiniciar o Nginx

Em seguida, precisamos reiniciar o Nginx, o que podemos fazer clicando em um botão na Área Administrativa do CloudPanel…

Parabéns!

Agora, no nosso navegador, podemos ir ao URL do nosso site e executar o Assistente de Configuração do Discourse…

Coexistir em Paz

Agora posso auto-hospedar e gerenciar meu site Discourse junto com meus sites Ghost, Wordpress, Drupal e outros tipos, usando um painel de gerenciamento limpo e enxuto, com necessidade mínima de usar o terminal/linha de comando daqui para frente.


Para Instalar Instâncias Adicionais do Discourse…

3 curtidas

Você deve excluir essas etapas e criar o app.yml sem gerar esse erro. É confuso.

(Se você vai substituir o arquivo inteiro, por que copiar o exemplo?) A melhor coisa a fazer é dizer o que precisa ser alterado no exemplo existente. Parece que é o modelo de socket e forçar https.

Isso lhe dá duas cópias do postgres, que usa mais RAM do que um único postgres. Funciona, mas não é uma boa prática.

Há uma série de coisas que tornam este um mau exemplo a seguir e será muito difícil de dar suporte. Fico feliz que você tenha encontrado uma solução para você, mas não acho que este seja um bom caminho para as pessoas seguirem.

3 curtidas

Obrigado @pfaffman

Você está certo. Ele faz o trabalho, mas o procedimento é muito confuso. Está na ordem errada. Agradeço suas sugestões e vou corrigi-lo.

Você poderia esclarecer por que pensa isso?

Porque é complicado e é uma boa ideia apenas para pessoas que conseguem descobrir por si mesmas. É bastante ineficiente e, se o objetivo é apenas executar dois discursos, duas máquinas virtuais separadas são uma solução mais barata e fácil na maioria dos casos.

2 curtidas

Obrigado novamente @pfaffman – Simplifiquei o procedimento e removi a seção sobre a adição de um segundo site Discourse no mesmo servidor.

1 curtida

Recebi esta mensagem

sudo apt update \
sudo apt-get install docker-ce docker-ce-cli docker-compose containerd.io

uso: gpg [opções] --dearmor [arquivo]
curl: (23) Falha ao escrever corpo

Por quê?

Olá Antonio. Bem-vindo.

Isso parece um problema do Docker e não do Discourse. Você provavelmente terá mais sucesso pesquisando com seu sistema operacional e atualizando o docker-ce do que perguntando aqui.

Você está tentando usar o Discourse? Ou o CloudPanel?

1 curtida

Acabei de seguir o guia aqui. Executei o primeiro comando, para instalação do docker, e o servidor respondeu isto
o comando é:

1 curtida

Não deve haver barras invertidas no final de cada uma dessas linhas. A barra invertida escapa a nova linha, o que significa que o shell trata a próxima linha como uma continuação da mesma linha.

Neste caso, isso resultará em tentar executar isso como um único comando, que é de onde o erro está vindo:
sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo \"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu focal stable\"

Apenas remover essas barras invertidas no final das linhas resolverá isso:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu focal stable\" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt-get install docker-ce docker-ce-cli docker-compose containerd.io
2 curtidas

Obrigado, agora funciona bem

2 curtidas

Obrigado @Simon_Manning – Removi as barras invertidas no trecho de código no tutorial da postagem principal.

2 curtidas

Desculpe-me, agora tenho este erro: FAILED

Pups::ExecError: /usr/local/bin/ruby -e 'if ENV["DISCOURSE_SMTP_ADDRESS"] == "smtp.example.com"; puts "Aborting! Mail is not configured!"; exit 1; end' failed with return #<Process::Status: pid 112 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn'
exec failed with the params "/usr/local/bin/ruby -e 'if ENV[\"DISCOURSE_SMTP_ADDRESS\"] == \"smtp.example.com\"; puts \"Aborting! Mail is not configured!\"; exit 1; end'"
bootstrap failed with exit code 1
** 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.
214c73c4474ed59e7b6fb7f42143ce126d2b453022b08770da3af31ca2fdaaba

Não conheço o CloudPanel, mas as mensagens de erro parecem autoexplicativas:

'if ENV["DISCOURSE_SMTP_ADDRESS"] == "smtp.example.com"; puts "Aborting! Mail is not configured!"; exit 1; end'
'if ENV[\"DISCOURSE_SMTP_ADDRESS\"] == \"smtp.example.com\"; puts \"Aborting! Mail is not configured!\"; exit 1; end'\"

Parece que seu e-mail não foi configurado durante o ./discourse-setup ou dentro do app.yml (você pode editá-lo manualmente a qualquer momento). :thinking:

2 curtidas

Com licença a todos, sou professor da escola secundária Fermi e estou tentando instalar o Discourse Community para nossa escola. Como usamos painéis de nuvem, segui este guia, mas aparentemente algo está faltando. É possível obter ajuda e um guia mais detalhado para seguir? Mil agradecimentos.

1 curtida

Acho que usar uma instalação avançada pode não ser o que você procura se você não tiver muito conhecimento de sysadmin. Outro ponto importante a considerar é que tal instalação se enquadrará em unsupported-install, tornando menos provável que você receba ajuda aqui se encontrar problemas.

Se você tiver o orçamento e dependendo do tamanho da sua comunidade, pode ser melhor hospedar o Discourse em outro servidor e seguir a instalação padrão.

1 curtida

Desculpe, e para que serviria um serviço como este? Na minha opinião, talvez o guia não seja muito detalhado, ele é feito para administradores de sistemas, bastaria indicar os vários passos. De onde eu venho, diz-se: ninguém nasce já educado. Obrigado pela sua ajuda e pelo seu tempo.

1 curtida

É exatamente isso. É por isso que a instalação padrão foi recomendada.

E é por isso, @denvergeeks, que eu não achei que criar um guia como este fosse uma boa ideia em primeiro lugar. É difícil de escrever, difícil de manter, e você é a única pessoa que pode verificá-lo.

4 curtidas

Lamento, mas não concordo. Já uso o Cloud Panel com vários domínios, além disso, a comunidade Discourse ficaria em um subdomínio e, então, a premissa do autor fica muito clara (o guia é para quem usa o Cloud Panel com diferentes serviços instalados no VPS). Basta um pouco de esforço para detalhar tudo melhor. Afinal, compartilhar conhecimento é a base das comunidades, senão eu teria comprado um software já instalado e pronto para usar. De qualquer forma, não quero incomodar ninguém, se for possível obter ajuda, então obrigado, caso contrário, não os incomodarei novamente.

1 curtida

@denvergeeks Configurar o e-mail é fundamental para a operação normal e, embora haja um link para a instalação padrão, a forma como o guia está escrito atualmente contorna a configuração do e-mail, bem como outras informações diversas que podem ser importantes para certas configurações.

Eu me pergunto se valeria a pena substituir as seções Instalar Discourse até Bootstrap the App por algo mais parecido com:

Instalar e Configurar Discourse

Siga a instalação padrão através dos passos 1-6

do_stuff_currently_in_edit_the_app.yml

Reconstruir Discourse:

./launcher rebuild app

Em seguida, na seção Parabéns!, adicione uma linha após a captura de tela para dizer algo como “Continue com o restante da documentação de instalação padrão.” Essencialmente, refatorando o guia para fornecer etapas adicionais que complementam a instalação padrão, em vez de fornecer instruções de instalação alternativas.

Acho que as informações que você forneceu sobre o CloudPanel são muito úteis e as instruções são claras, o lado do Discourse poderia apenas se beneficiar de ter menos divergência da instalação padrão para torná-la mais segura, bem como a tag unsupported-install para deixar claro (mais claro) que aqui há dragões.

2 curtidas

[quote=“Antonio Cirillo, post:18, topic:266422, username:Antonio_Cirillo”]
Afinal, compartilhar conhecimento é a base das comunidades, caso contrário eu teria comprado um software já instalado e pronto para usar. De qualquer forma, não quero incomodar ninguém, se for possível obter ajuda, então obrigado, caso contrário, não os incomodarei mais.
[/quote]A discussão se afasta um pouco do tópico original, mas tenha certeza de que ficaremos felizes em ajudar. :slight_smile:

Resumindo:

Se você tem conhecimento básico de TI, pode seguir a instalação padrão. Você também precisará de um nome de domínio e configurar um serviço de envio de e-mail, como o Mailgun (tutorial aqui: Configure Mailgun for email when using Digital Ocean for DNS).

Note que geralmente não ajudamos em questões que estão fora do escopo deste fórum. Por exemplo, a pergunta “Como registro um nome de domínio?” não se encaixaria aqui.

Se você não tem conhecimento básico de TI e dependendo do seu orçamento, pode solicitar suporte pago em Marketplace.

Finalmente, você também pode dar uma olhada nos planos pagos gerenciados do Discourse, onde praticamente tudo será tratado por nós e você terá acesso à nossa equipe de suporte.

Além disso, saiba que oferecemos descontos para fins educacionais, já que você menciona que é para sua escola:

Existem descontos educacionais ou sem fins lucrativos?

Sim! Se você for legalmente reconhecido como uma instituição educacional, oferecemos um desconto de 85%. Se você for legalmente reconhecido como uma organização sem fins lucrativos isenta de impostos federais, oferecemos um desconto de 50%. Esses descontos se aplicam apenas aos nossos planos básico, pro e business, não podem ser combinados com outros descontos e devem ser pagos por cartão de débito/crédito mensal ou anualmente. Entre em contato conosco após iniciar seu teste e adicionaremos o desconto à sua conta.

4 curtidas