zapret-kvn/docs/sing-box/routing-gui.md
loop-uh 308f6da16a
Some checks failed
Windows project source guards / test (push) Failing after 38s
Маршрутизация: структурный редактор sing-box по схеме ядра
Раздел «Маршрутизация» с подпунктами (Обзор, Правила, Наборы правил, DNS,
Исходящие, Система, JSON) редактирует тот же активный native JSON.
Формы строятся из JSON Schema закреплённого ядра (sing-box schema),
своей модели маршрутизации нет; неизвестные ключи и форма Listable
сохраняются. «Проверить» запускает sing-box check в фоне.

DNS больше не перезаписывается принудительно: при обновлении шаблонов
нетронутые верхние секции следуют за стоком, изменённые остаются.
Сброс к стоку — вручную, целиком или по разделу.
2026-09-26 20:30:17 +03:00

6.7 KiB
Raw Permalink Blame History

Маршрутизация: структурный редактор sing-box

Раздел «Маршрутизация» в боковом меню редактирует активный native JSON sing-box (data/configs/sing-box/*.json). Своей модели маршрутизации у приложения нет: формы меняют разобранный JSON на месте и записывают его обратно, страница «JSON» показывает тот же документ.

Страницы

Подпункт Что редактирует
Обзор выбор конфига и шаблона, сравнение со стоком, сброс всего конфига или одного раздела, статус
Правила route.rules (сверху вниз, первое совпадение) и route.final
Наборы правил route.rule_set: local / remote / inline
DNS параметры dns, dns.servers, dns.rules
Исходящие outbounds и endpoints; proxy — слот выбранного сервера, только просмотр
Система inbounds (TUN), остальные route.*, log, experimental, прочие секции
JSON весь документ текстом

Правки живые: «Готово» закрывает подстраницу, «Отменить правки» возвращает объект к состоянию на момент открытия. На диск пишут только «Сохранить»/«Применить» в верхней панели; «Проверить» запускает sing-box check бандл-ядром по редактируемому JSON в фоне (служебные подстановки запуска в эту проверку не входят).

Откуда берутся поля

assets/sing-box-schema/schema.json — JSON Schema, которую генерирует само закреплённое ядро (sing-box schema) из своих Go-структур: python3 scripts/generate_singbox_schema.py после смены пина sing-box в scripts/core-lock.windows-x64.json. Форк не умеет описать несколько своих типов (amnezia-диапазоны endpoints, byte-размеры, providers); генератор ослабляет только их и пишет пути в loose-paths.txt. Тест гарантирует, что их нет в route, dns, inbounds, outbounds, log и experimental; такие поля endpoints редактируются как JSON.

sing-box check по исходному JSON не видит служебных подстановок запуска. Поэтому outbound direct и DNS-сервер bootstrap-dns, на которые запуск ссылается сам, помечены как нужные приложению, а их удаление требует подтверждения.

  • xray_fluent/singbox_config/schema.py — чтение схемы: поля объекта с учётом дискриминатора (type, action), Listable-поля, ссылки на теги (x-tag-reference).
  • xray_fluent/singbox_config/catalog.py — только подписи, закреплённые поля и сводки строк. Поле без подписи всё равно доступно под своим native-ключом.
  • xray_fluent/ui/singbox/form.py — форма показывает заданные, обязательные и закреплённые поля; всё остальное, что знает ядро, — в «Добавить параметр». Смена type/action убирает поля, которые новый вариант не принимает.

Инварианты

  • Открытие страниц и объектов не меняет JSON (пустые секции создаются только при первой настоящей правке).
  • Неизвестные ядру ключи сохраняются и показываются как «неизвестное поле».
  • Одиночное значение Listable-поля остаётся скаляром, пока в нём один элемент.
  • При ошибке JSON разделы только читают и предлагают исправить текст на странице «JSON».
  • Обновление приложения сливает стоковый шаблон посекционно (template_sync.merge_stock_sections): нетронутые разделы следуют за стоком, изменённые остаются вашими. Принудительной синхронизации DNS больше нет.
  • Виджеты редактора удаляются только через qt_lifecycle.dispose_later: скрытие сразу, разрушение на следующем такте при выключенном циклическом GC (у ScrollArea/PlainTextEdit/RoundMenu qfluentwidgets есть SmoothScrollDelegate, гонка GC с деструкторами роняет процесс, на Windows — особенно). Меню «Добавить…» строятся по клику и удаляются после закрытия.
  • qfluentwidgets 1.11 не освобождает Python-обёртки удалённых стилизованных виджетов (лямбды на destroyed и qconfig.themeChanged). Глобально это не патчится: освобождённые обёртки попадают под ту же гонку GC во всём приложении. Поэтому редактор бережёт виджеты: строки списков обновляются на месте, невидимые разделы пересобираются только при показе, повторная загрузка того же текста ничего не пересобирает, схема ядра грузится при первой сборке раздела.
  • Смена type/action пересобирает форму на следующем такте: выбор приходит из всплывающего меню самого комбобокса.
  • Незафиксированный ввод (списки и JSON применяются с задержкой) сбрасывается в документ по потере фокуса, «Готово», переключению раздела и перед «Сохранить/Применить/Проверить».