Skip to content

s-ui v1.5.8-beta4

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 14 Jun 15:24

Release Notes: v1.5.8-beta4

Release date: 2026-06-14
EN

v1.5.8-beta4 updates the embedded sing-box core from v1.13.12 to v1.13.13 (upstream bug fixes: TUN loopback handling in the direct outbound, a ping-timeout fix, and release/build fixes). Upstream re-tagged v1.13.13 after publishing, so the original tag commit cached by the Go module proxy fails to compile on Windows (it calls a sing-box API that the bundled sing-tun no longer exposes); the panel therefore pins sing-box to the fixed release commit, keeping require v1.13.13 while resolving the corrected code. Linux, Windows and Docker builds all compile and every build resolves the same immutable sources. The internal connection/stats tracker contract was revalidated against v1.13.13 and is unchanged.

This release also fixes a critical bug that prevented Let's Encrypt from issuing TLS certificates for bare IP addresses: the certificate request placed the IP in the CSR Common Name, which Let's Encrypt rejects with badCSR. The request is now built per RFC 8738 with an empty Common Name and the IP only in the SubjectAltName, so issuance — and the in-panel 12-hour auto-renewal — work correctly. Issuance also moves out of the Settings web UI into the terminal management menu (s-ui.sh item 20) and a new sui ip-cert <issue|renew|status|disable> CLI; the web card, the POST /api/ip-cert/issue and GET /api/ip-cert/status endpoints, and the related frontend are removed. No database migration and no configuration changes are required.

This release also lands a performance and code-health pass. GET /load — the panel's busiest read endpoint — is roughly 3.7× faster: SettingService.GetAllSetting previously ran a ~90-statement default-seeding write transaction on every call, serializing the read path on SQLite's single writer (profiled at ~85% of the endpoint's CPU under load). It now skips seeding once all default keys exist, with byte-identical output and exactly-once concurrent first-init preserved (BenchmarkAPI_Load ~4.86 ms → ~1.30 ms/op, allocations −37%). Proven-dead code (10 functions plus an orphaned variable) was removed, while three security helpers that merely looked dead are kept and pinned with contract tests. Generation correctness is hardened with new determinism, link round-trip, and byte-exact subscription golden tests, plus benchmark regression anchors. These changes are internal; no API, database, or configuration change is required.

RU

v1.5.8-beta4 обновляет встроенное ядро sing-box с v1.13.12 до v1.13.13 (исправления апстрима: обработка TUN loopback в direct outbound, фикс таймаута ping и правки релиза/сборки). Апстрим перетегировал v1.13.13 уже после публикации, поэтому исходный коммит тега, закэшированный прокси Go-модулей, не компилируется под Windows (он вызывает API sing-box, которого больше нет во встроенном sing-tun); панель поэтому пинит sing-box на исправленный релизный коммит, сохраняя require v1.13.13, но подтягивая исправленный код. Сборки под Linux, Windows и Docker компилируются, и все они резолвят одни и те же неизменяемые исходники. Контракт внутреннего трекера соединений/статистики ревалидирован против v1.13.13 — без изменений.

Также этот релиз исправляет критическую ошибку, из-за которой Let's Encrypt отклонял выпуск TLS-сертификатов для голых IP-адресов: запрос помещал IP в Common Name CSR, что Let's Encrypt отклоняет ошибкой badCSR. Теперь запрос строится по RFC 8738 — с пустым Common Name и IP только в SubjectAltName, поэтому выпуск (и фоновый автоперевыпуск каждые 12 часов) работают корректно. Сам выпуск переезжает из веб-интерфейса Settings в терминальное меню управления (пункт 20 в s-ui.sh) и новую CLI-подкоманду sui ip-cert <issue|renew|status|disable>; веб-карточка, эндпоинты POST /api/ip-cert/issue и GET /api/ip-cert/status, а также связанный фронтенд удалены. Миграция базы и изменения конфигурации не требуются.

Этот релиз также включает проход по производительности и чистоте кода. GET /load — самый нагруженный читающий эндпоинт панели — стал быстрее примерно в 3.7×: SettingService.GetAllSetting раньше выполнял write-транзакцию из ~90 операторов сидирования дефолтов на каждый вызов, сериализуя читающий путь на единственном writer'е SQLite (по профилю ~85% CPU эндпоинта под нагрузкой). Теперь сидирование пропускается, когда все дефолтные ключи уже есть, при байт-идентичном выводе и сохранённой exactly-once первичной инициализации (BenchmarkAPI_Load ~4.86 мс → ~1.30 мс/op, аллокаций −37%). Доказуемо мёртвый код (10 функций и осиротевшая переменная) удалён, а три security-хелпера, лишь выглядевших мёртвыми, сохранены и закреплены contract-тестами. Корректность генерации усилена новыми тестами детерминизма, round-trip ссылок и байт-точными golden-тестами подписки, плюс benchmark-якоря против регрессий. Все изменения внутренние; правок API, базы данных или конфигурации не требуется.