VPN·HUB·CRACK Страница подписки: бренд, домен, шаблоны приложений · VPN HUB CRACK
Все статьи
Remnawave PRO Remnawave

Страница подписки: бренд, домен, шаблоны приложений

Обновлено 11 августа 2026 Проверено

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

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

📖 Незнакомые слова? Все термины простыми словами есть в Словаре терминов.

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

  • Домен подписки: отдельный сабдомен (sub.your.domain), задаётся в .env панели: SUB_PUBLIC_DOMAIN=sub.your.domain (без схемы). ⚠️ По умолчанию подписку отдаёт сам backend (на /api/sub); отдельный контейнер remnawave-subscription-page:3010 ставится только под кастомную/ребренд-страницу, тогда reverse-proxy ведёт на 127.0.0.1:3010, иначе на backend.
  • Длина короткого id: SHORT_UUID_LENGTH (16–64), длиннее = труднее перебрать чужую подписку.
  • Не дефолтный путь. Меняйте стандартный префикс на произвольный (например /s/ или /cute/), чтобы ссылки не угадывались и не сканировались.

⚠️ Поменяли .envполный пересоздать: docker compose down && docker compose up -d (обычный restart не перечитывает env).

Caddy для подписки:

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

Брендинг

В subscription-page настраивается название сервиса, логотип, цвета, тексты, ссылки (поддержка, канал). Сделайте страницу «своей»: это повышает доверие и конверсию. Загрузите свои лого и фон; в контактах поддержки укажите свой бот/канал.

Редактор страницы подписки (Subpage Editor)
Subpage Editor: блок «Брендинг» (название, ссылка на логотип, ссылка поддержки), «Локализация» по языкам и базовые настройки. Заполняете своими бренд-данными (UUID и ссылка поддержки на скрине скрыты).

Шаблоны ядер (важно)

Подписка отдаётся в разных форматах под клиентское ядро: - base64 (v2ray-список): универсальный, понимают почти все. - xray-json: полный конфиг Xray (можно вшить routing: RU-direct, WARP, см. «Маршрутизация»). - sing-box: для Hiddify/sing-box-клиентов. - mihomo (наследник Clash): в шаблоне есть плейсхолдер $payload$, движок вставляет список прокси. - Happ (популярное клиентское приложение): свой формат с поддержкой Happ-routing (свои правила соберёте в конструкторе → utils.docs.rw/happ-rb).

Держите шаблоны актуальными и вшивайте в них роутинг (RU напрямую, остальное через VPN), тогда клиенту ничего не настраивать. Под разные тарифы можно отдавать разные шаблоны (External Squads / Routing Rules), например «всё через VPN» vs «RU-bypass».

Шаблоны Xray JSON в Remnawave
Раздел Шаблоны → Xray JSON: несколько шаблонов ядра (Default + балансировщики). В каждый можно вшить свой routing и отдавать разным сквадам/тарифам.

Какой формат уходит приложению (Response Rules)

Какой из шаблонов получит клиент, панель решает по его User-Agent (метка приложения, по которой видно, какой клиент запросил): это Response Rules (Subscription settings → Response Rules). Дефолтные правила покрывают Clash/Mihomo/Sing-box/Stash, а в конце стоит Fallback Base64. Под него попадают Happ, v2rayTun, v2rayNG: им уходит base64-список без роутинга.

⚠️ Это незаметно рушит вшитый роутинг. Сделали XRAY_JSON-шаблон с RU-direct/балансером (см. «Супер-автовыбор»), но не добавили правило, Happ/v2rayTun получат base64 и поедут full-tunnel (весь трафик в туннель, у клиента «VPN палится» на 2ip, автовыбор не работает). Фикс: правило User-Agent ~ ^(happ|v2raytun|v2rayng) → XRAY_JSON выше Fallback Base64 (или serve_json_at_base_subscription = true).

Готовый набор правил целиком: вставь в Subscription settings → Response Rules. Правило для Happ / v2rayTun / v2rayNG → XRAY_JSON уже стоит где надо (перед Fallback Base64), остальные клиенты как в дефолте:

