Este guia provavelmente está desatualizado, pois agora há muito poucas razões para não usar o certificado Let’s Encrypt integrado que Simplesmente Funciona. Veja também:
2023-04-10 @pfaffman diz: Isto é deixado aqui principalmente para fins históricos.
Então, você gostaria de habilitar SSL para sua configuração Discourse baseada em Docker? Vamos fazer isso!
Este guia pressupõe que você usou todas as configurações padrão de instalação – um arquivo de configuração de contêiner em /var/discourse/containers/app.yml e o Discourse docker está instalado em: /var/discourse
Compre um Certificado SSL
Vá para namecheap ou algum outro provedor de certificado SSL e compre um certificado SSL para seu domínio. Siga todas as etapas documentadas por eles para gerar a chave privada e o CSR e, finalmente, obter seu certificado. Eu usei os padrões do apache, eles funcionarão bem.
Mantenha sua chave privada e certificado em um local seguro.
Coloque o Certificado e a Chave
Obtenha um certificado assinado e uma chave e coloque-os na pasta /var/discourse/shared/standalone/ssl/
A chave privada é:
/var/discourse/shared/standalone/ssl/ssl.key
O certificado é
/var/discourse/shared/standalone/ssl/ssl.crt
Os nomes dos arquivos são críticos não se desvie deles ou seu template nginx não saberá onde encontrar o certificado.
Dê uma olhada no seu arquivo de configuração app.yml para ver onde a pasta compartilhada está montada.
volumes:
- volume:
host: /var/discourse/shared/standalone
guest: /shared
Em essência, os arquivos devem estar localizados em /shared/ssl/ssl.key e /shared/ssl/ssl.crt dentro do contêiner.
Para que todos os clientes encontrem um caminho do seu certificado para um certificado raiz confiável (ou seja, não mostrar nenhum aviso aos seus usuários), você pode precisar concatenar os arquivos de certificado do seu provedor assim:
cat "Your PositiveSSL Certificate" "Intermediate CA Certificate" "Intermediate CA Certificate" >> ssl.crt
Configure o NGINX
Adicione uma referência ao template ssl do nginx no seu arquivo de configuração app.yml:
templates:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
- "templates/web.ssl.template.yml"
Configure seu Contêiner Docker
Diga ao seu contêiner para escutar em SSL
expose:
- "80:80"
- "443:443"
Inicialize seu Contêiner Docker
Reconstrua seu aplicativo
./launcher rebuild app
Lucro, você terminou!
Solução de Problemas
Certifique-se de ler os logs usando
./launcher logs app
Se algo der errado.
Como isso funciona
O template configura o nginx com TLSv1.2 e TLSv1.3, suítes de cifras fortes, cabeçalhos HSTS e configurações de ticket de sessão. Ele usa saídas de configuração do nginx para injetar a configuração SSL.
A imagem tem regras de reescrita que redirecionarão quaisquer solicitações na porta 80 para https://DISCOURSE_HOST_NAME, e também redirecionarão solicitações para outros nomes de host na porta 443 para o nome de host canônico.
Personalizar esta configuração é muito fácil, veja:
Você pode fazer uma cópia desse arquivo e alterar o template conforme necessário.
A vantagem de usar templates e saídas aqui é que conseguimos manter todo o restante da configuração NGINX recomendada pelo Discourse, ela muda com o tempo.
Testando sua configuração
Veja SSL Server Test (Powered by Qualys SSL Labs) para garantir que tudo está funcionando corretamente. É possível que alguns navegadores e combinações de sistema operacional aceitem https parcialmente configurado, então verifique aqui primeiro.