Require payment_db_id for successful webhook processing and validate ownership. Precreate payment records for auto-renew and include payment_db_id in provider metadata. Ignore replayed succeeded webhooks. Also normalize empty Telegram webhook secret before set_webhook and request handler usage.
Telegram-бот для продажи подписок Remnawave
Этот Telegram-бот предназначен для автоматизации продажи и управления подписками для панели Remnawave. Он интегрируется с API Remnawave для управления пользователями и подписками, а также использует различные платежные системы для приема платежей.
✨ Ключевые возможности
Для пользователей:
- Регистрация и выбор языка: Поддержка русского и английского языков.
- Просмотр подписки: Пользователи могут видеть статус своей подписки, дату окончания и ссылку на конфигурацию.
- Мои устройства: Опциональный раздел для просмотра и отключения подключенных устройств (активируется через переменную
MY_DEVICES_SECTION_ENABLED). - Пробная подписка: Система пробных подписок для новых пользователей (активируется вручную по кнопке).
- Промокоды: Возможность применять промокоды для получения скидок или бонусных дней.
- Реферальная программа: Пользователи могут приглашать друзей и получать за это бонусные дни подписки.
- Оплата: Поддержка оплаты через YooKassa, FreeKassa (REST API), Platega, SeverPay, CryptoPay и Telegram Stars.
Для администраторов:
- Защищенная админ-панель: Доступ только для администраторов, указанных в
ADMIN_IDS. - Статистика: Просмотр статистики использования бота (общее количество пользователей, забаненные, активные подписки), недавние платежи и статус синхронизации с панелью.
- Управление пользователями: Блокировка/разблокировка пользователей, просмотр списка забаненных и детальной информации о пользователе.
- Рассылка: Отправка сообщений всем пользователям, пользователям с активной или истекшей подпиской.
- Управление промокодами: Создание и просмотр промокодов.
- Синхронизация с панелью: Ручной запуск синхронизации пользователей и подписок с панелью Remnawave.
- Логи действий: Просмотр логов всех действий пользователей.
🚀 Технологии
- Python 3.12
- Aiogram 3.x: Асинхронный фреймворк для Telegram ботов.
- aiohttp: Для запуска веб-сервера (вебхуки).
- SQLAlchemy 2.x & asyncpg: Асинхронная работа с базой данных PostgreSQL.
- Alembic: Миграции схемы базы данных.
- YooKassa, FreeKassa API, Platega, SeverPay, aiocryptopay: Интеграции с платежными системами.
- Pydantic: Для управления настройками из
.envфайла. - Docker & Docker Compose: Для контейнеризации и развертывания.
⚙️ Установка и запуск
Предварительные требования
- Установленные Docker и Docker Compose.
- Рабочая панель Remnawave.
- Токен Telegram-бота.
- Данные для подключения к платежным системам (YooKassa, CryptoPay и т.д.).
Шаги установки
-
Клонируйте репозиторий:
git clone https://github.com/kavore/remnawave-tg-shop cd remnawave-tg-shop -
Создайте и настройте файл
.env: Скопируйтеenv.exampleв.envи заполните своими данными.cp .env.example .env nano .envНиже перечислены ключевые переменные.
Основные настройки
Переменная Описание Пример BOT_TOKENОбязательно. Токен вашего Telegram-бота. 1234567890:ABC-DEF1234ghIkl-zyx57W2v1u123ew11ADMIN_IDSОбязательно. ID администраторов в Telegram через запятую. 12345678,98765432DEFAULT_LANGUAGEЯзык по умолчанию для новых пользователей. ruSUPPORT_LINK(Опционально) Ссылка на поддержку. https://t.me/your_supportSUBSCRIPTION_MINI_APP_URL(Опционально) URL Mini App для показа подписки. https://t.me/your_bot/appMY_DEVICES_SECTION_ENABLEDВключить раздел «Мои устройства» в меню подписки ( true/false).falseREQUIRED_CHANNEL_SUBSCRIBE_TO_USEВключить/выключить обязательную проверку подписки на канал ( true/false).falseREQUIRED_CHANNEL_IDID канала для проверки подписки. Используется, только если REQUIRED_CHANNEL_SUBSCRIBE_TO_USE=true.-1001234567890REQUIRED_CHANNEL_LINK(Опционально) Публичная ссылка или invite на канал для кнопки «Проверить подписку». https://t.me/your_channelREFERRAL_ENABLEDВключить/выключить реферальную систему полностью ( true/false).trueНастройки платежей и вебхуков
Переменная Описание WEBHOOK_BASE_URLОбязательно. Базовый URL для вебхуков, например https://your.domain.com.TELEGRAM_WEBHOOK_PATHОтносительный путь Telegram вебхука. По умолчанию /webhook/telegram.TELEGRAM_WEBHOOK_SECRET(Рекомендуется) Секрет для проверки заголовка X-Telegram-Bot-Api-Secret-Token.WEB_SERVER_HOSTХост для веб-сервера. По умолчанию 0.0.0.0.WEB_SERVER_PORTПорт для веб-сервера. PAYMENT_METHODS_ORDER(Опционально) Порядок отображения кнопок оплаты через запятую. Поддерживаемые ключи: severpay,freekassa,platega,yookassa,stars,cryptopay. Первый будет сверху.YOOKASSA_ENABLEDВключить/выключить YooKassa ( true/false).YOOKASSA_SHOP_IDID вашего магазина в YooKassa. YOOKASSA_SECRET_KEYСекретный ключ магазина YooKassa. YOOKASSA_AUTOPAYMENTS_ENABLEDВключить автопродление (сохранение карт, автосписания, управление способами оплаты). YOOKASSA_AUTOPAYMENTS_REQUIRE_CARD_BINDINGТребовать обязательную привязку карты при оплате с автосписанием. Установите false, чтобы пользователю показывался чекбокс «Сохранить карту».NALOGO_INNИНН для авторизации в nalog.ru (самозанятый). NALOGO_PASSWORDПароль для авторизации в nalog.ru (самозанятый). CRYPTOPAY_ENABLEDВключить/выключить CryptoPay ( true/false).CRYPTOPAY_TOKENТокен из вашего CryptoPay App. FREEKASSA_ENABLEDВключить/выключить FreeKassa ( true/false).FREEKASSA_MERCHANT_IDID вашего магазина в FreeKassa. FREEKASSA_API_KEYAPI-ключ для запросов к FreeKassa REST API. FREEKASSA_SECOND_SECRETСекретное слово №2 — используется для проверки уведомлений от FreeKassa. FREEKASSA_PAYMENT_URL(Опционально, legacy SCI) Базовый URL платёжной формы FreeKassa. По умолчанию https://pay.freekassa.ru/.FREEKASSA_PAYMENT_IPВнешний IP вашего сервера, который будет передаваться в запрос оплаты. FREEKASSA_PAYMENT_METHOD_IDID метода оплаты через магазин FreeKassa. По умолчанию 44.STARS_ENABLEDВключить/выключить Telegram Stars ( true/false).STARS_PROVIDER_TOKENТокен провайдера Telegram invoice. Для Stars (XTR) оставить пустым. PLATEGA_ENABLEDВключить/выключить Platega ( true/false).PLATEGA_MERCHANT_IDMerchantId из личного кабинета Platega. PLATEGA_SECRETAPI секрет для запросов Platega. PLATEGA_PAYMENT_METHODID способа оплаты (2 — SBP QR, 10 — РФ карты, 12 — международные карты, 13 — crypto). PLATEGA_RETURN_URL(Опционально) URL редиректа после успешной оплаты. По умолчанию ссылка на бота. PLATEGA_FAILED_URL(Опционально) URL редиректа при ошибке/отмене. По умолчанию как PLATEGA_RETURN_URL.SEVERPAY_ENABLEDВключить/выключить SeverPay ( true/false).SEVERPAY_MIDMID магазина в SeverPay. SEVERPAY_TOKENСекрет/токен для подписи запросов SeverPay. SEVERPAY_BASE_URL(Опционально) Базовый URL API SeverPay. По умолчанию https://severpay.io/api/merchant.SEVERPAY_RETURN_URL(Опционально) URL редиректа после оплаты (по умолчанию ссылка на бота). SEVERPAY_LIFETIME_MINUTES(Опционально) Время жизни платежной ссылки в минутах (30–4320). Настройки подписок
Для каждого периода (1, 3, 6, 12 месяцев) можно настроить доступность и цены:
1_MONTH_ENABLED:trueилиfalseRUB_PRICE_1_MONTH: Цена в рубляхSTARS_PRICE_1_MONTH: Цена в Telegram Stars Аналогичные переменные есть для3_MONTHS,6_MONTHS,12_MONTHS.
Настройки панели Remnawave
Переменная Описание PANEL_API_URLURL API вашей панели Remnawave. PANEL_API_KEYAPI ключ для доступа к панели. PANEL_WEBHOOK_SECRETСекретный ключ для проверки вебхуков от панели. USER_SQUAD_UUIDSID отрядов для новых пользователей. USER_EXTERNAL_SQUAD_UUIDОпционально. UUID внешнего отряда (External Squad) из документации Remnawave, куда автоматически добавляются новые пользователи. USER_TRAFFIC_LIMIT_GBЛимит трафика в ГБ (0 - безлимит). USER_HWID_DEVICE_LIMITЛимит устройств (HWID) для новых пользователей (0 - безлимит). Раздел "Мои устройства" становится доступен пользователям только при включении
MY_DEVICES_SECTION_ENABLED. Значение лимита устройств при создании записей в панели берётся изUSER_HWID_DEVICE_LIMIT.Настройки пробного периода
Переменная Описание TRIAL_ENABLEDВключить/выключить пробный период ( true/false).TRIAL_DURATION_DAYSДлительность пробного периода в днях. TRIAL_TRAFFIC_LIMIT_GBЛимит трафика для пробного периода в ГБ. -
Запустите контейнеры:
docker compose up -dЭта команда скачает образ и запустит сервис в фоновом режиме.
-
Настройка вебхуков (Обязательно): Вебхуки являются обязательным компонентом для работы бота, так как они используются для получения уведомлений от платежных систем (YooKassa, FreeKassa, CryptoPay, Platega, SeverPay) и панели Remnawave.
Вам понадобится обратный прокси (например, Nginx) для обработки HTTPS-трафика и перенаправления запросов на контейнер с ботом.
Пути для перенаправления:
https://<ваш_домен>/webhook/yookassa→http://remnawave-tg-shop:<WEB_SERVER_PORT>/webhook/yookassahttps://<ваш_домен>/webhook/freekassa→http://remnawave-tg-shop:<WEB_SERVER_PORT>/webhook/freekassahttps://<ваш_домен>/webhook/platega→http://remnawave-tg-shop:<WEB_SERVER_PORT>/webhook/plategahttps://<ваш_домен>/webhook/severpay→http://remnawave-tg-shop:<WEB_SERVER_PORT>/webhook/severpayhttps://<ваш_домен>/webhook/cryptopay→http://remnawave-tg-shop:<WEB_SERVER_PORT>/webhook/cryptopayhttps://<ваш_домен>/webhook/panel→http://remnawave-tg-shop:<WEB_SERVER_PORT>/webhook/panel- Для Telegram: Бот автоматически установит вебхук, если в
.envуказанWEBHOOK_BASE_URL. Путь берётся изTELEGRAM_WEBHOOK_PATH(по умолчаниюhttps://<ваш_домен>/webhook/telegram).
Где
remnawave-tg-shop— это имя сервиса изdocker-compose.yml, а<WEB_SERVER_PORT>— порт, указанный в.env. -
Просмотр логов:
docker compose logs -f remnawave-tg-shop💡 Если включена проверка подписки (
REQUIRED_CHANNEL_SUBSCRIBE_TO_USE=true), добавьте бота администратором в канал изREQUIRED_CHANNEL_ID. Пользователь увидит кнопку «Проверить подписку», и после успешного подтверждения доступ продолжится.
Миграции БД (Alembic)
- При запуске
python main.pyмиграции применяются автоматически доhead. - Для ручного запуска используйте:
alembic upgrade head
Подробная инструкция для развертывания на сервере с панелью Remnawave
1. Клонирование репозитория
git clone https://github.com/kavore/remnawave-tg-shop && cd remnawave-tg-shop
2. Настройка переменных окружения
cp .env.example .env && nano .env
Обязательные поля для заполнения:
BOT_TOKEN- токен телеграмм бота, например,234567890:ABC-DEF1234ghIkl-zyx57W2v1u123ew11ADMIN_IDS- TG ID администраторов, например,12345678,98765432и т.д. (через запятую без пробелов)WEBHOOK_BASE_URL- Обязательно. Базовый URL для вебхуков, напримерhttps://webhook.domain.comPANEL_API_URL- URL API вашей панели Remnawave (например,http://remnawave:3000/apiилиhttps://panel.domain.com/api)PANEL_API_KEY- API ключ для доступа к панели (генерируется из UI-интерфейса панели)PANEL_WEBHOOK_SECRET- Секретный ключ для проверки вебхуков от панели (берётся из.envсамой панели)USER_SQUAD_UUIDS- ID отрядов для новых пользователей
3. Настройка Reverse Proxy (Nginx)
Перейдите в директорию конфигурации Nginx панели Remnawave:
cd /opt/remnawave/nginx && nano nginx.conf
Добавьте в nginx.conf следующую конфигурацию:
upstream remnawave-tg-shop {
server remnawave-tg-shop:8080;
}
map $http_upgrade $connection_upgrade {
default upgrade;
"" close;
}
server {
server_name webhook.domain.com; # Домен для отправки Webhook'ов
listen 443 ssl;
http2 on;
ssl_certificate "/etc/nginx/ssl/webhook_fullchain.pem";
ssl_certificate_key "/etc/nginx/ssl/webhook_privkey.key";
ssl_trusted_certificate "/etc/nginx/ssl/webhook_fullchain.pem";
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
proxy_intercept_errors on;
error_page 400 404 500 502 @redirect;
location / {
proxy_pass http://remnawave-tg-shop$request_uri;
}
location @redirect {
return 404;
}
}
4. Выпуск SSL-сертификата для домена webhook
Убедитесь, что установлены необходимые компоненты, а также откройте 80 порт:
sudo apt-get install cron socat
curl https://get.acme.sh | sh -s email=EMAIL && source ~/.bashrc
ufw allow 80/tcp && ufw reload
Выпустите сертификат:
acme.sh --set-default-ca --server letsencrypt
acme.sh --issue --standalone -d 'webhook.domain.com' \
--key-file /opt/remnawave/nginx/webhook_privkey.key \
--fullchain-file /opt/remnawave/nginx/webhook_fullchain.pem
5. Добавление сертификатов в Docker Compose Nginx
Отредактируйте docker-compose.yml панели Nginx:
cd /opt/remnawave/nginx && nano docker-compose.yml
Добавьте две строки в секцию volumes:
services:
remnawave-nginx:
image: nginx:1.26
container_name: remnawave-nginx
hostname: remnawave-nginx
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
- ./fullchain.pem:/etc/nginx/ssl/fullchain.pem:ro
- ./privkey.key:/etc/nginx/ssl/privkey.key:ro
- ./subdomain_fullchain.pem:/etc/nginx/ssl/subdomain_fullchain.pem:ro
- ./subdomain_privkey.key:/etc/nginx/ssl/subdomain_privkey.key:ro
- ./webhook_fullchain.pem:/etc/nginx/ssl/webhook_fullchain.pem:ro # Добавьте эту строку
- ./webhook_privkey.key:/etc/nginx/ssl/webhook_privkey.key:ro # Добавьте эту строку
restart: always
ports:
- '0.0.0.0:443:443'
networks:
- remnawave-network
networks:
remnawave-network:
name: remnawave-network
driver: bridge
external: true
6. Запуск бота и перезапуск Nginx
Запустите бота:
cd /root/remnawave-tg-shop && docker compose up -d && docker compose logs -f -t
Перезапустите Nginx:
cd /opt/remnawave/nginx && docker compose down && docker compose up -d && docker compose logs -f -t
🐳 Docker
Файлы Dockerfile и docker-compose.yml уже настроены для сборки и запуска проекта. docker-compose.yml использует готовый образ с GitHub Container Registry, но вы можете раскомментировать build: . для локальной сборки.
Для автоматической публикации образов настроены GitHub Actions (.github/workflows). По умолчанию образы пушатся в GitHub Container Registry и Docker Hub. Добавьте в Secrets репозитория значения DOCKERHUB_USERNAME и DOCKERHUB_TOKEN (персональный access token или пароль для Docker Hub), чтобы загрузка в Docker Hub работала корректно.
📁 Структура проекта
.
├── bot/
│ ├── filters/ # Пользовательские фильтры Aiogram
│ ├── handlers/ # Обработчики сообщений и колбэков
│ ├── keyboards/ # Клавиатуры
│ ├── middlewares/ # Промежуточные слои (i18n, проверка бана)
│ ├── services/ # Бизнес-логика (платежи, API панели)
│ ├── states/ # Состояния FSM
│ └── main_bot.py # Основная логика бота
├── config/
│ └── settings.py # Настройки Pydantic
├── db/
│ ├── dal/ # Слой доступа к данным (DAL)
│ ├── database_setup.py # Настройка БД
│ └── models.py # Модели SQLAlchemy
├── locales/ # Файлы локализации (ru, en)
├── .env.example # Пример файла с переменными окружения
├── Dockerfile # Инструкции для сборки Docker-образа
├── docker-compose.yml # Файл для оркестрации контейнеров
├── requirements.txt # Зависимости Python
└── main.py # Точка входа в приложение
🔮 Планы на будущее
- Расширенные типы промокодов (например, скидки в процентах).
❤️ Поддержка
- Карты РФ и зарубежные: Tribute
- Crypto:
USDT TRC-20 TT3SqBbfU4vYm6SUwUVNZsy278m2xbM4GE