> ## Documentation Index
> Fetch the complete documentation index at: https://docs.bedolagam.ru/llms.txt
> Use this file to discover all available pages before exploring further.

# Обзор Cabinet

> Веб-интерфейс личного кабинета — полнофункциональная альтернатива Telegram-боту

## Что такое Cabinet?

**Bedolaga Cabinet** — веб-приложение для управления VPN подписками через браузер. Работает как полноценный личный кабинет с авторизацией через Telegram, email или OAuth-провайдеров (Google, Яндекс, Discord, VK). Включает встроенную админ-панель для управления всем сервисом.

> **Telegram + Email + OAuth**
>
> 4 способа авторизации, включая вход без Telegram

> **Админ-панель**
>
> Полное управление сервисом через веб-интерфейс

> **RBAC + ABAC**
>
> Роли, разрешения, политики доступа и журнал аудита. [Подробнее →](/cabinet/rbac.md)

> **Анимированные фоны**
>
> 15 визуальных эффектов на базе Aceternity UI. [Подробнее →](/cabinet/backgrounds.md)

> **Real-time**
>
> WebSocket-уведомления и мгновенные обновления

## Возможности для пользователей

> **Подписки**
>
> Покупка, продление, смена тарифа, приостановка. Выбор серверов и стран. Управление устройствами (HWID). Мультитарифный режим — несколько подписок одновременно.

> **Баланс и платежи**
>
> Пополнение через любую подключённую платёжную систему. История транзакций с фильтрацией. Telegram Stars.

> **Подключение к VPN**
>
> Ключи подключения, полноэкранный QR-код, инструкции по настройке. Deep-ссылки для автоматического импорта в VPN-клиенты.

> **Реферальная программа**
>
> Реферальная ссылка, список рефералов, история начислений. Заявка на партнёрство, вывод средств.

> **Поддержка**
>
> Создание тикетов, переписка с поддержкой, уведомления о статусе.

> **Подарочные подписки**
>
> Покупка и отправка по коду, deep link или по контакту получателя. Активация в боте или Cabinet. [Подробнее →](/cabinet/gift-subscriptions.md)

> **Дополнительно**
>
> Промокоды, рекламные предложения, конкурсы, мини-игры, колесо фортуны, опросы.

## Авторизация

Cabinet поддерживает 4 независимых способа входа. Пользователи могут регистрироваться и использовать сервис **без Telegram**.

### Telegram

| Способ | Описание |
| - | - |
| **WebApp (Mini App)** | Автоматический вход при открытии внутри Telegram — валидация `initData` с HMAC-SHA256 |
| **Login Widget** | Кнопка «Войти через Telegram» на веб-странице для браузерного доступа |

### Email

Классическая регистрация с email + пароль:

1. Регистрация с валидацией (блокировка одноразовых email)
2. Верификация через ссылку в письме
3. Вход по email + паролю
4. Сброс пароля через email
5. Смена email с подтверждением кодом

Подробнее: [Email-авторизация](/cabinet/email-auth.md)

### OAuth 2.0

> **Google**
>
> `openid email profile`

> **Яндекс**
>
> `login:info login:email`

> **Discord**
>
> `identify email`

> **VK ID**
>
> `vkid.personal_info email` (OAuth 2.1 + PKCE)

Аккаунты автоматически привязываются при совпадении верифицированного email. Подробнее: [Настройка OAuth](/cabinet/oauth-setup.md)

### JWT-токены

| Токен | Срок жизни | Хранение |
| - | - | - |
| Access | 15 мин (настраивается) | sessionStorage |
| Refresh | 7 дней (настраивается) | localStorage, SHA-256 хеш в БД |

Автообновление: access-токен обновляется автоматически через refresh. Параллельные запросы ожидают один refresh без дублирования.

## Админ-панель

Полнофункциональная веб-панель администратора доступна прямо в Cabinet.

### Доступ

```env theme={null}
# Telegram-админы (по user ID)
ADMIN_IDS=123456789,987654321

# Email-админы (для пользователей без Telegram)
ADMIN_EMAILS=admin@example.com,manager@example.com
```

Достаточно одного из двух — Telegram ID или email в списке администраторов. Для делегирования доступа с ограниченными правами используйте [систему ролей (RBAC)](/cabinet/rbac.md).

### Разделы

> **Дашборд**
>
> Аналитика, статистика пользователей, подписок и доходов

> **Статистика продаж**
>
> 6 аналитических вкладок: сводка, триалы, продажи, продления, доп. услуги, пополнения. Графики по тарифам, платёжкам, периодам. [Подробнее →](/cabinet/sales-stats.md)

