Автономная CI/CD система для сборки OpenWrt под GL-iNet GL-MT6000 (Flint 2).
pesa1234 поддерживает форк OpenWrt с кастомными патчами для MT6000 (RSS, WED, ATF). Это лучшая прошивка для Flint 2, но зависеть от одного человека рискованно — если он уйдёт, патчи устареют.
Цель: независимая воспроизводимая сборка. Мы "воруем" наработки pesa1234 в виде патчей, храним у себя и собираем на официальном openwrt/openwrt upstream. Если pesa1234 исчезнет — у нас есть всё для продолжения.
darkworon/openwrt-mt6000 ← этот репо (ПРИВАТНЫЙ)
│ исходники: патчи, конфиги, overlay, CI
│
├─ feeds используют:
│ darkworon/openwrt-mt6000-packages ← форк pesa1234/packages (ветка next-r4.mtk)
│ darkworon/openwrt-mt6000-luci ← форк pesa1234/luci (ветка next-v4)
│
└─ CI публикует в:
darkworon/openwrt-mt6000-releases ← (ПУБЛИЧНЫЙ)
├─ GitHub Releases: прошивка .bin + пакеты .tar.gz (5 последних)
└─ GitHub Pages: APK index.json (ссылки на Release assets)
GitHub Pages работает только на публичных репо (Free plan). Прошивка для конкретного железа — не секрет. Исходники (патчи, конфиги) — в приватном репо.
Кастомные патчи pesa1234 поверх официального OpenWrt kernel 6.18:
| Группа | Патчи | Эффект |
|---|---|---|
| RSS (Receive Side Scaling) | 999-2701..2728, 999-9901..9910 | +30-40% ethernet throughput, 4 Rx rings |
| WED bugfixes | 999-9911..9914 | Hardware WiFi offload стабильность |
| NAPI/misc | 999-9907..9910 | Jumbo frames, NAPI poll weight, buffer tuning |
| USB | 999-9999 | USB power control |
- WED TX support — hardware WiFi offload
- HW-ATF — Airtime Fairness через железо
- iBF/eBF beamforming — направленный сигнал
- VHT 256QAM на 2.4GHz — повышенная скорость
- WED/CSI/vendor fixes — различные исправления
0018-wifi-mt76-mt7915-update-fix-inconsistent-QoS-mapping-betwee.patchнамеренно исключен: он добавляетset_qos_mapвieee80211_ops, которого уже нет в текущем OpenWrt/mac80211.
advanced_setup — init-скрипт (START=99), не существует в upstream:
- IRQ affinity по ядрам CPU
- RPS (Receive Packet Steering)
- WED hardware offload (iptables FLOWOFFLOAD --hw)
- ATF/HW-ATF (Airtime Fairness)
- USB speed/power control
etc/hotplug.d/ntp/25-zerotier — hotfix для роутера без RTC:
- после первого валидного NTP sync за boot один раз перезапускает ZeroTier;
- повторные NTP
stratumevents игнорирует через/var/state/zerotier-ntp-restarted; - предотвращает постоянный flap
zt0и firewall reload, которые роняют dae-routed client traffic.
etc/init.d/sing-box-wg-edge — автозапуск proxy-policy sing-box wg-edge dataplane:
- при boot вызывает
/root/sing-box-wg-edge-switch.sh startпосле короткой задержки; - поднимает
sing-box, DNS listener0.0.0.0:53, TPROXY127.0.0.1:12347, nft tableproxy_policy_singbox_wg_edgeи policy routefwmark 0x67 -> table 1067; - включается на first boot через
etc/uci-defaults/97-sing-box-wg-edge-autostart.
mt6000.diffconfig:
- Target:
mediatek/filogic, device:glinet_gl-mt6000 - Пакеты:
dae,adguardhome,zerotier,luci,luci-app-advanced,uhttpd,rpcd-*,wpad-openssl,dnsmasq-full,ip-full,iwinfo,bridger,wireguard-tools,nano,openssh-sftp-server,curlс HTTP/3 (libnghttp3/libngtcp2),kmod-sched,kmod-sched-core,kmod-sched-bpf,kmod-sched-act-vlan,kmod-sched-flower,kmod-nf-conntrack-netlink,kmod-nft-tproxy,kmod-xdp-sockets-diag,kmod-tcp-bbr,kmod-tun,kmod-wireguard,kmod-veth,kmod-ikconfig, legacy iptables compatibility kmods, USB storage/filesystem/NLS kmods from the last known-good personal build - DAE kernel toggles in OpenWrt
.config:CONFIG_KERNEL_CGROUPS,CONFIG_KERNEL_CGROUP_BPF,CONFIG_KERNEL_XDP_SOCKETS,CONFIG_KERNEL_KPROBES,CONFIG_KERNEL_DEBUG_INFO_BTF - Hysteria2/Hy2 включён внутри
dae: custom packagedaeзаменяетgithub.com/daeuniverse/outboundнаdarkworon/outbound:stickyip-salamander. Отдельный standalone packagehysteriaне нужен.
etc/uci-defaults/99-proxy-policy-base — первый boot baseline под dae + Hysteria2:
- отключает software/hardware flow offload в firewall;
- переводит
dnsmasqна port54, чтобыsing-box wg-edgeмог слушать клиентский DNS на:53; - выключает дефолтный OpenWrt
network.globals.packet_steering; - включает
Advanced -> Packet Steeringв режиме2с boot delay30s.
etc/sysctl.d/99-vpn-tune.conf — сетевой runtime tuning для VPN/QUIC:
net.core.default_qdisc = fqдля pacing;- BBR как TCP congestion control;
- увеличенные backlog и socket buffers.
etc/uci-defaults/98-proxy-policy-sysupgrade-keep — keep-list для sysupgrade:
- сохраняет
/etc/dae/, чтобы include-файлы DAE не терялись при следующем обновлении; - сохраняет
/etc/sing-box/и/root/sing-box-wg-edge-switch.shдляsing-box wg-edge; - сохраняет
/var/lib/adguardhome/,/var/lib/zerotier-one/и кастомные root-скрипты.
dae-kernel.config — параметры ядра для DAE (eBPF transparent proxy):
CONFIG_BPF_STREAM_PARSER=y
CONFIG_NETKIT=y
# CONFIG_NET_SCH_BPF is not set
Остальные DAE kernel requirements задаются через обычный OpenWrt .config
как CONFIG_KERNEL_* и kmod-* package selections.
GitHub Actions is the build path for the full firmware image. The custom dae
package is not built as a standalone artifact here; it is injected into the
OpenWrt tree from darkworon/openwrt-dae and built together with the rest of
the MT6000 firmware so kernel packages and package indexes stay consistent.
Useful workflow variables:
DAE_SOURCE_REF=main
DAE_SOURCE_VERSION=latest
DAE_OUTBOUND_REF=stickyip-salamander
OPENWRT_REF=main
As of May 6, 2026, upstream daeuniverse/dae uses main, not master.
If upstream creates a master branch later, set DAE_SOURCE_REF=master.
| Workflow | Триггер | Что делает |
|---|---|---|
validate.yml |
Ручной запуск | Тяжелая валидация патчей/kernel/mt76 без автоматического дубля full build |
track-pesa1234.yml |
Вс + Ср 04:00 UTC, ручной | Проверяет обновления у pesa1234, создаёт Issue (пропускает EXCLUDED.md), старый запуск отменяется через concurrency |
sync-forks.yml |
Пт 03:00 UTC, ручной | Синхронизирует форки feeds/luci/mt76/openwrt с upstream pesa1234, старый запуск отменяется через concurrency |
build.yml |
Пт 05:00 UTC, ручной | Полная сборка и публикация, включая custom dae; push-trigger отключён, чтобы обычные коммиты не запускали долгую OpenWrt-сборку |
1. Клонировать openwrt/openwrt:main (официальный upstream)
2. Скопировать patches/kernel/*.patch → актуальный target/linux/mediatek/patches-*/
3. Скопировать patches/mt76/*.patch и patches/mt76-local/*.patch → package/kernel/mt76/patches/
4. Скопировать files/ → openwrt/ (advanced_setup и др.)
5. Проверить, что локальные pesa1234-патчи и feed forks синхронны с upstream
6. feeds.conf → darkworon/openwrt-mt6000-packages:next-r4.mtk + darkworon/openwrt-mt6000-luci:next-v4
7. Зафиксировать Go toolchain patchlevel на `1.26.3`
8. Подключить darkworon/openwrt-dae как custom package `dae`
9. Проверить, что custom `dae` собирается с `hysteria2`/`hy2` outbound и Salamander
10. make defconfig + проверка DAE параметров и критичных пакетов
11. make tools + toolchain + target + packages + image. Toolchain cache intentionally ignores `diffconfig`, so package/kmod changes do not invalidate the expensive host/toolchain cache. `openwrt/dl` is cached by feed config, `openwrt/feeds` is cached separately, ccache is enabled with OpenWrt `CONFIG_CCACHE`, and the slow serial `dae` clean/rebuild is only enabled with `debug_rebuild=true`.
12. Smoke test: firmware > 10MB, dae + adguardhome + zerotier + WireGuard + nano + SFTP server + luci-app-advanced + curl HTTP/3 + pacing/BBR kmods в manifest
13. Публикация Release в openwrt-mt6000-releases (прошивка + пакеты)
14. Обновление APK index.json на GitHub Pages
15. Ротация: оставить 5 последних релизов и Pages entries
16. Telegram уведомление (✅/❌ + ссылка на release)
1. Найти последнюю ветку next-r4.*.rss.mtk у pesa1234 (динамически)
2. Сравнить с .pesa1234-branch (что мы отслеживаем сейчас)
3. Клонировать pesa1234/openwrt (актуальная ветка)
4. Сравнить patches/kernel/ с pesa1234 999-* патчами, учитывая `patches/kernel/EXCLUDED.md`
5. Сравнить patches/mt76/ с pesa1234/openwrt package/kernel/mt76/patches/
6. Сравнить feeds.conf.default
7. Если есть delta → создать GitHub Issue с описанием и командами для обновления
Ключевое правило: kmod-* пакеты привязаны к точному vermagic ядра (хеш конфига сборки). Пакеты от одного билда несовместимы с прошивкой другого билда.
Как мы решаем:
CONFIG_VERSION_REPOзашивается в прошивку при сборке- Роутер с этой прошивкой автоматически обращается к APK репо своего билда
- URL формат:
https://darkworon.github.io/openwrt-mt6000-releases/packages/{build-tag}/ - После sysupgrade: новая прошивка несёт новый URL
Ротация: храним 5 последних билдов. Кто не обновлялся > 5 недель — теряет совместимый APK репо (нормально для snapshot-сборок).
| Secret | Описание |
|---|---|
TG_BOT_TOKEN |
@jarvis_vetva_bot токен — уведомления о билде |
RELEASES_TOKEN |
GitHub PAT — для пуша в openwrt-mt6000-releases |
При появлении Issue от track workflow:
# 1. Найти актуальную ветку
BRANCH=$(gh api "repos/pesa1234/openwrt/branches?per_page=100" \
--jq '[.[].name | select(test("next-r[0-9]+\\.[0-9]+\\.[0-9]+\\.rss\\.mtk"))] | sort | last')
# 2. Клонировать
git clone --depth=1 --branch $BRANCH https://github.com/pesa1234/openwrt.git /tmp/pesa1234
# 3. Обновить патчи
KERNEL_DIR=$(ls -d /tmp/pesa1234/target/linux/mediatek/patches-* | sort -V | tail -n1)
rm -f patches/kernel/*.patch patches/mt76/*.patch
cp "$KERNEL_DIR"/999-*.patch patches/kernel/
for f in /tmp/pesa1234/package/kernel/mt76/patches/*.patch; do
name=$(basename "$f")
grep -Fq "$name" patches/mt76/EXCLUDED.md && continue
cp "$f" patches/mt76/
done
cp /tmp/pesa1234/target/linux/mediatek/filogic/base-files/etc/init.d/advanced_setup \
files/target/linux/mediatek/filogic/base-files/etc/init.d/advanced_setup
cp /tmp/pesa1234/package/kernel/mt76/Makefile \
files/package/kernel/mt76/Makefile
# 4. Обновить tracked branch
echo "$BRANCH" > .pesa1234-branch
# 5. Коммит
git add patches/ files/ .pesa1234-branch
git commit -m "chore: sync patches from pesa1234 $BRANCH $(date +%Y-%m-%d)"
git push- Скачать из Releases →
*-squashfs-sysupgrade.bin - LuCI: System → Backup/Flash Firmware → Flash image → выбрать
.bin - SSH:
scp firmware.bin root@192.168.1.1:/tmp/ && ssh root@192.168.1.1 "sysupgrade /tmp/firmware.bin" - Проверить sha256:
sha256sum firmware.bin→ сверить сsha256sumsв assets
# 1. Создать приватный репо openwrt-mt6000
gh repo create darkworon/openwrt-mt6000 --private
# 2. Создать публичный репо releases
gh repo create darkworon/openwrt-mt6000-releases --public
# 3. Включить Pages в releases репо (gh-pages ветка)
gh api repos/darkworon/openwrt-mt6000-releases/pages -X POST \
--input - <<< '{"source":{"branch":"gh-pages","path":"/"}}'
# 4. Убедиться что есть форки packages и luci
# darkworon/openwrt-mt6000-packages (fork pesa1234/packages, ветка next-r4.mtk)
# darkworon/openwrt-mt6000-luci (fork pesa1234/luci, ветка next-v4)
# 5. Установить секреты
gh secret set TG_BOT_TOKEN --repo darkworon/openwrt-mt6000 --body "<token>"
gh secret set RELEASES_TOKEN --repo darkworon/openwrt-mt6000 --body "<github-pat>"
# 6. Запустить первый билд
gh workflow run build.yml --repo darkworon/openwrt-mt6000| ID | Описание | Приоритет |
|---|---|---|
| TD-001 | Выделить отдельного Telegram бота для build уведомлений (сейчас @jarvis_vetva_bot) | Low |
| TD-002 | Зашить CONFIG_VERSION_REPO в mt6000.diffconfig (сейчас APK URL только в release notes) |
Medium |
| TD-003 | Автоматизировать смену ветки darkworon/openwrt в sync-forks.yml при появлении новой next-r*.rss.mtk |
Medium |
| Репо | Роль |
|---|---|
| openwrt/openwrt | Официальный upstream (клонируется при каждом билде) |
| pesa1234/openwrt | Источник патчей (отслеживается, не используется напрямую) |
| pesa1234/mt76 | Источник WiFi патчей (отслеживается) |
| darkworon/openwrt-mt6000-packages | Наш форк feeds/packages |
| darkworon/openwrt-mt6000-luci | Наш форк feeds/luci |
| darkworon/openwrt-dae | Custom OpenWrt package dae, собирает свежий dae с outbound salamander |
| darkworon/outbound | DAE outbound fork с hysteria2/hy2 и Salamander |
| darkworon/openwrt-mt6000-immortalwrt-packages | Форк immortalwrt/packages — содержит пакет dae |
| darkworon/openwrt-mt6000-releases | Прошивки и APK repo |
Последнее обновление: 2026-04-03