Remnawave v2.2.0
kastovСвежее обновление Remnawave состоит из множества новых функций и улучшений, не обошлось и без исправления некоторых найденных багов.
В этой небольшой статье пройдемся по ключевым изменениям, на которые стоит обратить внимание после обновления.
Внешние сквады (External Squads)

Итак, в версии 2.0 ( релиз которой был 29-ого июля) появились Внутренние Сквады (Internal Squads), название само по себе подразумевает, что должны быть так же и внешение сквады, которые будут направлены на переопределение настроек, которые получаются пользователи.
В то время как внутренние сквады больше направлены на внутреннее использование, внешение сквады имеют полностью противоположный эффект.
Многие задавались вопросом – как для определенного пользователя или определенной группы пользователей изменить некоторые параметры подписки, которую эти пользователи получают? Например, для 5 пользователей из 500 хотелось бы отдавать другой роутинг или другое анонс-сообщение (которые настраиваются в разделе Subscription - Settings). Так как один пользователь мог иметь несколько внутренних сквадов – эти настройки даже в теории невозможно было бы добавить во внутренние сквады. Собственно – для этого и нужны внешние сквады. У одного пользователя может быть активен только один внешний сквад, а уже в настройках внешнего сквада вы можете настроить (а лучше сказать переопределить) некоторые параметры подписки. В частности – изменить шаблон на основе которого генерируется подписка или изменить другие настройки.

Собственно, подводя небольшой итог: у внешних сквадов одна цель – переопределять некоторые параметры подписки, которую получают пользователи.
Шаблоны подписок (Subscription Templates)
В прошлых версиях у вас мог быть только один шаблон для каждого типа подписки.
Например, для всех клиентских приложений, у которых под капотом ядро Mihomo – у вас был один единый шаблон, что могло вызывать некоторые трудности, когда для разных пользователей или разных устройств требовались различные конфигурации, которые отличались в мелочах.
В новой версии мы изменили подход, теперь у нас есть строгое фиксированные типы клиентских шаблонов: MIHOMO, XRAY JSON, CLASH, STASH и SING BOX. (Внимательные пользователи могли заметить здесь отсутствие типа SingBox Legacy – о нем чуть дальше, продолжайте чтение).

Как вы видите, для конкретного типа шаблона – в данном случае Xray Json, мы создали множество разных шаблонов. Теперь мы можем их использовать например при настройке одного из внешних сквадов или в Редакторе Правил Ответов (Response Rules).
Правила ответов (Response Rules)

В прошлых версиях Remnawave самостоятельно определял каким клиентским приложениям какую подписку выдавать (на основе User Agent Remnawave определял к какому типу принадлежит клиентское приложение – Mihomo, Xray, и тд).
Этот раздел был полностью переработан, и теперь Remnawave позволяет максимально гибко и удобно настраивать этот момент.
Кастомизация правил ответов существует и в других панелях, но настолько гибкой настройки – вы не встретите нигде, кроме Remnawave.
С виду – это обычная JSON конфигурация, однако из-за большого количества опций и вариантов запоминать параметры на память было бы сложно и неудобно.
В нашем редакторе (который на скриншотах) вы можете навестись курсором на любой объект, на любое значение и вы получите описание этого обьекта, а в некоторых случаях еще и примеры использования. Само собой, при таких раскладах так же и доступна полная поддержка "дописывания", просто начните вводить и редактор вам подскажет какие поля и обьекты здесь разрешены, а какие – нет.

С помощью этого редактора перед вами открывается огромное количество возможностей, ради которых раньше приходилось неудобно настраивать конфигурацию реверс-прокси. Например, вы хотите полностью заблокировать доступ к подпискам, если клиент использует приложение Sing-box – теперь это довольно просто сделать, требуется лишь добавить одно правило в список.
Для демонстрации всей мощи этого функционала, приведу небольшой пример.

