Acabei de compartilhar os passos que segui para configurar uma subpasta junto com o Cloudflare, especialmente quando o site principal já está no ar e o domínio raiz não pode ser apontado para o servidor do fórum (mesmo que temporariamente).
Pontos Chave
- O
mywebsite.comexistente atualmente aponta para1.1.1.1e está no ar - Devemos rotear
mywebsite.com/forum(e seus subdiretórios) para2.2.2.2 - Como durante a instalação do Discourse não podemos passar a validação do letsencrypt (que verifica se o domínio resolve para o servidor atual), devemos usar a validação DNS
Alterações em app.yml
Atualizações do Letsencrypt
Crie um novo template do letsencrypt e defina-o em app.yml de acordo com este tópico: LetsEncrypt DNS Validation Template Using Cloudflare
No entanto, certifique-se de copiar apenas o método issue_cert desse post, e o restante do conteúdo retire do web.letsencrypt.ssl.template.yml original (pois ele foi alterado após a postagem do tópico).
LETSENCRYPT_CF_TOKEN: ""
LETSENCRYPT_CF_ACCOUNT_ID: ""
LETSENCRYPT_CF_ZONE_ID: ""
LETSENCRYPT_DNS_PROVIDER: "dns_cf"
- Você pode criar o token do Cloudflare na página Meu Perfil → “Tokens de API” do CF.
- O ID da Conta e o ID da Zona são mostrados na página Visão Geral do domínio.
- Deixe o valor do provedor de DNS como acima.
Atualizações de Subdiretório
De acordo com este tópico Serve Discourse from a subfolder (path prefix) instead of a subdomain, defina DISCOURSE_RELATIVE_URL_ROOT: /forum em env: e atualize a seção run:.
Observe este post para IPs de usuários: Serve Discourse from a subfolder (path prefix) instead of a subdomain - #111 by varun21
Rebuild
Após alterar o app.yml para executar o comando de reconstrução, precisamos pular a verificação do Discourse para que o domínio resolva o IP do servidor atual (já que nosso mywebsite.com já está apontando para 1.1.1.1, e o Discourse verifica o domínio raiz), para isso execute:
./launcher rebuild app --skip-connection-test
Configuração do Cloudflare
Sei que algumas pessoas recomendam usar Workers para rotear /forum para o 2.2.2.2, no entanto, achei muito mais fácil fazer isso com Load Balancing. Com workers, eu não conseguia resolver problemas relacionados a CSS/JS de qualquer maneira, mesmo com rocket loader e outras configurações semelhantes desativadas. Então,
- Ative o Load Balancer (em Traffic)
- Selecione “Manage Pools” → “Create”
- Crie 2 pools (para o site principal e para o fórum), cada um deles deve ter apenas um endpoint
- Crie o Load Balancer, o hostname deve ser
mywebsite.com - Na seção de endpoints, escolha ambos os pools
- Pule os Monitores (já que não precisamos monitorar a saúde do servidor, o site principal deve sempre apontar para
1.1.1.1e o fórum para2.2.2.2), Pule o Traffic Steering (o padrão é desativado) - Em Custom Rule, crie uma com a condição de caminho como
/forume aponte para o endpoint do fórum.
- Salve/Implante
Notas
- Por algum motivo, copiar o app.yml de exemplo e depois reconstruir não funcionou para mim (provavelmente eu estava fazendo algo errado). Então, como solução, executei o discourse-setup pela primeira vez com outro domínio e, em seguida, junto com outras alterações no app.yml acima, mudei o hostname e fiz a reconstrução final.
- O Discourse gera 2 certificados do letsencrypt,
RSA certeECDSA cert, e o letsencrypt tem um limite de 5 certificados por domínio exato por semana. Se você errar 2 vezes seguidas, a 3ª tentativa emitirá apenas um certificado, e o fórum não funcionará (você pode verificar o limite atual com este script GitHub - sahsanu/lectl: Script to check issued certificates by Let's Encrypt on CTL (Certificate Transparency Log) using https://crt.sh). - O Load Balancer da CF não é gratuito, no entanto, considerando (até agora) o custo de 5 dólares por 500 mil requisições DNS, acho que vale a pena, em comparação com o incômodo com nginx etc.

