Cloudflare com configuração de subpasta

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.com existente atualmente aponta para 1.1.1.1 e está no ar
  • Devemos rotear mywebsite.com/forum (e seus subdiretórios) para 2.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.1 e o fórum para 2.2.2.2), Pule o Traffic Steering (o padrão é desativado)
  • Em Custom Rule, crie uma com a condição de caminho como /forum e 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 cert e ECDSA 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.