Configuração Multisite com Let's Encrypt e sem Reverse Proxy

Estas instruções devem ser consideradas beta e para aqueles familiarizados com uma configuração padrão

Mas neste momento (2023.02.11) estas instruções não funcionam!! (Veja Set up Let’s Encrypt with multiple domains / redirects para saber como atualizar a configuração letsencrypt para adicionar a parte fullpath. Vou atualizar isso para refletir essas mudanças em breve.)

Desenvolvi este guia há algumas semanas, mas preciso que alguém teste e veja se funciona para outra pessoa. Por favor, responda se tentar e me diga se funciona e se algo não está claro.

E vamos ao show. . .

Este guia documenta amplamente como configurar uma configuração de múltiplos sites com 2 hosts adicionais (3 no total).

Assume-se que você tem uma Instalação Padrão Oficial do Discourse funcional ou uma instalação de 2 contêineres (Move from standalone container to separate web and data containers).

Nome de domínio para o site principal

Subdomínio para o 2º site

Subdomínio para o 3º site

Senha do banco de dados (a mesma que DISCOURSE_DB_PASSWORD) ou discourse em app.yml

Para simplificar, isto é para um site principal chamado =domain=, com dois sites adicionais =two=.=domain= e =three=.=domain=. Você pode usar os nomes que quiser, mas para este modelo, não ter um nome curto (para o nome do banco de dados e título do sub-fórum) e nome de host completo diferentes é um pouco mais fácil.

adicione em hooks após os plugins em app.yml ou web_only.yml

  before_bundle_exec:
    - file:
        path: $home/config/multisite.yml
        contents: |
         =two=:
           adapter: postgresql
           database: =two=
           pool: 25
           timeout: 5000
           host: data
           password: NThmZTNjZjZhOTczNmVj
           host_names:
             - =two=.=domain=
         =three=:
           adapter: postgresql
           database: =three=
           pool: 25
           timeout: 5000
           host: data
           password: NThmZTNjZjZhOTczNmVj
           host_names:
             - =three=.=domain=

  after_db_migrate:
    - exec: cd /var/www/discourse && sudo -E -u discourse bundle exec rake multisite:migrate

  after_ssl:
   # diga ao letsencrypt quais certificados adicionais obter
    - replace:
        filename: "/etc/runit/1.d/letsencrypt"
        from: /-d =domain= /
        to: "-d =domain= -d =two=.=domain= -d =three=.=domain="
        global: true
   # não redirecione todos os hosts de volta para o nome de domínio principal
    - replace:
        filename: "/etc/nginx/conf.d/discourse.conf"
        from: /if \\(\\$http_host[^\\}]*\\}/m
        to: ""

Adicione à seção after_postgres em app.yml ou data.yml

  - exec: sudo -u postgres createdb =two= || exit 0
    - exec:
        stdin: |
          grant all privileges on database =two= to discourse;
        cmd: sudo -u postgres psql =two=
        raise_on_fail: false

    - exec: /bin/bash -c 'sudo -u postgres psql =two= <<< "alter schema public owner to discourse;"'
    - exec: /bin/bash -c 'sudo -u postgres psql =two= <<< "create extension if not exists hstore;"'
    - exec: /bin/bash -c 'sudo -u postgres psql =two= <<< "create extension if not exists pg_trgm;"'
    - exec: sudo -u postgres createdb =three= || exit 0
    - exec:
        stdin: |
          grant all privileges on database =three= to discourse;
        cmd: sudo -u postgres psql =three=
        raise_on_fail: false
    - exec: /bin/bash -c 'sudo -u postgres psql =three= <<< "alter schema public owner to discourse;"'
    - exec: /bin/bash -c 'sudo -u postgres psql =three= <<< "create extension if not exists hstore;"'
    - exec: /bin/bash -c 'sudo -u postgres psql =three= <<< "create extension if not exists pg_trgm;"'

Depois disso,

./launcher rebuild app

ou

./launcher rebuild data
./launcher rebuild web_only
10 curtidas

Acabei de testar, na verdade testei duas vezes porque não acreditei que funcionou sem problemas na primeira tentativa já :smile: Tudo o que fiz foi copiar, ajustar os domínios e a senha e depois colar nos arquivos respectivos de uma instalação nova com 2 containers. :ok_hand:

Aguardo feedback sobre se algo não está claro; apenas precisei refletir um pouco sobre este parágrafo:

Parece sugerir que uma configuração de 2 containers é necessária para seguir o tutorial, mas não é. E não entendi por que há um link para a postagem 48 do tópico, em vez da postagem inicial.

