Skip to content

diagnose: сенсор сроков серта не сканирует /opt/selfsteal/certs → на selfsteal-ноде cert_min_days=-1 (слеп); и считает снятые с renew серты #39

Closed

Description

@jestivald

Что происходит

Сенсор сроков 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-ветке) сканирует ровно два глоба:

for cf in /etc/letsencrypt/live/*/fullchain.pem /root/.acme.sh/*/fullchain.cer ${NA_CERT_PATHS:-}; do

Каталог, куда реально кладёт серт 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), а не брать все каталоги подряд.

Предлагаемый фикс

  1. Добавить в дефолтные пути /opt/selfsteal/certs/*/fullchain.cer (и, шире, дать сенсору
    подсказку от protect/optimize, если selfsteal-путь известен из конфигурации).
  2. Когда не найдено НИ одного серта, а на :443/:8443 слушает TLS — поднимать до warn, а не info
    (сейчас «серт-датчик слеп» и «сертов нет» неотличимы и оба тихие).
  3. Отсеивать серты, снятые с renew (сверка с acme.sh --list), чтобы не тревожить по мёртвым.

Activity

  1. jestivald commented on Sep 2, 2026

    @jestivald
    OwnerAuthor

    Ещё одна раскладка сертов, на которой сенсор слеп, и важный нюанс про 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 для общих переменных), иначе даже расширенный список путей не покроет
    нестандартные раскладки, а задать их персистентно будет по-прежнему нечем.

  2. jestivald commented on Sep 2, 2026

    @jestivald
    OwnerAuthor

    Исправлено в v4.1 (PR #42, merge 427b13f): https://github.com/jestivald/node-accelerator/releases/tag/v4.1 — разбор в CHANGELOG, секция v4.1.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions