Веб админ-панель
Админ-панель доступна аккаунтам с ролью owner или admin. Каждый запрос /api/admin/* проверяет действующую Web App-сессию и роль в базе; отзыв действует и для уже открытой сессии. Telegram для входа администратора не требуется. Первый владелец назначается серверной командой после подтверждения email; далее владелец выдаёт и отзывает роли в разделе «Пользователи». Порядок запуска описан в работе без Telegram.
На этой странице
Заголовок раздела «На этой странице»- Возможности
- Пользователи
- Настройки
- Партнёрская программа
- Бэкапы
- Промокоды
- Переводы
- Инструкции подключения
- Поддержка
- Внешний вид
- Тарифы
- Практические замечания
- Рекламные источники
Возможности
Заголовок раздела «Возможности»- дашборд со статистикой пользователей, платежей и синхронизации с Remnawave;
- список пользователей с поиском, фильтрами и колонкой premium-трафика; карточка пользователя с активной подпиской, обычным и premium-трафиком, платежами и действиями (подробнее в разделе «Пользователи» ниже);
- блокировка пользователей, входящий список тикетов поддержки, рассылки, промокоды и просмотр логов;
- ручная синхронизация с Remnawave;
- редактор разрешенных настроек приложения из manifest-файла;
- раздел Внешний вид для логотипа, выбора темы, accent-цвета, масштаба логотипа и предпросмотра тем;
- раздел Инструкции подключения для встроенной страницы установки, поведения кнопок бота и Remnawave Subscription Page config;
- раздел Бэкапы для просмотра локальных ZIP-архивов, загрузки архива и восстановления БД/compose-папки;
- раздел Партнёры для заявок, профилей, атрибуций, комиссий, балансов и ручных выплат;
- раздел Подарки для покупок, получателей, состава подписки, платежей и доставки; описание подарочных подписок;
- редактор JSON-каталога тарифов;
- загрузка Internal Squads из Remnawave для выбора в тарифах.
Пользователи
Заголовок раздела «Пользователи»Кнопка Граф рефералов открывает интерактивное дерево всех реферальных и партнёрских связей без ограничения глубины. Стрелки направлены от пригласившего к приглашённому; цвет и легенда различают два вида связи. Пользователи без связей, удалённые аккаунты и ссылки пользователя на самого себя не показываются. Исторические связи приостановленных и закрытых партнёров сохраняются, пока оба аккаунта существуют. Если у пары есть оба вида связи, граф показывает оба.
В компактных узлах аватар расположен слева, а имя, Minishop ID, Telegram ID,
Telegram username и email — справа. Связи выходят и входят в карточки вертикально;
маршруты поворачивают на 90° со скруглёнными углами.
Фильтр Все / Рефералы / Партнёры оставляет соответствующие связи и пользователей
с ними; поиск, счётчик и список пользователей учитывают выбранный тип. Расположение
узлов сохраняется при переключении, выбранный фильтр сохраняется в адресе страницы.
Поиск помогает найти пользователя; масштабирование, плавное перемещение и общий
обзор позволяют изучать все поколения приглашений. При перетаскивании мышью или
одним пальцем граф проходит в 1,5 раза большее расстояние за жест.
Кнопка Показать в графе рядом
с рефералами в карточке пользователя и в карточке партнёра открывает граф с
фокусом на владельце. Кнопка доступна только при наличии входящих или исходящих
связей; адрес с выбранным пользователем можно сохранить и открыть повторно.
Данные графа доступны только администраторам через
GET /api/admin/users/relationships. Расположение рассчитывает ELK.js через
cytoscape-elk; интерактивный граф рисует Cytoscape.js на canvas.
Раздел Пользователи — таблица с пагинацией по 25 записей. Строка поиска ищет по внутреннему числовому ID, Telegram ID, фрагменту @username, имени или email; применение — кнопка «Найти» или клавиша Enter в поле поиска.
Из этого же раздела администратор управляет основными пользовательскими операциями:
- просматривает подписку, статус, трафик, premium-лимиты, платежи и служебные события;
- блокирует пользователя;
- запускает ручную синхронизацию с Remnawave Panel;
- открывает тикеты поддержки и отвечает пользователю.
При синхронизации две записи Remnawave с одинаковым Telegram ID автоматически сливаются, если одна уже привязана к этому пользователю Minishop. Сохраняется привязанная запись и её текущий тариф; оставшийся активный срок дубля добавляется к её сроку. После успешного обновления основной записи дубль удаляется из панели, поэтому для подключения нужно использовать ссылку из Minishop. Сбой обновления или удаления оставляет задачу для повторной синхронизации без повторного начисления срока. Совпадение email не запускает слияние; запись, принадлежащая другому локальному аккаунту Minishop, требует отдельного подтверждённого объединения аккаунтов.
Фильтры:
- состояние аккаунта: все / не забанены / забанены;
- наличие Telegram или email;
- связь с панелью Remnawave (
panel_user_uuid); - статус подписки в панели для активной подписки в базе бота: active, expired, limited;
- premium-трафик: все; без лимита premium в тарифе; безлимитный оверрайд; норма (ниже 85% квоты); предупреждение (от 85% до 100%); исчерпана квота.
Сортировка: по дате регистрации, имени, ID, а также по абсолютному объёму использованного premium-трафика в байтах (в интерфейсе показывается в GB).
В колонке premium для конечной квоты показывается израсходовано относительно лимита; лимит складывается из базовой premium-квоты тарифа, докупок и бонусов. Отображение не опирается на служебный флаг «limited» в базе как на признак «есть premium-трафик» — он отражает другую семантику на стороне панели.
Карточка пользователя по переходу из списка объединяет просмотр подписки, трафика, платежей и действий (блокировка, сообщения, продление, оверрайды и т.д.) в соответствии с доступными эндпоинтами /api/admin/users/*.
Вкладка Уведомления показывает четыре пользовательских предпочтения: рекламные и системные уведомления отдельно для email и Telegram. Администратор может изменить любой переключатель; личные сообщения из карточки, сообщения безопасности и поддержка от этих предпочтений не зависят. В редакторе личного сообщения можно добавить кнопку Экран веб-приложения → Настройки уведомлений, которая сразу откроет пользователю соответствующий подраздел личного кабинета.
Блок Ссылки карточки (и в Web App, и в карточке пользователя Telegram-админки) показывает ссылку подписки из панели, публичную ссылку инструкции установки /s/<token> (если включены встроенные инструкции и у пользователя есть активная подписка) и реферальные ссылки — их удобно копировать, когда нужно помочь пользователю с подключением.
Эмодзи в кнопках сообщений
Заголовок раздела «Эмодзи в кнопках сообщений»В редакторах рассылки, личного сообщения и ответа поддержки кнопка Эмодзи находится между выбором типа кнопки и её подписью. Выберите обычный emoji или изображение из добавленного набора. Выбранная иконка показывается рядом; её можно заменить или удалить, не меняя подпись, языковые варианты и адрес назначения. На мобильном экране поля переносятся на отдельные строки и сохраняют одинаковую высоту.
Иконка сохраняется в отложенной рассылке и её истории. Telegram получает custom emoji как нативную иконку кнопки; обычный emoji добавляется перед подписью. При отказе Telegram используется обычный символ. В HTML-письмах рассылок и личных сообщений кастомная иконка встраивается через CID, а текстовая версия содержит Unicode. Кнопка публичного сообщения поддержки показывает защищённую картинку только владельцу тикета и администраторам.
Настройки
Заголовок раздела «Настройки»Раздел Система -> Настройки позволяет менять приложение без редактирования .env, но только в пределах allowlist из backend/bot/app/web/admin_settings_manifest.py. Даже администратор не может менять через UI произвольные атрибуты Settings.
Изменения сохраняются как overrides в базе данных и применяются поверх .env без перезапуска. Если значение сброшено, снова используется значение из .env. После сохранения публичный кеш настроек Web App сбрасывается, поэтому пользователи видят изменения при следующих запросах.
В manifest сейчас входят:
- общие параметры: язык, валюта, ссылки поддержки, документы, обязательный канал, режим регистрации только по приглашению, Remnawave-доступы и поведение
/start; - внешний вид и доступность Web App: название, цвет, логотип и
WEBAPP_ENABLED; - инструкции подключения:
SUBSCRIPTION_GUIDES_ENABLED,SUBSCRIPTION_GATEWAY_ENABLED,SUBSCRIPTION_GUIDES_BOT_MENU_ENABLED, чтение конфига из Remnawave Panel, JSON-переопределение и резервный путь к файлу; - legacy-тарифы без JSON-каталога: периоды подписки, RUB/Stars цены, реферальные бонусы и пакеты трафика;
- платежные провайдеры: включение и порядок методов, режим выпадающего списка/отдельных кнопок, публичные параметры и секреты YooKassa, FreeKassa, Platega, SeverPay, Wata, CryptoPay, Heleket, OxaPay, PayKilla, LAVA, Pally, CloudPayments, Stripe, Tribute и Stars, а также текст и иконки способов оплаты;
- пробный период, приветственный реферальный бонус, уведомления, логирование, Telegram антифлуд, поддержка, раздел устройств, лимит устройств и legacy-лимиты трафика.
Секретные поля помечены как secret и не должны использоваться для произвольного просмотра старых значений. Настройки, которых нет в manifest, остаются только в .env или коде.
Цвета кнопок и custom emoji в Telegram
Заголовок раздела «Цвета кнопок и custom emoji в Telegram»В Настройки → Дополнительные кнопки меню блок Оформление меню Telegram задаёт
оформление системных и дополнительных кнопок главного меню, интерфейса бота и информации.
Цвет выбирается из четырёх вариантов: стандартный, синий (primary), зелёный (success)
и красный (danger). Их оттенки определяет клиент Telegram. Иконку можно оставить обычной,
скрыть или заменить custom emoji.
Превью показывает сообщение, всю клавиатуру и причины отсутствия кнопок. Можно переключать экран, язык, состояние подписки и светлую/тёмную тему. Нажмите кнопку в превью, чтобы выбрать её для редактирования. Черновик не меняет настройки бота до сохранения; его можно отменить или сбросить оформление одной/всех кнопок. Конфликт параллельных изменений требует перезагрузить настройки. Подписи, порядок, ссылки и видимость дополнительных кнопок редактируются в существующем блоке дополнительных кнопок.
В Библиотеке эмодзи добавьте https://t.me/addemoji/<name>, имя набора или числовой ID.
Поддерживаются именно наборы custom emoji; обычные наборы стикеров не принимаются.
Палитра содержит поиск, вкладки наборов, недавние и избранные эмодзи, загружает наборы
страницами: при приближении к концу списка следующая страница подгружается автоматически.
Счётчик показывает загруженное и общее количество; после ошибки доступен повтор.
Удаление набора из библиотеки не переписывает уже выбранные иконки и сообщения.
Списки недавних/избранных хранятся локально для аккаунта администратора.
Сразу после добавления набора сервер скачивает все доступные миниатюры, до шести одновременно. Библиотека показывает, сколько изображений уже сохранено; палитра получает каталог страницами независимо от загрузки файлов. Незавершённая загрузка возобновляется в фоне при старте backend и при открытии библиотеки. При ошибке Telegram или нехватке места появляется состояние частичной загрузки: нажмите Обновить, чтобы повторить её. Эмодзи без статичной миниатюры остаются обычными символами.
При первой загрузке палитра получает сохранённые картинки пакетами до 32 изображений и 4 MiB за запрос. Импортированный каталог отображается сразу: устаревшие метаданные Telegram обновляются в фоне. Версионные изображения палитры сохраняются в IndexedDB для подтверждённого аккаунта администратора, до 16 MiB и 512 файлов, с удалением старых и неиспользуемых записей. Кеш переживает перезапуск Mini App и смену сессионных токенов; срок хранения — 30 дней, явный выход очищает его. Пароли и токены в этот кеш не записываются. В Telegram 9.0+ небольшой набор дополнительно сохраняется в нативном DeviceStorage: до 1 MiB и 256 изображений, с тем же сроком и разделением аккаунтов. Это позволяет восстановить картинки, даже если Telegram пересоздал WebView и очистил IndexedDB. Записи объединяются в один пакет, чтобы не выполнять отдельный вызов Telegram для каждого эмодзи; явный выход удаляет только ключ кеша эмодзи. Если оба хранилища недоступны или файл превышает лимит кеша, превью загружается с сервера. Токены не используются как ключи и не попадают в DeviceStorage. Во время ожидания анимация занимает всю ячейку эмодзи; настройка уменьшения движения учитывается. Список эмодзи сохраняется отдельно: до 16 страниц и 128 KiB на 30 дней в браузере и дополнительно в DeviceStorage. При повторном открытии палитра показывает сохранённый каталог сразу, обновляя его в фоне; неизменный ответ сохраняет уже открытые страницы. Открытие, выбор набора и очистка поиска не ждут задержку ввода. Превью кнопки и редактора используют известную версию изображения из каталога того же аккаунта. Изменение библиотеки и явный выход очищают сохранённый каталог; поздний ответ старого запроса не восстанавливает его. Основное приложение и отдельно загружаемая админка разделяют кеш своего API-клиента, включая доступ к DeviceStorage, фоновые обновления, превью и очистку при выходе. Изображения тикетов остаются за отдельной проверкой доступа и не входят в постоянный кеш палитры.
Эта же палитра доступна в визуальном редакторе административных сообщений и ответов поддержки. Палитра, превью кнопки и визуальный редактор показывают миниатюру custom emoji из Telegram; при ошибке загрузки остаётся обычный символ. Поля поиска, выбора набора и импорта имеют общий размер, на узком экране поля располагаются друг под другом, а действия и панель инструментов редактора остаются доступными.
В Telegram HTML сохраняются ID и обычный emoji, например
<tg-emoji emoji-id="9007199254740993">🙂</tg-emoji>. В тикетах Web App и админки сохраняются
ID и форматирование, показывается защищённое изображение; при копировании остаётся обычный emoji.
Пользователь загружает изображения только из публичных сообщений своего тикета.
В HTML-письмах рассылок и поддержки изображения встроены как PNG-вложения через CID:
вход в админку и внешняя загрузка с Telegram для просмотра письма не требуются.
Повторные эмодзи используют одно вложение; до 128 уникальных изображений суммарно до 4 MiB
подготавливаются за ограниченное время. Если изображение недоступно или превышен лимит,
остаются обычные символы. Они также сохраняются в текстовой версии письма и alt изображения.
Для анимированных и видео-эмодзи используется статичная миниатюра.
Markdown-документы и пользовательский редактор поддержки не получают административную палитру.
Отправить тест себе отправляет текущий черновик в личный Telegram текущего администратора. Нужны работающий Telegram-бот и привязанный Telegram аккаунт, который уже начал общение с ботом. При выбранной custom иконке тест отдельно проверяет иконки и emoji текста; без неё проверяет оформление клавиатуры. Статусы относятся к этому боту и личным сообщениям. Premium получателя не требуется. Право бота зависит от Telegram: Premium владельца для поддерживаемых прямых сообщений либо дополнительное имя бота, приобретённое через Fragment. Статус администратора/Premium пользователя не доказывает наличие этого права у бота. При подтверждённом отказе Telegram доставка использует обычные emoji, сохраняя действия и цвета кнопок. Проверить отображение окончательно можно только в Telegram на нужных клиентах.
Настройки хранятся в TELEGRAM_MENU_APPEARANCE_JSON и
TELEGRAM_CUSTOM_EMOJI_LIBRARY_JSON в обычных DB overrides, поэтому попадают в бэкап БД.
В worker они перечитываются перед обработкой обновления. Metadata и защищённые thumbnail
сохраняются в восстанавливаемом кеше data/telegram-emoji, отдельно для каждого bot ID;
bot token и Telegram download URL клиенту не передаются. Кеш медиа ограничен 2 МБ на файл,
а весь восстанавливаемый кеш — 128 МБ на бота. Цвета доступны и в браузерной установке
без бота; библиотека наборов и Telegram-тест требуют включённого адаптера.
Изображения не скачиваются из Telegram заново через сутки: на сервере они хранятся до смены версии файла или освобождения места. Добавленные наборы защищены от вытеснения; для новых файлов сначала освобождается место за счёт старых неиспользуемых записей. Удаление набора разрешает вытеснение его кеша, сохраняя ID в уже отправленных сообщениях. Существующий каталог и сохранённые картинки доступны при сбое Telegram. Браузер использует версии URL, приватный HTTP-кеш с ETag и общий ограниченный кеш изображений для текущей сессии. Повторное открытие не запускает отдельное скачивание для каждого элемента; кеш не переносится между аккаунтами. До появления картинки показывается нейтральный индикатор, а обычный emoji — при ошибке.
Официальные ограничения: InlineKeyboardButton и Telegram HTML.
Партнёрская программа
Заголовок раздела «Партнёрская программа»Операционный раздел Партнёры показывает сводные показатели по выбранной валюте, заявки, профили, клиентов, комиссии, ledger, audit и выплаты. Здесь администратор одобряет или отклоняет заявки, создаёт партнёра вручную, меняет ставку и статус, ротирует ссылку, импортирует обычных рефералов как клиентов, выполняет корректировки баланса и проводит выплаты. Счётчик в навигации обновляется каждые 30 секунд и показывает ожидающие заявки и открытые выплаты.
Рабочие списки разделены на вкладки Партнёры, Заявки и Выплаты с независимыми фильтрами и сортировкой. Массовый импорт обычных рефералов показывается отдельной панелью только при выключенной реферальной программе и перед выполнением выводит preview конфликтов и исторических платежей без ретроактивной комиссии.
Параметры программы не дублируются в операционном разделе. Они находятся в Система → Настройки
→ Маркетинговые программы → Партнёрская программа и применяются поверх .env без перезапуска.
Операционная история остаётся доступной, даже если новые заявки и начисления глобально выключены.
Полный порядок первого включения, клиентские бонусы, финансовые состояния, шифрование реквизитов,
сверка и rollback описаны в руководстве по партнёрской программе.
Переключатель Регистрация только по приглашению находится в Система -> Настройки -> Общие. Когда он включён, новые пользователи создаются после перехода по валидной реферальной, партнёрской или неиспользованной оплаченной подарочной ссылке Telegram/Web App. Подарочная ссылка только разрешает регистрацию: активацию получатель подтверждает отдельно после входа. Существующие Telegram, WebApp/OAuth, email-code, magic-link и password пользователи продолжают входить без параметра приглашения.
Сохранённая настройка применяется к работающему процессу сразу. Если применить её не удалось (например, провайдер отключён из-за некорректного env-конфига), панель отвечает списком not_applied и показывает предупреждение «применятся только после перезапуска» вместо «Настройки сохранены» — значение при этом уже лежит в БД. Провайдер, чей env-конфиг не читается, отключается по отдельности и не мешает остальным: раньше одна такая переменная роняла запуск и незаметно отменяла применение всех сохранённых настроек.
Для каждого платежного метода в разделе провайдера доступны настройки отображения PAYMENT_<METHOD>_WEBAPP_LABEL_RU, PAYMENT_<METHOD>_WEBAPP_LABEL_EN, PAYMENT_<METHOD>_WEBAPP_ICON, PAYMENT_<METHOD>_TELEGRAM_LABEL_RU, PAYMENT_<METHOD>_TELEGRAM_LABEL_EN и PAYMENT_<METHOD>_TELEGRAM_EMOJI. Пустое значение возвращает мультиязычное значение по умолчанию из модуля платежного провайдера. Иконка Web App выбирается из уже подключенных lucide-иконок (frontend/src/lib/components/ui/icons.ts) через модалку в админке.
В Платежи → Оформление оплаты настройка PAYMENT_METHODS_DISPLAY_MODE выбирает компактный
выпадающий список (dropdown, по умолчанию) или отдельные кнопки (buttons). Методы с
неподходящей минимальной суммой не исчезают из Mini App: они показываются заблокированными с
подсказкой о минимуме. Подробности: платежи.
Раздел Система -> Бэкапы показывает архивы из data/backups, принимает upload ZIP-файла и запускает восстановление БД/compose-папки с предварительной проверкой архива. Подробная эксплуатационная инструкция: бэкапы и восстановление.
Промокоды
Заголовок раздела «Промокоды»Раздел Промокоды управляет кодами для мгновенных бонусов и checkout-скидок. В Web App админке доступны скидка в процентах, множители срока и выдаваемого трафика, фиксированные бонусные дни, обычные и premium GB сразу или после оплаты, область применения, минимальный срок/объем покупки и история активаций.
Админка показывает Telegram/Web App ссылки для каждого кода и вкладку активаций с платежом, суммой скидки и фактически выданными днями или GB. Массовое создание в Telegram-админке остается быстрым legacy-сценарием для бонусных дней; расширенные эффекты настраиваются здесь.
Подробности по режимам и ограничениям: промокоды.
Переводы
Заголовок раздела «Переводы»Раздел Система -> Переводы позволяет переопределять отдельные строки из locales/ru.json и locales/en.json без монтирования полного файла локализации. Строки сгруппированы по месту применения: админка, Mini App, Telegram-бот, платежи, подписки, поддержка и другие группы.
В разделе строки разделены по аудитории: пользовательские тексты Mini App/бота/платежей и внутренние тексты админки, логов и синхронизации. Дополнительные языки можно добавлять прямо в интерфейсе по коду локали, например uk, de или pt-BR; для таких языков оверрайды хранятся без отдельного базового файла локали, а отсутствующие строки берутся из языка по умолчанию.
Файл data/locales-overrides.json считается источником правды, а таблица locale_overrides хранит его DB-зеркало. Если валидный JSON-файл есть, при старте backend и worker полностью синхронизируют БД с файлом, включая удаления строк. Если файл отсутствует, но каталог доступен для записи, он автоматически создается из текущих DB-оверрайдов или как пустой {}. Если файл не примонтирован, недоступен или временно сломан по JSON, используется fallback из БД. Сохранение из админки записывает полный итоговый снапшот и в JSON-файл, и в БД; если активный JSON-файл есть, но его нельзя перезаписать, сохранение отклоняется, чтобы БД не разъехалась с главным файлом.
Формат файла:
Инструкции подключения
Заголовок раздела «Инструкции подключения»Секция Система -> Настройки -> Инструкции подключения управляет встроенным экраном установки. SUBSCRIPTION_GUIDES_ENABLED включает /install в личном кабинете, а SUBSCRIPTION_GUIDES_BOT_MENU_ENABLED заставляет кнопки подключения в Telegram-боте открывать Mini App вместо финальной Remnawave Subscription Page. Оба переключателя включены по умолчанию.
SUBSCRIPTION_GATEWAY_ENABLED разрешает приложениям импортировать и обновлять подписку по публичной ссылке /s/<token>. Он также включен по умолчанию. Если выключить его, страница инструкции останется доступной, но приложение не получит профиль. Выбор ссылки для новых подписок задает отдельно SUBSCRIPTION_LINK_MODE; по умолчанию он остается panel.
По умолчанию Minishop читает конфиг Remnawave Subscription Page из панели (SUBSCRIPTION_PAGE_CONFIG_PANEL_ENABLED=True). Это основной режим, потому что один и тот же конфиг используется и в панели, и во встроенной инструкции. JSON-поле SUBSCRIPTION_PAGE_CONFIG_JSON применяется только когда явно включен SUBSCRIPTION_PAGE_CONFIG_JSON_OVERRIDE_ENABLED; иначе оно может храниться в админке, но не влияет на пользователей. SUBSCRIPTION_PAGE_CONFIG_PATH остается резервным путем к локальному v1 JSON-файлу, если конфиг панели отключен или недоступен.
При сохранении backend валидирует JSON-переопределение как конфиг Remnawave Subscription Page v1. Ошибки показываются как обычные ошибки валидации настроек, а если рабочий конфиг недоступен, пользовательская кнопка подключения откатывается к старой финальной ссылке подписки.
Инструкцию можно открыть сразу для нужной ОС: /install?platform=android, либо
для ОС и приложения: /install?platform=android&app=happ. В публичной ссылке
используйте /s/<token>?view=page&platform=android&app=happ. Значение platform
соответствует ключу платформы в конфигурации, app — стабильному id приложения,
а не его названию или позиции в списке. Приложение указывать необязательно.
Если в JSON приложения отсутствует id, используется slug его name: строчные
латинские буквы и цифры, разделённые дефисами. При одинаковых значениях выбирается
первое приложение; для однозначной адресации и сохранения ссылок после переименования
задайте уникальный явный id.
Без параметров сохраняется автоматический выбор ОС; неизвестные значения
обрабатываются с обычным выбором доступной инструкции.
Если сначала требуется войти в аккаунт, браузер временно сохраняет выбранную
инструкцию и возвращает к ней после входа, в том числе через OAuth.
В редакторах кнопок сообщений, рассылок, ответов поддержки и меню при выборе раздела Установить и настроить можно дополнительно выбрать ОС, затем приложение из текущей конфигурации. Оба шага необязательны. Для адресной кнопки нужен HTTPS-адрес Mini App; при переходе через резервную Telegram-ссылку открывается обычный раздел инструкций.
Поддержка
Заголовок раздела «Поддержка»Раздел Коммуникации -> Поддержка показывает входящий список тикетов из Mini App. В списке доступны фильтры по статусу, приоритету, категории и назначенному администратору, поиск по теме и пользователю, сортировка по обновлению, созданию или важности.
В карточке тикета администратор видит диалог, пользовательский контекст и действия: ответить пользователю, оставить внутреннюю заметку, изменить статус, приоритет, категорию или исполнителя, закрыть тикет и перейти в карточку пользователя. Внутренние заметки не показываются пользователю.
Счетчик непрочитанных обращений отображается в навигации админки. Уведомления о новых тикетах и ответах пользователя настраиваются через LOG_SUPPORT, LOG_SUPPORT_THREAD_ID и параметры SUPPORT_*. Подробности: поддержка пользователей / тикеты.
Внешний вид
Заголовок раздела «Внешний вид»Раздел Внешний вид объединяет настройки бренда и темы Web App. Логотип можно загрузить файлом или по HTTPS-ссылке; backend сохраняет файл в data/webapp-logo/uploads и подставляет локальный URL. Если логотип не задан, показывается логотип проекта по умолчанию. Favicon генерируется из логотипа или загружается отдельно.
Этот же бренд используется в HTML-письмах. Загруженный локальный логотип встраивается в письмо как inline image (cid:webapp-logo), поэтому email-клиенту не нужен прямой доступ к /webapp-uploaded-logo/.... Логотип по публичной HTTPS-ссылке остается внешней картинкой в письме.
В блоке тем админка читает каталог из WEBAPP_THEMES_DIR, показывает встроенные и кастомные темы, позволяет выбрать текущую тему, изменить accent, включить или выключить тему для админки и настроить отдельный масштаб логотипа для desktop и mobile layout. Кнопка предпросмотра открывает /home?theme_preview=<key> и не меняет глобальную тему до сохранения.
Подробный формат theme.json, CSS/asset-роуты и пошаговый пайплайн создания новой темы описаны в webapp-themes.md.
Раздел Система -> Тарифы работает с файлом TARIFFS_CONFIG_PATH (по умолчанию data/tariffs.json). При сохранении backend валидирует payload через TariffsConfig, пишет JSON в UTF-8 и сбрасывает кеш публичных данных Web App.
Если файла еще нет, админка открывает пустой каталог. Перед сохранением должен быть хотя бы один включенный тариф, а default_tariff должен ссылаться на включенный тариф.
Редактор тарифа разделен на вкладки:
- Основное: ключ и прежние ключи, модель
period/traffic, видимость, названия и описания RU/EN, базовые Internal Squads и курс конвертации для traffic-тарифа; - Цены: периоды, цены и реферальные бонусы для
period, пакеты GB и цены дляtraffic; - Трафик: базовый лимит и стратегия сброса, шаг/итоговый максимум/месячная цена гибкого лимита и переключатель checkout-слайдера, а ниже — отдельные несгораемые пакеты докупки и переключатель «Докупка доступна всегда» (
topup_always_available). По умолчанию отдельная докупка появляется после 80% расхода лимита. Дляtraffic-тарифа пользователь повторно покупает пакеты изtraffic_packages; - Премиум трафик: premium-доступ и отдельный счётчик, названия RU/EN, Internal Squads, лимит/безлимит и стратегия сброса, гибкий checkout-лимит, пакеты несгораемой premium-докупки и
premium_topup_always_available; - Устройства: базовый HWID-лимит, линейная цена и максимум устройств для checkout-слайдера, а ниже — отдельные RUB/Stars пакеты докупки после оформления.
Гибкие лимиты настраиваются отдельно от пакетов докупки. У обычного и premium-трафика задаются
шаг в GB, максимальное итоговое значение, цена одного шага за месяц в валюте каталога и
необязательная цена в ⭐ Stars. У устройств шаг всегда равен 1; задаются максимум
дополнительных устройств и цена одного устройства за месяц. Слайдер включается отдельным
рычажком только после заполнения валидных параметров. Полные правила и примеры находятся в
разделе о докупках при оформлении.
Обычные настройки внутри вкладок собраны в карточки «заголовок + описание + поле или переключатель» и логические группы. Перетаскиваемые списки периодов и пакетов остаются отдельными редакторами строк.
Порядок периодов, traffic-пакетов, обычных докупок, premium-докупок и HWID-пакетов меняется перетаскиванием строк в редакторе. Этот порядок сохраняется в JSON и используется на витрине Web App и в Telegram-боте.
Базовые и premium Internal Squads выбираются из Remnawave через /api/admin/panel/internal-squads. Если панель недоступна, можно сохранить уже существующие UUID в JSON, но выпадающий список не загрузится.
Когда включен провайдер Tribute, на вкладке «Цены» доступна кнопка «Подтянуть из Tribute». Она читает каталог Creator API через /api/admin/tariffs/tribute/catalog тем же TRIBUTE_API_KEY: выбор подписки подставляет subscription_id и period_id во все периоды, выбор Digital Product — product_id и ссылку товара. Загруженный каталог одновременно сверяется с тарифом и показывает расхождения цены и валюты, а также ID, которых больше нет в Tribute. Запрос выполняется только по нажатию кнопки. Подробности режима — Платежи.
Практические замечания
Заголовок раздела «Практические замечания»Не меняйте key опубликованного тарифа без миграции активных подписок: подписки, платежи и смена тарифа ссылаются на этот ключ.
Отключенный тариф исчезает с витрины, но активные подписки с его tariff_key продолжают существовать. Удаление тарифа безопасно только если не осталось активных подписок, которым нужна докупка, продление или смена с этого тарифа.
Для Docker важно, чтобы путь TARIFFS_CONFIG_PATH был доступен на запись контейнеру. Если каталог ./data смонтирован в /app/data, админка может сохранять data/tariffs.json.
Рекламные источники
Заголовок раздела «Рекламные источники»Кампании, ссылки, предложения и проверка источника покупки описаны в разделе рекламы.