На скриншоте вы можете заметить кастомное правило, которое у меня получилось добавить буквально за 5 минут. Расскажу, что здесь происходит.
Цель: выдавать шаблон подписки Happ Android (тип Xray Json) только для приложения Happ и только если запрос пришел с Android, а так же дополнительный добавить в ответ хедер.
Следовательно, в голове мы можем построить такую логическую цепочку: если запрос пришел от приложения Happ и с платформы Android, необходимо переопределить шаблон, а так же добавить хедер.
В обьект responseModifications.subscriptionTemplate мы прописали наш существующий шаблон (в разделе "Шаблоны Подписок"), а чуть ниже добавили хедер, которые получит клиент при запросе подписки.
Самое замечательное, что все, что вы видите на скриншоте уже полностью провалидировано, в том числе название шаблона, который мы переопределили.

Этот список шаблонов был получен в реальном времени на основе тех, которые у вас уже имеются. В данном случае были получены все шаблоны для типа Xray Json (XRAY_JSON), так как тип ответа (в обьекте чуть выше) выбран как XRAY_JSON.
И это лишь маленькая часть того, как гибко можно настроить этот раздел. Различные варианта сравнений (от простого равно до регулярных выражений), разное комбинирование условий в рамках правила (AND, OR).
Понятное дело, что тестирование такого функционала может привести к крайне печальным последствиям для вашей production-среды – поэтому был так же добавлен отдельный "режим" – отладчик. С его помощью вы можете БЕЗ ПРИМЕНЕНИЯ изменений в редакторе получить строчку, которую вы можете импортировать в такие приложения как Postman, Insomnia и увидеть, какой тип ответа будет использован, и под какое правило попал ваш запрос.

Процесс может выглядеть вот так: в редакторе собираете правила (пока что не сохраняете!), вызываете отладчик (он в реальном времени возьмет текущее содержимое вашего редактора) и выдаст команду. Копируете, одним кликом добавляете в Insomnia или другое приложение.

Как вы видите на скриншоте, мой запрос (так как он не содержит каких-то особых хедеров клиентских приложений) попал в fallback-правило (в редакторе оно внизу).
Само собой, редактор правил полностью поддерживает функционал подгрузки публичных шаблонов.
Чтобы другие пользователи могли загрузить ваш кастомный шаблон – не забудьте отправить PR в наш репозиторий шаблонов: https://github.com/remnawave/templates
Важная заметка касательно этого раздела: если вы переопределяете шаблон ответов (и при этом пользователь находится во внешем скваде, в котором тоже переопределен шаблон) – у SRR (так я называю "Правила ответов") будет наисвыший приоритет.
Сниппеты для Профилей (Snippets for Config Profiles)

Напомню, что профилем в контексте Remnawave является серверная конфигурация ядра Xray, которую вы создаете в панели, а после этого она попадает на ваши ноды.
Так вот, профили так же получили небольшой буст, который позволяет вам создавать небольшие "сниппеты", которые вы можете потом использовать в любом из профилей.
На данный момент сниппеты поддерживаются только для обьектов outbounds и routing.rules.
Например, у вас есть несколько профилей – допустим 10 штук, в каждом из 10 штук раздел роутинга у вас одинаковый и вы бы хотели быстро и удобно заменить правила во всех профилях сразу. Раньше бы вам пришлось ручками пройтись по каждому профилю и изменить его, что может повлечь за собой ошибки из-за усталости или невнимательности.
С функционалом сниппетов вам будет достаточно изменить "правило" или "правила" в одном месте, а потом они автоматически подтянутся в профили.

Для примера создадим простой сниппет, который, я думаю, вы довольно часто используете. В нем буквально одно правило – если IP попадает в категорию geoip:private – отправляем в outbound BLOCK.

После создания мы легко и просто можем указать сниппет уже в реальном обьекте правил. И естественно, присутствует полная поддержка подсказок – начните вводить и перед вами списком появяется все ваши существующие сниппеты. А если вы наведетесь на них – так же отобразится превью содержимого.
Настройки Remnawave
Некоторые настройки, которые раньше конфигурировались через .env файл и для применения изменений требовали полный перезапуск панели переехали в свой собственный раздел уже внутри панели. Никаких больше перезапусках при изменении логотипа!

