Skip to content

Подписки и страница подписки ​

У каждого пользователя есть один адрес подписки. Приложение запрашивает его и получает все способы подключиться к вашим узлам в том формате, который оно понимает. Открытый в браузере, тот же адрес показывает страницу подписки. Здесь описаны настройки, которые определяют и то, и другое. Как собираются записи, рассказано в От шаблона до ссылки.

Страница настроек подписок: карточки определения клиента, страницы подписки и её темы, имён ссылок с предпросмотром и базовой конфигурации для каждого форматаСтраница настроек подписок: карточки определения клиента, страницы подписки и её темы, имён ссылок с предпросмотром и базовой конфигурации для каждого формата

Куда ведут ссылки, задаётся на Адреса, а всё остальное — здесь, в Настройки → Подписки. Изменения применяются при следующем запросе подписки пользователем; на узлы ничего не отправляется.

Куда ведут ссылки ​

Ссылки строятся на маршруте Подписки в Настройки → Адреса, у которого включено Публиковать ссылки здесь. Пока такого маршрута нет, ссылки строятся на адресе, по которому пришёл запрос, или на Публичный адрес маршрута панели. Первый адрес панели всегда обслуживает и подписки, что бы вы ни добавили.

Домены подписок ​

Хосты маршрута Подписки — это имена хостов, на которых строятся ссылки пользователей, например sub.example.com.

  • Новые ссылки используют первый хост. Каждый хост маршрута продолжает обслуживать уже выданные ссылки.
  • Чтобы заменить переставший работать домен, добавьте новый, переместите его наверх и держите старый на маршруте, пока приложения пользователей не обновятся на новые ссылки. Ссылки хоста отключаются именно удалением его из маршрута.
  • Пишите каждый домен как одно имя хоста, без порта и пути. Ссылки используют порт слушателя маршрута или не содержат порта вовсе, если у маршрута задан Публичный адрес.
  • Каждому домену нужна DNS-запись, указывающая на панель, и место в сертификате слушателя маршрута. Собственный сертификат панели перевыпускается так, чтобы покрыть все хосты на слушателе, который его использует. В сертификат, которым вы управляете сами, их нужно добавить вручную.
  • Префикс пути — путь, под которым строятся ссылки, например /s.

Маршрут Подписки берёт только /sub, поэтому маршрут панели после него по-прежнему отвечает панелью на том же хосте по её собственному пути. Страница отклоняет изменение, после которого на адресе, с которого вы работаете, не останется панели.

Отдельное имя хоста для каждого подписчика ​

Запишите хост с подстановочным знаком, *.sub.example.com, и каждый подписчик получит собственное имя хоста под ним, например k4m2xr8qvp.sub.example.com. Если одно имя перестанет работать, это коснётся одного клиента, а не всей вашей базы.

  • Имя вычисляется из аккаунта пользователя, поэтому при каждом обновлении оно одно и то же. По нему нельзя восстановить подписку, а под каждым wildcard-доменом один и тот же пользователь получает несвязанное имя.
  • Нужна wildcard-запись DNS, *.sub.example.com, указывающая на панель. Без неё эти имена ни у кого не разрешаются.
  • Собственный сертификат панели покрывает wildcard автоматически.
  • Обслуживается ровно один уровень: abc.sub.example.com, но не a.b.sub.example.com.

Главный администратор может также выделить каждому реселлеру свой домен подписок, чтобы ссылки его клиентов использовали этот домен: это маршрут Подписки, привязанный к этому реселлеру (Адреса), или Домен подписок в его учётной записи (Реселлеры).

За CDN или прокси ​

Если люди попадают к подпискам через CDN или прокси перед панелью, задайте Публичный адрес маршрута, например https://sub.example.com. Тогда ссылки строятся на нём, без порта. См. Адреса.

Форматы для каждого приложения ​

Панель отвечает каждому приложению в формате, который оно понимает, и сама распознаёт большинство приложений:

ФорматПриложения
Ссылки, base64 (v2ray)Happ, v2RayTun, INCY, Streisand, v2rayN, v2rayNG, Shadowrocket, NekoBox, V2Box
Clash (clash)Приложения на основе Clash Meta, mihomo и Stash
Профиль sing-box (singbox)Приложения sing-box (SFA, SFI), Hiddify, Karing
Профиль Xray JSON (xray)Приложения на основе Xray, которые импортируют полный JSON-профиль
Простые ссылки (plain)Всё, что принимает ссылки по одной на строку