> **Пользователи**
>
> Поиск, просмотр профилей, управление данными, таймлайн активности, прямое сообщение пользователю, удаление отдельной подписки

> **Тарифы**
>
> Создание, редактирование, включение/выключение тарифов, статистика

> **Сквады**
>
> Управление сквадами (серверами), синхронизация с RemnaWave, статистика нагрузки

> **Платежи**
>
> Все транзакции, поиск по ID, настройка отображения платёжных методов

> **Рассылки**
>
> Массовые сообщения пользователям с фильтрацией и шаблонами

> **Промокоды**
>
> Создание и управление промокодами, промогруппами (периодические скидки), статистика

> **Рекламные кампании**
>
> Создание кампаний с deep-ссылками и отслеживанием конверсий

> **Партнёры**
>
> Заявки на партнёрство, настройка комиссий, управление партнёрами

> **Выводы средств**
>
> Обработка запросов на вывод реферальных средств (одобрение / отказ / завершение)

> **Рефералы**
>
> Управление реферальными связями: назначение/удаление реферера, добавление рефералов

> **Поддержка**
>
> Управление тикетами, настройка уведомлений о SLA

> **Настройки**
>
> Live-редактирование конфигурации бота без перезапуска. Древовидная навигация: 7 групп, 61 категория, быстрые переключатели

> **Редактор меню**
>
> Drag-and-drop настройка структуры меню, кастомные URL-кнопки, стили и иконки. [Подробнее →](/cabinet/menu-editor.md)

> **RemnaWave**
>
> Статус панели, ноды, сквады, синхронизация, миграции пользователей между сквадами. Вкладка трафика с разбивкой по inbound. GeoCheck нод на панели 3.3.0+

> **Купоны**
>
> Партии одноразовых купонов на подписку, экспорт ссылок, отзыв и удаление партий. [Подробнее →](/bot/coupons.md)

> **Трафик**
>
> Мониторинг потребления трафика по пользователям

> **Рекламные предложения**
>
> Шаблоны промо-предложений, персональные рассылки

> **Email-шаблоны**
>
> Редактирование шаблонов писем (верификация, сброс пароля) с предпросмотром и тестовой отправкой

> **Приложения**
>
> Настройка VPN-приложений для скачивания, deep-ссылки по платформам, брендирование

> **Колесо фортуны**
>
> Настройка призов, стоимости вращения, лимитов

> **Закреплённые сообщения**
>
> Создание сообщений, отображаемых всем пользователям в кабинете

> **Новости**
>
> Создание и публикация статей, управление категориями и тегами, загрузка медиа. [Подробнее →](/bot/news-module.md)

> **Обновления**
>
> Проверка новых версий бота и кабинета

> **Роли и доступ (RBAC)**
>
> Создание ролей с разрешениями, назначение пользователям, ABAC-политики (время, IP), журнал аудита. [Подробнее →](/cabinet/rbac.md)

> **Анимированные фоны**
>
> 15 визуальных эффектов (CSS, Canvas, SVG), live-превью, мобильная оптимизация. [Подробнее →](/cabinet/backgrounds.md)

## Архитектура

```
Браузер  →  Caddy/Nginx  →  /api/*  →  remnawave_bot:8080  (backend API)
                          →  /*      →  /srv/cabinet         (статика frontend)
```

Frontend — статические файлы (HTML, JS, CSS). Обратный прокси:

1. Раздаёт статику frontend
2. Проксирует `/api/*` на backend бота (с удалением префикса `/api`)

Два режима главного меню бота:

| Режим | `MAIN_MENU_MODE` | Описание |
| - | - | - |
| Стандартный | `default` | Полноценный Telegram-бот с inline-кнопками |
| Кабинет | `cabinet` | Минимальное текстовое меню с перенаправлением в веб-кабинет |

## Стек технологий

| Технология | Назначение |
| - | - |
| React 18 | UI фреймворк. Автоперезагрузка при ошибках чанков (`lazyWithRetry`) |
| TypeScript | Типизация |
| Vite | Сборка |
| Tailwind CSS | Стили |
| Zustand | State management |
| i18next | Мультиязычность (RU/EN/CN/UA/FA) |
| Telegram WebApp SDK | Авторизация через Telegram |
| WebSocket | Real-time уведомления |

## Переменные окружения

### Build-time (вшиваются в JS при сборке)