2 curtidas

Obrigado! Vou dar uma olhada. Ambos parecem ser do tipo de descuido que eu esperava que você me avisasse!

EDIT: Obrigado! Eu havia copiado descuidadamente minha localização atual no tópico de 2 contêineres, então corrigi isso e alterei o texto para dizer que funcionará com qualquer instalação funcional.

Obrigado!

2 curtidas

Oi

Comecei com uma instalação padrão do Discourse (no DigitalOcean) e depois configurei o nginx (usando estas instruções), pois queria ter alguns sites Drupal no mesmo droplet.

Se eu quiser ter outra instância do Discourse, devo seguir o que está acima?

Ou seria melhor seguir este guia?

Obrigado!
/Sifaan

Estas instruções são para o caso de não usar um proxy reverso. Recomendo que você siga Configuração de multisite com Docker. As instruções que você linkou podem funcionar, mas recomendo que você siga primeiro o que está aqui.

2 curtidas

Obrigado; notei que com isso ambos os sites usariam a mesma configuração SMTP :frowning:
há uma maneira de contornar isso?
ou seria melhor seguir o outro guia (parece que pode exigir algum trabalho para colocar o site existente na rede Docker)

alternativamente, é possível instalar outra base de código, digamos /var/discourse2?
(vai me custar cerca de 500 MB, mas vale a pena se me poupar essa dor de cabeça)

Sim.

Não use multisite.

Sim, mas você só precisa criar uma instalação com 2 contêineres e, em seguida, ter um web_only2.yml. (Acho que é possível ter 2 arquivos no estilo app.yml, mas aí você estaria executando desnecessariamente duas instâncias do PostgreSQL). Acredito, no entanto, que você precise de duas instâncias do Redis.

3 curtidas

Obrigado; como não estou muito familiarizado com a separação dos contêineres de dados e web, criei outro contêiner independente seguindo estas diretrizes (e os certificados criados pelo certbot parecem estar funcionando). No entanto, atualmente parece haver um problema com a configuração do Mailgun: ele envia e-mails de ativação para o Gmail, mas qualquer e-mail hospedado no meu registrador (DreamHost) está falhando :frowning:

Quanto de carga adicional o instância extra do Postgres causaria?
Li seu post sobre a separação e tentarei fazer isso se a economia for significativa.

Provavelmente não muito. Apenas um pouco de RAM. Tenho pouca ideia de quanto.

1 curtida

Recentemente, tenho tentado fazer isso, mas estou com dificuldades em alguns pontos do guia:

  1. Não consigo encontrar a senha do banco de dados (ou para que ela é usada no arquivo).
  2. Meu arquivo app.yml não continha originalmente uma seção after_postgres, então adicionei uma sob hooks para ficar igual aos outros (after_ssl, after_db_migrate, etc.). Se isso estiver na seção errada, por favor, me avise; sou completamente novo nesse tipo de coisa.
  3. Quando verifico a sintaxe do arquivo YAML em http://www.yamllint.com/, recebo o erro (<unknown>): did not find expected key while parsing a block mapping na linha onde coloquei a seção after_postgres dentro da seção hooks.

Se você puder esclarecer os passos para editar o arquivo app.yml, ficaria muito agradecido.

2 curtidas

Talvez você não precise de uma senha se estiver usando uma configuração de único contêiner (um post anterior sugere isso).

Adicionar a seção como você sugeriu deve funcionar.

Não consigo identificar exatamente o que pode estar errado. Vou tentar dar uma olhada mais de perto em alguns dias.

1 curtida

Estou pensando em configurar isso, pois meu amigo e eu queremos testar alguns fóruns diferentes antes de decidirmos se queremos investir mais neles, possivelmente tendo hospedagem separada e tal.

Eu estava pensando em tê-los em domínios diferentes. Entendo que isso pode causar um pouco de confusão, pois as pessoas receberão e-mails apenas do endereço SMTP principal, no entanto, você sabe se domínios separados criariam outros problemas?

O Discourse tem um único domínio para todos os seus clientes empresariais e padrão. Você pode definir o endereço de e-mail de notificação como desejar, como nomecurto@qualquermemail.com.

2 curtidas

Fico muito feliz em saber disso, obrigado!

1 curtida

Olá, primeiramente obrigado pelo tutorial.

Infelizmente, tenho um problema ao executar múltiplos sites do Discourse em um único servidor/IP.
Primeiro, segui a documentação para configurar um site independente e foi bem-sucedido.
(por exemplo, test.john.com - um subdomínio redirecionado para o IP único)
Agora, quando tentei adicionar mais sites do Discourse (por exemplo, test.joe.com e test.doe.com - outros subdomínios de outros sites).
Tentei seguir seus passos, mas não obtive sucesso e agora estou perdido.

