These target GitHub Actions runners and do not fit the bare Gitea Actions
host runner, producing failed runs on every branch push. The build.yml
release workflow (auto-build on tags) is kept.
Point the installer at https://git.rukavishnikoff.ru/hacker07/NeoTachyon and
support Gitea's GitHub-compatible API for releases. When the repository has
no published release yet, fall back to installing the backend and LuCI UI
directly from the branch source archive (tachyon/files, luci-app htdocs/root)
so the same one-liner installs the fork as-is. Repo can be overridden via
TACHYON_REPO_HOST / TACHYON_REPO_OWNER / TACHYON_REPO_NAME /
TACHYON_SOURCE_BRANCH / TACHYON_REPO_INSTALL_URL. README install/uninstall
commands now point to the Gitea raw URLs.
Add AdGuard Home as an installable Tachyon component (component card with
check/update/remove/rollback/enable/disable) backed by providers/adguard
(validator + runtime) and an init.d service.
Backend:
- action.uc: install/remove/enable/backup/rollback/dispatch/releases for
'adguard' (tar.gz from AdguardTeam/AdGuardHome, OpenWrt->AdGuard arch map)
- updater.uc: adguard asset selection; updates.uc: valid_component_name and
automatic update checks
- runtime.uc: generates AdGuardHome.yaml from UCI (upstream=single-box DNS,
fallback_dns for failover, web UI on LAN, filters), manages the daemon
- dns/apply.uc: dns_main_mode (dnsmasq->AdGuard->sing-box chain, or AdGuard on
:53 with dnsmasq DHCP-only)
- settings: dns_main_mode (Main DNS) + dns_adguard_failover_enabled
- sections: routed_dns_type/dns_type 'adguard' resolve via the AdGuard provider
upstreams; validator accepts the new type
- system-info: adguard_version/installed/enabled/backup fields
Frontend:
- component card 'AdGuard Home' with enable/disable + version actions
- LuCI DNS settings tab: Main DNS selector and failover flag
- section.js: AdGuard Home routed DNS protocol option
Tests: tests/adguard_validator.sh, tests/adguard_runtime.sh
- decouple restart() from stop_impl() in lifecycle.uc to avoid premature dnsmasq_restore
- keep dhcp.@dnsmasq[0].server locked to 127.0.0.42 throughout service restarts
- add atomic restart_service hooks in init.d/tachyon and initd.uc
- fix dns_turbo_cache path resolution to promote default cache to /etc/sing-box/cache.db
- add Local DNS Cache support in dnsmasq (dns_local_cache, dns_cache_size)
- add comprehensive behavioral regression test tests/service_restart_lifecycle.sh
- Add Boosty badge to README.md and README.en.md headers
- Add Boosty as first donation option in support sections of both READMEs
- Add Boosty card (with orange border accent) to LuCI diagnostic support modal
- Add Russian translations for Boosty strings in po/ru/tachyon.po
- Add fptn to route.target() to prevent exit(2) crash on config generation
- Add add_fptn_outbound() using direct outbound with routing_mark=0x00300000
(routes traffic through tun-fptn via kernel ip rule → table 4249)
- Add fptn to reserve_section_outbound_tags
- Add fptn to generator_routes outbound dispatch
Fixes torrents and all traffic breaking when an FPTN section is configured.
- initd.uc: retry_start_on_wan_up now calls BIN_PATH directly instead of
SERVICE_INIT to avoid the rc.common flock-1000 self-deadlock that was
hanging Backend CI for the full 1-hour runner timeout
- initd.uc: schedule_start_retry uses background_command() so inherited
fd 1000 (procd lock) is closed before the sleep starts
- updates.uc, parental_quota.uc: read /etc/crontabs/root via fs.readfile
instead of crontab -l — BusyBox exits 1 on an empty file causing
command_output_from_args to return '' and wipe all user cron entries
- shell/index.ts: COMPONENT_ACTION_RPC_TIMEOUT_MS 10s -> 45s to prevent
false RPC timeout errors during opkg installs on slow routers
- Feat(ui): implement adaptive polling in runtimeUiState service (1s -> 2s during active tasks, 10s idle)
- Perf(controller): cache settings snapshot in current_tick_ctx across all probe setting() calls to eliminate repeated uci_core.get_all()
- Perf(controller): reuse ctx.proxy_port in probe_proxy to eliminate duplicate proxy_port() evaluation
- Perf(watchdog): guard adaptive_normal_interval behind 120s check and clear tick context at tick boundary
- Test: add static and behavioral assertions in tests/watchdog_adaptive_intervals.sh
- Perf(watchdog): Adaptive external health checks for proxy (30s) and DNS (60s)
* Honor UCI ai_proxy_health_interval and ai_dns_interval while healthy
* Adapt to fast retry (10-15s) upon consecutive failures, instant post-heal reset
* Single shared observation context (tick_context) per tick eliminating redundant pgrep/proc scans
* Throttle watchdog keepalive file writes from 5s to 30s
- Perf(ui): Read-only fast path for get_ui_state
* Decouple refresh_action_dirs() filesystem GC from 500ms polling requests
* Throttle action directory cleanup to once per 30s via /var/run stamp
* Trigger immediate GC sweep on action job completion
- Perf(telegram): Long-poll 50s and eliminate redundant sleep after success
* Increase getUpdates long-poll timeout to 50s (curl timeout 65s)
* Remove redundant sleep after successful poll for instant command responsiveness
- Perf(torrserver): Cache detected PID and replace shell sleep with native ucode sleep(60000)
- Fix(singbox): Remove harmful hijack-dns rules from mixed proxy inbounds
* Eliminate hijack-dns (port 53 / protocol dns) from section, direct bypass and service mixed proxies
* Resolve 4-5s curl timeouts on component updates (api.github.com) and slow LAN DNS resolution
* Maintain ip_is_private: true direct LAN routing bypass
- Test: Add tests/watchdog_adaptive_intervals.sh and update tests/sing_box_runtime.sh
- Version: Bump fe-app-tachyon to 1.3.27
Replace brittle grep | head pipelines with assert_contains and direct grep flags to prevent pipefail SIGPIPE exit code 141 in OpenWrt container test runs.