You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
diagnose: сенсор сроков серта не сканирует /opt/selfsteal/certs → на selfsteal-ноде cert_min_days=-1 (слеп); и считает снятые с renew серты #39
Сенсор сроков TLS в diagnose.shне видит selfsteal-серт, лежащий в нестандартном каталоге, и
на такой ноде отдаёт cert_min_days=-1 — то есть о протухании фасадного серта не предупредит
вообще, хотя ради этого сенсор и нужен.
Наблюдалось
2026-09-02, флот из 7 selfsteal-нод (v4.0.1). Фасадные серты у всех лежат в /opt/selfsteal/certs/<sni>/fullchain.cer (nginx-selfsteal в контейнере). На nl1 серт вдобавок
самоподписанный (домен в clientHold, acme нет):
$ na-diagnose --json | jq .cert_min_days # nl1
-1
$ ls /opt/selfsteal/certs/nl1.coppergate.cloud/fullchain.cer # серт есть
… fullchain.cer
Ноды, где параллельно живёт acme.sh, случайно спасаются — сенсор находит копию в /root/.acme.sh/<sni>/fullchain.cer. Но это побочный эффект, а не покрытие: на ноде, где acme нет
или снят, сенсор слеп.
Корень
scripts/diagnose.sh:688 (и :125 в json-ветке) сканирует ровно два глоба:
Каталог, куда реально кладёт серт selfsteal-контейнер (/opt/selfsteal/certs/*/fullchain.cer),
в список не входит. NA_CERT_PATHS есть, но его надо знать и задать руками на каждой ноде — а
дефолт молчит (info "…задай NA_CERT_PATHS" — не warn, легко пропустить).
Смежный дефект (тот же участок)
Глоб /root/.acme.sh/*/fullchain.cer захватывает и серты, снятые с renew (acme.sh --remove
оставляет каталог, но продлевать перестаёт). На cdn1 так лежит легаси eu3.coppergate.cloud_ecc
(снят с renew 31.08) — с его notAfter сенсор с 25.10 начнёт давать ложную тревогу о «протухающем»
серте, которого в проде уже нет. Стоит сверять кандидатов со списком активных в acme.sh --list
(Le_NextRenewTime), а не брать все каталоги подряд.
Предлагаемый фикс
Добавить в дефолтные пути /opt/selfsteal/certs/*/fullchain.cer (и, шире, дать сенсору
подсказку от protect/optimize, если selfsteal-путь известен из конфигурации).
Когда не найдено НИ одного серта, а на :443/:8443 слушает TLS — поднимать до warn, а не info
(сейчас «серт-датчик слеп» и «сертов нет» неотличимы и оба тихие).
Отсеивать серты, снятые с renew (сверка с acme.sh --list), чтобы не тревожить по мёртвым.
Ещё одна раскладка сертов, на которой сенсор слеп, и важный нюанс про NA_CERT_PATHS.
Флот из 4 нод (v4.0.1): selfsteal-Caddy и CDN-origin живут в контейнерах, серты лежат в docker-томе
(caddy_data → /data/caddy/certificates/acme-v02.api.letsencrypt.org-directory/...), на хосте их нет
ни в /etc/letsencrypt, ни в /root/.acme.sh. Итог тот же:
$ na-diagnose | grep -i серт
[*] TLS-сертификатов в стандартных путях не найдено (задай NA_CERT_PATHS, если selfsteal-серт лежит иначе)
При этом серты живые и продлеваются (notAfter=Nov 3 2026 на fl01, Nov 28 на de01) — то есть
сенсор молчит не потому, что нечего мерить.
Нюанс, который делает совет из подсказки нерабочим:NA_CERT_PATHS читается только из окружения. diagnose.sh не сорсит ни optimize.conf, ни protect.conf (единственное обращение к конфигу — sed по protect.conf за FLEET_SYNC_INTERVAL, строка ~545). Проверено: с переменной в env сенсор
сразу даёт верное значение (cert_min_days: 64), а та же строка, положенная в /etc/node-accelerator/optimize.conf,
не влияет ни на что. Значит «задай NA_CERT_PATHS» сегодня означает «правь юнит/cron, из которого
зовёшь na-diagnose», а не «настрой ноду один раз» — и после install.sh настройка не переживает
ни ре-ран, ни вызов руками.
К предложенному фиксу стоит добавить: load_conf "$CONF_DIR/optimize.conf" в начало diagnose.sh
(или отдельный na.conf для общих переменных), иначе даже расширенный список путей не покроет
нестандартные раскладки, а задать их персистентно будет по-прежнему нечем.
Activity
jestivald commentedon Sep 2, 2026
Ещё одна раскладка сертов, на которой сенсор слеп, и важный нюанс про
NA_CERT_PATHS.Флот из 4 нод (v4.0.1): selfsteal-Caddy и CDN-origin живут в контейнерах, серты лежат в docker-томе
(
caddy_data→/data/caddy/certificates/acme-v02.api.letsencrypt.org-directory/...), на хосте их нетни в
/etc/letsencrypt, ни в/root/.acme.sh. Итог тот же:При этом серты живые и продлеваются (
notAfter=Nov 3 2026на fl01,Nov 28на de01) — то естьсенсор молчит не потому, что нечего мерить.
Нюанс, который делает совет из подсказки нерабочим:
NA_CERT_PATHSчитается только из окружения.diagnose.shне сорсит ниoptimize.conf, ниprotect.conf(единственное обращение к конфигу —sedпоprotect.confзаFLEET_SYNC_INTERVAL, строка ~545). Проверено: с переменной в env сенсорсразу даёт верное значение (
cert_min_days: 64), а та же строка, положенная в/etc/node-accelerator/optimize.conf,не влияет ни на что. Значит «задай
NA_CERT_PATHS» сегодня означает «правь юнит/cron, из которогозовёшь na-diagnose», а не «настрой ноду один раз» — и после
install.shнастройка не переживаетни ре-ран, ни вызов руками.
К предложенному фиксу стоит добавить:
load_conf "$CONF_DIR/optimize.conf"в началоdiagnose.sh(или отдельный
na.confдля общих переменных), иначе даже расширенный список путей не покроетнестандартные раскладки, а задать их персистентно будет по-прежнему нечем.
jestivald commentedon Sep 2, 2026
Исправлено в v4.1 (PR #42, merge 427b13f): https://github.com/jestivald/node-accelerator/releases/tag/v4.1 — разбор в CHANGELOG, секция v4.1.
diagnose: датчики меряют тот же срез, что и правила + честный --json …
merge v4.1-diagnose: #27 #30 #31 #32 #34 #35 #37 #38 #39 — датчики ме…