🚀 Tachyon v1.4.0 — один из самых важных релизов проекта
Наконец-то готов Tachyon v1.4.0.
И это тот случай, когда номер версии вроде бы изменился не сильно, а внутри проект поменялся очень серьёзно.
В этом релизе я не просто добавил несколько новых кнопок и починил пачку багов. Я начал переводить Tachyon на архитектуру, где он больше не зависит от одного-единственного движка маршрутизации.
Главная новинка — Steer.
Но сразу важный момент:
⚠️ Steer пока тестовый.
Сейчас это Canary-функция для тех, кто хочет попробовать новую архитектуру и помочь с тестированием.
Для обычного повседневного использования я пока рекомендую оставаться на sing-box.
При этом переключение полностью обратимое: если Steer какую-то настройку пока не понимает, Tachyon не удаляет её, а временно «паркует». Вернулись обратно на sing-box — настройки восстановились.
То есть экспериментировать теперь можно намного спокойнее.
🧭 Tachyon больше не привязан только к sing-box
Наверное, это самое главное изменение во всём релизе.
Раньше большая часть логики Tachyon так или иначе строилась вокруг sing-box.
Теперь я добавил отдельный мультидвижковый оркестратор.
Проще говоря, Tachyon теперь понимает:
- какой движок сейчас активен;
- какие функции этот движок поддерживает;
- что нужно запустить;
- что нужно остановить;
- какие настройки можно применить;
- какие настройки нужно временно сохранить;
- что делать при переключении обратно.
Перед самим переключением Tachyon сначала рассчитывает план операции.
Если нужный движок не установлен — он не будет пытаться переключиться «на авось».
⚙️ Steer теперь полноценно интегрирован в Tachyon
Я сделал генерацию конфигурации Steer прямо из обычных настроек Tachyon.
То есть вам не нужно руками собирать spec.json.
Tachyon сам умеет превращать текущую конфигурацию в правила Steer:
- домены;
- IP;
- порты;
- протоколы;
- direct;
- интерфейсы;
- VLESS;
- Zapret;
- отдельные правила nftables.
Для Steer создаётся отдельная таблица:
inet steer
Так что новый движок не должен превращать системные правила маршрутизации в кашу.
🔄 Переключение движка теперь выглядит нормально
Раньше любые подобные системные операции было очень легко превратить в набор костылей.
В v1.4.0 я сделал переключение движка полноценной компонентной операцией.
Теперь процесс выглядит примерно так же, как обновление Tachyon:
подготовка → установка → переключение → запуск → проверка
И всё это показывается в модальном окне с прогрессом.
Если нужного движка нет, интерфейс сам выполняет:
Install → Switch
То есть нажали кнопку — и Tachyon сначала поставил нужное ядро, потом реально на него переключился.
Без ситуации «ну вроде установилось, а дальше разбирайся сам».
🖥 Карточку движка я тоже нормально переделал
Теперь сразу видно, что конкретно сейчас используется.
Например:
sing-box 1.11.3 (Extended)
или
steer-extended 1.2.3
В списке движков отображается состояние:
✓ active
installed
not installed
То есть больше не нужно гадать:
«А он вообще установлен?»
«А сейчас точно запущен этот вариант?»
«А какой именно sing-box у меня стоит?»
🐛 Заодно убрал несколько очень неприятных зависаний UI
Была отдельная категория багов, когда операция уже закончилась или упала, а кнопка в интерфейсе продолжала показывать, что «что-то происходит».
И всё.
Можно было ждать хоть вечность.
В этом релизе я отдельно прошёлся по этой логике.
Теперь состояние операции снимается корректно даже после:
- ошибки установки;
- ошибки загрузки данных;
- неудачного переключения;
- параллельного watcher-запроса;
- уже отслеживаемой фоновой операции.
🛡 Steer + DPI
Для Steer я сделал отдельную интеграцию с nfqws / nfqws2.
Появились:
steer-nfqws
и
tachyon-steer-zapret
Через них Tachyon может применять DPI-стратегии внутри Steer.
Стратегии хранятся отдельно, поддерживаются Lua runtime, blob-файлы и полноценные параметры запуска nfqws.
Также я решил проблему, когда пакет Steer мог перезаписать мою обёртку.
Теперь оригинал хранится отдельно и автоматически восстанавливается при необходимости.
🧪 Strategy Fuzzer стал заметно стабильнее
Здесь тоже была неприятная проблема.
При первом запуске фаззера иногда можно было сразу получить timeout, хотя сам тест ещё толком даже не начался.
Оказалось, что перед запуском происходила лишняя синхронная DPI-детекция, которая могла подвесить весь процесс.
Я её убрал.
Плюс:
- увеличил RPC timeout;
- добавил coreutils-timeout;
- улучшил запуск на слабых роутерах;
- починил получение статуса;
- починил применение найденной стратегии.
В общем, фаззер теперь должен гораздо реже падать просто потому, что роутер на секунду задумался.
🌍 Нормальные названия серверов в Steer
Ещё один визуально очень раздражающий момент.
Вместо нормальных названий серверов Steer мог показывать что-то вроде:
proxy-0
proxy-1
proxy-2
Очень информативно 😁
Теперь Tachyon сохраняет оригинальные данные узлов:
- название;
- страну;
- флаг;
- транспорт;
- тип подключения.
То есть в интерфейсе снова можно видеть нормальные серверы, а не внутренние технические имена.
📶 Починил Latency
Ещё раньше сервер, который реально отвалился по timeout, мог показываться как:
N/A
То есть интерфейс не различал:
- сервер ещё не проверялся;
- сервер проверили, но он не ответил.
Теперь это разные состояния.
Если узел не отвечает, интерфейс показывает:
Timeout / Не отвечает
а не создаёт ощущение, что тест просто не запускался.
📡 Подписки Steer больше не конфликтуют друг с другом
Если было несколько VLESS-секций, их данные могли перетирать друг друга.
Это исправлено.
Теперь каждая секция получает собственный sub.txt и собственный кэш.
Можно использовать несколько подписок без того, чтобы одна внезапно подменяла список серверов другой.
🌐 DNS для Steer
Я добавил отдельный DNS-модуль для нового движка.
Steer теперь может использовать SmartDNS как upstream.
Есть поддержка:
- обычного DNS;
- DoH;
- DoT.
🧹 Под капотом я очень сильно почистил проект
На пользовательском интерфейсе это почти не видно, но для будущих обновлений это одна из самых важных частей v1.4.0.
Старый огромный:
components/action.uc
я разделил на отдельные модули.
Теперь установка компонентов, проверка версий, документация, каталог релизов, верификация и вспомогательная логика не лежат одним огромным полотном.
То же самое сделал с Fuzzer.
Его тоже разбил на отдельные модули.
Зачем это вообще нужно?
Чтобы каждое следующее изменение не превращалось в игру:
«Починил обновление sing-box — случайно сломал удаление Steer».
Чем крупнее становится Tachyon, тем важнее нормально разделять ответственность внутри кода.
🧠 Контроль процессов стал надёжнее
Я добавил новый:
core/process.uc
Теперь Tachyon определяет свои процессы не только по PID.
Он также учитывает:
- время запуска;
- boot-id;
- возраст процесса;
- дополнительные параметры идентификации.
Это нужно для защиты от очень неприятной ситуации, когда процесс уже умер, PID система выдала другому приложению, а Tachyon думает, что его старый сервис всё ещё работает.
📦 Работа с пакетами тоже переехала в отдельный модуль
Появился:
core/packages.uc
Туда я вынес:
- управление lock'ами;
- определение зависших lock'ов;
- разбор архитектуры пакетов;
- часть общей логики apk/ipk.
Это особенно важно для OpenWrt-устройств, где неправильная работа с пакетным менеджером может закончиться далеко не красивой ошибкой в UI.
🌐 sing-box я тоже не бросил
Несмотря на огромное количество работы вокруг Steer, в sing-box тоже есть важные исправления.
IP-only списки
IP-списки больше не отправляются в FakeIP DNS-правила.
Если rule-set содержит только IP — он используется только для маршрутизации.
Смешанные списки
Если в одном источнике одновременно есть:
- домены;
- IP;
Tachyon теперь разделяет их автоматически.
Домены идут в DNS-логику.
IP — в маршрутизацию.
Так намного правильнее и предсказуемее.
🔐 OpenVPN
Для OpenVPN endpoint'ов я обновил генерацию конфигурации.
Новый вариант требует:
sing-box 1.14.0+
Если версия ниже — Tachyon выдаёт нормальную понятную ошибку.
А не генерирует что-то, что потом непонятно почему не стартует.
🐞 Починил ещё одну очень мерзкую проблему ucode
В проекте были места, где функция вызывалась раньше, чем объявлялась.
В некоторых языках это нормально.
В нашем случае ucode местами мог просто тихо сломать выполнение.
Без красивой ошибки.
Без большого красного сообщения.
Просто «не работает».
Это в том числе могло задевать self-update.
Теперь подобные места ловятся линтером, а найденные проблемы я исправил.
📦 Installer 3.1.0
Отдельно обновил установщик.
Теперь через install.sh доступны все основные варианты sing-box:
- stable;
- tiny;
- extended;
- extended-compressed;
- lx;
- skip.
Раньше CLI и LuCI в этом плане немного жили каждый своей жизнью.
Теперь варианты синхронизированы.
🏷 Можно выбрать конкретную версию Tachyon
В интерактивном режиме установщик теперь показывает несколько последних релизов и предлагает выбрать нужный.
По умолчанию остаётся рекомендуемый latest.
При этом автоматические сценарии я не сломал.
--tag
и
-y
по-прежнему можно использовать для полностью автоматической установки.
💾 Установка по-прежнему защищена от неприятных сюрпризов
Перед обновлением Tachyon проверяет:
- свободное место на overlay;
- свободное место в /tmp;
- lock пакетного менеджера;
- возможность создать recovery snapshot.
Это особенно важно для роутеров с маленькой флешкой.
Потому что последнее, чего хочется во время обновления — узнать, что место закончилось где-то на половине установки.
✅ Тесты
Перед релизом я прогнал проект через тесты.
Backend:
172 / 172
Frontend:
647 Vitest
Плюс:
- ESLint без предупреждений;
- shellcheck clean по error severity;
- детерминированная сборка LuCI;
- дополнительные тесты оркестратора;
- тесты нового установщика;
- тесты Steer;
- тесты работы пакетного менеджера.
📥 Как обновиться
Конфигурация и подписки сохраняются.
Через терминал
curl -fsSL https://raw.githubusercontent.com/Dushnilin/tachyon/main/install.sh | sh -s --force
Через LuCI
Tachyon → Обновления → Проверить обновления → Обновить Tachyon
⚠️ Стоит ли сейчас переходить на Steer?
Если вам нужен просто стабильный домашний роутер — пока оставайтесь на sing-box.
Если хочется потестировать новую архитектуру, посмотреть, куда движется Tachyon, и вы готовы присылать баги и логи — можно попробовать Steer.
Я специально сделал переключение обратимым, чтобы экспериментировать с ним было проще.
Сейчас Steer для меня — это не попытка срочно заменить sing-box.
Это фундамент для того, чтобы Tachyon в будущем вообще не был привязан к конкретному ядру.
❤️ И немного от себя
Этот релиз оказался намного больше, чем я изначально планировал.
Часть изменений вообще начиналась как «сейчас быстренько добавлю ещё один движок», а закончилась переделкой оркестратора, установщика, пакетной логики, процессов, фаззера и части интерфейса.
Но зато теперь у Tachyon появился гораздо более нормальный фундамент для следующих версий.
Если пользуетесь проектом — пишите о багах, странном поведении, зависаниях, проблемах на конкретных моделях роутеров.
Особенно сейчас мне интересна обратная связь по Steer.
Ну а дальше — будет ещё интереснее. 🚀
Anton Lebedev

Sep 25 20:17