s-ui v1.5.7-beta6-hotfix1
Pre-releaseRelease Notes: v1.5.7-beta6-hotfix1
Release date: 2026-06-05
An emergency build hotfix for v1.5.7-beta6. It carries no code, config,
or data changes beyond the version string — everything shipped in beta6
(security, reliability, performance, accessibility) is unchanged. It exists solely
to fix a broken frontend build in the beta6 release artifacts.
The problem in beta6
After installing v1.5.7-beta6 the web panel failed to load: a black screen,
with the browser console reporting 404 (Not Found) for a JavaScript chunk
(e.g. assets/_WJiVkoC.js). The application shell loaded, but a lazily-imported
view chunk was missing from the server, so the UI never rendered.
Root cause
frontend/package-lock.json had drifted out of sync with frontend/package.json
(the icon dependency was switched from the @mdi/font webfont to @mdi/js SVG
paths without regenerating the lock). The strict CI gates (npm ci) correctly
went red, but the release workflow built the frontend with the lenient
npm install, which silently resolved a different, unvalidated dependency tree
and produced an internally-inconsistent bundle — one whose entry chunks reference
a chunk that was never emitted. That broken bundle was embedded into the beta6
binaries and shipped.
The fix
package-lock.jsonregenerated in sync withpackage.jsonvia a clean,
cross-platform resolution. The frontend now builds a fully consistent bundle —
verified locally: lint clean, 88/88 unit tests pass, type-check passes, and
every referenced asset chunk is present in the build output (no dangling 404).- The release pipeline is now fail-closed. It builds the frontend with
npm ciand runs the same lint + unit-test gates as CI before producing any
artifact, so a desynced lockfile — or any frontend that CI would reject — can
never be shipped again.
Upgrade
If your panel shows a black screen on v1.5.7-beta6, install this build and
hard-refresh the browser (Ctrl/Cmd+Shift+R) once. No migration, no config change.
Примечания к релизу: v1.5.7-beta6-hotfix1
Дата релиза: 2026-06-05
Экстренный сборочный хотфикс для v1.5.7-beta6. Изменений кода,
конфигурации или данных нет — кроме строки версии; всё содержимое beta6
(безопасность, надёжность, производительность, доступность) не изменилось. Он
исправляет только сломанную сборку фронтенда в артефактах beta6.
Проблема в beta6
После установки v1.5.7-beta6 веб-панель не открывалась: чёрный экран, а в
консоли браузера — 404 (Not Found) на JavaScript-чанк (например
assets/_WJiVkoC.js). Оболочка приложения загружалась, но лениво подгружаемый
чанк-вью отсутствовал на сервере, и интерфейс не отрисовывался.
Корневая причина
frontend/package-lock.json рассинхронизировался с frontend/package.json
(зависимость иконок переключили с веб-шрифта @mdi/font на SVG-пути @mdi/js, не
перегенерировав lock). Строгие гейты CI (npm ci) корректно стали красными,
но релизный workflow собирал фронтенд нестрогим npm install, который молча
разрешал другое, невалидированное дерево зависимостей и собирал внутренне
несогласованный бандл — где входные чанки ссылаются на чанк, который так и не был
сгенерирован. Этот битый бандл вшили в бинарники beta6 и опубликовали.
Исправление
package-lock.jsonперегенерирован в синхрон сpackage.jsonчистым
кросс-платформенным разрешением. Теперь фронтенд собирает полностью
согласованный бандл — проверено локально: линт чист, 88/88 юнит-тестов
проходят, проверка типов проходит, и каждый упоминаемый чанк присутствует в
выводе сборки (никаких висячих 404).- Релизный пайплайн теперь fail-closed. Он собирает фронтенд через
npm ciи
прогоняет те же линт и юнит-тесты, что и CI, до создания артефактов — так
что рассинхронизированный lock (или любой фронтенд, который CI отклонил бы)
больше не сможет уехать в релиз.
Обновление
Если на v1.5.7-beta6 панель показывает чёрный экран — установите эту сборку и
один раз сделайте жёсткое обновление страницы (Ctrl/Cmd+Shift+R). Миграция и
правка конфигурации не нужны.
Release Notes: v1.5.7-beta6
Release date: 2026-06-05
A hardening beta on top of v1.5.7-beta5, driven by a full code-quality,
optimization, and security audit of the panel. There are no new features and
no manual migration: it closes several security gaps, removes silent-failure
and panic risks, trims the frontend bundle by ~60%, and fixes a few
data-integrity bugs. Paid Subscriptions stays off by default. Two items change
existing behavior — see Breaking changes.
What changed
Security
- Go 1.26.4 — closes two reachable Go standard-library vulnerabilities
(GO-2026-5037incrypto/x509,GO-2026-5039innet/textproto). - API-token scopes are enforced. The
apiv2action endpoints previously ran
every action regardless of token scope, so aread/observability/telegram/
databasetoken could write config, restart the panel, or read settings. Each
action is now gated — writes/restarts requirewrite/admin, config and
identity reads requireread/write/admin, metrics also allow
observability. Browser (admin-session) access is unchanged. - Remote x-ui import/sync hardened against SSRF. Remote imports validate the
target URL and re-check the resolved IP at connection time (defeating
DNS-rebinding), with bounded redirects; cloud-metadata, loopback, and private
ranges are blocked for untrusted (scoped-token) callers.fileandsshimport
sources are admin-only, and scheduled sync runs afile/sshsource only from
an admin-saved profile. - Secrets at rest. With
SUI_SECRETBOX_KEYset, stored secrets are re-sealed
once at startup under that out-of-database key, so a value written before you
adopted the key is no longer recoverable from the database alone. Remote-panel
credential encryption now derives its key from a random per-install secret
instead of a predictable default. - Login brute-force gains a per-username throttle on top of the per-IP limit.
- Session fixation is closed: the session ID is rotated on login.
- Transport & headers — HSTS honors
X-Forwarded-Protoonly from a trusted
proxy; the CSRF cookie honors a strictSameSitepolicy;s-ui admin -reset
generates a random password instead of a fixed default. - Telegram payments verify the payer's Telegram id; proxy URLs carrying
embedded credentials are masked in logs.
Reliability & fixes
- The core no longer reports running when the generated config fails to parse
(it surfaces the error instead of silently starting an empty instance). - Background jobs can't crash the panel — cron jobs are panic-isolated and
skip-if-still-running; the WAL-checkpoint job is nil-guarded at startup. - The link, Clash, and JSON subscription builders no longer panic on malformed
inbound/client configuration. - A client name with a quote/JSON metacharacter no longer corrupts the change log,
which previously made the admin Changes view return an empty response. - Bulk client edits with differing inbound sets now regenerate each client's
links from its own inbounds. - API errors are consistent and redact internal details.
Performance
- Backend — IP-monitor writes are batched into a single upsert; the
subscription hot path caches its display settings (~8 fewer queries per request)
andsettingsreads use an index. - Frontend bundle 6.2 MB → 2.5 MB (−60%) —
momentand the date-picker load
lazily, and icons moved from the full Material Design webfont to inline SVG.
Accessibility
- Icon-only admin action buttons (edit / changes / delete) now have accessible
names for screen readers.
Breaking changes
- Scoped API tokens that wrote config, restarted the panel, or read settings
(only possible because of the enforcement gap above) are now rejected — use an
adminor appropriately scopedwritetoken. file/sshx-ui sync profiles must be admin-saved: after upgrading, a
scheduled profile whose source is a localfile/sshtarget will not run until
an admin re-saves it.
Upgrade
No manual migration or config change. The settings table gains a unique index
automatically on first start, and (if SUI_SECRETBOX_KEY is set) the one-time
secret re-seal runs at startup. Review the two Breaking changes if you use
scoped API tokens or file/ssh scheduled sync.
Примечания к релизу: v1.5.7-beta6
Дата релиза: 2026-06-05
Бета-усиление поверх v1.5.7-beta5 по итогам полного аудита качества кода,
оптимизации и безопасности панели. Новых функций нет и ручная миграция не
требуется: закрыты несколько брешей в безопасности, убраны риски тихих отказов
и паник, фронтенд-бандл урезан на ~60%, исправлено несколько багов целостности
данных. «Платные подписки» по-прежнему выключены по умолчанию. Два пункта
меняют существующее поведение — см. Ломающие изменения.
Что изменилось
Безопасность
- Go 1.26.4 — закрывает две достижимые уязвимости стандартной библиотеки Go
(GO-2026-5037вcrypto/x509,GO-2026-5039вnet/textproto). - Scope API-токенов энфорсится. Раньше action-эндпоинты
apiv2выполняли
любое действие независимо от scope, так что токен
read/observability/telegram/databaseмог писать конфиг, перезапускать
панель и читать настройки. Теперь каждое действие гейтится — запись/перезапуск
требуютwrite/admin, чтение конфига/учёток —read/write/admin, метрики
допускают иobservability. Доступ через браузерную сессию админа не изменился. - Удалённый импорт/синк x-ui усилен против SSRF. Удалённые импорты валидируют
целевой URL и повторно проверяют разрешённый IP в момент соединения (защита от
DNS-rebinding), с ограничением редиректов; cloud-metadata, loopback и приватные
диапазоны блокируются для недоверенных (scoped-токен) вызовов. Источникиfile
иssh— только для админа, а плановый синк выполняетfile/ssh-источник
только из профиля, сохранённого админом. - Секреты at-rest. При заданном
SUI_SECRETBOX_KEYсекреты одноразово
ре-шифруются на старте под этим внедатабазным ключом — значение, записанное до
включения ключа, больше не восстановить из одной только БД. Шифрование учёток
удалённых панелей выводит ключ из случайного per-install секрета. - Брутфорс логина — добавлен throttle по имени пользователя поверх лимита по
IP. - Session fixation закрыт: ID сессии ротируется при логине.
- Транспорт и заголовки — HSTS доверяет
X-Forwarded-Protoтолько от
доверенного прокси; CSRF-cookie соблюдает строгийSameSite;s-ui admin -resetгенерирует случайный пароль вместо фиксированного дефолта. - Telegram-платежи сверяют Telegram-id плательщика; proxy-URL со встроенными
кредами маскируются в логах.
Надёжность и фиксы
- Ядро больше не рапортует running, если конфиг не парсится (возвращает
ошибку вместо тихого запуска пустого инстанса). - Фоновые джобы не роняют панель — изоляция паник и skip-if-still-running;
WAL-checkpoint защищён от nil на старте. - Генераторы link/Clash/JSON-подписок больше не падают на малформном конфиге
inbound/клиента. - Имя клиента с кавычкой/JSON-метасимволом больше не портит журнал изменений (из-за
чего страница Changes отдавала пустой ответ). - Bulk-правка клиентов с разными наборами inbound’ов пересобирает ссылки
каждого клиента из его собственных inbound’ов. - Ошибки API единообразны и редактируют внутренние детали.
Производительность
- Бэкенд — записи IP-монитора батчатся в один upsert; горячий путь подписки
кэширует display-настройки (≈8 запросов меньше на запрос), чтенияsettings
идут по индексу. - Фронтенд-бандл 6.2 МБ → 2.5 МБ (−60%) —
momentи date-picker грузятся
лениво, иконки переехали с веб-шрифта на инлайн-SVG.
Доступность
- Иконочные кнопки действий админа (редактировать / изменения / удалить) получили
доступные имена для скринридеров.
Ломающие изменения
- Scoped API-токены, писавшие конфиг, перезапускавшие панель или читавшие
настройки (что работало лишь из-за бреши выше), теперь отклоняются — используйте
токенadminили подходящийwrite. file/ssh-профили синка x-ui должны быть сохранены админом: после
апгрейда плановый профиль с локальнымfile/ssh-источником не запустится, пока
админ не пере-сохранит его.
Обновление
Ручной миграции и правки конфига не нужно. Таблица settings получает уникальный
индекс автоматически при первом старте, а при использовании SUI_SECRETBOX_KEY
одноразовый ре-seal секретов выполняется на старте. Просмотрите два Ломающих
изменения, если используете scoped API-токены или file/ssh плановый синк.