All Go runtime tuning (GOMEMLIMIT, GOGC, GOMAXPROCS) caused more harm
than good — GC thrashing increased both CPU usage and memory consumption.
Go's default GC with GODEBUG=madvdontneed=1 is already optimal for
sing-box on OpenWrt. sing-box uses ~380MB RSS with 130+ outbounds on
a 2GB device, which is normal and expected.
Removed:
- GOMEMLIMIT (caused GC thrashing, 91% CPU)
- GOGC (aggressive values caused CPU spikes)
- GOMAXPROCS (unnecessary, Go handles this)
- mem_scale file (no longer needed)
- Adaptive memory scaling logic
Kept: GODEBUG=madvdontneed=1 only.
rtk git push origin main
- GOMEMLIMIT: remove 256MB RAM threshold cap. Now applies to ALL
devices. Formula: min(35% RAM, 512MB). mem_scale respected.
Fixes sing-box eating 500MB+ on 2GB routers with no limit.
- Cascade delete: when a routing section is deleted, child UCI entries
(subscription_url, urltest, priority_group, priority_level,
section_interface) are now removed. Prevents orphaned entries that
corrupt config generation.
- Migration cleanup: orphan_section_interfaces now cleans ALL child
types, not just section_interface.
- Watchdog logread: kill orphans in stop_runtime(), add SIGTERM/SIGINT
handlers in uloop mode (previously only in fallback mode).
A value like 'cloudflare-dns.com/dns-query' is the sing-box DoH
path format. The previous check only caught 'https://' URLs.
dns_server_value_valid() accepts it because it validates only the
host part — so 'cloudflare-dns.com' passed as a valid hostname.
Fallback servers are plain UDP only; any '/' in the value is the
DoH path separator and must be rejected.
Changes:
- validator.uc: add index(value, '/') >= 0 check before the
dns_server_value_valid call
- config_validator_runtime.sh: add regression test for path-style
DoH ('cloudflare-dns.com/dns-query') in dns_fallback_server
Fallback servers must be plain UDP (IP or IP:port). Before this fix a
user could accidentally enter a DoH URL (https://...) as a fallback
server — the validator passed it through, and it silently failed at
runtime because dns_failover treats all fallback entries as UDP.
Changes:
- validator.uc: after main/bootstrap validation, check all
dns_fallback_server values: reject entries containing '://'
(protocol URL scheme) with a clear error, then validate each
with dns_server_value_valid for format correctness
- config_validator_runtime.sh: assert_rejects for a DoH URL in
dns_fallback_server
- опция daily_quota_minutes у расписаний: лимит минут использования сети в сутки
- поминутный cron-тик: учёт активности через ip neigh, блок до полуночи при исчерпании
- nft-сеты tachyon_quota_block (MAC) и _ip (IPv4) с drop-правилами; самовосстановление после ребилдов таблицы
- сброс счётчиков после смены суток, TG-уведомление о блокировке
- validator: проверка диапазона 0..1440
- UI: поле и колонка квоты в Родительском контроле + RU-локализация
- новый компонент Tailscale: установка пакета из фида, карточка в Обновлениях
- режим native для секций Tailscale: системный tailscaled вместо sing-box endpoint
- доступ к тейлнету с LAN без клиента: маршруты 100.64.0.0/10 и MagicDNS через dnsmasq
- masquerade и exit-node (opt-in) с обходом tproxy по зарезервированной маске
- validator: требование tailscaled и auth-key для native; bypass-правила в mangle
- тесты: генерация конфига, смоук рантайма с моками, обновлена сигнатура состояния
- i1–i5/j1–j3: классический hex конвертируется в теги <b 0x…>;
userspace WireGuard extended/lx молча игнорирует голый hex,
handshake не завершался (#39#41#42)
- j1/j2/j3/itime эмитятся только для extended ≤2.6.0: в 2.6.1+
поля удалены из схемы, sing-box падает на unknown fields
- j1–j3 больше не ломаются uci_bin_to_hex
- h1–h4: диапазоны «min-max» на обеих ветках
- MTProto: секрет канонизируется в ee-hex из любой формы
(hex/base64), валидатор даёт понятную ошибку вместо
FATAL decode psk (#23)
- XHTTP v2: парсинг и экспорт ключей подписок
- валидатор: warp/masque/openvpn/snell/mieru/sudoku — только extended
- тесты: stat→ucode (busybox), раннеры исключены из E2E,
новые server_mtproto.sh и awg_variant_schema.sh
- has_outbound_section: туннельные секции (awg/warp/vpn/openvpn/masque/
anytls/snell/mieru/sudoku) теперь считаются исходящей конфигурацией -
одинокая AWG-секция больше не получает вводящее в заблуждение
«No proxy outbound sections found» (жалобы пользователей #39/#42)
- новая миграция orphan_section_interface_cleanup: удаление секции
маршрутизации раньше оставляло после себя дочерние section_interface,
ссылающиеся на несуществующего родителя (у пользователя - запись на
секцию '2' при живой только '1'); сироты удаляются через новую операцию
delete_section; функция объявлена до массива MIGRATIONS - ucode не
поднимает объявления
- strip_unmarked_tachyon_cron_lines: старые версии писали cron-строки без
маркер-комментария, они переживали фильтрацию по маркерам, копились при
обновлениях и crond запускал component_updates_if_due дважды за тик;
немаркированные строки с нашими командами теперь вычищаются при каждом
refresh и remove
Новые опции config schedule:
- blocked_domains: домены для блокировки (full:/keyword:/regex: префиксы)
- mode: block (список) | allow (whitelist — всё кроме списка)
- dns_level: блокировка на DNS-уровне (NXDOMAIN через dns-block-in)
- notify: уведомление в Telegram при попытке доступа
Механизм:
- sing-box: новый dns-block-in inbound (127.0.0.43:1053) с reject-правилами
для заблокированных доменов; source_ip_cidr для IP-устройств;
invert для whitelist-режима
- nftables: nat chain dns_block — REDIRECT DNS-запросов устройств на
dns-block-in; time-based через meta hour для расписаний; MAC-устройства
матчатся по ether saddr (DHCP-динамические IP поддерживаются)
- route rules reject для always-on расписаний (fallback при обходе DNS)
- telegram worker: проверка nft counters каждые 60s, уведомление о
заблокированной активности
UI (parental.js):
- колонка Blocked Sites в таблице
- textarea с пресетами: соцсети, видео, игры, взрослый контент,
мессенджеры, магазины
- mode / dns_level / notify переключатели
Валидация: домены, mode, dns_level, notify в validator.uc
Тесты: tests/content_blocking.sh (98/98 backend, 522/522 frontend)
- Fix response parsing: check report field, not just message
- Pass user query text to LLM instead of ignoring it
- Append user question to diagnostic prompt with system context
- Increase timeout to 120s for LM Studio responses
- Add command_status_from_args to core/common.uc exports
Closes#38
- wget: remove -t flag incompatible with BusyBox 25.12+, add curl-first fallback
in download_to_file() with wget as fallback
- startup/reload speedup (5 improvements):
- cut sing-box verification timeout from 45 iterations to 15
- remove redundant second stability wait for sing-box process
- batch requirement check + runtime validation into single ucode fork
- replace dnsmasq full restart with procd reload (config-conditional bounce)
- move telegram and watchdog runtime start to background
- telegram: fix "API failure" spam - empty result[] from getUpdates is now
treated as a successful idle poll, not an error that triggers backoff
- watchdog SmartDetect: extract domain from proxy and VPN URLs for DNS
health check, use real domains (google.com/example.com) instead of
provider-specific endpoints that trigger false alerts
- tests: new invariants for wget -t prohibition, telegram empty-result
handling, DNS apply reload-vs-restart, and combined validation mode ownership
Дашборд:
- Добавлены карточки статуса Zapret, Zapret2, ByeDpi на панель мониторинга
- Показывают статус (работает/остановлен), количество перезапусков, предупреждения
- Баг: API возвращает boolean а не число — исправлено сравнение
Секция Hosts:
- Перенесены опции hosts из глобальных настроек в отдельный тип секции (action=hosts)
- Опции: пользовательские DNS записи, удалённые списки хостов, автообновление, интервал
- Миграция: автоматический перенос глобальных настроек hosts в секцию
- Вкладка «Условия» скрыта для секций типа Hosts (hosts записи применяются глобально)
- Возвращена кнопка «Import Hosts File» с модальным окном загрузки из файла
- Убраны неиспользуемые опции из settings.js (~280 строк)
Локализация:
- Переведены 6 новых строк для превью импорта hosts
Ключевые изменения:
1. core/helpers.uc: file_is_usable(path, min_bytes) + file_size_value(path)
для единообразной проверки файлов (минимальный размер порог).
2. singbox/dns.uc: WAN fallback DNS серверы (fallback_wan_main) теперь
используют прямой UDP без detour — исправлена петля когда
DNS шёл через мёртвую прокси-секцию.
Health probes для ВСЕХ DNS серверов (включая DoH) идут direct —
failover может определить доступность DNS серверов.
3. watchdog.uc: ai_heal_empty_sections() — автообнаружение пустых
proxy-секций с подписками → запуск subscription_update_async.
ai_heal_dns_loop() — при обнаружении DNS-петли (dead proxy +
dead DNS) → временно отключает DNS detour → загружает подписку →
восстанавливает настройки.
4. Единая file_is_usable: nft/apply.uc, generator_routes.uc,
components/{updates,action}.uc, config/validator.uc,
subscription/cache.uc — все используют helpers.file_is_usable.
5. Тест tests/file_usable.sh для проверки helpers CLI.
6. Исправлен components_updater_job.sh mock lib — добавлен core/helpers.uc
1. Добавлен встроенный установщик Tor через LuCI-попап с поддержкой opkg и apk.
2. Маршрутизация скрытых сетей (.onion / .i2p) интегрирована на уровень backend (route.uc, generator.uc).
3. Добавлена прозрачная поддержка форка sing-box lx: UI и генераторы теперь корректно включают 'extended' фичи для lx.
4. Проведен полный аудит и восстановление отсутствующих переводов в fe-app-tachyon и luci-app-tachyon.
- Вынесена логика вызова команд shell в core.common
- Удалено дублирование реализации чтения stdin и извлечения параметров UCI
- Громоздкие циклы парсинга URL в helpers.uc переписаны на регулярные выражения
- Проверка IPv4/IPv6 упрощена до использования регулярных выражений вместо построчного разбора
- Использованы встроенные функции ucode (lc, length) вместо ручных аналогов
- Очистка фронтенда: удален функционал мониторинга прямого трафика и лишняя колонка 'Add to' из UI таблиц