Я уже дошёл до отчаяния, потому что попытки заставить бота Discourse или Claude исправить эту проблему кажутся невозможными. Я не могу внятно описать проблему, так как не обладаю достаточными знаниями, и, я думаю, именно это меня и бесит больше всего.
Я постараюсь объяснить, что произошло, с моей точки зрения.
Когда я переходил с одного контейнера на два, файл в samples/ использовал web-only, и я по ошибке оставил его как есть, вместо того чтобы использовать web_only.
Затем, из-за этого (по моему мнению), у меня не загружались изображения, потому что один «элемент» ожидал указание на web_only, но там было установлено web-only. Я внёс некоторые изменения, и изображения заработали. Но теперь проблема в сертификатах Let’s Encrypt.
Я попросил бота помочь мне это исправить. Он сказал мне подождать до следующего дня, так как проблема была в ограничении частоты (rate-limit) сертификатов. Проблема должна была решиться. Но она не решилась. Затем я спросил его снова, потом спросил Claude, потом снова Claude… и мы уже неделю сидим в этом режиме «подожди до завтра в X часов, и это ТОЧНО будет исправлено». Это никогда не исправляется. Оба говорят: «О, извините, я не должен был предполагать, что это решится, давайте попробуем вот это, потому что теперь это действительно будет исправлено». Но это не работает.
Сам сайт работает, но я чувствую, что каждый раз, когда я хочу пересобрать систему, что-то пойдёт не так, и, честно говоря, я не хочу постоянно полагаться на временные решения (пластыри).
Claude сказал мне добавить что-то в хуки в web_only.yml, но поскольку ничего подобного не упоминается в инструкциях, предоставленных здесь на форуме, я ожидал какого-то другого решения, например… решения самой проблемы.
Пожалуйста, кто-нибудь помогите мне разобраться, в чём заключается проблема и где именно всё ломается? Я был бы очень благодарен, потому что на данный момент это изматывает. Не сама работа, а то, что я не понимаю, что происходит и почему «подождать до завтра» никогда не приводит к решению.
Спасибо!
Я попросил Claude объяснить, в чём, по его мнению, заключается проблема, может быть, это поможет? Вот что он сказал:
Заголовок: Двухконтейнерная конфигурация: папка ECC-сертификатов отсутствует после разделения, цикл --force приводит к превышению лимита запросов при каждом запуске
Конфигурация: Два контейнера (data + web_only), миграция из standalone. Шаблоны: web, ratelimited, ssl, letsencrypt, cloudflare. Имя хоста alltiago.com, без алиасов.
Симптом: При каждом запуске web_only срабатывает лимит частоты Let’s Encrypt, и nginx не может обслуживать запросы, возвращая ошибки соединения, пока строки ECC не будут вручную удалены из /etc/nginx/conf.d/outlets/server/20-https.conf.
Что я обнаружил:
Папка /shared/letsencrypt/alltiago.com_ecc/ отсутствует в моей установке. Папка /shared/letsencrypt/alltiago.com/ (RSA) существует и работает нормально, сертификаты обновляются штатно.
В web.letsencrypt.ssl.template.yml:
cert_exists() {
[[ "$(cd ${LETSENCRYPT_DIR}/${DISCOURSE_HOSTNAME}$1 && openssl verify -CAfile <(openssl x509 -in ca.cer) fullchain.cer | grep "OK")" ]]
}
issue_cert "ec-256"
if ! cert_exists "_ecc"; then
issue_cert "ec-256" "--force"
fi
Так как папка отсутствует, cert_exists "_ecc" возвращает false при каждом запуске, поэтому запускается --force, и запрашивается совершенно новый ECC-сертификат, независимо от того, что находится на диске. Это происходит через хук after_ssl, который патчит /etc/runit/1.d/install-ssl, поэтому он выполняется при каждом запуске контейнера, а не только при первичной настройке (bootstrap).
Результат: ошибка 429 too many certificates (5) already issued for this exact set of identifiers in the last 168h (слишком много сертификатов (5) уже выдано для этого точного набора идентификаторов за последние 168 часов). Затем --installcert выполняется всё равно против пустой папки и записывает нерабочий /shared/ssl/alltiago.com_ecc.cer. В nginx настроены оба сертификата, он не может загрузить ECC-сертификат и не может обслуживать запросы.
Подтверждено работающим: Валидация ACME HTTP-01 проходит успешно (проверено через staging, ECC-сертификат успешно выпущен для letsencrypt_test, создана правильная структура папок). RSA-сертификат успешно обновился сегодня. Так что дело не в DNS, файрволе или валидации.
Вопросы:
- Есть ли поддерживаемый способ пересоздать папку
alltiago.com_ecc/, не дожидаясь истечения лимита частоты? - Должен ли возврат false от
cert_existsдействительно запускать--force, а не обычный запрос?--forceобходит проверку «существующий действительный сертификат» и гарантирует исчерпание лимита частоты, если папка отсутствует. - Есть ли задокументированный способ работать только с RSA?
Два фактических примечания, чтобы тема не ушла в сторону: дата повторной попытки сдвинулась с 27 августа на 29 августа, потому что обновление RSA сегодня заняло слот в скользящем 168-часовом окне. И причина, по которой другие не сообщают об этом, заключается в том, что при обычной установке обе папки создаются при первом запуске, и ветка --force никогда не выполняется.