Обновления хаба и база уязвимостей

Раздел «О системе» хаба — версия самого хаба, обновление, общая база уязвимостей, кэш пакетов, база ClamAV, разбор моделью и приватный режим. Версии хостов — на странице «Хосты».
Проверка версий
Хаб раз в NKT_HUB_UPDATE_CHECK_INTERVAL (6 ч) спрашивает GitHub Releases (NKT_HUB_RELEASE_REPO), нет ли версии новее, и показывает бейдж в меню — только для сведения: само ничего не ставится. «Проверить снова» — разовая проверка сразу.
Ниже — описание релиза на языке интерфейса (из WHATSNEW.md и WHATSNEW.en.md). Пока обновления нет, там заметки установленной версии — полезно прочесть после обновления, что приехало.
Обновить хаб
«Обновить до vX.Y.Z» — заданием хаба с окном журнала (закрытое окно его не прерывает):
- скачивает бинарник под архитектуру этой машины и
deploy/netknownsthat-hub.serviceтого же тега, сверяетSHA256SUMS; - кладёт бинарник в
/usr/local/bin/nkt, юнит — в/etc/systemd/system/, затемdaemon-reloadиrestart— черезsystemd-runв отдельном юните, потому чтоProtectSystem=strictсамого хаба писать туда не даёт; - хаб на несколько секунд недоступен; открытая страница ждёт, пока он ответит уже новой версией, и перезагружается сама. Если за 3 минуты новой версии нет — страница так и говорит и подсказывает, где смотреть журнал установки.
В журнале задания — четыре шага строками: файл сумм, скачивание бинарника (с процентами; уже скачанный прошлой попыткой берётся из кэша, если сумма сходится), юнит systemd, установка и перезапуск. Если от GitHub 60 секунд не приходит ни байта, скачивание повторяется ещё раз, а потом задание заканчивается ошибкой «скачивание остановилось на N%» — а не висит; всё обновление ограничено 30 минутами.
Другие вкладки, открытые до обновления, работают на прежнем коде интерфейса, пока их не перезагрузить. Такая вкладка сама замечает новую сборку на сервере (раз в две минуты и при возврате на неё) и показывает плашку «Интерфейс nkt обновился… — обновите страницу». То же — после обновления nkt на хосте.
В подтверждении — галочка «После обновления хаба — обновить nkt на всех хостах», по умолчанию включённая. Тогда после перезагрузки сразу открываются «Хосты», и обновление nkt на хостах запускается само, без второго подтверждения: галочка и есть согласие. Обновляются все отставшие хосты, кроме тех, где обновление уже идёт, и упавших в прошлый раз (их — вручную, галочкой «повторить неудачные»). Признак «недоступен» сразу после перезапуска хаба ненадёжен, поэтому подключение проверяет само задание — у каждого хоста перед установкой; без подключения хост пропускается. Сразу открывается журнал задания; если обновлять некого — так и сказано. Запуск происходит, только если версия хаба действительно сменилась; не сменилась за полчаса — намерение снимается (запоминается в этом браузере).
Есть откат на предыдущую версию, если что-то пошло не так.
hub.env обновление не трогает — в отличие от nkt.env хостов, который хаб перегенерирует при каждой установке, он целиком на совести оператора.
Кнопка есть, только если хаб запущен как systemd-юнит (в окружении есть INVOCATION_ID). Иначе — пояснение вместо кнопки:
- Docker / Kubernetes — бинарник в слое образа: обновление —
docker compose pull && docker compose up -dили новый тег образа; - бинарник запущен вручную — поставьте хаб службой (установка), и кнопка появится.
Бета-версии
Тег vX.Y.Z-beta собирает такой же релиз, помеченный pre-release: бинарник с версией X.Y.Z-beta, образ :X.Y.Z-beta и :beta (:latest не трогается). Галочка «использовать бета-версии» переводит хаб на бета-канал: беты считаются обновлениями, «последняя доступная» перепроверяется сразу. Без галочки хаб на бете обновится до стабильной сборки той же версии, когда она выйдет. Хосты приводятся к версии хаба — бета-хаб раздаёт бету. Бета помечена бейджем «beta» в шапке и в «О системе».
Хосты после обновления хаба
Хост с версией, отличной от хаба, при открытии сначала обновляется; «обновить всё» в списке хостов — для всех отставших сразу (подробно — в Хостах).
База уязвимостей
Без хаба каждый хост при сканировании уязвимостей сам качает trivy (~50 МБ) и его базу (~100–150 МБ сжатой, ~1 ГБ распакованной). На хабе база одна:
- хаб в фоне раз в
NKT_HUB_VULNDB_REFRESH_INTERVAL(12 ч) проверяет её свежесть; скачивание — не чаще раза в сутки; - «Обновить сейчас» форсирует проверку (свежая база заново не качается);
- «Сканировать» на странице «Уязвимости» хоста под хабом: хаб забирает у хоста манифест пакетов (дамп
dpkgи/etc/os-release, сотни КБ) через SSH и сканирует его своей базой. Хосту для пакетов ОС не нужны ни trivy, ни база; - образы контейнеров сканируются на самом хосте — нужен его Docker/Podman-сокет. Хост с контейнерами один раз ставит trivy и базу только ради этой части; хост без контейнеров не качает ничего;
- «localhost» использует тот же каталог базы (
NKT_DATA_DIR/vuln).
База ClamAV
Копия базы сигнатур ClamAV на хабе. Заводится кнопкой в «О системе», дальше обновляется раз в NKT_HUB_CLAMDB_REFRESH_INTERVAL (24 ч, 0 — не обновлять), качается только изменившееся. На странице хоста во вкладке «Вредоносное» кнопка «база с хаба» заливает её по SSH — хосту без интернета не нужно ходить к зеркалам ClamAV.
Кэш пакетов
Размер, попадания, лимит и очистка — там же; устройство — на странице Кэш пакетов.
Разбор моделью и приватный режим
Настройка модели (Anthropic или OpenAI-совместимая, включая локальные), инструкции и галочка «скрыть чувствительное» — на странице Оповещения, задания, ИИ.
Справка
Значок «?» у названия раздела (на месте прежнего «ⓘ») при наведении показывает короткую подсказку, а по щелчку открывает раздел этого сайта для текущей страницы интерфейса — в окне внутри nkt; «Открепить» выносит справку в отдельное окно браузера (как терминал), «В новой вкладке» — обычной вкладкой. В редакторе конвейера, в «Секретах» и в мастере «Сайтов» — кнопки прямо на нужные разделы.


