Docker и сервер

Certbot standalone против webroot: продление молча падает

Порт :80 занят nginx, certbot standalone падает при каждом продлении, а узнаёте вы об этом по отвалившемуся HTTPS. Диагностика и перевод на webroot.

6 мин чтения

Симптом

Сертификаты перестают продлеваться, и вы узнаёте об этом, только когда у клиентов молча перестаёт работать HTTPS. certbot renew --dry-run показывает Could not bind TCP port 80 — already in use. Типовая причина на сервере, где :80 постоянно держит продакшн-nginx, а конфигурационные файлы продления прописаны на authenticator = standalone. Таймер тикает, но каждое продление падает впустую.

Корень

В /etc/letsencrypt/renewal/*.conf стоит authenticator = standalone — certbot сам поднимает временный сервер на :80. Но порт постоянно занят nginx, bind не проходит, продление падает каждый раз. Конфигурационные файлы на месте, certbot.timer активен — но вхолостую.

Диагностика, ничего не меняет:

certbot renew --dry-run
grep -H authenticator /etc/letsencrypt/renewal/*.conf

Рабочие домены идут webroot и продлеваются; битые — standalone.

Фикс: перевести на webroot

nginx уже отдаёт .well-known/acme-challenge из webroot-каталога, так что:

  1. Снапшот: cp /etc/letsencrypt/renewal/*.conf <snap>/.
  2. В каждом битом .conf: authenticator = standalonewebroot, добавить webroot_path = /var/www/html, и в конец — блок [[webroot_map]] со строкой <домен> = /var/www/html.
  3. certbot renew --dry-run → должно быть all simulated renewals succeeded.

Подводные камни

Вывод. Standalone-authenticator несовместим с постоянно занятым :80 — продление падает молча, пока не откажет HTTPS. Переведите конфигурационные файлы продления на webroot (nginx уже отдаёт acme-challenge), проверьте dry-run, разберитесь, какой из certbot боевой, и вынесите срок жизни сертификатов в постоянный мониторинг: тихое истечение недопустимо.

Как подключиться за 2 минуты
Частые вопросы

Частые вопросы

Как понять, что Let's Encrypt перестал продлевать сертификаты?
Часто узнают об этом только тогда, когда у клиентов молча отваливается HTTPS. Диагностировать заранее можно командой certbot renew --dry-run — она покажет ошибку вида «Could not bind TCP port 80 — already in use».
Почему certbot standalone не может продлить сертификат, если сервер работает?
В конфигурации продления стоит authenticator = standalone — certbot сам пытается поднять временный сервер на порту 80. Но порт постоянно занят продакшн-nginx, bind не проходит, и продление падает каждый раз, хотя таймер certbot исправно тикает.
Как перевести продление сертификата с standalone на webroot?
Nginx уже отдаёт .well-known/acme-challenge из webroot-каталога, поэтому в конфиге продления authenticator меняют на webroot, добавляют webroot_path и блок webroot_map с доменом. После этого certbot renew --dry-run должен показать, что все продления симулированы успешно.
Почему certbot в docker-контейнере не продлевает сертификаты по факту?
На хосте нередко есть два certbot: реальный host-бинарь под systemd-таймером и docker-контейнер со своим пустым томом. Контейнер ничего не продлевает — это обманка, а боевые сертификаты лежат на хосте и монтируются в nginx через bind-mount.
Что вынести в мониторинг, чтобы не узнать об истечении сертификата по отказу HTTPS?
Срок жизни сертификатов стоит поставить в мониторинг с алертами за 14 и за 3 дня до истечения — чтобы об истечении сообщал мониторинг, а не отказавший у клиентов HTTPS.
Похожее

Ещё в базе знаний

Подключите рабочий VPN

Инструкции базы знаний написаны под ключи VPN PRO: ключ выдаёт Telegram-бот за минуту, работоспособность гарантируем. Промокод VPN10 — 10 дней бесплатно, без карты.

Промокод VPN10 — 10 дней бесплатно · до 31 августа · передавайте друзьям