Permitir SSL / HTTPS para sua configuração Docker do Discourse

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.

75 curtidas
I need help with SSL
Broken image since https
Troubles installing SSL
NGINX Proxy Mixed Content Error
SSL on Discourse / DO sub-domain of Heroku hosted domain
Force Discourse to use SSL/HTTPS through CloudFlare
How to force redirect from https to http on Docker installation
SSL Let's Encrypt Error After Installation
Cannot connect to IP address and no errors in log
Can i change Lets Encrypt to EssentialSSL / Wildcard SLL
I have a very difficult problem installing ssl - please help
Go Daddy SSL certificate installation error in D.O. server
How Do I Uninstall SSL Certificate?
How to Set Up SSL in Discourse
Site down after enabling SSL
SSL installation
SSL certificate expired and after that - Error 404 Not Found
Skipping built-in SSL certificate?
Unable to renew Let's encrypt certificate
Adding SSL certificate
Getting Cloudflare 521 Error After Upgrade to 3.5.0.beta8-dev
Let's encrypt failing for IP behind firewall
Unable To Connect/Connection Refused due to https certificates
Rebuild goes into a loop
Transfer from bitnami to normal discourse
My site is down with a weird SSL notification
Https with let's encrypt behind a vpn?
Cannot install custom SSL new_file: no such file
Favicon is failing to load for logged-in users
How to install SSL certificate in Discourse
Disabe letsencrypt failed and Run discourse-setup had some not normal alert
How to modify Dockerfile?
DNS validation for Let's Encrypt?
How might we better structure #howto?
Hit Let's encrypt renewal limit
Unable To Connect/Connection Refused due to https certificates
Setting up Discourse with SSL on Docker with AWS ELB breaks and returns 503 Service Unavailable (Back-end server is at capacity)
Disabe letsencrypt failed and Run discourse-setup had some not normal alert
Global setting to hide origin IP from everywhere - is it possible?
Latest update requires cache purge in CloudFlare