Ноды и подписки: как панель раздаёт доступ
Прежде чем цеплять ноду и выпускать подписку руками, разберём, что при этом происходит: как панель доставляет конфиг ноде, чем подписка отличается от «ссылки на сервер» и почему один URL умеет два разных ответа. Практика — в парной статье.
Перейти к практике →Панель — мозг, нода — мышцы
Повторю ключевое разделение, потому что на нём всё держится: панель не гоняет трафик. Она хранит состояние и раздаёт конфиги. Реальный трафик клиентов ходит через ноды, где крутится Xray.
Отсюда два независимых потока, которые надо не путать:
- Панель → нода — доставка конфигурации. Панель говорит ноде: «вот твои инбаунды, вот ключи, поднимай Xray вот так».
- Панель → клиент — доставка подписки. Панель говорит клиенту: «вот список серверов, к которым тебе можно подключиться».
Нода и клиент друг о друге через панель не знают напрямую — панель посредник в обоих потоках. Разберём каждый.
Как панель доставляет конфиг ноде
Когда ты регистрируешь ноду, панель не «заходит на неё по SSH». Механика другая и умнее:
- На сервере ноды ставится лёгкий агент (в контейнере). Он знает адрес панели и секретный ключ.
- Агент сам коннектится к панели и ждёт конфиг.
- Панель, авторизовав ноду по ключу, пушит на неё Xray-JSON — тот самый Config Profile с включёнными инбаундами.
- Агент поднимает Xray с этим конфигом. Нода становится online.
Красота в том, что нода — расходник без состояния. Весь мозг на панели. Умерла нода — поднимаешь новую с тем же ключом, панель заливает ей конфиг, и она встаёт в строй. Ничего вручную переносить не надо.
Ключ ноды (SECRET_KEY) — её единственный пароль к панели. Это то, чем нода доказывает, что она своя. Утёк ключ — считай, чужой может притвориться твоей нодой. Поэтому он живёт только в конфиге ноды и нигде не светится.
Один профиль на ноду, но галочками
Тонкость, которая экономит нервы. Нода ссылается на ровно один Config Profile, но внутри профиля ты галочками отмечаешь, какие инбаунды на этой конкретной ноде включены. То есть профиль может описывать три транспорта (TCP, gRPC, XHTTP), а на конкретной ноде ты включишь только нужные.
Это позволяет держать один аккуратный профиль и по-разному раскладывать его по нодам. Одна нода — только TCP-Reality, другая — все три транспорта. Профиль общий, набор включённого — разный.
Что такое подписка на самом деле
Теперь второй поток. Подписка — это не «ссылка на сервер», а ссылка на список серверов, который панель собирает под конкретного клиента.
Когда клиент вставляет подписку в приложение, происходит следующее:
- Приложение идёт по URL подписки.
- Панель смотрит, в каких сквадах состоит этот клиент, какие инбаунды ему доступны, какие хосты видимы.
- Собирает из пересечения список серверов и отдаёт приложению.
- Приложение показывает клиенту этот список — каждый видимый хост становится отдельным сервером.
Отсюда важное следствие для оператора: при замене серверов на твоей стороне клиенту достаточно «Обновить подписку». Ты поменял ноды в панели — список у клиента обновился сам, ничего заново вставлять не надо. Это и есть смысл подписки: динамический список, а не вбитый однажды сервер.
Почему один URL — два ответа
Хитрость, которая сначала сбивает с толку. Один и тот же URL подписки отдаёт две разные вещи:
- Открыл в браузере — видишь красивую страницу с кнопками «добавить в приложение» и QR-кодом.
- Открыл приложением — оно получает конфиг (список серверов).
Панель определяет, кто пришёл, по запросу — по заголовкам. Браузер просит HTML — получает страницу. Приложение просит конфиг — получает конфиг. Один адрес, два поведения.
Более того, формат конфига панель тоже подбирает под клиента — по его User-Agent. Разные приложения понимают разные форматы (base64-список, xray-json, sing-box, mihomo). Панель отдаёт каждому свой. Это отдельная большая тема (Response Rules), но принцип знай сразу: подписка адаптивна, она подстраивается под того, кто её открыл.
Настройки на уровне клиента
У каждого пользователя панель хранит несколько параметров, которые определяют его доступ во времени:
- Срок действия — до какой даты подписка активна.
- Лимит трафика — сколько гигабайт можно потратить (и стратегия сброса: день/неделя/месяц/без сброса).
- Лимит устройств (HWID) — со скольких устройств можно подключаться. Против шеринга ключей.
- Сквады — в каких тарифах состоит.
Эти параметры и есть рычаги управления клиентом: продлил срок, сбросил трафик, поднял лимит устройств, добавил в премиум-сквад. Всё это делается на уровне записи пользователя, не трогая ноды.
Собираем картину
Итого раздача доступа — это два потока через панель:
- Конфиг едет на ноду пушем: агент коннектится, панель заливает Xray-JSON по ключу, нода поднимает Xray.
- Подписка едет клиенту по запросу: панель собирает список серверов из пересечения сквадов, инбаундов и хостов, подбирает формат под приложение, отдаёт.
Понял механику — иди в парную практику. Там подключаем реальную ноду и выпускаем первую живую подписку по шагам, с командами. Ты уже знаешь, что при этом происходит под капотом, так что команды лягут на понимание, а не на веру.
Следующий гайд Подключение ноды и выпуск первой подписки → ↗ Не понравилась статья или что-то непонятно? Напишите мне — помогу или поправлю. @notrealvpn →