{
  "version": "1",
  "rules": [
    {
      "name": "Browser Subscription",
      "description": "System critical: do not delete or disable this rule.",
      "enabled": true,
      "operator": "AND",
      "conditions": [
        { "headerName": "accept", "operator": "CONTAINS", "value": "text/html", "caseSensitive": true }
      ],
      "responseType": "BROWSER"
    },
    {
      "name": "Mihomo Clients",
      "description": "Response with generated YAML config (Mihomo Template)",
      "enabled": true,
      "operator": "AND",
      "conditions": [
        { "headerName": "user-agent", "operator": "REGEX", "value": "^(?:FlClash|FlClashX|Flowvy|[Cc]lash-[Vv]erge|[Kk]oala-[Cc]lash|[Cc]lash-?[Mm]eta|[Mm]urge|[Cc]lashX [Mm]eta|[Mm]ihomo|[Cc]lash-nyanpasu|clash.meta|prizrak-box)", "caseSensitive": false }
      ],
      "responseType": "MIHOMO"
    },
    {
      "name": "Stash (iOS, macOS)",
      "description": "Response with generated YAML config (Stash Template)",
      "enabled": true,
      "operator": "AND",
      "conditions": [
        { "headerName": "user-agent", "operator": "REGEX", "value": "^stash", "caseSensitive": false }
      ],
      "responseType": "STASH"
    },
    {
      "name": "Sing-box clients",
      "description": "Response with generated JSON config (Singbox Template)",
      "enabled": true,
      "operator": "AND",
      "conditions": [
        { "headerName": "user-agent", "operator": "REGEX", "value": "^sfa|sfi|sfm|sft|karing|singbox", "caseSensitive": false }
      ],
      "responseType": "SINGBOX"
    },
    {
      "name": "Clash Core Clients",
      "description": "Response with generated YAML config (Clash Template)",
      "enabled": true,
      "operator": "AND",
      "conditions": [
        { "headerName": "user-agent", "operator": "REGEX", "value": "^clash", "caseSensitive": false }
      ],
      "responseType": "CLASH"
    },
    {
      "name": "Happ / v2rayTun / v2rayNG (XRAY JSON)",
      "description": "JSON-подписка с роутингом и балансером для этих клиентов",
      "enabled": true,
      "operator": "AND",
      "conditions": [
        { "headerName": "user-agent", "operator": "REGEX", "value": "^(happ|v2raytun|v2rayng)", "caseSensitive": false }
      ],
      "responseType": "XRAY_JSON"
    },
    {
      "name": "Fallback Base64",
      "description": "System critical: do not delete or disable this rule.",
      "enabled": true,
      "operator": "AND",
      "conditions": [],
      "responseType": "XRAY_BASE64"
    }
  ]
}

Порядок уже верный, править ничего не нужно. ⚠️ Это обратимо и не трогает юзеров/ноды: перед заменой сохраните текущие правила, вернёте старый JSON, поведение мгновенно как было. После вставки в Happ удалите и добавьте подписку заново (сбросить кэш base64→json).

  • Happ для JSON-подписки берёт роутинг только из самого JSON; поле happ_routing: лишь для base64. После переключения на XRAY_JSON в Happ подписку лучше удалить и добавить заново (refresh не всегда сбрасывает кэш base64→json).
  • ⚠️ HWID-заглушка. При включённом HWID (привязка подписки к «железу» устройства, чтобы не раздавали всем) проверка подписки curl'ом без x-hwid отдаёт болванку …@0.0.0.0:1#App not supported, это не поломка, а HWIDNotSupported. Проверяйте с реальным x-hwid или через GET /api/subscriptions/by-short-uuid/<id> (он HWID игнорит).

Кнопки «добавить в приложение» и QR

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

Готовый app-config страницы подписки (скачать)

Поведение subscription-page, то есть какие клиенты показывать на каждой ОС, тексты установки, брендинг и что прятать, задаётся одним JSON (app-config). Не собирайте руками: возьмите наш готовый шаблон и поменяйте только брендинг.

Что уже зашито в шаблон:

  • showConnectionKeys: false: главный приватный флаг. Пользователь не видит «сырой» конфиг хоста (VLESS/Reality-ключи, SNI, адрес, shortId, порт), только кнопки «Добавить в приложение» и QR. Зачем:
  • клиент не вытащит и не перепродаст/не расшарит ваш ключ как отдельный конфиг;
  • не светятся внутренности хоста (донор-SNI, порт, транспорт), меньше поверхности, чтобы скопировать вашу схему;
  • чище UX, никто не путается в JSON.
  • hideGetLinkButton: true: парный флаг, убирает кнопку «Получить ссылку» (чтобы саму ссылку-подписку тоже не растаскивали).
  • INCY как альтернативный клиент (iOS + Android), рядом с Happ. Не зашёл основной клиент, юзер ставит INCY, и подписка добавляется в один тап (incy://add/{{SUBSCRIPTION_LINK}}); App Store / Google Play / APK уже прописаны.
  • Полный набор клиентов по платформам (Happ, v2rayTun, FlClashX, Koala Clash, Prizrak-Box, Hiddify и др.) с авто-импортом подписки и пошаговыми инструкциями RU/EN.

Как применить: Subscription-page → Subpage Editor → импорт app-config → вставьте JSON. Затем впишите свой brandingSettings (title / logoUrl / supportUrl) и metaTitle. Плейсхолдеры {{SUBSCRIPTION_LINK}} и {{HAPP_CRYPT4_LINK}} не трогайте: их подставляет сама панель под каждого пользователя.

Файл это обезличенный шаблон: бренд/логотип/поддержка стоят заглушками (BRANDNAME, your_support_bot), реальных адресов в нём нет.

Что отдать клиенту

  • Одна ссылка-подписка + короткая инструкция (см. «Клиентские приложения»).
  • На странице: кнопки приложений, QR, статус подписки (срок/трафик), ссылка на поддержку.
  • При замене серверов на вашей стороне клиенту достаточно «Обновить подписку»: список хостов обновится сам.

Гигиена

  • Длинный SHORT_UUID_LENGTH + нестандартный путь защищают от перебора чужих подписок.
  • Подписка это единственное, что светится публично; панель и ноды по этим ссылкам не угадываются (отдавайте только адреса хостов, не панель).

Связано: «Панель Remnawave» (установка, .env), «Маршрутизация (RU-direct)» (роутинг в шаблоне), «Клиентские приложения» (инструкция клиенту).