RemnaWave-bot Update
This commit is contained in:
89
README.md
89
README.md
@@ -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`
|
||||
- открытие раздела подписки через кнопку в панели
|
||||
- ввод реферального кода
|
||||
- ввод реферального кода или промокода
|
||||
- отправку чека
|
||||
- подтверждение оплаты модератором
|
||||
- выдачу ссылки пользователю
|
||||
|
||||
Reference in New Issue
Block a user