Многие .env переменные теперь игнорируются и вы можете безопасно их удалить из содержимого .env файла и настроить соотвествующие функции внутри панели.
Полный список больше не нужных .env переменных:
TELEGRAM_OAUTH_ENABLED TELEGRAM_OAUTH_ADMIN_IDS OAUTH2_GITHUB_ENABLED OAUTH2_GITHUB_CLIENT_ID OAUTH2_GITHUB_CLIENT_SECRET OAUTH2_GITHUB_ALLOWED_EMAILS OAUTH2_POCKETID_ENABLED OAUTH2_POCKETID_CLIENT_ID OAUTH2_POCKETID_CLIENT_SECRET OAUTH2_POCKETID_ALLOWED_EMAILS OAUTH2_POCKETID_PLAIN_DOMAIN OAUTH2_YANDEX_ENABLED OAUTH2_YANDEX_CLIENT_ID OAUTH2_YANDEX_CLIENT_SECRET OAUTH2_YANDEX_ALLOWED_EMAILS BRANDING_LOGO_URL BRANDING_TITLE
Благодаря этому был так же добавлен функционал быстрого изменения способов входа – и опять же – без необходимости перезапускать панель! Настройки брендирования станут намного удобнее, ведь любые изменения будут видны моментально.
Вход с помощью ключей входа (Passkey)
А так же, благодаря тому, что часть настроек переехала в панель – вы теперь с легкостью можете добавить ваш ключ входа и входить в панель без ввода каких-либо паролей или использования сторонних средств (по типу Telegram, Github).


При желании вы можете даже отключить вход по паролю и комбинировать разные метода входа в любых сочетаниях. На скриншоте как раз пример – включен только метод входа с помощью ключа входа, все остальные методы аутентификации отключены.
Прочие изменение и исправления ошибок
- Перечисление SNI в Хосте через запятые (sni-1.com,sni-2.com,sni-3.com) – если SNI перечислены в таком формате – Remnawave при запросе подписки будет выбирать случайное значение из предоставленного списка
- Получение уведомлений и вебхуков для пользователей, которые не подключались определенный срок – включается через .env переменные. По умолчанию эта опция выключена.
### Not connected users notification (webhook, telegram) NOT_CONNECTED_USERS_NOTIFICATIONS_ENABLED=false # Only in ASC order (example: [6, 12, 24]), must be valid array of integer(min: 1, max: 168) numbers. No more than 3 values. # Each value represents HOURS passed after user creation (user.createdAt) NOT_CONNECTED_USERS_NOTIFICATIONS_AFTER_HOURS=[6, 24, 48]
- Некоторые элементы внутри панели получили редизайн (frontend)
- Изменена логика обновления пользователя (метод patch – /api/users/)
- Исправлена ошибка при которой изменение внутренного сквада пользователя могло не удалить пользователя с нод, к которым после изменение сквада у пользователя не должно быть доступа
- Исправлена ошибка при которой кастомное поле Server Description (Host) могло не передаваться в Xray Json подписку
- Оптимизация модальных окон (frontend)
- Добавлен 400 код ошибки в документацию OpenAPI (backend)
- Общие изменения некоторых компонентов для стандартизации визуальной части панели (frontend)
Переводы
Отдельно хочу выразить благодарность тем, кто принимает активное участие в переводе Remnawave на другие языки!
Try Remnawave
Свежее обновление уже доступно для тестирования на сайте: https://try.tg

С момента запуска TryRemnawave было задеплоено 247 инстансов панели и я считаю это отличным достижением! Спасибо!
Как обновиться?
Перед обновлением не забудьте сделать бекап. Вы можете воспользоваться одним из инструментов, представленных здесь: https://remna.st/docs/awesome-remnawave#backup-restore
Обновиться, как и всегда, можно командой:
cd /opt/remnawave && docker compose pull remnawave && docker compose down && docker compose up -d
Перед обновлением убедитесь, что сторонние сервисы, которые могут использовать API Remnawave поддерживают новую версию. Уточнить эту информацию вы можете в чатах проектов, которые используете.
Актуальную документацию API вы можете посмотреть здесь: https://remna.st/api
Полезные ссылки
Быть в курсе новостей: https://t.me/remnalog
Поговорить о чем угодно (флудилка, оффтоп): https://t.me/+RE36-TXEXjRkYmE6
Поговорить о панели или спросить совета: https://t.me/+xQs17zMzwCY1NzYy
Подписаться на канал: https://t.me/remnawave
Поддержать Remnawave: https://remna.st/donate
Поделиться идеей или сообщить о баге: https://hub.remna.st