Автопродление обычно настраивают один раз и забывают. Проблема в том, что забывают вместе с ним и проверить, что оно вообще способно отработать. Сертификат живёт девяносто дней, значит первая настоящая проверка случится через два месяца после настройки, когда контекст уже потерян.
Само получение сертификата почти никогда не проблема. Ломается то, что происходит вокруг него.
Если валидация идёт в режиме standalone, certbot поднимает собственный веб-сервер на восьмидесятом порту. Порт в этот момент должен быть свободен. На сервере, где уже работает nginx, продление тихо падает с ошибкой занятого адреса — а узнаете вы об этом, когда браузеры начнут ругаться на просроченный сертификат.
Решение — пара хуков, которые освобождают порт перед проверкой и возвращают сервис на место после:
/etc/letsencrypt/renewal-hooks/pre/stop-web.sh
/etc/letsencrypt/renewal-hooks/post/start-web.sh
Оба должны быть исполняемыми и оба должны быть идемпотентными. Останавливать уже остановленное и запускать уже запущенное — нормальная ситуация, скрипт не должен на этом падать.
Пакет certbot приносит с собой systemd-таймер, который запускается дважды в сутки со случайной задержкой. Отдельная запись в кроне не нужна и скорее вредна: две сущности, делающие одно и то же, рано или поздно разъедутся.
Проверить, что таймер жив:
systemctl list-timers certbot.timer
systemctl status certbot.timer
Первая команда покажет время следующего запуска. Если в колонке NEXT прочерк, таймер не активирован, и продления не будет.
Не дожидаясь реального срока, стоит прогнать холостой запуск:
certbot renew --dry-run
Он делает всё то же самое, включая вызов хуков, но обращается к тестовому окружению и не тратит лимиты. Если dry-run прошёл, значит и настоящее продление пройдёт — при условии, что за это время не поменяются DNS-записи или правила файрвола.
Отдельно проверьте, что восьмидесятый порт открыт снаружи. Валидация приходит с серверов центра сертификации, и закрытый порт выглядит для них как недоступный домен.
Достаточно одной проверки — срок до истечения. Команда certbot certificates печатает дату для каждого сертификата, из неё легко собрать число дней и отправлять алерт, когда останется меньше двадцати. Двадцать дней — запас, за который успеешь разобраться спокойно, даже если проблема окажется в DNS.
Более тонкий мониторинг обычно не окупается: сертификаты либо продлеваются, либо нет, промежуточных состояний немного.