Certbot продлил сертификат, а nginx отдаёт старый
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, поэтому флаг и нужен.