# Certbot продлил сертификат, а nginx отдаёт старый

Опубликовано 2026-10-12 · certbot, Let's Encrypt, nginx, TLS · https://home.tigran.manukyan.dev/ru/notes/certbot-deploy-hooks.html

**TL;DR:** Сертификаты, выпущенные через `certbot certonly`, продлеваются, но nginx отдаёт старый, пока его не перезагрузить. Решение — исполняемый скрипт в /etc/letsencrypt/renewal-hooks/deploy/ с `nginx -t && systemctl reload nginx`, проверка — `certbot renew --dry-run --run-deploy-hooks`.

Таймер certbot в systemd исправно продлевает сертификаты. Подвох в другом: если сертификат получен через `certonly`, nginx никто не просит перечитать новый файл, и он отдаёт старый до следующего рестарта. Узнаёшь об этом примерно через 90 дней.

## Решение

Кладём скрипт в папку deploy-хуков. Certbot запускает всё, что в ней лежит, после каждого успешного продления, и только тогда.

```
sudo tee /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh <<'SH'
#!/bin/sh
nginx -t -q && systemctl reload nginx
SH
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
```

Проверка `nginx -t` здесь не для красоты: если где-то лежит сломанный конфиг, reload всё равно упадёт, а так хук хотя бы не сделает хуже.

## Как проверить, не дожидаясь трёх месяцев

```
sudo certbot renew --dry-run --run-deploy-hooks
systemctl list-timers | grep certbot
```

При dry run certbot пропускает deploy-хуки, если не передать `--run-deploy-hooks`, поэтому флаг и нужен.
