Проблема
src/lib/nginx-templates.ts:33-35 на этапе записи файла эмитит ssl_certificate /etc/letsencrypt/live/mail.<domain>/fullchain.pem, а NginxService.regenerate() (domain/nginx/service.ts:80-88) сразу вызывает nginx -s reload. На новом домене сертификата ещё нет, а nginx -s reload отклоняет весь конфиг, если любой referenced cert-файл отсутствует.
jonasal/nginx-certbot обычно пре-сидит dummy-сертификаты, но по своему циклу — есть окно, где reload из mail-api обгоняет создание dummy-сертификата и падает.
Код обрабатывает это gracefully (ошибка reload ловится, логируется warn, файлы остаются на диске — service.ts:83-86), так что не фатально. Но провалившийся reload означает, что vhost нового домена (и любое другое отложенное изменение в том же reload) не применится до следующего успешного reload.
Фикс (варианты)
renderMailVhost эмитит ssl_*-директивы только после подтверждения, что cert-путь существует; иначе пишет vhost с shared dummy/self-signed сертификатом и переключается на реальный путь при следующей регенерации.
- Как минимум — задокументировать, что добавление домена может потребовать второго reload после выпуска сертификата.
- Заодно: включить OCSP stapling (
ssl_stapling on; ssl_stapling_verify on; — сейчас задан ssl_trusted_certificate, но stapling выключен) и HSTS в шаблоне.
Проблема
src/lib/nginx-templates.ts:33-35на этапе записи файла эмититssl_certificate /etc/letsencrypt/live/mail.<domain>/fullchain.pem, аNginxService.regenerate()(domain/nginx/service.ts:80-88) сразу вызываетnginx -s reload. На новом домене сертификата ещё нет, аnginx -s reloadотклоняет весь конфиг, если любой referenced cert-файл отсутствует.jonasal/nginx-certbotобычно пре-сидит dummy-сертификаты, но по своему циклу — есть окно, где reload из mail-api обгоняет создание dummy-сертификата и падает.Код обрабатывает это gracefully (ошибка reload ловится, логируется
warn, файлы остаются на диске —service.ts:83-86), так что не фатально. Но провалившийся reload означает, что vhost нового домена (и любое другое отложенное изменение в том же reload) не применится до следующего успешного reload.Фикс (варианты)
renderMailVhostэмититssl_*-директивы только после подтверждения, что cert-путь существует; иначе пишет vhost с shared dummy/self-signed сертификатом и переключается на реальный путь при следующей регенерации.ssl_stapling on; ssl_stapling_verify on;— сейчас заданssl_trusted_certificate, но stapling выключен) и HSTS в шаблоне.