Приложение, которое панель не распознала, получает Формат подписки по умолчанию из карточки Определение клиента. Ссылка может и сама указать формат: адрес, за которым следует /clash, /singbox, /xray или /plain.

Не каждое приложение может использовать каждый инбаунд. Инбаунд, который формат приложения не может выразить, не попадает в файл этого приложения, а не включается в полурабочем виде; на страницах протоколов сказано, где это так.

Шаблоны подписок содержат базовую конфигурацию, из которой строятся форматы Clash, sing-box и Xray, по вкладке на каждый. Сгенерированные записи вливаются в неё. Оставьте вкладку пустой, чтобы использовать встроенную основу.

Имена записей ​

Имена ссылок задают, как называется каждая запись в подписке. Пустое значение, по умолчанию, оставляет имена, которые панель создавала всегда. Приложения запоминают выбранный пользователем сервер по имени, поэтому смена имён на работающем сервисе сбивает выбор у всех.

Шаблон имени — это текст с переменными:

{USER} · {ROUTE} · {REMAINING}        →   ali · CDN · 42.1 GB
{INBOUND}-{NODE}                      →   vless-ws-de-1
Переменная
{USER}, {USER_REMARK}Имя аккаунта и примечание
{INBOUND}, {PROTOCOL}, {NETWORK}Тег, протокол и транспорт инбаунда
{NODE}, {NODE_REMARK}Узел; пусто у записи фронта
{ROUTE}Метка адреса узла или фронта, который использует запись
{SERVER}, {PORT}Куда подключается запись
{USED}, {REMAINING}, {TOTAL}Трафик; ∞, если лимита нет
{DAYS_LEFT}, {EXPIRE}Сколько дней осталось и дата окончания; ∞, если срока нет
{EXPIRE_JALALI}Дата окончания по солнечному календарю хиджры
  • Всё, чего нет в списке, остаётся как написано, поэтому переменная с опечаткой видна, а не пропадает. Шаблон без единой известной переменной отклоняется.
  • Пустая переменная забирает с собой свой разделитель: {USER}-{NODE}-{INBOUND} у записи фронта даёт ali-vless-ws.
  • Даты и объёмы совпадают со страницей подписки и показываются в часовом поясе панели.
  • Предпросмотр показывает результат на примере аккаунта; его отрисовывает сама панель.

Файлы конфигурации приложений (.conf, .ovpn) сохраняют свои имена.

Что сообщается приложениям ​

Ответ подписки несёт также заголовки, которые многие приложения показывают без каких-либо действий пользователя:

ПараметрПередаётся какПоказывает
Заголовок профиля (или примечание пользователя)Profile-TitleHapp, v2RayTun
Квота, расход и срок пользователяSubscription-UserinfoHapp, v2RayTun, Clash Meta
Интервал обновления у клиентаProfile-Update-IntervalHapp, v2RayTun
ОбъявлениеAnnounceHapp, v2RayTun
Ссылка на поддержкуSupport-UrlHapp
Предлагать ссылку на страницу подпискиProfile-Web-Page-UrlHapp
  • Интервал обновления у клиента задаётся в часах; пустое поле означает 12. 0 не отправляет заголовок, и каждое приложение использует своё значение по умолчанию.
  • Если выключить Предлагать ссылку на страницу подписки, заголовок не отправляется вовсе, а не отправляется пустым.
  • Текст на персидском, русском или китайском передаётся в закодированном виде, чтобы приложения показывали его правильно. Объявление — одна строка: переносы строк становятся пробелами.
  • Happ показывает около 25 символов заголовка и около 200 символов объявления.

Страница подписки ​

Открытый в браузере, адрес подписки показывает страницу с расходом пользователя, сроком действия, историей трафика и каждым способом подключения с QR-кодом, кнопкой копирования и кнопками импорта подписки в популярные приложения. Пользователи WireGuard, OpenVPN и OpenConnect получают там же файлы конфигурации для своих приложений. Страница следует языку браузера пользователя.

Настройки → Подписки → Страница подписки:

