BASH
#certbot#letsencrypt#cron#nginx#renew#deploy-hook

Certbot: продление сертификата и cron с deploy-hook для nginx

Команды certbot renew, проверка через --dry-run, настройка cron с --deploy-hook для перезагрузки nginx. По документации Certbot.

Как использовать

  1. Проверка без продления: certbot renew --dry-run --deploy-hook "echo OK".
  2. В crontab root добавь задачу на certbot renew с --deploy-hook "systemctl reload nginx".
  3. Используй полный путь к 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

Проверка

  1. Убедиться, что 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. При успехе — сообщение о продлении или о том, что сертификат ещё действителен.

  1. Проверить, что nginx подхватил сертификат после продления — даты сертификата по HTTPS должны обновиться. См. Проверка дат ACME-сертификата:
echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null | openssl x509 -noout -dates
  1. Права и путь к 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 выполняется только при успешном обновлении).