VPN·HUB·CRACK
Страница подписки: бренд, домен, шаблоны приложений · VPN HUB CRACK
Страница подписки: бренд, домен, шаблоны приложений
Страница подписки
Страница подписки это лицо сервиса для клиента: он открывает ссылку и либо видит красивую страницу с кнопками «добавить в приложение» и 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 настраивается название сервиса, логотип, цвета, тексты, ссылки (поддержка, канал). Сделайте страницу «своей»: это повышает доверие и конверсию. Загрузите свои лого и фон; в контактах поддержки укажите свой бот/канал.
Шаблоны ядер (важно)
Подписка отдаётся в разных форматах под клиентское ядро:
- 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».
Какой формат уходит приложению (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)» (роутинг в шаблоне), «Клиентские приложения» (инструкция клиенту).