[!important] Важно
Перед обновлением, обязательно сделать полный бекап ваших данных (база данных,.env-файл). См. Инструменты бекапа и восстановления.
На что обратить внимание?
Миграция базы данных – HWID-устройство и История Запросов подписки
В таблицах hwid_user_devices и user_subscription_request_history столбец userUuid заменен на userId (BigInt).
- HWID-устройства – если таблица содержит ≤ 500 тыс. записей, данные будут перенесены автоматически. Если > 500 тыс. записей, таблица будет очищена (все устройства будут перерегистрированы при следующем запросе на обновление подписки).
- Subscription Request History – таблица будет очищена во время миграции..
Уведомления об истечении подписки теперь отключены по умолчанию
Раньше вебхуки/уведомления о приближающемся и наступившем истечении подписки (user.expires_in_72_hours, user.expires_in_48_hours, user.expires_in_24_hours, user.expired_24_hours_ago) отправлялись по умолчанию, без отдельной настройки.
Теперь эти события объединены в одно user.expiration и по умолчанию выключены. Если вы полагались на старое поведение, после обновления уведомления об истечении перестанут приходить, пока вы их явно не включите.
Что изменилось
- Старые события удалены (см. также раздел про модель вебхуков):
user.expires_in_72_hoursuser.expires_in_48_hoursuser.expires_in_24_hoursuser.expired_24_hours_ago
- Вместо них — единое событие
user.expirationс объектомmeta.expiration(знаковое значение в часах относительно момента истечения). - Набор и моменты отправки теперь настраиваются через
.env, а не зашиты в код.
Как вернуть прежнее поведение (включить уведомления)
Добавьте в .env:
### Expiration notifications (webhook, telegram)
EXPIRATION_NOTIFICATIONS_ENABLED=true
# negative = за N часов ДО истечения, positive = через N часов ПОСЛЕ истечения
EXPIRATION_NOTIFICATIONS=[-72, -48, -24, 24]
Конфигурация [-72, -48, -24, 24] полностью повторяет старое поведение: уведомления за 72, 48 и 24 часа до истечения и через 24 часа после.
Важно: уведомления отправляются, только если включён хотя бы один канал доставки —
IS_TELEGRAM_NOTIFICATIONS_ENABLED=trueилиWEBHOOK_ENABLED=true. Если оба выключены, джоба не запустится даже приEXPIRATION_NOTIFICATIONS_ENABLED=true.
Формат EXPIRATION_NOTIFICATIONS
Массив целых чисел — часы относительно момента истечения подписки (expireAt):
- отрицательное — за
|N|часов до истечения (истекает через N часов); - положительное — через
Nчасов после истечения (истекло N часов назад); - допустимый диапазон: от −168 до 168, значение 0 запрещено;
- не более 5 значений в каждую сторону (до 5 отрицательных и 5 положительных);
- без дубликатов, строго по возрастанию (ASC), например
[-72, -48, -24, 24].
Кастомный notifications-config.yml — удалите устаревшие ключи
Если вы используете кастомный конфиг уведомлений (примонтированный
./config.yml:/var/lib/remnawave/configs/notifications/notifications-config.yml), после обновления панель не запустится, пока вы не удалите из.ymlстарые ключи событий. Конфиг проходит строгую валидацию, и неизвестный ключ приводит к фатальной ошибке старта:[NotificationsConfig] Validation Errors: ❌ events.user.expires_in_72_hours: Invalid enum value... Please fix the notifications config file and restart the application.
Удалите из events: следующие ключи (события удалены):
# ❌ Удалить — события больше не существуют
user.expires_in_72_hours:
telegram: true
webhook: true
user.expires_in_48_hours:
telegram: true
webhook: true
user.expires_in_24_hours:
telegram: true
webhook: true
user.expired_24_hours_ago:
telegram: true
webhook: true
При необходимости добавьте новый ключ для управления каналами объединённого события (опционально — если ключ не указан, событие включено по умолчанию для обоих каналов):
# ✅ Новое объединённое событие
user.expiration:
telegram: true
webhook: true
Полезная нагрузка вебхука
Событие user.expiration содержит meta.expiration с тем же знаковым значением, что сработало:
{
"scope": "user",
"event": "user.expiration",
"meta": { "expiration": -72 }
}
Новая опциональная переменная
SERVICE_DISABLE_SRH_RECORDS=false
Установите значение true, чтобы отключить сохранение истории запросов на подписку. Значение по умолчанию — false.
Бекенд
Новый функционал
- Mihomo: поддержка протокола Hysteria2
Полная генерация Hysteria2-подписки для клиентов с ядром Mihomo, включая QUIC-параметры (brutal up/down, UDP hop, bbrProfile, congestion), обфускацию (salamander) и TLS-опции. - Mihomo: поддержка транспорта xHTTP
xHTTP-транспорт для клиентов Mihomo с полным набором опций xmux, download-settings и padding. - Mihomo: выбор IP-версии
Новое поле хостаmihomoIpVersion(dual / ipv4 / ipv6 / ipv4-prefer / ipv6-prefer) пробрасывается вip-versionконфига Mihomo. - Поддержка ECH в Xray-Json
TLS-опцииechForceQueryиechConfigListдля Xray-Json (значения берутся из инбаунда). - Hysteria2 в Xray (Base64)
Генерация ссылокhysteria2://auth@host:port/?params#remark - Улучшения транспорта KCP
ПараметрыclientMtu,clientTtiтеперь передаются в Base64-подписку; http-заголовок KCP теперь включает `path` и `host` из заголовков запроса. - Шифрование тела ответа подписки (age)
Response Rules могут шифровать ответ черезage-encryption: методыage1(X25519) иage1pq1(гибридный post-quantum). Генерация ключевых пар добавлена в Rescue CLI. - SOCKS5-прокси для нод
Новое поле нодыproxyUrl, весь API-трафик к ноде может идти через SOCKS5-прокси. - Отдельный множитель потребления ноды
Новое полеnodeConsumptionMultiplier(учёт общего трафика ноды отдельно от пользовательскогоconsumptionMultiplier). - Множественные теги хостов
Полеtagзаменено на массивtags[](до 10 тегов, regex^[A-Z0-9_:]+$, ≤36 символов). - Удаление
allowInsecure— добавленыpinnedPeerCertSha256иverifyPeerCertByName,allowInsecureудалён. disableHwidCheckв Response Rules
Флаг отключает проверку HWID на уровне правила (приоритетнее настроек подписки).- Bulk-update хостов
Вместоset-inbound/set-portдобавлен универсальныйPATCH hosts/bulk/updateсо всеми полями хоста. - Статистика по нескольким нодам
Новый эндпоинтPOST /bandwidth-stats/nodes/users: топ-пользователи + sparkline-данные по набору нод (GetStatsNodesUsersUsageCommand). - Заметки к нодам
Новое полеnote(до 255 символов). - HWID advisory lock
Создание HWID-устройства теперь использует PostgreSQL advisory locks (pg_advisory_xact_lock) для защиты от гонок при проверке лимита устройств.
Это нововведение является частью исправления CVE-2026-39880. - HWID: трекинг IP запроса
Записи устройств теперь хранятrequestIpзапроса подписки. - Метрики Load Average ноды
Новые Prometheus-метрики:node_cpu_load_avg_1m,node_cpu_load_avg_5m,node_cpu_load_avg_15m. - Плагины нод: AS-листы — общие списки теперь поддерживают тип
asList(номера ASN) в дополнение кipList. - base64-трансформация в Template Variables
ПрефиксrwEncodeBase64в поддерживаемых полях (тех же полях, в которых доступныTemplate Variables)кодирует содержимое вbase64. - CLI: обслуживание таблицы статистики
Новые действияRescue CLI: Generate keypairs (генерация ключей шифрования), Clean up Users Usage Table (TRUNCATE + VACUUM + REINDEX), Delete Users Usage by date range (batch-удаление по диапазону дат). - Сортировка пользователей по
usedTrafficPercentage
Сортировка по вычисляемому проценту использованного трафика. - Поддержка
DIRECT_URLдля Prisma
Отдельное прямое подключение к БД (в обход пулера, напр. PgBouncer)
Исправления
- Xray-Json: WS-транспорт
Заголовок Host перенесён из объектаheadersв отдельное полеhost. - Advanced Xray-Json: виртуальные хосты
Кандидаты-хосты теперь исключают сам хост-получатель. - Plugin Executor
Теперь нацеливается только на включённые и подключённые ноды. - Подавление ошибок 404 в логах
Снижение шума в логах (404 больше не логируется). - Метрики: event loop delay
Теперь вычитается смещениеresolutionдля корректных значений. - Xray-Json: fallback outbounds
baseTemplate.outboundsбезопасно обрабатывается приundefined. - Заголовки в ws/httpupgrade
Корректная передача заголовков; добавленhostв опцииws-транспорта. - Кодирование base64 share-link
Пробел в query кодируется как%20вместо+. - Таймаут HTTP-запросов Telegram-бота
Таймаут снижен до 10 секунд (вместо несколько минут по умолчанию).
Улучшения
- БД:
userUuid→userId(BigInt)
В таблицах HWID-устройств и истории запросов подписки — более быстрыеjoin’ы и меньшие индексы. - Process titles
Процессы API, processor и scheduler теперь задаютprocess.title(rw-api,rw-processor,rw-scheduler). - Оптимизация реордеров
viewPositionв репозиториях (internal-squad,subpage-configs,config-profile) обновляется через батч-метод. FINGERPRINTS
Переведён в массив строк с нормализацией (includes+ fallbackchrome); добавлено значение360; полеfingerprintтеперь свободная строка.- Logs → /dev/null
out_file/error_fileпроцессов PM2 перенаправлены в/dev/null - Dockerfile
Удалено копированиеpatchesиlibsв финальный образ. - Удалён лимит на YAML-алиасы
вClash/Mihomo/Stashгенераторах. - Удалена устаревшая команда CLI
fixPostgresCollationудалена; улучшено сообщение о сбросе суперадмина.
Фронтенд
Новый функционал
- Табличный вид для Хостов
Добавлено отображение хостов в виде таблицы в дополнение к карточкам: сортировка, видимость колонок. Карточка хоста переработана:OverflowListдля нод, иконки-индикаторы с тултипами, отображение inbound-тега, исключённых сквадов и server description. - Массовое редактирование хостов
Новое модальное окно для bulk-редактирования хостов всеми полями (взамен раздельныхset-inbound/set-port). Добавлено множественное перемещение хостов и мульти-выбор. - Метаданные нод и пользователей
Отображение метаданных ноды и метаданных пользователя. - Колонка процента использованного трафика
КолонкаusedTrafficPercentageв таблице пользователей (с сортировкой). - Шаблоны фильтров таблицы пользователей
Возможность сохранять/применять шаблоны фильтров (users-table-templates) в таблице пользователей. - Статистика по нескольким нодам
Новый виджетNodesUsersUsageStatistics– запрос и отображение статистики (топ-пользователи + sparkline) сразу по набору нод. - Disclaimer-оверлей
Оверлей с дисклеймером и сохранением состояния принятия пользователем. - QR-код билдер
renderSVGзаменён на собственныйQrCodeBuilderдля генерации QR-кодов ссылки-подписки пользователя. - WASM crash handling в редакторе Профилей
Обработка падений WASM и автоматический перезапуск. - Открытие ноды в Infra Billing
Прямой переход к ноде из раздела инфра-биллинга. - Инспекторы HWID и SRH
Улучшены таблицы инспектора HWID-устройств и истории запросов подписки, переработаны соответствующие модальные окна.
Исправления
- Иконки действий в таблицах
Исправлено отображение action-иконок в таблицах; скорректирован размер колонки User-Agent в таблице запросов подписки. - Infra-billing: даты в UTC
Date-only выбор дат удерживается в UTC, чтобы записи 1-го числа месяца корректно учитывались (#354). - Единицы трафика
Единицы трафика помечены как GiB (#345).
Улучшения
- Mantine v9
Миграция UI-фреймворка с Mantine v8.3.18 на v9.3.1 - Оптимизация
SessionsExplorerCard
Улучшены вычисление ключей и логика рендеринга строк сессий. - Утилита диапазонов дат
Диапазоны дат заменены на общую утилитарную функцию для консистентности. - Рефакторинг user-action компонентов
Переработаны компоненты действий над пользователем; обновлены стили (варианты и цветаActionIcon). - Bulk-операции над пользователями
- Реструктуризация виджетов массовых действий:
bulk-users-actions,bulk-users-update,bulk-all-users-*, карточкиaccess-setting/traffic-limits/device-tag-settings.