← К библиотеке
Панель Практика

Брендинг страницы подписки под свой сервис

Страница подписки — первое, что видит клиент. Кривая дефолтная страница режет доверие и конверсию. Ниже — как поднять свой домен подписки, забрендировать её и включить флаги, которые не дают растащить твой ключ. Свои данные впиши в конструктор сверху.

Что это и зачем возиться

Страница подписки — лицо сервиса для клиента. Он открывает ссылку и либо видит аккуратную страницу с кнопками «добавить в приложение» и QR, либо его приложение молча тянет оттуда конфиг. Один и тот же URL умеет оба ответа — панель определяет по запросу.

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

Свой домен и путь подписки

Подписку выносим на отдельный сабдомен. Задаётся в .env панели, без схемы (без https://):

.env
SUB_PUBLIC_DOMAIN=sub.your-domain.com
SHORT_UUID_LENGTH=48

Две вещи здесь работают на безопасность:

  • SHORT_UUID_LENGTH (16–64) — длина короткого идентификатора подписки. Длиннее = труднее перебрать чужую ссылку. Ставь ближе к верхней границе.
  • Нестандартный путь — меняй дефолтный префикс на произвольный (например /s/ или /go/), чтобы ссылки не угадывались сканерами.

После правки .env нужен полный пересоздать, обычный restart не перечитывает переменные:

bash
cd /opt/remnawave
docker compose down && docker compose up -d

По умолчанию подписку отдаёт сам backend. Отдельный контейнер страницы подписки нужен, только если хочешь свою кастомную/ребренд-страницу — тогда reverse-proxy ведёт на неё. Caddy для сабдомена подписки, если ставишь отдельный контейнер:

Caddyfile
sub.your-domain.com {
    reverse_proxy * http://remnawave-subscription-page:3010
}

Брендинг: логотип, цвета, тексты

В редакторе страницы подписки (Subpage Editor) задаётся название сервиса, логотип, цвета, тексты и ссылки на поддержку и канал. Логотип и фон — свои файлы, контакты — твой бот и канал. Ключевые поля брендинга:

branding
{
  "brandingSettings": {
    "title": "BRANDNAME",
    "logoUrl": "https://your-domain.com/logo.svg",
    "supportUrl": "https://t.me/your_support_bot"
  },
  "metaTitle": "BRANDNAME"
}

Заполняешь своими данными — страница становится «твоей». Клиент видит не голый Remnawave, а сервис с именем и лицом.

Приватные флаги: не дай растащить ключ

Главное, ради чего стоит лезть в app-config страницы. Два флага, которые закрывают самую частую утечку:

app-config
{
  "showConnectionKeys": false,
  "hideGetLinkButton": true
}
  • showConnectionKeys: false — клиент не видит сырой конфиг хоста (VLESS/Reality-ключи, SNI, адрес, порт, shortId). Только кнопки «добавить в приложение» и QR. Зачем: клиент не вытащит и не перепродаст твой ключ как отдельный конфиг, и не светятся внутренности хоста (донор, порт, транспорт) — меньше поверхности, чтобы скопировать твою схему.
  • hideGetLinkButton: true — парный флаг, убирает кнопку «получить ссылку», чтобы саму подписку тоже не растаскивали.

Оба флага — прямая защита выручки. Без них технически подкованный клиент выдёргивает конфиг и раздаёт друзьям бесплатно.

Кнопки приложений и QR

Страница умеет отдавать deep-links на популярные клиенты (Happ, Hiddify, v2rayTun и другие) — клиент жмёт «Добавить в Happ» и подписка импортируется в один тап. Плюс QR-код для телефона. Это резко снижает вал тикетов «как подключить».

В app-config прописываются клиенты по платформам с авто-импортом и пошаговыми инструкциями. Плейсхолдеры вроде {{SUBSCRIPTION_LINK}} не трогай — их панель подставляет под каждого пользователя сама. Не собирай app-config руками с нуля: возьми готовый шаблон и поменяй только брендинг.

Применяем

Порядок такой: Subscription-page → Subpage Editor → импорт app-config → вставляешь JSON → вписываешь свой brandingSettings и metaTitle. После правок в клиенте (например, в Happ) подписку лучше удалить и добавить заново, чтобы сбросить кэш и подтянуть новый вид.

Гигиена

  • Длинный SHORT_UUID_LENGTH + нестандартный путь — против перебора чужих подписок.
  • Подписка — единственное, что светится публично. По её адресу панель и ноды не угадываются: отдавай только адреса хостов, никогда не свети адрес панели.
  • Флаги приватности всегда включены на проде — это не опция, а защита от бесплатной раздачи.

Страница забрендирована и защищена. Дальше по разделу — тонкая настройка хостов (как панель собирает саму ссылку клиенту) и защита панели. А форматы подписки под разные приложения — отдельная тема Response Rules, которую стоит разобрать, когда пойдут клиенты на разных клиентах.

Следующий гайд Hosts и inbounds: как панель собирает ссылку клиенту → Не понравилась статья или что-то непонятно? Напишите мне — помогу или поправлю. @notrealvpn →
Материал носит образовательный характер и посвящён инженерии сетевой инфраструктуры. Вы отвечаете за соблюдение законов своей юрисдикции.