Параметр
ТемаВстроенная страница · фиолетовая (по умолчанию), Встроенная страница · янтарная или одна из ваших тем
Каталог темОткуда читаются ваши темы. Только для главного администратора
Заголовок профиля, Ссылка на поддержку, ОбъявлениеПоказываются на странице и также передаются приложениям в заголовках
Отдавать браузеру сырую конфигурациюВыключает страницу: браузер получает тот же ответ, что и приложение

Своя тема ​

Тема — это каталог в каталоге тем, где лежит index.html (или sub.html) и все файлы, которые он использует. По умолчанию это /var/opt/nx-panel/sub-themes/ при стандартной установке и ./sub-themes рядом с compose-файлом в Docker. Положите туда каталог, нажмите Пересканировать каталог тем и выберите тему в поле Тема. Перезапуск не нужен.

  • В именах каталогов допустимы буквы, цифры, ., _ и -.
  • Правки появляются через несколько секунд.
  • Тема, которая не загрузилась или не отрисовалась, заменяется фиолетовой страницей, поэтому неудачная правка никогда не лишает пользователя подписки. Причина записывается в журнал панели.
  • Две встроенные страницы — хорошая отправная точка: каждая из них — один самодостаточный index.html.

Чтобы посмотреть тему, откройте адрес подписки пользователя, добавив /page.

Для авторов тем. Страница — это HTML-шаблон, который заполняет панель. Он получает пользователя (.User: имя, примечание, статус, онлайн), его трафик (.Usage, числами и форматированным текстом), .Expire и .Reset, историю трафика в виде SVG-столбцов (.Chart), каждый способ подключения (.Links, .Configs), файлы WireGuard, OpenVPN и OpenConnect (.Apps), адрес подписки в каждом формате с готовыми ссылками импорта для приложений (.Sub), ваш заголовок, ссылку на поддержку и объявление (.Panel), а также язык посетителя с переведёнными фразами встроенной страницы (.Lang, .Dir, .T). Вспомогательные функции форматируют байты и даты и рисуют QR-коды. Файлы рядом с index.html отдаются по адресу из .AssetBase. Если добавить /info к адресу подписки, вернутся те же данные в JSON, без ссылок, — для страницы, которая обновляет себя сама. Тема может только оформлять то, что ей передано: к базе данных, диску и сети у неё доступа нет.

INCY и V2RayTun умеют импортировать подписку по зашифрованной ссылке, в которой не виден адрес подписки. На вкладках INCY и V2RayTun в Шаблоны подписок кнопки Получить ключ от INCY и Получить ключ от V2RayTun сохраняют ключ каждого приложения, и кнопки импорта на странице для этого приложения переходят на зашифрованную форму. Удалите ключ, чтобы вернуться к обычным ссылкам.

Лимит устройств, строгий режим ​

Лимит устройств пользователя считает устройства, которые представляются при запросе подписки. Большинство приложений и все браузеры идентификатор устройства не отправляют.

Лимит устройств отклоняет клиентов без идентификатора решает, что с ними делать:

  • Выкл (по умолчанию): приложения без идентификатора устройства обслуживаются, а лимит действует только на те, что представляются.
  • Вкл: пользователь с лимитом устройств получает подписку только на устройствах, которые сообщают, кто они.

Включайте это, только если все ваши пользователи работают в приложениях, отправляющих идентификатор устройства. См. Пользователи.

Попросите пользователей выключить Mux ​

В приложениях на основе Xray (v2rayNG, v2rayN, Streisand) есть переключатель Mux. Ваши узлы не поддерживают протокол мультиплексирования, который он включает, поэтому с включённым Mux подключение просто не работает, и пользователь не видит понятного сообщения. Панель не может выключить его со своей стороны.

Страница подписки предупреждает об этом пользователей на их языке в разделе Дополнительно. Повторите это в своих инструкциях по настройке. Настройки мультиплексирования в приложениях sing-box и Clash — другая функция, с ними всё в порядке.

И ещё о v2rayNG: Update subscription обновляет только группу, открытую на экране. Пользователь, который импортировал вашу ссылку и обновляет подписку, пока открыта другая группа, видит пустой список без ошибки. Попросите его сначала открыть вкладку новой группы.

Текст и изображения — CC BY 4.0.