Skip to content

optimize: уступив маски чужой стансе, тулкит не создаёт свою и рапортует зелёным — diagnose показывает ✔ ротацию, которой нет #40

Closed

Description

@jestivald

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

При конфликте масок с чужой стансой optimize отдаёт ей все свои пути, не создаёт na-node-logs
вообще — и после этого рапортует об успехе
. na-logrotate.timer включается, na-diagnose печатает
зелёное ✔ ротация логов: часовой таймер активен, optimize.conf хранит NA_LOG_PATHS, как будто
они в силе. Фактически тулкит не ротирует ничего, а оператор видит здоровую фичу.

Отдельно: уступая маску, модуль печатает проверь, что там задан maxsize — но сам не проверяет.
Именно у победившей стансы maxsize чаще всего и нет: у пакетной стансы rsyslog на Debian/Ubuntu
стоит weekly вообще без maxsize, то есть после уступки размер не ограничен ничем.

Наблюдалось

2026-09-02, апгрейд v4.0.0 → v4.0.1 (install.sh optimize, NA_REF=v4.0.1) на четырёх боевых
Remnawave-нодах. На трёх из них с 28.07 лежала созданная руками станса /etc/logrotate.d/vpn-node-logs
с теми же масками, что у дефолта тулкита:

$ cat /etc/logrotate.d/vpn-node-logs
/var/log/nginx/*.log /var/log/remnanode/*.log {
    daily
    rotate 3
    maxsize 500M
    …
}

Прогон v4.0.1 (одинаково на de01, ch01, most01):

[*] все заданные пути уже покрыты другими стансами — свою не создаю
[!] маска /var/log/nginx/*.log уже покрыта чужой стансой в /etc/logrotate.d — отдана ей; проверь, что там задан maxsize
[!] маска /var/log/remnanode/*.log уже покрыта чужой стансой в /etc/logrotate.d — отдана ей; проверь, что там задан maxsize

Состояние после прогона:

$ ls /etc/logrotate.d/na-node-logs        # ABSENT
$ systemctl is-active na-logrotate.timer  # active
$ na-diagnose | grep -i ротац
  ✔  ротация логов: часовой таймер активен
$ na-diagnose | tail -3
  Итог:  ✔ 36   ▲ 0   ✘ 0

То есть все три ноды показывают полностью зелёную диагностику при отсутствующей стансе.
(На четвёртой ноде, где чужой стансы не было, всё корректно: na-node-logs создана, ✔ 38 ✘ 0.)

Само поведение «отдать чужому» правильное — спор решает logrotate, и в v4.0.1 он решается честно.
Дефект в том, что уступка не доводится до оператора там, где он смотрит: в diagnose и в
итоговом статусе прогона.

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

  1. diagnose: разделить «таймер активен» и «станса существует». Сейчас сенсор смотрит только на
    таймер. Если ENABLE_LOGROTATE=1, а /etc/logrotate.d/na-node-logs отсутствует или пуст — это
    ▲, а не ✔, с текстом «маски отданы чужим стансам: <список>».
  2. Проверять то, о чём предупреждаем. Найдя победившую стансу (файл, который logrotate назвал
    владельцем пути), грепнуть в ней maxsize; нет maxsize — warn с именем файла и его периодом
    (weekly без maxsize = кап не работает), а не совет «проверь сам».
  3. Записывать факт уступки в состояние ($STATE_DIR/logrotate.ceded) и показывать его в
    na-diagnose --json полем вида logrotate_owned_masks / logrotate_ceded_masks, чтобы
    флот-мониторинг видел ноды, где фича выключилась сама.

Activity

  1. added a commit that references this issue on Sep 2, 2026
  2. jestivald commented on Sep 2, 2026

    @jestivald
    OwnerAuthor

    Исправлено в v4.1.1 (PR #43, merge 6473b53): https://github.com/jestivald/node-accelerator/releases/tag/v4.1.1 — разбор в CHANGELOG, секция v4.1.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