RemnaWave-bot Update

This commit is contained in:
2026-05-06 15:41:56 +03:00
parent ce7a1f70b2
commit 2cc2f12a21
22 changed files with 3087 additions and 129 deletions

View File

@@ -11,7 +11,7 @@ Telegram-бот на `aiogram 3` с интеграцией в `Remnawave API`,
- Хранит локальный кэш пользователей и истории подписок в MariaDB
- Поддерживает привязку существующего аккаунта Remnawave по `short_uuid`
- Показывает профиль, статус подписки, срок и трафик
- Работает с реферальными кодами и скидкой перед оплатой
- Работает с реферальными кодами, промокодами и скидкой перед оплатой
- Поддерживает ручную оплату переводом с отправкой чека в бот
- Отправляет чек в отдельный Telegram-канал/топик на проверку
- Даёт админу или модератору подтвердить или отклонить оплату
@@ -24,8 +24,8 @@ Telegram-бот на `aiogram 3` с интеграцией в `Remnawave API`,
Сейчас в проекте не используется Telegram Stars. Оплата работает вручную:
1. Пользователь нажимает `Купить подписку`
2. Бот показывает список тарифов из `PAYMENT_PLANS`
3. Если у пользователя применён реферальный код, скидка учитывается до выбора тарифа
2. Бот показывает список тарифов из `PAYMENT_PRODUCT_PLANS`, если они заданы, иначе из `PAYMENT_PLANS`
3. Если у пользователя применён реферальный код или промокод, скидка учитывается до выбора тарифа
4. После выбора тарифа бот показывает реквизиты из `PAYMENT_TRANSFER_TEXT`
5. Пользователь отправляет чек следующим сообщением в бота
6. Бот пересылает чек в review-чат оплаты
@@ -34,7 +34,7 @@ Telegram-бот на `aiogram 3` с интеграцией в `Remnawave API`,
### Тарифы
Тарифы задаются одной переменной:
Обычные тарифы по срокам задаются одной переменной:
```env
PAYMENT_PLANS=30:250,180:600,365:1000
@@ -51,6 +51,22 @@ PAYMENT_PLANS=30:250,180:600,365:1000
- 180 дней = 600 ₽
- 365 дней = 1000 ₽
Для разных типов подписки можно включить продуктовые тарифы:
```env
PAYMENT_PRODUCT_PLANS=vpn_white:30:450,white:30:250,vpn:30:200
PAYMENT_VPN_SQUAD_UUIDS=11111111-1111-1111-1111-111111111111
PAYMENT_WHITE_SQUAD_UUIDS=22222222-2222-2222-2222-222222222222
```
Если `PAYMENT_PRODUCT_PLANS` заполнен, пользователь увидит выбор:
- `VPN + Белые списки` — получает UUID из `PAYMENT_VPN_SQUAD_UUIDS` и `PAYMENT_WHITE_SQUAD_UUIDS`
- `Белые списки` — получает только `PAYMENT_WHITE_SQUAD_UUIDS`
- `VPN` — получает только `PAYMENT_VPN_SQUAD_UUIDS`
Формат `PAYMENT_PRODUCT_PLANS`: `код:дни:цена_в_рублях`. Доступные коды: `vpn_white`, `white`, `vpn`. Эти значения также можно менять в админ-настройках бота.
### Логин в Remnawave
Логин создаётся в формате:
@@ -237,6 +253,12 @@ telegabot/
- `referral_bonuses`
- начисленные и ожидающие применения бонусы реферерам
- `promo_codes`
- промокоды, скидка, срок действия и ограничение по тарифу
- `promo_code_applications`
- активный промокод, который пользователь ввёл перед оплатой
- `payment_orders`
- ручные платежи, статусы и выданные доступы
@@ -261,6 +283,26 @@ telegabot/
- за каждую подтверждённую оплату по рефкоду реферер получает бонус в днях
- размер бонуса задаётся в `REFERRAL_BONUS_DAYS`
### Промокоды
Админ может создать промокод из UI: `Админ-панель` -> `Промокоды` -> `Создать промокод`.
Сценарий создания:
1. Админ вводит слово промокода
2. Выбирает область действия: все тарифы или один тариф
3. Вводит процент скидки
4. Вводит срок действия
Пользователь вводит промокод в том же разделе, где вводится реферальный код. Если промокод ограничен одним тарифом, скидка применяется только к этому тарифу. Если у пользователя есть и реферальное приглашение, и активный промокод, при оплате используется скидка промокода; реферальный бонус рефереру всё равно начислится после подтверждённой оплаты.
Форматы срока действия:
- `7` — 7 дней
- `24h` или `24ч` — 24 часа
- `2026-05-31` — до конца указанной даты
- `0` — без срока действия
## Тикеты поддержки
Сценарий:
@@ -331,10 +373,11 @@ DB_NAME=oreolvpn
DB_USER=oreolvpn
DB_PASSWORD=strong_password
PAYMENT_PLANS=30:250,180:600,365:1000
PAYMENT_PRODUCT_PLANS=vpn_white:30:450,white:30:250,vpn:30:200
PAYMENT_TRANSFER_TEXT=Карта 0000 0000 0000 0000; банк OREOL; получатель OREOL VPN
PAYMENT_REVIEW_LINK=https://t.me/c/3646494169/56/57
PAYMENT_INTERNAL_SQUAD_UUIDS=11111111-1111-1111-1111-111111111111
PAYMENT_VPN_SQUAD_UUIDS=11111111-1111-1111-1111-111111111111
PAYMENT_WHITE_SQUAD_UUIDS=22222222-2222-2222-2222-222222222222
REFERRAL_DISCOUNT_PERCENT=5
PAYMENT_USERNAME_PREFIX=Oreol
```
@@ -521,6 +564,21 @@ DB_PORT=3306
Если вы запускаете проект только в Docker, `DB_HOST` и `DB_PORT` можно не менять вручную.
`DB_ROOT_PASSWORD` нужен только контейнеру MariaDB. Сам бот подключается к базе исключительно через:
- `DB_USER`
- `DB_PASSWORD`
Это важно:
- `DB_ROOT_PASSWORD` не используется приложением для SQLAlchemy-подключения
- если в `.env` указать `DB_USER=root`, но оставить `DB_PASSWORD` пустым, бот попытается зайти как `root` без пароля и упадёт с `Access denied`
Для production рекомендуется не использовать `root` для бота, а создать отдельного пользователя БД через:
- `DB_USER`
- `DB_PASSWORD`
MariaDB в текущем `docker-compose.yml` не публикуется наружу на хост, чтобы база не торчала во внешний интернет по `3306`. Бот подключается к ней по внутренней Docker-сети через hostname `db`.
#### Первый запуск
@@ -643,6 +701,23 @@ docker compose up -d
- не пустые ли `DB_PASSWORD` и `DB_ROOT_PASSWORD`
- есть ли у сервиса `db` статус `healthy` в `docker compose ps`
Если видите ошибку вида:
```text
Access denied for user 'root' ... (using password: NO)
```
проверьте:
- не стоит ли в `.env` `DB_USER=root`
- не пустой ли `DB_PASSWORD`
- совпадают ли `DB_USER` и `DB_PASSWORD` с пользователем MariaDB, который был создан при первом старте контейнера
Если контейнер `db` уже один раз поднимался с неправильными DB-переменными, volume MariaDB мог сохранить старого пользователя и старый пароль. Тогда есть два варианта:
- если данных ещё не жалко: `docker compose down -v` и затем `docker compose up -d --build`
- если данные нужно сохранить: зайти в MariaDB и вручную создать/выдать права нужному пользователю
Если хотите открыть MariaDB наружу для внешнего клиента, это нужно делать осознанно: добавьте `ports` обратно в сервис `db` и отдельно ограничьте доступ через firewall или private network.
#### Минимальный сценарий запуска в Docker
@@ -778,7 +853,7 @@ OperationalError: (1049, "Unknown database '...'" )
6. Проверить руками:
- `/start`
- открытие раздела подписки через кнопку в панели
- ввод реферального кода
- ввод реферального кода или промокода
- отправку чека
- подтверждение оплаты модератором
- выдачу ссылки пользователю