Обновление за 7–8 августа 2026.
Релиз про один раздел — про ноды. До сих пор панель уверенно отвечала на вопрос «жива ли нода» и почти не отвечала на «что с ней не так». Метрики показывали процессор, память и объём трафика, то есть ровно то, что видно и без панели, а всё, из-за чего клиенты на самом деле жалуются, — потери на канале, переподписанный гипервизор, забитая таблица соединений, кривой маршрут до конкретного сервиса — не измерялось вовсе или измерялось и выбрасывалось по дороге. Здесь это исправлено, и заодно каждый показатель научился объяснять сам себя.
У ноды появилось здоровье одной цифрой
В списке нод рядом с именем стоит индекс от 0 до 100, а кнопка «Худшие сверху» ставит проблемные наверх. Раньше, чтобы понять, какая из двадцати нод требует внимания, надо было открыть двадцать карточек.
Индекс складывается из проб доступности, сервисов, рукопожатия, состояния агента, ресурсов, срока сертификата и базовой защиты. В карточке ноды он разложен по строкам: видно, за что именно сняты баллы. Рядом с числом идёт покрытие — доля сигналов, по которым вообще есть данные. Сто баллов при покрытии 20% означает не «всё отлично», а «мы почти ничего не измерили», и панель так и пишет: выводу это пока не подлежит. Сигнал, которого нет, не снимает баллов и не добавляет их — он опускает покрытие.
Отдельным весом идёт очередь задач. Она ловит отказ, который не виден больше нигде: агент исправно отмечается, нода во всех списках читается как online, а команды не выполняются. Обнаруживалось это обычно тогда, когда перезапуск нужен срочно. Теперь на вкладке «Агент» видно глубину очереди, время ожидания и просроченные аренды — работу, которую панель считает сделанной, а её не делали.
Панель показывает качество канала, а не только его объём
Для протоколов, которые возит VPN, объём — неверная половина: гигабит с двумя процентами потерь ощущается хуже честной сотни мегабит, а QUIC замечает дрожание задолго до того, как заметит полосу.
Появились графики потерь, дрожания и задержки — их нода меряет сама, до нескольких контрольных точек. Рядом ретрансмиты TCP, потери и ошибки интерфейсов и заполненность conntrack. Последняя коварнее всех: когда таблица соединений заполняется, ядро молча перестаёт принимать новые подключения при полностью свободных процессоре и памяти. Уже подключённые работают, новые не могут подключиться, и в графиках при этом всё зелёное.
Часть этих счётчиков агент собирал давно — и панель их выбрасывала. Агрегирующий запрос выбирал только именованные колонки, и на любом окне длиннее часа вся телеметрия из JSON-части исчезала. То есть данные копились и терялись.
В настройках ноды появилось поле «Заявленная полоса». Заполните его, и панель начнёт считать насыщение: 300 Мбит/с на гигабитном порту и на трёхсотмегабитном — разные ситуации, а без знаменателя различить их нечем. Отдельно считается, сколько точек просидело у предела: разовый вечерний всплеск и постоянный потолок требуют разных решений.
Видно, что происходит с самим сервером
На обзоре ноды появилась карточка «Хост» — то, чего не показывает ни одна обычная метрика.
Steal CPU отвечает на самый частый вопрос эксплуатации: нагрузки нет, а всё тормозит. Это доля процессорного времени, которую гипервизор отдал соседям по железу, и она единственная отличает «нода занята» от «хостер продал одно железо слишком многим». Счётчик OOM объясняет «сервис ночью перезапустился сам»: ядро при нехватке памяти не предупреждает, а убивает самый крупный процесс — обычно тот, что обслуживает клиентов. Флаг перезагрузки ловит ноду, которая пропатчена, но работает на старом ядре: проверка версий показывает новую, а действует старая, и отсюда растёт вывод «обновление не помогло».
Медленнее, на своих часах, собираются ждущие обновления с отдельным счётчиком security, число docker-образов вместе с висящими и вес журнала systemd. Два последних — обычный ответ на «куда делось место на диске», и в метрике диска их не видно: там только растущий итог без объяснения.
Определитель типа диска был и убран: под виртуализацией флаг вращения отдаётся единицей для тома, лежащего на NVMe, и панель уверенно сообщала «HDD» про хост, где ничего не вращается. Показание, которое ошибается, хуже отсутствующего — по нему начинают искать причину задержек в диске, которого нет.
Стало видно, где именно упирается путь
На вкладке «Сеть» появилась диагностика: трассировка и замер MTU, обе с ноды, обе по кнопке, результат приходит на том же клике.
Трассировка отвечает не на «что-то не так», а на «где именно», и её вывод можно приложить к обращению к хостеру вместо взаимных догадок. Хоп, который не ответил, там не получает имени: многие маршрутизаторы не отвечают на пробы, и рисовать их как несуществующий узел было бы враньём. Значение имеют потери, которые держатся до конца пути; потеря на промежуточном хопе, исчезающая дальше, говорит о самом маршрутизаторе, а не о маршруте, — это написано прямо под таблицей, потому что иначе трассировка регулярно приводит к жалобе на хостера из-за роутера, который просто не любит ICMP.
Замер MTU существует ради отказа, который все прочие пробы показывают зелёным: когда что-то на пути молча роняет крупные пакеты, мелкие ходят прекрасно — рукопожатия проходят, пинги чистые, — а передача файлов встаёт. Панель различает два случая, дающих одно и то же число: путь, который честно сообщает о сужении, и чёрную дыру, которая молчит. Лечатся они по-разному.
Там же считается, сколько хопов насчитает сервис на той стороне по TTL пришедшего пакета, и предлагается значение, при котором он насчитает разумное. Правило ставится на конкретное назначение, а не глобально: значение зависит от длины пути именно до него, и одно число на всех чинило бы одни направления и ломало другие. ICMP при этом не трогается — иначе первым же делом сломалась бы трассировка, которой это и настраивается.
Нода рассказывает, что видно с неё наружу
Все прежние проверки смотрели на ноду со стороны панели: открыт ли порт, проходит ли рукопожатие, доезжает ли дозвон до интернета. Каждая доказывает, что нода жива, и ни одна не замечает, что на её аплинке YouTube резолвится в заглушку провайдера, что DPI рвёт сессию по имени домена, а сервис забанил её адрес выхода. Такие поломки не приходят в панель ошибкой — они приходят жалобой клиента, что «у вас всё не работает».
Спросить об этом можно только саму ноду. Агент присылает факты: что резолвится, куда встаёт TCP, что говорит TLS, какой код вернул сервис; вердикты считает панель, и переписать их можно без выпуска нового агента. Отдельно разделены две разные вещи, которые легко спутать: сеть, которая не пропускает, и сервис, который забанил адрес выхода. Первое чинится маршрутом, второе — сменой адреса.
Формулировка одной находки выправлена по ходу: панель писала, что сброс соединения означает чтение имени домена в рукопожатии. На деле проба бьёт в адрес, которого ни у кого нет, и до отправки рукопожатия дело не доходит — значит сброс говорит о вмешательстве на линии, а не о чтении имени. Находка от этого не обесценивается, но называться должна тем, чем является.
Службы безопасности ставятся из панели
В разделе сервисов у CrowdSec, Fail2ban и UFW появилась кнопка установки. Раньше панель умела их настраивать и проверять, но только на ноде, куда кто-то заранее сходил по SSH, — то есть раздел был бесполезен ровно там, где нужнее всего.
CrowdSec и Fail2ban после установки запускаются: до запуска они не делают ничего. UFW ставится и намеренно не включается. Включение применяет запрет входящих, а на удалённой ноде это SSH и все клиентские порты разом — по кнопке с надписью «установить». Включение остаётся за отдельным действием, где панель считает риск потерять доступ и требует подтверждения.
При установке CrowdSec его локальный API переносится на свободный порт, если штатный занят. На ноде Axottle он занят всегда — там слушает nginx перед XHTTP-инбаундом, — и стоковая установка падала бы на каждой ноде, каждый раз, по причине, к самому CrowdSec отношения не имеющей.
Каждый термин объясняется по-человечески
Рядом с названием метрики появился вопросик. Он открывает окно с объяснением: что это простыми словами, что это значит для ноды, что почувствуют клиенты и когда пора беспокоиться — с конкретными границами, потому что «высокое значение» без числа так же бесполезно, как число без объяснения. Написано 38 статей: от процессора и диска до conntrack, steal, шагов базовой защиты и настроек ядра из отчёта о производительности.
Поля конструктора входа и транзита переписаны так же. Тексты там были и раньше, но для того, кто уже знает Xray: «URI-path для XHTTP/WS/gRPC» ничего не говорит владельцу сервиса ни о том, что выбрать, ни о том, чем грозит ошибка. Теперь у 23 самых последствийных полей сказано, когда параметр пригодится, когда не стоит и с чем он обязан совпадать. Последнее ломается чаще всего и ломается молча: путь, транспорт и имя домена должны совпасть у ноды и клиента до буквы, а расхождение даёт не ошибку, а тишину — нода отвечает чужому запросу как обычный сайт. Показывались эти тексты системной подсказкой браузера, одной строкой и до первого движения мыши; теперь это то же окно с разделами.
Мелочи
Панель открывается по-русски. Стартовым языком стоял английский, хотя интерфейс пишется на русском: подписи в коде русские, даты форматируются по-русски, а 215 ключей есть только в русском словаре. Оператор без сохранённого выбора получал смесь.
Индекс здоровья перестал сообщать «нет данных» о ресурсах, которые панель рисует в соседней карточке. Он читал таблицу, в которую не пишет ни одна строчка кода: живые показания всё это время лежали в другом месте, откуда их берёт график. Заодно показание старше пятнадцати минут больше не считается измерением — иначе индекс оставался бы зелёным ровно в тот период, когда нода замолчала.
Результат задачи агента доходит до всех обработчиков. Цепочка ставилась дважды, и второй раз перечисляла список руками — обработчик, добавленный только в первый, переставал существовать. В логах это не видно никак: задача создаётся, агент выполняет и рапортует об успехе, панель пишет «завершена», а результат падает в пустоту.
Карточка применённой схемы показывает здоровье живой версии, а не «Черновик». Плашка брала жизненный цикл, а он после любой правки остаётся черновиком до самого применения — и схема, в которой месяц назад что-то подвинули, выглядела ненастроенной, хотя обслуживала клиентов.
На вопрос «как» Axosun даёт дорогу, а не справку. «Как собрать схему из нескольких серверов» уходило в расследование той схемы, на которой стоял оператор, и он получал в ответ ровно то, что и так знал.
Обзор ноды снова начинается с «Сейчас» и «Сервисов»: сводки полезны, но первый экран должен отвечать на «что происходит прямо сейчас», а не «как дела в целом».
Обновление
Обновиться можно кнопкой в панели (нужен polkit) или скриптом на сервере:
sudo /opt/axottle/installer/upgrade.shМиграции применяются при старте, останавливать панель заранее не нужно.
Часть новых показателей собирает агент на ноде: пока он не обновится, карточка хоста, потери и дрожание будут честно писать «нет данных», а трассировка и установка служб будут недоступны.