Remnawave Panel v2.8.0

[!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_hours
    • user.expires_in_48_hours
    • user.expires_in_24_hours
    • user.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 — удалите устаревшие ключи

:warning: Если вы используете кастомный конфиг уведомлений (примонтированный ./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 секунд (вместо несколько минут по умолчанию).

Улучшения

  • БД: userUuiduserId (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 + fallback chrome); добавлено значение 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.

API Changelog 2.7.4 vs. 2.8.0

New endpoints

  • POST /api/bandwidth-stats/nodes/users — per-user bandwidth stats by node
  • PATCH /api/hosts/bulk/update — bulk-update hosts (replaces the removed set-inbound / set-port endpoints)

Hosts: replaced single tag with tags array

The single tag property is removed and replaced with a tags array, allowing multiple tags per host. In responses tag (required) is removed and tags (optional) is added; in requests tag is removed and tags is added.

Affected endpoints:

  • GET /api/hosts
  • PATCH /api/hosts
  • POST /api/hosts
  • POST /api/hosts/bulk/delete
  • POST /api/hosts/bulk/disable
  • POST /api/hosts/bulk/enable
  • GET /api/hosts/{uuid}
  • GET /api/subscriptions/by-short-uuid/{shortUuid}/raw (in resolvedProxyConfigs/metadata)

Hosts: certificate pinning replaces allowInsecure

The allowInsecure property is removed from both requests and responses. Two new properties take its place: pinnedPeerCertSha256 (pin by certificate fingerprint) and verifyPeerCertByName (verify by certificate name).

Affected endpoints:

  • GET /api/hosts
  • PATCH /api/hosts
  • POST /api/hosts
  • POST /api/hosts/bulk/delete
  • POST /api/hosts/bulk/disable
  • POST /api/hosts/bulk/enable
  • GET /api/hosts/{uuid}
  • GET /api/subscriptions/by-short-uuid/{shortUuid}/raw (in resolvedProxyConfigs/securityOptions)

Hosts: added mihomoIpVersion

A new mihomoIpVersion property is added to control the IP version used by Mihomo clients.

Affected endpoints:

  • GET /api/hosts
  • PATCH /api/hosts
  • POST /api/hosts
  • POST /api/hosts/bulk/delete
  • POST /api/hosts/bulk/disable
  • POST /api/hosts/bulk/enable
  • GET /api/hosts/{uuid}
  • GET /api/subscriptions/by-short-uuid/{shortUuid}/raw (in resolvedProxyConfigs/clientOverrides)

Hosts: ALPN now supports HTTP/2 and HTTP/3

The alpn property accepts new values: h2, h3, h2,http/1.1, h3,h2, h3,h2,http/1.1, http/1.1.

Affected endpoints:

  • GET /api/hosts
  • PATCH /api/hosts
  • POST /api/hosts
  • POST /api/hosts/bulk/delete
  • POST /api/hosts/bulk/disable
  • POST /api/hosts/bulk/enable
  • GET /api/hosts/{uuid}

Hosts: removed fixed fingerprint values

The predefined fingerprint enum values are removed: android, chrome, edge, firefox, ios, qq, random, randomized, safari.

Affected endpoints:

  • PATCH /api/hosts
  • POST /api/hosts

Hosts: host, path and sni are now nullable

The host, path and sni request properties became nullable. On PATCH /api/hosts the isDisabled request property now defaults to false.

Affected endpoints:

  • PATCH /api/hosts
  • POST /api/hosts

Hosts: isDisabled and excludeFromSubscriptionTypes are now always returned

Both properties became required in responses (previously optional). The isDisabled default value of false was removed.

Affected endpoints:

  • GET /api/hosts
  • PATCH /api/hosts
  • POST /api/hosts
  • POST /api/hosts/bulk/delete
  • POST /api/hosts/bulk/disable
  • POST /api/hosts/bulk/enable
  • GET /api/hosts/{uuid}

Removed host bulk endpoints

The following endpoints were removed without deprecation. Use PATCH /api/hosts/bulk/update instead.

  • POST /api/hosts/bulk/set-inbound
  • POST /api/hosts/bulk/set-port

Replaced userUuid with userId in HWID devices and subscription request history

The userUuid property is replaced with userId (number) in the response objects. requestIp (nullable string) is added to HWID device responses.

Affected HWID endpoints:

  • GET /api/hwid/devices
  • POST /api/hwid/devices
  • POST /api/hwid/devices/delete
  • POST /api/hwid/devices/delete-all
  • GET /api/hwid/devices/{userUuid}

Affected subscription request history endpoints:

  • GET /api/subscription-request-history
  • GET /api/users/{uuid}/subscription-request-history

Nodes: added nodeConsumptionMultiplier, note and proxyUrl

Three new properties are added to nodes: nodeConsumptionMultiplier (traffic consumption multiplier), note (free-form note) and proxyUrl. The bulk update endpoint exposes nodeConsumptionMultiplier and note only.

Affected endpoints:

  • GET /api/nodes
  • PATCH /api/nodes
  • POST /api/nodes
  • POST /api/nodes/actions/reorder
  • POST /api/nodes/bulk-actions/update (nodeConsumptionMultiplier, note)
  • GET /api/nodes/{uuid}
  • POST /api/nodes/{uuid}/actions/disable
  • POST /api/nodes/{uuid}/actions/enable

Subscription response rules: added encryption and disableHwidCheck

The responseModifications object gains two optional properties: encryption and disableHwidCheck.

Affected endpoints:

  • GET /api/subscription-settings
  • PATCH /api/subscription-settings
  • POST /api/system/testers/srr-matcher

Subscriptions (raw): renamed tti to clientTti

In resolvedProxyConfigs/transportOptions, the required tti property is removed and clientTti is added.

Affected endpoints:

  • GET /api/subscriptions/by-short-uuid/{shortUuid}/raw

trafficLimitBytes type changed from integer to number

Affected endpoints:

  • GET /api/subscriptions/by-short-uuid/{shortUuid}/raw
  • GET /api/users
  • PATCH /api/users
  • POST /api/users
  • POST /api/users/bulk/all/update
  • POST /api/users/bulk/update
  • GET /api/users/by-email/{email}
  • GET /api/users/by-id/{id}
  • GET /api/users/by-short-uuid/{shortUuid}
  • GET /api/users/by-tag/{tag}
  • GET /api/users/by-telegram-id/{telegramId}
  • GET /api/users/by-username/{username}
  • GET /api/users/{uuid}
  • POST /api/users/{uuid}/actions/disable
  • POST /api/users/{uuid}/actions/enable
  • POST /api/users/{uuid}/actions/reset-traffic
  • POST /api/users/{uuid}/actions/revoke
  • POST /api/nodes