RR Edition: сборка пакета и отключение функционала
Этот документ описывает, как собирать пакет sing-box-rr-edition для OpenWrt и как дальше урезать текущий форк на базе sing-box-extended.
Он написан под текущее состояние репозитория, где дефолтная OpenWrt-сборка уже сведена к network-only профилю.
Быстрый старт сборки
Feed build через OpenWrt SDK
Для 24.10.x и 25.12.x этот пакет собирается внешним go, а не через SDK golang/host.
По умолчанию используется /usr/local/go/bin/go.
Текущий package profile не включает naive outbound и не требует специального musl/cronet-пути.
echo 'src-link singboxrr /home/fresa/sing-box-rr-edition' >> feeds.conf
./scripts/feeds update singboxrr
./scripts/feeds install -f sing-box-rr
make package/feeds/singboxrr/sing-box-rr/compile V=s GO_BIN=/usr/local/go/bin/go
Локальная сборка опубликованных пакетов
./build-ipk.sh arm64
./build-apk.sh arm64
Где задаётся r-релиз пакета
r-релиз теперь задаётся прямо в корневом VERSION.
Формат строки: 1.13.11-rr-edition-2.1.0-r6.
sing-box-rr/Makefile, build-ipk.sh и build-apk.sh не держат своё значение r*, а парсят его из этого файла.
1. Что уже отключено
В текущем форке уже убраны из runtime-поверхности или из дефолтной сборки:
WARPMASQUEMTProxySSHTorBandwidth limiterConnection limiterTraffic limiterRate limiterbondparserprovidersnaive inbound- старый
WireGuardoutbound tailscaledhcpacmemanagermanager_apinodenode_manager_apiadmin_panelccmocm
Основные точки, где это уже вырезано:
- include/registry.go
- option/options.go
- box.go
- experimental/clashapi/server.go
- release/DEFAULT_BUILD_TAGS_OTHERS
2. Что сейчас входит в дефолтную сборку
OpenWrt package builds
Скрипты build-ipk.sh и build-apk.sh читают теги из:
Текущее значение:
with_quic,with_utls,with_clash_api
Обычные non-package builds
Дефолтные теги для обычных сборок лежат в:
naive outbound больше не включён в дефолтные сборки.
Если он снова понадобится, его нужно включать вручную отдельным build tag.
Libbox builds
Отдельные дефолты для libbox управляются в:
Если режешь дефолтные теги, держи этот файл синхронным с остальными.
3. Самый безопасный способ: резать через build tags
Это лучший первый шаг, если нужно уменьшить бинарник без немедленного перепила registry.
with_quic
Убирай with_quic, если не нужны:
HysteriaHysteria2TUIC- DNS over
QUIC - DNS over
HTTP3 - QUIC transport для V2Ray QUIC
- HTTP/3 путь у
naive
Связанные файлы:
После отключения парсер всё ещё знает эти типы, но runtime возвращает понятную ошибку "not included in this build".
with_clash_api
Убирай with_clash_api, если не нужен Clash-совместимый API/UI слой.
Связанные файлы:
with_utls
Убирай with_utls, если не нужны uTLS fingerprints для TLS outbounds.
Это хороший чистый срез размера, если хватает обычного TLS.
with_gvisor
Убирай with_gvisor, если не нужен gVisor-based stack.
Для текущего RR Edition package profile этот тег уже выключен: целевой сценарий здесь tproxy-only, без tun со stack gvisor/mixed.
Делать это нужно аккуратно только если позже вернёшься к TUN-сценариям, которые на него опираются.
with_naive_outbound
Этот тег больше не входит в дефолтные build profiles RR Edition.
Если naive outbound снова понадобится, его нужно включать вручную и отдельно учитывать связанный musl/cronet build path для OpenWrt.
4. Следующий уровень: вырезать типы из registry
Если build tags уже не хватает, режь runtime-регистрацию прямо в:
Именно этот файл определяет, что бинарник реально экспонирует во время работы.
Inbounds, которые можно убрать
sockshttpmixedshadowsocksvmesstrojannaiveshadowtlsvlessanytlsfailovertunredirecttproxy
Outbounds, которые можно убрать
selectorurltestfallbacksockshttpshadowsocksvmesstrojannaiveshadowtlsvlessmieruanytlsfailover
DNS transports, которые можно убрать
tcpudptlshttpssdnshostslocalfakeipfallbackresolved
Services, которые можно убрать
resolvedssmapioom-killerprofiler
Endpoints, которые можно убрать
vpn-servervpn-client
Практическое правило:
- Если фича должна остаться распознаваемой, но с понятной ошибкой, лучше build-tag stub.
- Если фича должна исчезнуть из поддерживаемых config types совсем, убирай её из registry.
5. Глубокий срез: чистка config surface
Если нужно, чтобы форк вообще перестал "обещать" удалённые секции, чисти ещё и конфигурационный слой.
Providers
Providers уже отключены в текущем форке. Ключевые точки среза:
Тот же паттерн можно использовать, если позже будешь убирать другие top-level config sections.
Старые feature-specific options
Если фича удаляется окончательно, проверь, не остались ли на неё ссылки в:
option/*.goconstant/*.goinclude/*_stub.go
Безопасный порядок такой:
- Сначала убрать из build tags или registry.
- Потом проверить, что валидные конфиги больше на неё не опираются.
- И только после этого удалять option/constant references.
6. Рекомендуемый порядок урезания
Для этого форка самый безопасный порядок такой:
- Резать build tags в release/DEFAULT_BUILD_TAGS_OTHERS.
- Если нужно, синхронизировать ту же политику в release/DEFAULT_BUILD_TAGS, release/DEFAULT_BUILD_TAGS_WINDOWS и cmd/internal/build_libbox/main.go.
- Потом убирать лишнюю runtime-регистрацию в include/registry.go.
- Только после стабилизации сборки резать config surface.
- Физически удалять старые каталоги с исходниками только в самом конце.
7. Примеры профилей урезания
Профиль A: оставить XHTTP и mKCP, убрать только admin/API хвост
Оставить:
with_quicwith_utls
Убрать:
with_clash_api
Это самый безопасный следующий срез, если не используешь Clash-compatible API endpoints.
Профиль B: более компактная router build
Убрать теги:
with_clash_apiwith_utlswith_quic
Потом дополнительно убрать из registry:
naivemierushadowtlsanytls
Это даёт заметно меньший бинарник, но сохраняет базовые SOCKS/HTTP/VMess/VLESS/Trojan/Shadowsocks сценарии.
Профиль C: минимальное network core
Убрать теги:
with_clash_apiwith_utlswith_quic
Потом ужать registry до минимума:
tunилиredirect/tproxydirectblock- один-два реально используемых outbound-протокола
- только те DNS transports, которые реально используются
Это самый агрессивный сценарий для маленьких OpenWrt-таргетов.
8. Что важно для пакетизации
В проекте сейчас есть два пути пакетизации:
- локальные helper scripts: build-ipk.sh и build-apk.sh
- обычная OpenWrt feed-сборка через sing-box-rr/Makefile
Оба пути специально выставляют:
Provides: sing-boxProvides: sing-box-tiny
Это важно, если downstream-пакет зависит именно от sing-box-tiny, например zeroblock.
Связанные файлы:
Если меняешь package name или Provides, сначала проверь зависимости downstream-пакетов.
r-релиз тоже нужно менять именно в корневом VERSION.
Это теперь единственный источник истины для r1, r2 и дальше.
OpenWrt feeds build
Для 24.10.x SDK пакет нельзя собирать через стандартный golang-package.mk, потому что в этой ветке OpenWrt golang/host всё ещё 1.23.x, а текущий форк требует go 1.26.1.
Поэтому feed-пакет в sing-box-rr/Makefile:
- не зависит от
golang/host - берет исходники прямо из каталога
sing-box-rr - собирает бинарь внешним
go, по умолчанию через/usr/local/go/bin/go - сейчас рассчитан на
aarch64иx86_64, но для роутерного профиля нам важен именноaarch64
Если go лежит не в дефолтном пути, передай его явно:
make package/feeds/singboxrr/sing-box-rr/compile V=s GO_BIN=/путь/к/go
9. Команды пересборки
OpenWrt feed package build
echo 'src-link singboxrr /home/fresa/sing-box-rr-edition' >> feeds.conf
./scripts/feeds update singboxrr
./scripts/feeds install -f sing-box-rr
make package/feeds/singboxrr/sing-box-rr/compile V=s GO_BIN=/usr/local/go/bin/go
OpenWrt 24.10 IPK
./build-ipk.sh arm64
./build-ipk.sh x86_64
OpenWrt 25.12 APK
./build-apk.sh arm64
./build-apk.sh x86_64
Принудительная чистая пересборка Go cache
./build-ipk.sh arm64 --force
./build-apk.sh arm64 --force
10. Что проверять после каждого среза
После любого отключения функционала нужно проверять:
- Бинарник всё ещё собирается.
- Package metadata всё ещё совпадает с ожиданиями downstream-пакетов.
- Удалённые config types либо:
- полностью исчезли из registry;
- либо дают понятную stub-ошибку.
- На роутере
sing-boxвсё ещё стартует через штатный OpenWrt init script.
Полезные быстрые проверки:
git status --short
./build-ipk.sh arm64
./build-apk.sh arm64
Если режешь сборку для роутера, на котором уже стоит zeroblock, отдельно проверь совместимость package dependency перед изменением Provides, Conflicts и имени пакета.