Releases: Axottle/axottle-releases
Release list
Axottle v1.6.1
Обновление за 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 ключей есть только в русском словаре. Оператор без сохранённого выбора получал смесь.
Индекс здоровья перестал сообщать «нет данных» о ресурсах, которые панель рисует в соседней карточке. Он читал таблицу, в которую не пишет ни одна строчка кода: живые показания всё это время лежали в другом месте, откуда их берёт график. Заодно показание старше пятнадцати минут больше не считается измерением — иначе индекс оставался бы зелёным ровно в тот период, когда нода замолчала.
Результат задачи агента доходит до всех обработчиков. Цепочка ставилась дважды, и второй раз перечисляла список руками — обработчик, добавленный только в первый, переставал существоват...
Axottle v1.6.0
Обновление за 3–7 августа 2026.
Пять дней ушло на то, что видно только на живом сервере и на живом человеке: установка с нуля, первая собранная схема, показ панели тому, кто открыл её впервые. Отсюда и состав. Большая часть релиза — про первое включение: панель доводит нового человека от приветствия до QR-кода, который можно отдать клиенту, вместо того чтобы оставить его наедине с холстом и двумя десятками разделов. Остальное — два новых раздела, привязка сетевых адресов ноды и разбор с проверками здоровья, которые слишком охотно объявляли аварию.
Панель доводит нового человека до первого клиента
Раньше первый экран был тем же, что и тысячный: сайдбар, разделы, пустой холст. Теперь новичка встречает тур. Он объясняет, что такое Axottle и где кончается его работа и начинается Remnawave, ведёт до установленной ноды, потом на холст — собрать первое подключение, потом до страницы подписок и до QR-кода. Опытному предлагаются два экрана и ссылки на документацию.
Подсветка идёт по живым страницам, а не по макету: кнопка «Новая схема», блок шлюза, палитра, «Применить изменения». Переходы тур узнаёт от самих страниц — блок брошен, вход настроен, схема уехала в Remnawave, — поэтому переживает F5 и не заставляет делать заново то, что уже сделано. Нода, созданная руками до обучения, засчитывается молча. Если Remnawave не подключена, тур начинает с неё: иначе человек узнавал бы об этом через полчаса, на кнопке «Применить».
Настройка входа на этом пути спрашивает три вещи вместо шести вкладок: набор, ноду и, где он нужен, маскировочный домен. Рекомендация зависит от ноды — с доменом честно предлагать маскировку под сайт, без домена она физически не соберётся. «Показать все настройки» разворачивает прежний конструктор с уже собранным ответом. Упрощённое окно принадлежит именно туру: кто его прошёл или закрыл, получает полный конструктор сразу.
Прогресс хранится на администратора, а не на установку — сотрудник, заведённый через полгода, тоже видит панель впервые. Полосу тура можно свернуть, если она мешает настраивать раздел под ней. У каждого шага свой аксолотль.
Чего тур не умеет: собрать схему пальцем на телефоне нельзя, палитра тянется мышью.
Появился раздел «Страница статуса»
Публичная страница со статусом сервисов, инцидентами и окнами работ. Панель её настраивает и публикует туда снимок состояния, но сама не хранит ни одной строчки наблюдений: ни проб, ни uptime, ни истории «работало / не работало». Владелец наблюдений — сам рантайм страницы, потому что он не спит, когда панель выключена. Иначе страница показывала бы то, что панель помнит, а не то, что есть.
Установка идёт мастером по одному вопросу на экран: как назовём, по какому адресу открывать, куда поставить. Порядок шагов задан не вкусом, а ACME — домен, A-запись, её распространение, сертификат, сервис. Поставить страницу на домен, который ещё никуда не указывает, мастер не даст. Установщик на сервере разговаривает так же, как установщик панели: баннер, фазы, меню стрелками, русский и английский, подтверждение перед тем, как что-то менять. По SSH из панели запускается он же, только молча и со значениями по умолчанию — терминала там нет, и любой вопрос ждал бы ответа от никого.
Компоненты привязываются к ноде или схеме, инцидент объявляется с первым сообщением, дальше ведётся хроника. Вход сотрудника со страницы обратно в панель стал отдельным экраном подтверждения: видно, какая страница спрашивает, под какой учётной записью и что она получит. Код уходит по нажатию, а не сам — молчаливая выдача подписанного утверждения любому, кто открыл ссылку, означала бы, что чужой сайт уводит сессию сотрудника одним редиректом.
Страницу можно удалить из панели: инстанс, компоненты, инциденты, работы и ключи уходят вместе. Сервер, на котором она стоит, при этом продолжит работать — панель до него не дотягивается и снести его не может.
Появился раздел «Страница подписок»
Разворачивается официальная страница подписок Remnawave — та, которую открывает клиент вместо панели. За развёрнутой раздел следит: доступность, срок сертификата, журнал операций, обновление образа.
Способов установки сейчас два. По SSH — панель ставит сама, реквизиты живут внутри одного запроса и никуда не сохраняются. Вручную — для сервера, где 80 и 443 уже держит ваш Caddy или nginx: панель выдаёт команду и готовые куски конфига с подставленными доменом и портом. Раньше в этом случае оператор упирался в «освободите порты», и способа обойти это из панели не было. Установка на управляемую ноду и на сервер самой панели из мастера временно убраны — до тех пор, пока их не доведут.
Настройки подписки в самой Remnawave раздел показывает, но не переписывает: они принадлежат применению схем подключения, и менять их за вас он не станет.
Адрес ноды привязывается вводом одного поля
Провайдер выдал дополнительный адрес — раньше это означало разговор с netplan по SSH. Теперь оператор вводит адрес, а интерфейс, маску, шлюз и необходимость отдельной таблицы маршрутизации панель выводит из инвентаря самой ноды: спрашивать это у человека значит просить его сделать работу панели. Второй вопрос появляется ровно там, где ядру физически неоткуда взять ответ — адрес из подсети, до которой нода не дотягивается.
У адреса появилась роль. Вход — тот, на который подключаются клиенты: он уходит в конфиг клиента вместо адреса администрирования. Выход — тот, с которого нода идёт в интернет. Второй адрес с той же ролью встаёт в резерв: он уже прописан на ноде и готов принимать трафик, поэтому переключение на него стоит одну перекомпиляцию схемы, а не поход на сервер. Это и есть весь смысл резерва — на выходной адрес прилетела жалоба, и съезжать надо сразу.
Ограничение названо ошибкой, а не советом. Связка компилируется в один профиль конфигурации, который получают все её ноды, поэтому адрес одной ноды нельзя навязать блоку, где их несколько: для остальных это команда, которую они выполнить не могут, и вход у них молча не поднимется. Панель отклоняет такую схему с объяснением.
Отдельно: назначить роль и убедиться, что нода ей пользуется — разные вещи. Схема компилируется, проверки зелёные, а трафик всё это время может уходить со старого адреса. Панель теперь сверяет, с какого адреса нода на самом деле выходит, и говорит, если это не тот, что помечен выходом. Выход через WARP считается законным, а не расхождением: адрес там принадлежит Cloudflare, и называть это ошибкой значило бы отправить оператора искать поломку, которой нет.
Панель проверяет, за кого интернет принимает ноду
Страна ноды была величиной объявленной: приезжала из снимка Remnawave или её вписывал оператор, и дальше панель повторяла её везде. Между «нода жива» и «нода там, где написано» помещается целый класс поломок, которые панель показывала зелёными. Провайдер переназначил адрес из другого пула, гео-базы уехали следом, клиенты получили не тот регион стриминга — а доступность, сервисы и рукопожатие в порядке, потому что с нодой ничего и не случилось. Она просто больше не там, где написано.
Теперь панель выходит в интернет через саму ноду, смотрит, что о её выходном адресе думает внешняя сторона, и показывает вердикт рядом с объявленной страной.
Схемы на Hysteria2 перестали гореть аварией
Hysteria2 слушает QUIC поверх UDP, а все проверки панели были TCP. Стук по TCP в такой порт получает отказ всегда, независимо от того, работает туннель или нет, — и рабочая схема объявлялась недоступной с формулировкой «порт закрыт».
Теперь UDP-вход проверяется с двух сторон. Изнутри — по снимку слушающих сокетов, который агент присылает вместе с метриками: занят ли порт вообще. Снаружи — настоящим QUIC-рукопожатием с проверкой сертификата, тем же, которое делает клиент. Маршрут на Hysteria2 впервые получил доказательство и перестал висеть непроверенным.
Границу стоит назвать вслух. Рукопожатие доказывает, что пакеты доходят и сертификат тот. Оно не доказывает, что пройдёт аутентификация Hysteria2 — для этого нужен пароль подписки, которого у проверки нет и быть не должно. Поэтому в журнале это называется рукопожатием, а не «маршрут работает».
Заодно незнание перестало краситься как поломка. Проверка, которой нечего было проверить, больше не красит путь на холсте красным и не подписывает его «Проблемный путь»; в сводке такие пути считаются отдельно, как непроверенные. WARP по той же причине больше не обвиняется без проверки. Раньше отличить «сломано» от «не смотрели» можно было только открыв журнал проб.
Перепродажа с арендованного сервера теперь ловится
Все факторы детектора шаринга построены на разбросе: адресов, стран, устройств. Перепродажа с арендованного сервера даёт обратное — один адрес, одна страна, один провайдер. Для детектора такой перепродавец выглядел образцовым подписчиком. То есть панель ловила клиента, раздавшего ключ трём друзьям, и пропускала того, кто продаёт доступ сотне.
Появился фактор «трафик приходит из хостинга»: домашнего интернета в датацентрах не бывает. Сам по себе он ничего не открывает — подписчик может сидеть за корпоративной сетью или держать сервер для себя. Инцидент открывает пара «объём плюс хостинг», и она объясняется клиенту одной фразой. Порог объёма, который считается подозрительным, теперь задаётся в настройках, а не зашит в код.
Превышение лимита устройств тоже стало поводом для инцидента — но только когда устройства посчитаны по устройствам. Там, где данных об устройствах нет, панель подставляет число активных адресов, и по этому пути один телефон, переехавший из дома в метро, выглядел бы как несколько устройств. По такому счётчику инцидент не открывается, а в тексте для оператора прямо сказано, факт перед ним или подстановка.
Бот и прокси поддержки настраиваются, а не только удаляются
У канала были «Проверить», «Включить» и «Удалить». Бот с протухшим токеном оказывался в тупике: чинить нечем, а удалить нельзя — к нему привязаны тикеты. Прокси правился ещё хуже: завести его можно было только внутри диалога добавления ...
Axottle v1.5.2
Обновление за 2–3 августа 2026.
Предыдущий релиз вышел днём второго августа и научил панель работать с Remnawave третьей версии. Всё, что после него, вскрылось на живых прогонах: переустановка сервера с нуля, обновление Remnawave на отдельной машине и первая собранная схема подключения. Ни одна из этих поломок не ловится тестами, потому что все они начинаются там же, где начинается настоящий сервер.
Панель перестала врать про служебного пользователя
Пользователь, которым панель проверяет схемы «как клиент», заводился в Remnawave, но не сохранялся у себя. Выглядело это так: в Remnawave пользователь есть, а вкладка «Здоровье» пишет, что его нет, и не выполняет ни одной сквозной проверки.
Причина в одну строку. Пояснение к коду попало внутрь текста SQL-запроса: для Go это часть строки, для PostgreSQL — синтаксическая ошибка, и запись падала при каждом вызове.
Теперь она проходит. Заодно неудачная попытка перестала выглядеть как «никто и не пытался»: панель пишет, на чём именно споткнулась, а синхронизация сообщает об этом в результате, а не только в лог. Раньше она в любом случае заканчивалась зелёной.
Применение схемы синхронизируется с Remnawave
Локальная копия того, что происходит в Remnawave, обновлялась ровно одним способом: вы нажимали «Синхронизировать» на странице подключения. С этого момента она расходилась с настоящей панелью, и признаться в этом было нечему.
Применение схемы читает эту же копию: какую ноду привязать, какой хост уже существует, где живёт служебный пользователь. То есть деплой шёл по состоянию неизвестной давности. Служебный пользователь заводится в самом конце синхронизации, поэтому у тех, кто её не запускал, его не было вовсе.
Теперь применение синхронизируется само, перед тем как что-то отправлять в Remnawave. Шаг не обязательный: недоступная панель не роняет деплой, который отработал бы и по старым данным. Но результат виден в диалоге применения, так что «применили по устаревшему снимку» больше не подразумевается молча. Применение из-за этого стало заметно дольше на панелях с большим числом пользователей.
Кроме того, панель обновляет эту копию сама раз в десять минут.
Схема не применяется на домен, которого ещё нет в DNS
Домен входной ноды уходит в хост Remnawave, по которому подключаются все клиенты, и по нему же панель проверяет шлюз. Если A-записи у домена нет, не работает ничего: ни клиенты, ни проверки, ни маскировочный сайт. Наружу это выходит десятком разных на вид ошибок вроде «no such host».
Раньше панель спокойно всё это публиковала и оставляла разбираться вкладке «Здоровье» постфактум. Теперь перед отправкой она резолвит каждый адрес, который собирается опубликовать, и останавливается, если домена в DNS нет.
Проверка нарочно узкая, чтобы ей можно было доверять, а не отключить в первую неделю. Останавливает только ответ «домен не найден». Таймаут резолвера говорит о сервере панели, а не о вашем домене, и права вето на все деплои не получает. Домен, который резолвится не на адрес ноды, показывается, но ничего не блокирует: Cloudflare под оранжевым облаком, свой CDN и балансировка по нескольким адресам отсюда выглядят одинаково подозрительно, хотя все три законны. Ноды по голому IP не проверяются, там нечего резолвить.
Остановку снимает переключатель в диалоге. «Запись едет, применяю заранее» это нормальная рабочая ситуация. Ненормально было то, что панель принимала это решение за вас и молча.
Вкладка «Здоровье» написана для оператора
Список проверок показывал то, что вернул сервер, как есть. Из десятка строк половина называлась «Health-проверка», потому что названия были заведены для шести типов проверок из полутора десятков. Под ними шёл текст на английском:
skipped because L1 reachability failed
dial tcp: lookup de1.example.dev on 127.0.0.53:53: no such host
Это правда, но правда для того, кто писал проверку. Оператор видел одинаковые заголовки, английские строки и код gateway_unreachable и не понимал ни что сломалось, ни куда идти.
Теперь у каждой проверки своё название, а под ним объяснение обычными словами: домен не резолвится, порт закрыт, ушло в таймаут и так выглядит блокировка, в отличие от отказа. К объяснению идёт подсказка, что с этим делать, она раскрывается вместе со строкой. Сам ответ проверки никуда не делся: он там же, дословно и подписанный, потому что для разбора нужен именно он.
Статус «Не реализовано» переименован в «Не выполнена». Почти всегда это проверка, которой не хватило данных для запуска, а читалась она как недоделка панели.
Remnawave можно поставить за реверс-прокси, и это рекомендуемый способ
В меню установщика было два варианта, и оба давали панель, которую нельзя открыть в браузере: Remnawave рвёт соединение, пришедшее не через прокси по HTTPS. На публичном порту это видно сразу, вкладка пустая, а в логе копятся ошибки на каждый заход.
Первым пунктом теперь идёт установка за реверс-прокси с доменом и сертификатом, помеченная как рекомендуемая. Это не вкусовщина: только так веб-интерфейс Remnawave вообще работает. Если прокси на сервере нет, установщик поднимает Caddy; если 80 и 443 уже держит ваш caddy или nginx, он допишет туда site-блок; если порты заняты чем-то ещё, честно скажет об этом и предложит локальный вариант, вместо того чтобы драться за порт.
Установщик не виснет и не спрашивает лишнее
Переустановка сервера без терминала показала сразу несколько поломок.
Вопрос про домен панели задавался всегда, даже если домен уже передан флагом. С терминалом оператор молча набирал его второй раз и ничего не замечал. Без терминала это уходило в бесконечный цикл на полной скорости: за полчаса 27 МБ предупреждений в логе и ни одного ответа, которого неоткуда было взять. Теперь переданное значение принимается сразу, а при отсутствии терминала установщик останавливается и называет флаг, которым это чинится.
Меню способа доступа к Remnawave не показывалось вовсе, если сам Axottle ставился на домен. Режим навязывался, а следом навязывались домен, DNS-запись и сертификат панели, которой всё это могло быть не нужно. Многие держат Remnawave на loopback и работают с ней только из Axottle. Теперь вопрос задаётся всегда.
Токен Cloudflare спрашивался заново на каждый домен, хотя должен был спрашиваться один раз за установку. На диск он по-прежнему не пишется, поэтому возобновлённая установка спросит его снова.
Вопросы, у которых нет флага, вешали неинтерактивную установку намертво. И права на каталог Remnawave выставлялись раньше, чем в нём появлялся compose-файл, что убивало установку сразу после создания .env.
Обновление Remnawave работает и когда она на отдельном сервере
Кнопка обновления раньше была доступна только для Remnawave, стоящей на одной машине с Axottle: панель правит compose-файл и дёргает docker сама, а до чужого сервера ей не дотянуться. Теперь ту же работу там выполняет уже установленный агент.
Бэкап, его проверка и восстановление базы остались за панелью в обоих случаях, и правило «без бэкапа обновления не будет» для отдельного сервера ровно то же.
Заодно исправлены две вещи, найденные на живом прогоне. Панель отклоняла собственную задачу обновления с ошибкой про недопустимый вид задачи. И она теряла ответ агента, если задача завершилась неудачей, из-за чего любой сбой выглядел одинаково: после безобидной осечки на скачивании образа, когда ничего ещё не запускалось и данные были в порядке, панель восстанавливала базу из бэкапа. Теперь она различает, на каком шаге всё остановилось.
Панель видит и правит стек Remnawave
Панель работает под непривилегированным пользователем, которого никто не добавлял в группу docker. Стоя на одном сервере с Remnawave, она не находила ни compose-проект, ни базу и показывала ошибку обнаружения с единственной подсказкой про недоступный сокет. При этом панель Docker не просто смотрит, а управляет им: обнаружение читает compose-проект, бэкап запускает выгрузку внутри контейнера базы, обновление пересоздаёт стек.
Отдельно от этого обновление умирало на первом же шаге: каталог с настройками Remnawave принадлежит root, и панель не могла переписать compose-файл. Падало безопасно, версия не менялась и данные не трогались, но прогон бэкапа тратился впустую, а сообщение оператору ничего не объясняло.
Установщик теперь выдаёт панели и то, и другое, в том числе при повторном запуске на существующей установке. Стоит сказать прямо: членство в группе docker на этом хосте равносильно правам root. Это ровно тот доступ, который вы дали, попросив Axottle управлять развёртыванием, и более узкой двери к той же работе не существует.
Плашка SelfSteal объясняет, что ей мешает
На карточке ноды плашка знала только «можно» и «нельзя». После того как вы настроили домен и сертификат, она продолжала висеть без единой подсказки, что не так.
Теперь она перечисляет конкретные препятствия, ведёт на нужную вкладку и даёт кнопку «Проверить снова». В зелёном состоянии предлагает перейти в раздел SelfSteal или поставить сайт сразу. Крестик её прячет, но запоминает именно то состояние, которое вы закрыли: как только всё сойдётся, зелёная плашка появится снова.
Ещё живой сертификат мог читаться как отсутствующий из-за поля, которое агент заполняет не всегда. Проверка на него больше не смотрит.
Обновление
Обновиться можно кнопкой в панели (нужен polkit) или скриптом на сервере:
sudo /opt/axottle/installer/upgrade.shМиграции применяются при старте, останавливать панель заранее не нужно.
Если вы ставили панель до этого релиза, доступ к Docker и права на каталог Remnawave выдаются повторным запуском установщика.
Axottle v1.5.1
Обновление за 1–2 августа 2026.
31 июля Remnawave выпустила третью версию, а на следующий день сделала её версией по умолчанию. Всё, что ставилось после этого, ставилось сломанным: панель разворачивалась, но не запускалась, а бесконечно перезагружалась. Этот релиз чинит установку и заодно закрывает вопрос на будущее: Axottle теперь одинаково работает и со второй версией Remnawave, и с третьей, а обновлять её можно кнопкой из панели.
Установка Remnawave снова работает
Третьей версии нужен ключ, которого установщик не писал: до неё панель подписывала токены другими ключами, а новая без него просто не стартует. Теперь ключ генерируется при установке.
Версия образа больше не берётся из тега «последний». Именно этот тег и подложил свинью: он переехал на новый мажор через сутки после релиза, и все, кто ставил панель в этот день, получили её нерабочей. Теперь ставится конкретная версия, которую вы выбрали.
Если панель всё-таки не поднялась, установщик покажет причину из её собственного лога, а не сообщит, что она «не ответила».
Панель понимает и вторую, и третью версию
Axottle спрашивает у панели, какая она, и дальше разговаривает с ней на её языке. Подключить можно как уже работающую вторую версию, так и свежую третью, разницы вы не заметите.
Под капотом там было четыре несовместимости. Третья версия убрала у пользователей идентификатор, по которому Axottle к ним обращался, поэтому теперь везде используется тот, что есть в обеих версиях. Часть настроек подписки переехала в заголовки ответа, и панель перестала читать их целиком. У хостов одиночный тег ещё в прошлой версии заменили списком, а мы всё это время читали поле, которого уже нигде нет. И наконец, изменился формат создания API-ключа, причём дважды: сначала поменялось тело запроса, а в третьей версии ключ ещё и перестал выдаваться без специального заголовка, то есть создать его старым способом стало невозможно в принципе.
Всё это проверено не по документации, а на двух живых панелях, поднятых рядом: 2.8.1 и 3.1.0. Прогон по всему API, которым пользуется Axottle, зелёный на обеих.
Обновление Remnawave кнопкой из панели
В карточке подключения появился выбор версии и кнопка обновления. Панель сама снимает бэкап, проверяет его, меняет версию, скачивает образ, перезапускает стек и ждёт, пока Remnawave подтвердит, что работает уже на новой версии.
Главное правило: без бэкапа обновления не будет. Не «мы предупредили», а именно не будет. Настроенного профиля бэкапа недостаточно, нужен профиль, у которого бэкапы реально проходят: новая версия обновляет свою базу при первом запуске, и старый образ её потом уже не прочитает. Единственный путь назад лежит через дамп, снятый до переключения, поэтому он снимается всегда и всегда проверяется.
Откат разный в зависимости от того, где всё сломалось. Если не скачался образ, ничего ещё не запускалось: возвращается только версия в конфиге, базу никто не трогает. Если панель не поднялась или ответила не той версией, возвращается и версия, и база из того самого бэкапа. Если не удался и откат, вы получите номер бэкапа для восстановления руками, а не общую фразу про ошибку.
Пока обновление умеет только панель, которая стоит на том же сервере, что и Axottle. Для панели на отдельном сервере кнопка честно скажет, что недоступна: агенту, который там работает, такую задачу пока не выдают.
Установщик спрашивает, какую версию ставить
При установке Remnawave вы выбираете стрелками одну из пяти последних версий. Плавающих тегов в списке нет по той же причине, по которой мы от них отказались: выбрать «последний» значит согласиться, что однажды панель обновится сама и не спросит.
Если реестр недоступен или установка идёт без вопросов, ставится версия по умолчанию, а не падает вся установка.
Привязка панели доводится до конца
Установщик и раньше должен был сам завести администратора Remnawave, выпустить ключ и связать панель с Axottle. На деле этот шаг тихо не срабатывал, и в конце установки вам предлагали сделать всё руками.
Причин оказалось три, и все независимые. Remnawave с прошлой весны обрывает соединение, если запрос пришёл не через реверс-прокси, а мы ходили к ней напрямую по локальному адресу и получали пустоту вместо ответа. Формат создания ключа поменялся. И ещё цикл ожидания выходил на первой же неудачной попытке из-за опечатки в сравнении, так что регистрация начиналась раньше, чем панель успевала подняться.
Теперь всё это работает, и повторный запуск установщика обновляет уже существующее подключение, а не заводит второе. Заодно появился путь повтора из панели на случай, если панель поднялась позже, чем её ждали.
Переезд не меняет версию панели
При переносе Remnawave на другой сервер туда ставится ровно та версия, что работала на старом. Раньше переезд мог заодно и обновить панель до третьей версии, необратимо обновив её базу по дороге.
Поддержка на базовом тарифе
Раздел поддержки открывался с баннером «лицензия не включает» и надписью «нет данных» на тарифах, где очередь, каналы и инциденты вполне работают. Виноваты были два запроса аналитики, без которых остальное прекрасно живёт. Теперь закрытые тарифом запросы просто не уходят, а виджеты без данных не рисуются.
Обновление
Обновиться можно кнопкой в панели (нужен polkit) или скриптом на сервере:
sudo /opt/axottle/installer/upgrade.shМиграции применяются при старте, останавливать панель заранее не нужно.
Обновление самой Remnawave до третьей версии не требуется: Axottle работает с обеими. Если решите обновлять, сначала настройте бэкап в разделе Remnawave, иначе кнопка обновления будет заблокирована.
Axottle v1.5.0
Обновление за 16–29 июля 2026.
Самое крупное здесь — поддержка клиентов. Раньше вы отвечали людям где-то сбоку от панели: в личных сообщениях, в чате, в чужом хелпдеске. Теперь переписка живёт внутри Axottle, вместе с нодами и подключениями, про которые эти люди и пишут.
Поддержка клиентов внутри панели
Клиент пишет вашему боту в Telegram, и в панели появляется тикет. Отвечать можно тремя способами, как удобнее: из панели, из отдельной страницы для операторов или прямо из Telegram, где на каждый тикет заводится своя тема в рабочей группе. Всё это одна и та же переписка, просто три двери в неё.
Ответить можно от имени бота или с обычного аккаунта Telegram, если клиенты уже привыкли писать туда. Аккаунт для этого лучше завести отдельный, служебный: Telegram не любит автоматизацию на живых номерах.
Картинки, гифки, стикеры, видео и файлы ходят в обе стороны. Вложения по умолчанию лежат в базе панели, но можно подключить S3 или совместимое хранилище и проверить подключение кнопкой. Есть лимит на общий объём: когда место кончается, панель говорит об этом в Health Center и в Telegram, а не молча перестаёт принимать файлы.
Роли семь штук, от владельца до наблюдателя. Оператора можно добавить по @username или по Telegram ID, аккаунт в панели ему для этого не нужен. При закрытии тикета клиент видит пять звёзд и может оценить обслуживание.
Искусственный интеллект в поддержке, если он вам нужен
ИИ включается по частям и по умолчанию не отвечает никому.
Первая ступень — подсказки. Модель пишет черновик ответа, оператор его читает и отправляет сам. Клиент до этого момента не видит ни слова.
Вторая ступень — автономные ответы. Здесь есть два режима областей. Белый список: ИИ отвечает только по темам, которые вы разрешили. Чёрный: отвечает по всему, кроме тем, которые вы за собой оставили. Порог уверенности задаёте вы. Если модель не уверена или вообще не сообщила уверенность, тикет уходит человеку. Это правило без исключений: любая непонятная ситуация заканчивается живым оператором, а не догадкой.
Отвечает ИИ по вашей базе знаний. Уроки в неё попадают через утверждение, никакой другой путь к активному знанию не ведёт. Урок можно отправить в карантин, и он перестаёт использоваться в ту же секунду. Когда знаний не хватает, вы выбираете поведение: либо сразу звать человека, либо собрать симптомы и дать безопасный общий совет вроде «переподключитесь» или «смените сервер».
Учить ИИ можно в тренировочном чате: разговариваете с ним как клиент, а потом одной кнопкой сворачиваете разговор в черновик урока.
Модель умеет смотреть скриншоты клиента. Распознаванием занимается отдельная модель, а та, что пишет ответ, картинку не видит и работает с текстовым описанием.
Панель считает настроение клиентов, время ответа, нагрузку на операторов и пробелы в знаниях. Если на один и тот же узел вдруг жалуются многие, она собирает это в один массовый инцидент, а не в двадцать одинаковых тикетов.
Вход через Telegram и точные права
Можно входить в панель через Telegram, без пароля. Сессия теперь живёт в cookie, а не в токене в браузере.
Права стали подробными: 36 разрешений, разложенных по 16 разделам панели. Ноды и Connection Units делятся на просмотр, создание, изменение, удаление и операции, у остальных разделов пара «смотреть» и «управлять». Отдельно вынесены восстановление из бэкапа, лицензия и управление аккаунтами. Меню показывает только то, до чего у человека есть доступ, и поиск тоже. Один суперпользователь защищён от удаления и понижения, чтобы нельзя было случайно запереть себя снаружи.
Панель открывается с телефона
Всё, что было на десктопе, теперь читается и на экране 360 пикселей. Экран входа получил свои фоны под портрет, меню раскрывается на весь экран, диалоги приезжают снизу, широкие таблицы прокручиваются вбок сами, а не растягивают страницу за край.
Схема Connection Units на телефоне открывается только для чтения. Пан пальцем и щипок работают, а собрать маршрут нельзя: попасть пальцем в порт размером в несколько пикселей всё равно невозможно, и делать вид, что можно, мы не стали.
Вёрстка от 1024 пикселей не изменилась ни в одном разделе.
Поиск по всей панели
Поле поиска в шапке раньше было нарисованное. Теперь по ⌘K (или Ctrl+K) ищется всё сразу: разделы, вкладки настроек, встроенная документация, ноды, юниты, тикеты. Поиск переживает опечатки и не той раскладкой набранное: «нды» найдёт «Ноды», «селфстил» найдёт SelfSteal. Верхний результат дописывается прямо в поле, Tab его принимает.
Команды не только находятся, но и выполняются. «Создать ноду» открывает мастер, а не просто переводит на страницу, где эту кнопку ещё надо найти глазами.
Рядом с Axosun появилась книжка: она открывает документацию на странице того раздела, в котором вы сейчас находитесь.
Переезд Remnawave на другой сервер
Мастер из четырёх шагов в разделе Remnawave. Он снимает дамп базы, ставит Docker на новый сервер, разворачивает такой же стек, восстанавливает базу и проверяет, что новая панель принимает ваш существующий токен.
Ссылки на подписку не меняются: домен подписки переносится как есть. JWT-секреты переносятся вместе с базой, иначе восстановленная панель отвергла бы все выданные токены, включая свой собственный.
Остановка старой панели вынесена в отдельный шаг с кнопкой, потому что пока работают обе, старая продолжает раздавать нодам свой конфиг. Ноды, до которых Axottle дотягивается через агент, перепривязываются сами; до которых не дотягивается, остаются в списке с указанием причины. Если проверка после переключения не проходит, адрес возвращается на прежний автоматически.
Старый сервер при этом не меняется нигде, кроме явной остановки контейнера, так что откатиться можно всегда.
Безопасность
Мы прочитали панель насквозь и нашли семь проблем. Четыре закрыты в этом обновлении, и две из них стоит объяснить.
Раньше все секреты (коды двухфакторной аутентификации, ключи CDN и S3, сессии Telegram, бэкапы) шифровались одним и тем же ключом, который лежит в открытом репозитории. Теперь каждая установка получает свой ключ. Обновление не требует остановки: старые записи перешифровываются сами при первом чтении. Если панель всё ещё сидит на публичном ключе, она пишет об этом в лог, и axottle doctor показывает провалившуюся проверку.
Второе: лог запросов писал полный токен подписки целиком, то есть журнал сервера превращался в список живых ссылок. Теперь остаются первые восемь символов.
Ещё панель начала отдавать заголовки безопасности на каждый ответ, а файл, присланный клиентом в чат, больше не может выполниться в браузере оператора.
Отдельно про диагностические архивы. Раньше архив, который вы отправляете в поддержку, нёс адреса всех, кто подключался, и всех нод, к которым подключались. Теперь каждый адрес, по которому можно кого-то опознать, маскируется до вида 8.x.x.8, а в манифесте написано, сколько адресов замаскировано. Loopback и маски подсетей оставлены как есть: они никого не опознают, а диагностика без них бесполезна.
К архиву теперь прикладываются ошибки браузера. Интерфейс панели живёт внутри одного бинаря с сервером, и когда падал именно он, на сервере об этом никто не знал: вы видели белый экран, а присланный архив описывал совершенно здоровый бэкенд. Пароли, токены, логины и почтовые адреса вычищаются на входе, до записи на диск.
Здоровье и ноды
Проверка VLESS перестала зря пропускать юниты. Раньше она сравнивала адрес ключа с доменом ноды посимвольно, и любой юнит, у которого клиентский адрес отличался, вечно висел в статусе «пропущено» при живом туннеле.
После успешного подключения панель узнаёт, с какого адреса туннель на самом деле выходит наружу. Это видно в карточке ноды и помогает поймать момент, когда трафик молча пошёл не туда: например, мимо WARP.
Если на одной ноде поднято несколько входов, здоровье считается по каждому отдельно. Упавший порт больше не прячется за живым.
Одну ноду можно использовать в нескольких блоках одного юнита, но не в разных юнитах: попытка отклоняется до того, как что-то будет записано наружу. Standalone-юнит ограничен одной входной нодой, для второй нужен balanced.
При удалении ноды можно заодно удалить её двойника в Remnawave, чтобы панель не подобрала её обратно при следующей синхронизации.
Внешний вид
Панель по умолчанию розовая. Цвет взят из логотипа: тело аксолотля и его рот. Прежняя зелёная схема осталась и переключается в настройках рядом со светлой и тёмной темой.
Заодно зелёный перестал работать на две роли сразу. Раньше он был и акцентом интерфейса, и статусом «в порядке»; теперь он только статус. Все сочетания текста и фона в обеих палитрах проверены на контраст.
Обновление
Обновиться можно кнопкой в панели (нужен polkit) или скриптом на сервере:
sudo /opt/axottle/installer/upgrade.shМиграции применяются при старте, останавливать панель заранее не нужно.
Ссылки
Axottle v1.3.2-beta
Full Changelog: v1.0.0-beta...v1.3.2-beta
Axottle v1.3.1-beta
Full Changelog: v1.0.0-beta...v1.3.1-beta
Axottle v1.3.0-beta
Full Changelog: v1.0.0-beta...v1.3.0-beta
Axottle v1.2.9-beta
Full Changelog: v1.0.0-beta...v1.2.9-beta
Axottle v1.2.8-beta
Full Changelog: v1.0.0-beta...v1.2.8-beta