Falha do Discourse ao renovar certificado

Posso confirmar que a renovação do Letsencrypt falha. Tenho executado uma instalação Discourse auto-hospedada por anos, e muito estranhamente a renovação falhou para mim duas vezes seguidas nos últimos meses. A segunda vez foi hoje de manhã, e então comecei a investigar.

Eu rastreei até os seguintes dois commits:

E a linha relevante vinculada:

Existem dois problemas, eu acho.

Primeiro, return 301 https://${DISCOURSE_HOSTNAME}$request_uri; se transforma em return 301 https://<MEU NOME DO SERVIDOR> sem um $request_uri no final. Eu verifiquei na minha instalação auto-hospedada, e também na instalação auto-hospedada de um amigo que foi configurada na última semana. Eu não entendo como o template do Discourse funciona, então não sei por que ele é descartado.

Segundo, como @lessLost mencionou, o redirecionamento 301 está fora do bloco location. Eu acredito que um redirecionamento no nível do servidor anula todos os blocos location. O LetsEncrypt usa http para renovações. No entanto, qualquer tentativa de curl -I http://SEU_DOMINIO/.well-known/acme-challenge/test retornará um 301 para https, em vez de um 404 (que é o comportamento esperado; queremos um 404, não um 301).

Eu corrigi isso manualmente na minha instalação auto-hospedada, mas espero que qualquer atualização substitua minhas alterações. Infelizmente, eu não entendo os templates o suficiente para enviar um pull request @pfaffman — ou eu faria isso também.

Editado para adicionar:

Eu acredito que isso está incorreto —

Tenho certeza de que o LetsEncrypt usa http por padrão (por razões óbvias, se o certificado estiver expirado, ele não pode ser renovado!) Mas colocar o 301 no nível do bloco server força todas as requisições a redirecionar para https, o que é inconsistente com esta estratégia de renovação.

1 curtida