Адрес сайта — карточка «Справка» в «О системе» (и ссылка «Адрес справки…» в окне справки, в том числе у отдельного хоста без хаба): по умолчанию https://piqab.github.io/nkt/, можно свою копию — например, в локальной сети без интернета (npm run build в site/ проекта, результат — site/.vitepress/dist). Правка — с разницей перед записью и историей прежних адресов. Сайт описывает последнюю версию nkt; своя копия из того же коммита, что и установленный nkt, — справка ровно к нему. Если свой сервер запрещает показ внутри чужих страниц (X-Frame-Options), окно будет пустым — «Открепить» или «В новой вкладке».
Меню

Карточка «Меню» в «О системе» (только администратору):
- «Порядок разделов хаба» — окно со списком разделов меню хаба: перетащите раздел (или двигайте стрелками ↑↓). Скрывать разделы хаба нельзя — только менять порядок.
- «Редактирование разделов хоста» — то же для меню хоста, плюс галочка «показывать»: меню всех хостов, открытых через хаб, станет таким. «Обзор» скрыть нельзя. Скрытый раздел пропадает только из меню — по прямой ссылке он открывается, права не меняются.
Перед записью — разница «сейчас → станет», у каждой раскладки — история версий с «вернуть эту» и «Сбросить к умолчанию». Раскладки общие для всех, кто входит в хаб, хранятся на хабе и едут в его экспорте; разделы, которые появятся в новых версиях, встают в конец меню. Отдельный хост без хаба показывает меню по умолчанию. API: GET и PUT /api/hub/ui/nav/hub и /api/hub/ui/nav/host с {"order": [...], "hidden": [...]}.
Установка nkt на хосты
Карточка «Установка nkt на хосты» (только администратору) — рядом с опасной зоной. Окно со списком хостов хаба: галочки сняты, «Выбрать все» и «Снять все»; у каждого хоста — состояние (nkt такой-то версии, не установлен, недоступен, ошибка установки). Машины хаба (localhost) в списке нет. «Установить» — задание хаба со стандартным окном журнала: по три хоста одновременно, на каждом обычная установка, как «Переустановить» у хоста (её задание видно в «Заданиях»); задание ждёт итог каждой и пишет его. Хост с nkt, поставленным другим хабом, пропускается — такой переустанавливают в списке хостов с подтверждением. Нужен вход по SSH и root или sudo без пароля.
Опасная зона
Карточка с красной рамкой (только администратору) — «Удалить nkt со всех хостов»:
- Экспорт — обязательно. Сначала то же окно, что «экспорт» в «Хостах» (полный, с ключом; шифрование паролем). Пока файл не скачан, дальше не пустит; хаб тоже проверяет — без полного экспорта за последние 30 минут запрос отвергается.
- Выбор хостов. Список всех хостов хаба, галочки сняты; «Выбрать все» и «Снять все». Машины хаба (localhost) в списке нет. Хосты, где удаление заведомо не пройдёт (sudo просит пароль, недоступен), помечены. Что удалять — как при удалении одного хоста; по умолчанию служба и файлы, данные, следы доступа хаба и возврат входа по паролю, без удаления SSH-пользователя.
- Подтверждение — ввести слово «удалить», затем задание хаба со стандартным окном журнала: по три хоста одновременно, провал одного не мешает остальным. Где очистка прошла, хост убирается из хаба; где нет — остаётся в списке, а в журнале — причина.
Вернуть хаб и хосты — импортом того самого файла экспорта: хосты вернутся в список, хаб сам заметит, где nkt нет, и предложит поставить его. Но установка требует входа по SSH и sudo без пароля: если при удалении отмечены «следы доступа хаба», ключ хаба из authorized_keys и его правило sudo убраны — на хост, заведённый по ключу, новый хаб не войдёт, а на заведённый по паролю войдёт, но sudo без пароля придётся вернуть вручную (или подключить хост как root). С отмеченным «удалить SSH-пользователя» входить некуда вовсе. Если задача — просто переехать на новый хаб, удалять nkt не нужно: экспорт и импорт хватает, хосты продолжают работать.