REMNAWAVE REVERSE PROXY
🚀 Основные изменения
Главное в этом релизе: исправление багов. Большинство касалось редких и аварийных сценариев: сбой посреди операции, повторный запуск, временно недоступная панель.
NetBird
- Аварийный возврат охватывает и ноды в состояниях
rollback_failed, и импортированные: раньше именно они оставались на overlay-адресе при аварии NetBird. - Импорт ручной схемы не теряет ноды: вопрос о публичном хосте идёт мимо потока jq, имена с пробелами парсятся, а публичные ноды не помечаются как overlay.
- Состав группы собирается из идентификаторов участников: добавление уже зарегистрированной ноды в непустую группу больше не падает с 400.
- Перед выключением политики Default проверяются пути всех участников: импортированных нод, страницы подписки и чекера.
- Отдельный порт на Caddy создаётся с первого раза: пустой список разрешённых адресов допустим, номер порта своего блока распознаётся и не смещается при каждом применении.
- Откат страницы подписки завершается при любой защите панели: имя куки берётся из конфига панели, для TinyAuth и MFA отправляется X-Api-Key. Выход из схемы больше не требует удалять файл состояния вручную.
- Токен self-hosted аккаунта не отправляется в облако: адрес API строится по адресу вашего сервера NetBird, и нода при переводе подключается к нему же.
- Уже подключённый на ноде клиент виден до перевода: модуль показывает его сервер управления и предлагает перерегистрацию, а клиент из чужого аккаунта опознаётся по адресу вне сети панели.
- Чекер в сети не открывает свой интерфейс в интернет: состояние UFW проверяется, порт 2112 остаётся закрытым снаружи.
- Полное удаление стирает участников сети по идентификаторам, а не по именам: чужой сервер с hostname «vps» не выпадает из сети, а политика Default возвращается на место до удаления состояния модуля.
🧭 Маршрутизация
- «Локальная нода» снова означает адрес этой панели: публичный IP, домен, указывающий на этот IP, или шлюз локального compose. Overlay-адрес и домен удалённой ноды больше не считаются локальными: раньше так правило
ext:попадало в профиль, где файла нет, и Xray на ноде не запускался. - Перед включением ufw на сервере выхода открывается порт ноды для панели: если правило поставить не удалось, ufw не включается, и нода не теряет связь с панелью.
- Правило ruex включается только в профили, где файл смонтирован на всех нодах. Отступ в compose подстраивается под формат файла, запись идёт во временный файл со сверкой sha256, а рестарт получают только изменившиеся ноды.
- Если снять правила с профиля не удалось, мост остаётся в списке: служебный пользователь и сквад не удаляются, повтор доводит удаление до конца.
- Порт SS-инбаунда проверяется на диапазон и занятость, а EOF в любом меню модуля возвращает управление.
🧩 Плагины нод
- Сбойный запрос конфига плагина прерывает сохранение: раньше конфиг подменялся пустым, и следующий PATCH стирал остальные секции плагина на всех нодах.
- Ноды с чужим плагином перепривязываются только по списку и после подтверждения.
- Переименованный в панели плагин находится по сохранённому идентификатору, а не пересоздаётся пустым с перепривязкой всех нод.
- «Пересоздать таблицы» честно предупреждает: Ingress и Egress на нодах сбросятся тоже.
- Отметки пресетов переживают недоступную панель, пресет private не блокирует DNS самого сервера, а прокси с авторизацией в уведомлениях кодируется корректно.
➕ Добавление нод
- Сертификат, выпущенный на самой ноде, продлевается с рестартом nginx: deploy-hook прописывается в конфиг продления.
- Пара файлов сертификата при синхронизации пишется атомарно: передача, прерванная посередине, больше не ломает nginx ноды при следующем рестарте.
- Удаление устаревшей ноды находит профиль конфигурации по правильному полю и стирает его вместе с хостами, а профиль, созданный при неудачной установке ноды, удаляется, и имя свободно для повтора.
- Ошибка создания ноды не принимается за её uuid, overlay-нода получает SSH-алиас с первого раза, DNS-провайдер спрашивается и тогда, когда запись уже указывает на ноду.
📜 Сертификаты
- Сертификаты HTTP-01 продлеваются сами: крон ставит ufw, если его нет, хук лежит в ключе
renew_hook, который certbot действительно читает, а порт 80 открывается только на время ACME-проверки и не трогает чужие правила. - Хуки продления ставятся и для Bunny, и для сертификатов с суффиксом
-0001, а «Обновить сертификаты» не переписывает хуки чужих сертификатов, включая сертификат чекера. - Отчёт в Telegram об истекающих сертификатах идёт на языке интерфейса, а токен бота и учётные данные прокси уходят из командной строки.
⚙️ Ядро Xray
- Замена смонтированного кастомного ядра пересоздаёт контейнер ноды: раньше после замены контейнер продолжал работать со старым файлом.
- Перед установкой ядра 26.9.8 и новее модуль предупреждает: сервер REALITY перестаёт принимать клиентов без поддержки X25519MLKEM768 и молча отправляет их на сайт-маскировку. Ошибки у клиента при этом нет, подключение просто не работает. Перед обновлением проверьте, что ваши клиенты уже поддерживают ML-KEM.
- При недоступном GitHub API ставится закреплённая версия, своё ядро с потерянной записью показывается как неизвестное, а если профиль панели запускает собственное ядро, об этом сказано прямо.
📡 Xray Checker
nginx -tвыполняется в пересозданном контейнере с новыми монтированиями: публикация через nginx панели больше не падает на свежем сертификате.- Каталог сертификата определяется по факту, контейнер в цикле рестартов не считается работающим, а наполовину выполненная установка объясняет, как её завершить или отменить.
- Существующий сертификат используется повторно, если он уже покрывает домен, а домен, который уже обслуживает веб-сервер, отклоняется.
🖥️ Панель и доступ
- Неудачное обновление откатывает
.envи compose, а возврат с 3.x поднимает образ 2.x, а не только что скачанный 3.x. - Проверка после правки Caddy замечает цикл рестартов и возвращает конфиг.
- Порт 8443: повторное открытие не падает на «порт занят» (его занимает сам nginx), сбой правки не трогает чужое правило ufw, а с TinyAuth пост объясняет, когда страница входа доступна вообще.
- Логи показываются и для остановленных контейнеров, а ошибка
docker pullдокладывается вместо «обновлений нет».
🌐 IPv6, BBR и DNS
- Настройки IPv6 и BBR пишутся в собственный файл sysctl.d: Debian 13 перестал читать /etc/sysctl.conf при загрузке, и значения молча возвращались к исходным после каждой перезагрузки. Старые строки из sysctl.conf вычищаются.
- Статус IPv6 понимает отключение параметром ядра ipv6.disable=1, а пустой ответ sysctl больше не роняет проверку.
- Проверка «домен уже указывает на этот сервер» узнаёт записи за прокси Cloudflare по их CIDR-диапазонам, и обновление A-записи сохраняет прокси.
🎨 Legiz и selfsteal-шаблоны
- yq для расширений legiz ставится под архитектуру процессора (amd64/arm64), а повреждённый yq от прошлой установки замечается и заменяется.
- Установка страницы подписки ищется и в /opt/remnawave, и в /opt/subscription.
- Пункт 0 в меню расширений legiz действительно выходит: раньше он проваливался дальше, и compose панели перезапускался без причины.
- Смена selfsteal-шаблона ноды идёт через промежуточный каталог: неудачная копия оставляет работающий сайт на месте, а не пустой каталог.
- Выход из вложенного меню шаблонов больше не запускает вторую копию скрипта, а конец ввода выводит из меню вместо вечного цикла.
🔑 SSH
- Запись overlay-алиаса одной цели не стирает его у остальных: защита перевода больше не держится только на последней ноде.
- Смена ключа хоста при переустановке ОС решается на месте: скрипт показывает отпечаток сервера и забывает старый ключ после подтверждения.
- Подпись сервера в списке подключений меняется без повторного ввода: Enter оставляет прежнюю.
🔐 Безопасность и стабильность
- Тела API-запросов уходят через stdin: приватные ключи Reality из патчей профиля, пароль суперадмина и токены Telegram-ботов больше не видны в ps.
- Скачиваемые скрипты и бинарники проверяются перед запуском от root: установщик Docker и скрипты WARP и бекапа запускаются только при совпадении контрольных сумм с двух независимых источников, yq сверяется с контрольными суммами релиза. Если проверка невозможна, Docker ставится подписанными пакетами дистрибутива, а остальные скрипты не запускаются.
- Пустой ответ и страница ошибки перестали считаться успехом: DELETE проверяет HTTP-код, ответы панели проверяются на
.response. - Конец ввода выводит из любого меню вместо цикла без задержки на 100% CPU.
- Русские строки вынесены из кода в языковые файлы: диагностика NetBird и названия ядер показываются по-английски при английском интерфейсе.
⬆️ Обновление
bash <(curl -Ls https://raw.githubusercontent.com/eGamesAPI/remnawave-reverse-proxy/refs/heads/main/install_remnawave.sh)