Могу подтвердить, что обновление сертификата Let’s Encrypt не выполняется. Я уже несколько лет использую самохостинговую установку Discourse, и очень странно, что за последние пару месяцев обновление не сработало дважды подряд. Второй раз это произошло сегодня утром, и я начал расследование.
Я проследил проблему до следующих двух коммитов:
И соответствующая строка по ссылке:
Кажется, есть две проблемы.
Во-первых, return 301 https://${DISCOURSE_HOSTNAME}$request_uri; преобразуется в return 301 https://<МОЁ ИМЯ СЕРВЕРА> без $request_uri в конце. Я проверил это на своей самохостинговой установке, а также на установке друга, настроенной на прошлой неделе. Я не понимаю, как работают шаблоны Discourse, поэтому не знаю, почему $request_uri теряется.
Во-вторых, как отметил @lessLost, 301-редирект находится вне блока location. Я считаю, что редирект на уровне server переопределяет все блоки location. Let’s Encrypt использует HTTP для обновления сертификатов. Однако любая попытка выполнить curl -I http://ВАШ_ДОМЕН/.well-known/acme-challenge/test возвращает 301-редирект на HTTPS вместо 404 (что является ожидаемым поведением; нам нужен 404, а не 301).
Я исправил это вручную на своей самохостинговой установке, но ожидаю, что любое обновление перезапишет мои изменения. К сожалению, я недостаточно хорошо понимаю шаблоны, чтобы отправить pull request @pfaffman — иначе я бы это сделал.
Дополнено:
Я считаю, что это ошибочно —
Я почти уверен, что Let’s Encrypt по умолчанию использует HTTP (по очевидным причинам: если сертификат истёк, он не может обновиться!). Однако размещение 301-редиректа на уровне блока server заставляет все запросы перенаправляться на HTTPS, что противоречит этой стратегии обновления.
Дополнение 2: Подтверждение стратегии обновления через HTTP, но вы также можете поискать в Google, чтобы убедиться в этом.