Certbot: продление сертификата и cron с deploy-hook для nginx
Команды certbot renew, проверка через --dry-run, настройка cron с --deploy-hook для перезагрузки nginx. По документации Certbot.
Как использовать
- Проверка без продления: certbot renew --dry-run --deploy-hook "echo OK".
- В crontab root добавь задачу на certbot renew с --deploy-hook "systemctl reload nginx".
- Используй полный путь к certbot: /usr/bin/certbot.
Сертификаты Let’s Encrypt действуют 90 дней. Без автоматического продления сайт в итоге начнёт отдавать предупреждение о просроченном сертификате. Команда certbot renew проверяет срок и при необходимости продлевает; после успешного продления nginx должен перечитать файлы из /etc/letsencrypt/live/, иначе продолжит отдавать старый сертификат. Проблема: забыли настроить cron или deploy-hook — продление сработало, но nginx не перезагрузили. Симптомы: в браузере или openssl s_client по-прежнему старые даты notAfter, либо сертификат вообще не продлевается из-за ошибки в cron. Ниже — проверка продления без реального обновления (--dry-run), ручное продление с перезагрузкой nginx и настройка cron с --deploy-hook по документации Certbot.
Решение
Флаг --deploy-hook запускает указанную команду только после успешного продления. Для применения новых сертификатов в nginx в hook вызывают systemctl reload nginx.
Проверка без реального продления
Имитация продления: сертификат не меняется, но видно, пройдёт ли процесс и выполнится ли hook.
certbot renew --dry-run --deploy-hook "echo OK"
Если в выводе есть OK и нет ошибок — продление настроено верно.
Ручное продление с перезагрузкой nginx
Принудительное обновление (например, для проверки или после смены домена):
certbot renew --force-renewal --deploy-hook "systemctl reload nginx"
В обычной работе достаточно автоматического продления по cron.
Cron: ежедневная проверка и reload nginx
Задача выполняется от root. При успешном продлении certbot вызовет systemctl reload nginx.
EDITOR=nano crontab -e
Строка для вставки (каждый день в 03:00):
0 3 * * * /usr/bin/certbot renew --quiet --deploy-hook "systemctl reload nginx" >/dev/null 2>&1
Вариант с записью в лог (для отладки):
0 3 * * * /usr/bin/certbot renew --quiet --deploy-hook "systemctl reload nginx" >> /var/log/le-renew.log 2>&1
Просмотр лога:
tail -20 /var/log/le-renew.log
Проверка
- Убедиться, что cron выполняется — после добавления задачи подождите до времени запуска или временно поставьте время через 1–2 минуты:
# Пример: запуск в 12:05 (для теста)
5 12 * * * /usr/bin/certbot renew --quiet --deploy-hook "systemctl reload nginx" >> /var/log/le-renew.log 2>&1
Проверьте лог: cat /var/log/le-renew.log. При успехе — сообщение о продлении или о том, что сертификат ещё действителен.
- Проверить, что nginx подхватил сертификат после продления — даты сертификата по HTTPS должны обновиться. См. Проверка дат ACME-сертификата:
echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null | openssl x509 -noout -dates
- Права и путь к certbot — cron часто не подхватывает PATH. Используйте полный путь:
/usr/bin/certbot(проверьтеwhich certbot).
Типичные ошибки
- Продление прошло, но в браузере старые даты — nginx не перезагружали после renew. Добавьте
--deploy-hook "systemctl reload nginx"в команду certbot в cron и вручную выполнитеsystemctl reload nginxодин раз. - Cron не запускает certbot или нет вывода — задача должна быть в crontab пользователя root:
sudo crontab -l. Убедитесь, что в строке указан полный путь/usr/bin/certbotи что certbot установлен (which certbot). - Ошибка «No renewals were attempted» — сертификаты ещё не близки к истечению (Certbot по умолчанию продлевает за 30 дней). Для теста используйте
--force-renewalвручную; в cron оставьте обычныйcertbot renew.
Где применять
- Prod: сервер с nginx и сертификатами Let’s Encrypt (VPS, BitrixVM, любой Linux с certbot). Cron — от root.
- Dev/стенд: те же команды; для проверки достаточно
certbot renew --dry-run --deploy-hook "echo OK".
Связанные сниппеты: Выпуск сертификата webroot в BitrixVM, Проверка дат ACME-сертификата, Nginx и SSL Let’s Encrypt для BitrixVM.
Источники: Certbot — Renewing certificates, Certbot — Deploy hooks (deploy-hook выполняется только при успешном обновлении).