| Переменная | Описание | По умолчанию |
| - | - | - |
| `VITE_API_URL` | Путь к API (`/api` или полный URL) | `/api` |
| `VITE_TELEGRAM_BOT_USERNAME` | Username бота (без @) | — |
| `VITE_APP_NAME` | Название в шапке и вкладке | `Cabinet` |
| `VITE_APP_LOGO` | Текст логотипа (1-2 символа) | `V` |

### Backend бота (.env бота)

| Переменная | Описание | По умолчанию |
| - | - | - |
| `CABINET_ENABLED` | Включить Cabinet API | `false` |
| `CABINET_URL` | Базовый URL кабинета (для ссылок в email и OAuth) | — |
| `CABINET_JWT_SECRET` | Секретный ключ для JWT | — |
| `CABINET_ALLOWED_ORIGINS` | CORS origins (через запятую) | — |
| `CABINET_ACCESS_TOKEN_EXPIRE_MINUTES` | Время жизни access token | `15` |
| `CABINET_REFRESH_TOKEN_EXPIRE_DAYS` | Время жизни refresh token | `7` |
| `CABINET_EMAIL_AUTH_ENABLED` | Включить email-вход | `true` |
| `CABINET_EMAIL_VERIFICATION_ENABLED` | Требовать верификацию email | `true` |
| `CABINET_BUTTON_STYLE` | Стиль кнопок: `primary`, `success`, `danger` | — |
| `MAIN_MENU_MODE` | Режим меню: `default` или `cabinet` | `default` |
| `CABINET_REQUIRE_LEGAL_CONSENT` | Требовать согласие с офертой и политикой при первой авторизации | `true` |
| `CABINET_LEGAL_CONSENT_PRECHECKED` | Показывать чекбоксы согласия отмеченными | `false` |
| `SUPPORT_EMAIL` | Публичный email поддержки — отдаётся в `GET /info/service` | — |
| `SERVICE_WEBSITE_URL` | Публичный сайт сервиса — отдаётся в `GET /info/service` | — |
| `USER_ACTION_LOG_ENABLED` | Лог действий пользователя для вкладки «Активность» | `true` |
| `USER_ACTION_LOG_RETENTION_DAYS` | Срок хранения лога действий (дни) | `90` |

### Согласие с офертой и политикой

При первой авторизации новый пользователь подтверждает согласие с офертой и политикой конфиденциальности (`v3.67.0`).

> [!NOTE]
>
> Гейт отключается сам, если ни оферта, ни политика не включены для веба. `CABINET_LEGAL_CONSENT_PRECHECKED=true` показывает чекбоксы уже отмеченными — это юридически слабее явной галочки, поэтому по умолчанию выключено.

### Таймлайн активности пользователя

В карточке пользователя есть вкладка «Активность» (`v3.64.0`): команды бота (`/start` и другие), нажатия кнопок в боте и действия в кабинете — одной лентой. Хранение ограничено `USER_ACTION_LOG_RETENTION_DAYS`.

## Быстрый старт

**1. Включите Cabinet API**

Добавьте в `.env` бота:

```env theme={null}
CABINET_ENABLED=true
CABINET_URL=https://cabinet.example.com
CABINET_JWT_SECRET=your_secret_here
CABINET_ALLOWED_ORIGINS=https://cabinet.example.com
```

**2. Разверните frontend**

Подробная инструкция: [Установка Cabinet](/cabinet/setup.md)

**3. Настройте прокси**

Caddy, Nginx или Traefik: [Настройка прокси](/cabinet/proxy-config.md)

**4. Добавьте авторизацию (опционально)**

* [Email-авторизация](/cabinet/email-auth.md) — вход без Telegram
* [OAuth-провайдеры](/cabinet/oauth-setup.md) — Google, Яндекс, Discord, VK

## Структура проекта

```
bedolaga-cabinet/
├── src/
│   ├── api/           # API клиенты (axios)
│   ├── components/    # React компоненты (UI kit)
│   ├── contexts/      # React контексты (auth, theme)
│   ├── hooks/         # Custom hooks
│   ├── locales/       # Переводы (i18n) — 5 языков
│   ├── pages/         # Страницы приложения
│   │   └── admin/     # Страницы админ-панели (20+ модулей)
│   ├── store/         # Zustand stores (auth, settings)
│   ├── types/         # TypeScript типы
│   └── utils/         # Утилиты
├── public/            # Статические файлы
├── Dockerfile         # Multi-stage сборка (node → nginx)
├── docker-compose.yml # Docker Compose для сборки
├── nginx.conf         # Nginx конфиг внутри контейнера
└── .env.example       # Пример переменных окружения
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.