Algumas perguntas:

  1. Como esses dois sites adicionais serão instalados? Como copiar o /standalone.yml para o diretório containers e renomeá-lo? E apenas fazer a instalação regular? (por exemplo, ./launcher rebuild joe)
  2. Sua instrução afirma que as alterações devem ser feitas no app.yml, anexando todo o código acima - que presumo que será adicionado ao arquivo do primeiro site instalado com sucesso (test.john.com)?

Além daqueles no diretório container, criei um config/multisite.yml e este é o meu código:

secondsite:
  adapter: postgresql
  database: b_discourse
  username: postgres
  password: postgres
  host: dbhost
  pool: 5
  timeout: 5000
  host_names:
    - test.joe.com
...
...
# e a configuração do terceiro site

No entanto, não tenho certeza se há outras coisas que preciso configurar.

Agradeço qualquer resposta. Obrigado!

Não. Você adiciona as coisas ao app.yml conforme descrito. Isso criará o mutlisite.yml dentro do contêiner. Haverá uma única instância e funcionará para todos os domínios, dado que o DNS de todos eles aponta para lá. Isso não é para ter vários contêineres Discourse, um para cada nome de domínio.

Pelo que me lembro, essas instruções funcionaram como escritas. Basta adicionar as linhas ao seu app.yml e deve funcionar. Você não precisa mexer em nenhum outro arquivo.

1 curtida

Configuração de site único normal funciona perfeitamente. Sem problemas.
Mas tentei muitas combinações para multissite. Configuração de app.yml única ou separada por web_only.yml, data.yml etc… Tentei outras dicas em Configuração de multissite com Docker ou Mover de contêiner autônomo para contêineres web e de dados separados.

Quanto à parte de migração, todas as combinações sempre falharam… >> bundle exec rake multisite:migrate

********************** última parte do processo**************************
2023-02-11 17:50:43.853 UTC [61] LOG: desligando
162:M 11 Fev 2023 17:50:43.866 # Usuário solicitou desligamento...
162:M 11 Fev 2023 17:50:43.866 * Salvando o snapshot RDB final antes de sair.
162:M 11 Fev 2023 17:50:43.881 * DB salvo em disco
162:M 11 Fev 2023 17:50:43.882 # Redis está pronto para sair, tchau tchau...
2023-02-11 17:50:44.007 UTC [57] LOG: sistema de banco de dados está desligado


FALHOU
--------------------
Pups::ExecError: cd /var/www/discourse &amp;&amp; sudo -E -u discourse bundle exec rake multisite:migrate falhou com retorno #&lt;Process::Status: pid 582 exit 1&gt;
Localização da falha: /usr/local/lib/ruby/gems/3.1.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn'
exec falhou com os parâmetros "cd /var/www/discourse &amp;&amp; sudo -E -u discourse bundle exec rake multisite:migrate"
bootstrap falhou com código de saída 1
** FALHA AO INICIALIZAR ** por favor, role para cima e procure por mensagens de erro anteriores, pode haver mais de uma.
./discourse-doctor pode ajudar a diagnosticar o problema.

Verifiquei o que foi criado e o que não foi criado até a falha.
Bancos de dados de subdomínios são criados, mas a migração falhou. Configurações nginx de subdomínios ou multisite.yml não puderam ser criadas quando verifiquei as pastas overlay2 ou em qualquer lugar.

./launcher bootstrap,destroy,start,stop,rebuild ou configuração inicial muitas vezes … Tentei todos os comandos, mas nada aconteceu… :slight_smile:

Este tutorial ainda é válido para v3.1.0.beta 2 ou o que eu posso estar perdendo?
Alguma ideia, por favor?

1 curtida

Não. Algo sobre o Let’s Encrypt mudou em algum momento. Vou pedir para você dar uma olhada mais de perto em tudo o que precisa ser alterado dentro do contêiner para lidar com vários domínios.

1 curtida

Estou usando este método e ele funciona bem. Atualmente não tenho https ativado, então não posso comentar sobre as dificuldades do Let’s Encrypt.

Tenho usado essa configuração por anos com meus servidores de staging. No entanto, desde a atualização para 3.5.0.beta5-dev, sou redirecionado para o site principal sempre que insiro um subdomínio.

Fiquei tão feliz por não ter que lidar com toda a questão de certificação. Mas agora estou bem perdido, existem ferramentas para depurar o que está acontecendo?

1 curtida