1. Remove pointless HWID reset during auto-sync deactivation — user doesn't exist in panel, API returns 404, UUID is cleaned up below. 2. Clean up RESTRICT FK references (AdminAuditLog, WithdrawalRequest, AdminRole, UserRole, AccessPolicy) before deleting user to prevent IntegrityError on admin_audit_log_user_id_fkey. 3. Fix device limit not being sent to RemnaWave when DEVICES_SELECTION_DISABLED_AMOUNT=0: treat 0 as "no forced override" instead of sending hwidDeviceLimit:0 (which Remnawave interprets as unlimited). Now falls through to subscription.device_limit from tariff. 4. Add info-level logging to POST /api/users (was debug) to match existing PATCH logging for device limit diagnostics.
🚀 Remnawave Bedolaga Bot
🆕 Новый веб-кабинет (Cabinet WebApp) https://github.com/BEDOLAGA-DEV/bedolaga-cabinet/
Вышла новая версия личного кабинета пользователя — веб-интерфейс для управления подписками!
Переменные окружения для Cabinet:
Переменная Описание По умолчанию CABINET_ENABLEDВключить личный кабинет falseCABINET_JWT_SECRETСекретный ключ для JWT токенов BOT_TOKENCABINET_ACCESS_TOKEN_EXPIRE_MINUTESВремя жизни access token (минуты) 15CABINET_REFRESH_TOKEN_EXPIRE_DAYSВремя жизни refresh token (дни) 7CABINET_ALLOWED_ORIGINSРазрешённые origins для CORS — CABINET_EMAIL_VERIFICATION_ENABLEDВключить верификацию email falseCABINET_EMAIL_VERIFICATION_EXPIRE_HOURSВремя жизни токена верификации email (часы) 24CABINET_PASSWORD_RESET_EXPIRE_HOURSВремя жизни токена сброса пароля (часы) 1Для работы email-уведомлений настройте SMTP-переменные:
SMTP_HOST,SMTP_PORT,SMTP_USER,SMTP_PASSWORD,SMTP_FROM_EMAIL,SMTP_FROM_NAME,SMTP_USE_TLS.
🤖 Современный Telegram-бот для управления VPN подписками через Remnawave API
Полнофункциональное решение с управлением пользователями, платежами и администрированием
🚀 Быстрый старт • 📖 Функционал • Docker • 💻 Локальная разработка • 💬 Поддержка
🧪 Тестирование бота
💬 Bedolaga Chat - Для общения, вопросов, предложений
🌟 Почему Bedolaga?
Бот Бедолага не добрый и не милый. Он просто делает вашу работу вместо вас, принимает оплату, выдаёт подписки, интегрируется с Remnawave и тихо ненавидит всех, кто ещё не подключил его.
Вы хотите продавать VPN — Бедолага позволит это делать. Вы хотите спать — он позволит и это...
⚡ Полная автоматизация VPN бизнеса
- 🎯 Готовое решение - разверни за 5 минут, начни продавать сегодня
- 💰 Многоканальные платежи - Telegram Stars + Tribute + CryptoBot + Heleket + YooKassa (СБП + карты) + MulenPay + PayPalych (СБП + карты) + Platega (карты + СБП) + WATA + Freekassa (NSPK СБП + карты) + CloudPayments (карты + СБП)
- 🔄 Автоматизация 99% - от регистрации до продления подписок
- 📱 MiniApp лк - личный кабинет с возможностью покупки/продления подписки
- 📊 Детальная аналитика - полная картина вашего бизнеса
- 💬 Уведомления в топики об: Активация триала 💎 Покупка подписки 🔄 Конверсия из триала в платную ⏰ Продление подписки 💰 Пополнение баланса 🚧 Включении тех работ ♻️ Появлении новой версии бота
🎛️ Гибкость конфигурации
- 🌐 Умный выбор серверов - автоматический пропуск при одном сервере, мультивыбор
- 📱 Управление устройствами - от 1 до неограниченного количества
- 📊 Режимы продажи трафика - фиксированный лимит или выбор пакетов
- 🎯 Режим тарифов - готовые тарифные планы с фиксированными параметрами
- 🎁 Промо-система - коды на деньги, дни подписки, триал-периоды
- 🔧 Гибкие тарифы - от 5GB до безлимита, от 14 дней до года
- 🛒 Умная корзина - сохранение параметров подписки при недостатке баланса
💪 Enterprise готовность
- 🗃️ Современная архитектура - AsyncIO, PostgreSQL, Redis, модульная структура
- 🔒 Безопасность - интеграция с системой защиты панели через куки-аутентификацию
- 📈 Масштабируемость - от стартапа до крупного бизнеса
- 🔧 Мониторинг - автоматическое управление режимом тех. работ
- 🛡️ Защита панели - поддержка remnawave-reverse-proxy
- 🗄️ Бекапы/Восстановление - автобекапы и восстановление бд прямо в боте с уведомлениями в топики
- ✔️ Проверка на подписку - проверяет подписку на канал
- 🔄 Автосинхронизация - фоновая синхронизация подписок и серверов(сквадов) с Remnawave по расписанию
- 📝 Ротация логов - автоматическая очистка и архивация старых логов
- 🚫 Система ограничений - блокировка пользователей по различным критериям
- 🎮 Конкурсы и игры - ежедневные игры с призами и реферальные конкурсы
- 📡 Модем-подписки - дополнительный функционал для устройств-модемов
📚 Поддерживаемые методы авторизации
| Конфигурация | Authorization | X-Api-Key |
|---|---|---|
| Только API Key | Bearer <api_key> | <api_key> |
| Basic Auth | Bearer <api_key> | Basic user:pass |
| Caddy + API Key | Basic <caddy_token> | <api_key> |
| Cookies (eGames) | Bearer <api_key> | <api_key> + cookies |
🚀 Быстрый старт
# 1. Скачай репозиторий
git clone https://github.com/Fr1ngg/remnawave-bedolaga-telegram-bot.git
cd remnawave-bedolaga-telegram-bot
# 2. Создай необходимые директории
mkdir -p ./logs ./data ./data/backups ./data/referral_qr
chmod -R 755 ./logs ./data
sudo chown -R 1000:1000 ./logs ./data
# 3.Установи «Docker» командой:
sudo curl -fsSL https://get.docker.com | sh
# 4.Установи «make» следующей командой:
apt install make -y
make up # Поднять контейнеры
make help # Показать все команды
make down # Остановить контейнеры
make reload # Перезапустить
make reload-follow # Перезапустить с логами
make test # Запустить тесты
Ручной Docker запуск
Если не хочется пользоваться мастером, можно настроить всё вручную:
# 1. Скачай репозиторий
git clone https://github.com/Fr1ngg/remnawave-bedolaga-telegram-bot.git
cd remnawave-bedolaga-telegram-bot
# 2. Настрой конфиг
cp .env.example .env
nano .env # Заполни токены и настройки
# 3. Создай необходимые директории
mkdir -p ./logs ./data ./data/backups ./data/referral_qr
chmod -R 755 ./logs ./data
sudo chown -R 1000:1000 ./logs ./data
# 4. Запусти всё разом
docker compose up -d
# 5. Проверь статус
docker compose logs
🌐 Настройка веб-сервера и обратного проксирования
Встроенный FastAPI-сервер обслуживает Telegram webhook, платежные webhooks, административное API и статические файлы миниапки на одном порту 8080. Снаружи вы публикуете только HTTPS-прокси, которое проксирует весь трафик на этот порт.
1. Выбор режима запуска
BOT_RUN_MODE |
Что делает | Когда использовать |
|---|---|---|
polling |
Бот опрашивает Telegram через long polling. HTTP-сервер можно не поднимать. | Локальная отладка или отсутствие внешнего HTTPS. |
webhook |
Aiogram получает апдейты только через вебхук. | Продакшн и серверы за HTTPS-прокси. |
2. Минимальные настройки для webhook
Для запуска бота в режиме webhook минимально необходимы следующие параметры в .env:
# Обязательные базовые настройки
BOT_TOKEN=1234567890:AABBCCdd...
ADMIN_IDS=123456789,987654321
# Настройки webhook
BOT_RUN_MODE=webhook
WEBHOOK_URL=https://hooks.domain.com
WEBHOOK_PATH=/webhook
WEBHOOK_SECRET_TOKEN=super-secret-token
# Настройки Web API
WEB_API_ENABLED=true
WEB_API_PORT=8080
WEB_API_ALLOWED_ORIGINS=https://miniapp.domain.com
WEB_API_DEFAULT_TOKEN=super-secret-token
# Настройки Remnawave
REMNAWAVE_API_URL=https://your-panel.com
REMNAWAVE_API_KEY=your_api_key
Важно:
WEBHOOK_SECRET_TOKEN- сгенерируйте командойopenssl rand -hex 32WEB_API_DEFAULT_TOKEN- сгенерируйте командойopenssl rand -hex 32WEBHOOK_URLдолжен быть доступен извне по HTTPSWEB_API_ALLOWED_ORIGINS- укажите домен, где будет размещена миниапка
3. Полные настройки webhook (опционально)
BOT_RUN_MODE=webhook
WEBHOOK_URL=https://hooks.domain.com
WEBHOOK_PATH=/webhook
WEBHOOK_SECRET_TOKEN=super-secret-token
WEBHOOK_DROP_PENDING_UPDATES=true
WEBHOOK_MAX_QUEUE_SIZE=1024
WEBHOOK_WORKERS=4
WEBHOOK_ENQUEUE_TIMEOUT=0.1
WEBHOOK_WORKER_SHUTDOWN_TIMEOUT=30.0
WEB_API_ENABLED=true
WEB_API_HOST=0.0.0.0
WEB_API_PORT=8080
WEB_API_ALLOWED_ORIGINS=https://miniapp.domain.com
WEBHOOK_URL— публичный HTTPS-домен прокси. К нему автоматически добавится путь изWEBHOOK_PATH.WEBHOOK_SECRET_TOKEN— защитный токен Telegram, обязательно задайте своё значение.- Очередь можно тюнить через
WEBHOOK_MAX_QUEUE_SIZE,WEBHOOK_WORKERS,WEBHOOK_ENQUEUE_TIMEOUTиWEBHOOK_WORKER_SHUTDOWN_TIMEOUT. - Если миниапка или админка доступны по другим доменам, перечислите их через запятую в
WEB_API_ALLOWED_ORIGINS.
После изменения .env перезапустите сервис: docker compose up -d remnawave_bot.
4. Настройка Docker-сетей
Вариант 1: Бот на отдельном сервере
Если бот запускается на отдельном сервере (не там, где панель Remnawave), используйте стандартную конфигурацию:
docker-compose.yml бота:
services:
postgres:
image: postgres:15-alpine
container_name: remnawave_bot_db
restart: unless-stopped
environment:
POSTGRES_DB: ${POSTGRES_DB:-remnawave_bot}
POSTGRES_USER: ${POSTGRES_USER:-remnawave_user}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-secure_password_123}
POSTGRES_INITDB_ARGS: '--encoding=UTF8 --locale=C'
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- bot_network
healthcheck:
test:
[
'CMD-SHELL',
'pg_isready -U ${POSTGRES_USER:-remnawave_user} -d ${POSTGRES_DB:-remnawave_bot}',
]
interval: 30s
timeout: 5s
retries: 5
start_period: 30s
redis:
image: redis:7-alpine
container_name: remnawave_bot_redis
restart: unless-stopped
command: redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru
volumes:
- redis_data:/data
networks:
- bot_network
healthcheck:
test: ['CMD', 'redis-cli', 'ping']
interval: 30s
timeout: 10s
retries: 3
bot:
build: .
container_name: remnawave_bot
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
env_file:
- .env
environment:
DOCKER_ENV: 'true'
DATABASE_MODE: 'auto'
POSTGRES_HOST: 'postgres'
POSTGRES_PORT: '5432'
POSTGRES_DB: '${POSTGRES_DB:-remnawave_bot}'
POSTGRES_USER: '${POSTGRES_USER:-remnawave_user}'
POSTGRES_PASSWORD: '${POSTGRES_PASSWORD:-secure_password_123}'
REDIS_URL: 'redis://redis:6379/0'
TZ: 'Europe/Moscow'
LOCALES_PATH: '${LOCALES_PATH:-/app/locales}'
volumes:
- ./logs:/app/logs:rw
- ./data:/app/data:rw
- ./locales:/app/locales:rw
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
- ./vpn_logo.png:/app/vpn_logo.png:ro
ports:
- '${WEB_API_PORT:-8080}:8080'
networks:
- bot_network
healthcheck:
test:
[
'CMD-SHELL',
'python -c "import requests, os; requests.get(''http://localhost:8080/health'', headers={''X-API-Key'': os.environ.get(''WEB_API_DEFAULT_TOKEN'')}, timeout=5) or exit(1)"',
]
interval: 60s
timeout: 10s
retries: 3
start_period: 30s
volumes:
postgres_data:
driver: local
redis_data:
driver: local
networks:
bot_network:
name: remnawave_bot_network
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16
gateway: 172.20.0.1
driver_opts:
com.docker.network.driver.mtu: 1350
docker-compose.yml для Caddy (отдельный файл):
services:
caddy:
image: caddy:2-alpine
container_name: remnawave_caddy
restart: unless-stopped
ports:
- '80:80'
- '443:443'
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
networks:
- bot_network
volumes:
caddy_data:
caddy_config:
networks:
bot_network:
name: remnawave_bot_network
external: true
Вариант 2: Бот на одном сервере с панелью Remnawave
Если бот и панель Remnawave запускаются на одном сервере, подключите бота к сети панели:
docker-compose.local.yml бота(есть в репо):
services:
postgres:
image: postgres:15-alpine
container_name: remnawave_bot_db
restart: unless-stopped
environment:
POSTGRES_DB: ${POSTGRES_DB:-remnawave_bot}
POSTGRES_USER: ${POSTGRES_USER:-remnawave_user}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-secure_password_123}
POSTGRES_INITDB_ARGS: '--encoding=UTF8 --locale=C'
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- bot_network
- remnawave-network # Подключаем к сети панели
healthcheck:
test:
[
'CMD-SHELL',
'pg_isready -U ${POSTGRES_USER:-remnawave_user} -d ${POSTGRES_DB:-remnawave_bot}',
]
interval: 30s
timeout: 5s
retries: 5
start_period: 30s
redis:
image: redis:7-alpine
container_name: remnawave_bot_redis
restart: unless-stopped
command: redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru
volumes:
- redis_data:/data
networks:
- bot_network
- remnawave-network # Подключаем к сети панели
healthcheck:
test: ['CMD', 'redis-cli', 'ping']
interval: 30s
timeout: 10s
retries: 3
bot:
build: .
container_name: remnawave_bot
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
env_file:
- .env
environment:
DOCKER_ENV: 'true'
DATABASE_MODE: 'auto'
POSTGRES_HOST: 'postgres'
POSTGRES_PORT: '5432'
POSTGRES_DB: '${POSTGRES_DB:-remnawave_bot}'
POSTGRES_USER: '${POSTGRES_USER:-remnawave_user}'
POSTGRES_PASSWORD: '${POSTGRES_PASSWORD:-secure_password_123}'
REDIS_URL: 'redis://redis:6379/0'
TZ: 'Europe/Moscow'
LOCALES_PATH: '${LOCALES_PATH:-/app/locales}'
volumes:
- ./logs:/app/logs:rw
- ./data:/app/data:rw
- ./locales:/app/locales:rw
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
- ./vpn_logo.png:/app/vpn_logo.png:ro
ports:
- '${WEB_API_PORT:-8080}:8080'
networks:
- bot_network
- remnawave-network # Подключаем к сети панели
healthcheck:
test:
[
'CMD-SHELL',
'python -c "import requests, os; requests.get(''http://localhost:8080/health'', headers={''X-API-Key'': os.environ.get(''WEB_API_DEFAULT_TOKEN'')}, timeout=5) or exit(1)"',
]
interval: 60s
timeout: 10s
retries: 3
start_period: 30s
volumes:
postgres_data:
driver: local
redis_data:
driver: local
networks:
bot_network:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16
gateway: 172.20.0.1
driver_opts:
com.docker.network.driver.mtu: 1350
remnawave-network:
name: remnawave-network
external: true # Используем существующую сеть панели
Важно:
- Сеть
remnawave-networkдолжна быть создана панелью Remnawave - В
.envукажитеREMNAWAVE_API_URL=http://remnawave:3000(обращение внутри Docker-сети) - Бот сможет напрямую общаться с панелью без внешних запросов
5. Проверка здоровья
Проверьте, что единый сервер отвечает:
curl -s https://bot.example.com/health/unified | jq
Полезные диагностические endpoints:
/health/unified— агрегированный статус (режим бота, очередь Telegram, наличие миниапки и платежей). Когда административное API отключено, тот же статус доступен по/health./health/telegram-webhook— состояние очереди Telegram webhook./health/payment-webhooks— какие платёжные интеграции активированы.
6. Swagger и документация
- Включите
WEB_API_DOCS_ENABLED=true, если нужно открыть Swagger UI и OpenAPI. После перезапуска сервиса станут доступны эндпоинты/docs,/doc(редирект для обратной совместимости),/redocи/openapi.json. - Не забудьте проксировать эти пути через внешний HTTPS-прокси вместе с остальными эндпоинтами бота.
- В продакшене держите
WEB_API_DOCS_ENABLED=false, чтобы документация не была публичной. При необходимости включайте временно или защищайте прокси базовой авторизацией/IP-фильтрацией.
7. Пример Caddy-конфига
Caddyfile:
# Hooks + API
hooks.domain.com {
encode gzip zstd
# Webhook пути для платежных систем
handle /yookassa-webhook {
reverse_proxy remnawave_bot:8080 {
header_up Host {host}
header_up X-Real-IP {remote_host}
transport http {
read_buffer 0
}
}
}
handle /platega-webhook {
reverse_proxy remnawave_bot:8080 {
header_up Host {host}
header_up X-Real-IP {remote_host}
transport http {
read_buffer 0
}
}
}
handle /cryptobot-webhook {
reverse_proxy remnawave_bot:8080 {
header_up Host {host}
header_up X-Real-IP {remote_host}
transport http {
read_buffer 0
}
}
}
handle /wata-webhook {
reverse_proxy remnawave_bot:8080 {
header_up Host {host}
header_up X-Real-IP {remote_host}
transport http {
read_buffer 0
}
}
}
handle /heleket-webhook {
reverse_proxy remnawave_bot:8080 {
header_up Host {host}
header_up X-Real-IP {remote_host}
transport http {
read_buffer 0
}
}
}
handle /tribute-webhook {
reverse_proxy remnawave_bot:8080 {
header_up Host {host}
header_up X-Real-IP {remote_host}
transport http {
read_buffer 0
}
}
}
handle /pal24-webhook {
reverse_proxy remnawave_bot:8080 {
header_up Host {host}
header_up X-Real-IP {remote_host}
transport http {
read_buffer 0
}
}
}
handle /mulenpay-webhook {
reverse_proxy remnawave_bot:8080 {
header_up Host {host}
header_up X-Real-IP {remote_host}
transport http {
read_buffer 0
}
}
}
handle /freekassa-webhook {
reverse_proxy remnawave_bot:8080 {
header_up Host {host}
header_up X-Real-IP {remote_host}
transport http {
read_buffer 0
}
}
}
handle /cloudpayments-webhook {
reverse_proxy remnawave_bot:8080 {
header_up Host {host}
header_up X-Real-IP {remote_host}
transport http {
read_buffer 0
}
}
}
handle /remnawave-webhook {
reverse_proxy remnawave_bot:8080 {
header_up Host {host}
header_up X-Real-IP {remote_host}
transport http {
read_buffer 0
}
}
}
# app-config.json с CORS
handle /app-config.json {
header Access-Control-Allow-Origin "*"
reverse_proxy remnawave_bot:8080 {
header_up Host {host}
header_up X-Real-IP {remote_host}
transport http {
read_buffer 0
}
}
}
# Все остальные запросы
handle {
reverse_proxy remnawave_bot:8080 {
header_up Host {host}
header_up X-Real-IP {remote_host}
transport http {
read_buffer 0
}
}
}
}
# Статика для miniapp
miniapp.domain.com {
encode gzip zstd
# API эндпоинты /miniapp/* в приложение
handle /miniapp/* {
reverse_proxy remnawave_bot:8080 {
header_up Host {host}
header_up X-Real-IP {remote_host}
transport http {
read_buffer 0
}
}
}
# app-config.json с CORS
handle /app-config.json {
header Access-Control-Allow-Origin "*"
reverse_proxy remnawave_bot:8080 {
header_up Host {host}
header_up X-Real-IP {remote_host}
transport http {
read_buffer 0
}
}
}
# Статические файлы (корень и всё остальное)
handle {
root * /var/www/remnawave-miniapp
try_files {path} /index.html
file_server
}
}
Примечание: Если прокси запускается на том же сервере, замените remnawave_bot:8080 на localhost:8080
8. Пример nginx-конфига
nginx.conf:
events {}
http {
include /etc/nginx/mime.types;
sendfile on;
upstream remnawave_bot_unified {
server remnawave_bot:8080;
}
# Hooks + API домен
server {
listen 80;
listen 443 ssl http2;
server_name hooks.domain.com;
ssl_certificate /etc/ssl/private/hooks.fullchain.pem;
ssl_certificate_key /etc/ssl/private/hooks.privkey.pem;
client_max_body_size 32m;
# Webhook пути для платежных систем
location = /yookassa-webhook {
proxy_pass http://remnawave_bot_unified;
proxy_set_header Host $host;
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_read_timeout 120s;
proxy_send_timeout 120s;
proxy_buffering off;
proxy_request_buffering off;
}
location = /platega-webhook {
proxy_pass http://remnawave_bot_unified;
proxy_set_header Host $host;
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_read_timeout 120s;
proxy_send_timeout 120s;
proxy_buffering off;
proxy_request_buffering off;
}
location = /cryptobot-webhook {
proxy_pass http://remnawave_bot_unified;
proxy_set_header Host $host;
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_read_timeout 120s;
proxy_send_timeout 120s;
proxy_buffering off;
proxy_request_buffering off;
}
location = /wata-webhook {
proxy_pass http://remnawave_bot_unified;
proxy_set_header Host $host;
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_read_timeout 120s;
proxy_send_timeout 120s;
proxy_buffering off;
proxy_request_buffering off;
}
location = /heleket-webhook {
proxy_pass http://remnawave_bot_unified;
proxy_set_header Host $host;
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_read_timeout 120s;
proxy_send_timeout 120s;
proxy_buffering off;
proxy_request_buffering off;
}
location = /tribute-webhook {
proxy_pass http://remnawave_bot_unified;
proxy_set_header Host $host;
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_read_timeout 120s;
proxy_send_timeout 120s;
proxy_buffering off;
proxy_request_buffering off;
}
location = /pal24-webhook {
proxy_pass http://remnawave_bot_unified;
proxy_set_header Host $host;
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_read_timeout 120s;
proxy_send_timeout 120s;
proxy_buffering off;
proxy_request_buffering off;
}
location = /mulenpay-webhook {
proxy_pass http://remnawave_bot_unified;
proxy_set_header Host $host;
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_read_timeout 120s;
proxy_send_timeout 120s;
proxy_buffering off;
proxy_request_buffering off;
}
location = /freekassa-webhook {
proxy_pass http://remnawave_bot_unified;
proxy_set_header Host $host;
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_read_timeout 120s;
proxy_send_timeout 120s;
proxy_buffering off;
proxy_request_buffering off;
}
location = /cloudpayments-webhook {
proxy_pass http://remnawave_bot_unified;
proxy_set_header Host $host;
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_read_timeout 120s;
proxy_send_timeout 120s;
proxy_buffering off;
proxy_request_buffering off;
}
location = /remnawave-webhook {
proxy_pass http://remnawave_bot_unified;
proxy_set_header Host $host;
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_read_timeout 120s;
proxy_send_timeout 120s;
proxy_buffering off;
proxy_request_buffering off;
}
# app-config.json с CORS
location = /app-config.json {
add_header Access-Control-Allow-Origin "*";
proxy_pass http://remnawave_bot_unified;
proxy_set_header Host $host;
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;
}
# Всё остальное
location / {
proxy_pass http://remnawave_bot_unified;
proxy_set_header Host $host;
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_read_timeout 120s;
proxy_send_timeout 120s;
proxy_buffering off;
proxy_request_buffering off;
}
}
# Miniapp домен (статика + API)
server {
listen 80;
listen 443 ssl http2;
server_name miniapp.domain.com;
ssl_certificate /etc/ssl/private/miniapp.fullchain.pem;
ssl_certificate_key /etc/ssl/private/miniapp.privkey.pem;
client_max_body_size 32m;
# API эндпоинты /miniapp/*
location /miniapp/ {
proxy_pass http://remnawave_bot_unified;
proxy_set_header Host $host;
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_read_timeout 120s;
proxy_send_timeout 120s;
proxy_buffering off;
proxy_request_buffering off;
}
# app-config.json с CORS
location = /app-config.json {
add_header Access-Control-Allow-Origin "*";
proxy_pass http://remnawave_bot_unified;
proxy_set_header Host $host;
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;
}
# Статические файлы
location / {
root /var/www/remnawave-miniapp;
try_files $uri $uri/ /index.html;
# Кэширование
expires 1h;
add_header Cache-Control "public, immutable";
}
}
}
Примечание: Если прокси запускается на том же сервере, замените remnawave_bot:8080 на localhost:8080
Рекомендации:
- Откройте входящие 80/443 в файерволе.
- Если используете Cloudflare/анти-DDoS, разрешите методы
POSTи заголовокX-Telegram-Bot-Api-Secret-Token. - После развёртывания перезапустите бот (
make reload), чтобы он заново зарегистрировал webhook.
Быстрая настройка SSL для Nginx в Docker
1. Установка Certbot
sudo apt update && sudo apt install certbot -y
2. Генерация сертификатов
# Остановите Nginx Docker контейнер
docker compose down
# Сгенерируйте сертификаты (порт 80 должен быть свободен)
sudo certbot certonly --standalone -d hooks.domain.com --agree-tos --email your-email@example.com --non-interactive
sudo certbot certonly --standalone -d miniapp.domain.com --agree-tos --email your-email@example.com --non-interactive
3. Копирование сертификатов
sudo mkdir -p /etc/ssl/private
sudo cp /etc/letsencrypt/live/hooks.domain.com/fullchain.pem /etc/ssl/private/hooks.fullchain.pem
sudo cp /etc/letsencrypt/live/hooks.domain.com/privkey.pem /etc/ssl/private/hooks.privkey.pem
sudo cp /etc/letsencrypt/live/miniapp.domain.com/fullchain.pem /etc/ssl/private/miniapp.fullchain.pem
sudo cp /etc/letsencrypt/live/miniapp.domain.com/privkey.pem /etc/ssl/private/miniapp.privkey.pem
sudo chmod 600 /etc/ssl/private/*.pem
4. Обновите docker-compose.yml
services:
nginx:
image: nginx:latest
container_name: nginx
ports:
- '80:80'
- '443:443'
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- /etc/ssl/private:/etc/ssl/private:ro
- /var/www/remnawave-miniapp:/var/www/remnawave-miniapp:ro
networks:
- remnawave-network
restart: unless-stopped
networks:
remnawave-network:
external: true
5. Запуск Nginx
docker compose up -d
6. Автообновление сертификатов
# Создайте скрипт обновления
sudo tee /opt/renew-certs.sh > /dev/null <<'EOF'
#!/bin/bash
# Останавливаем Nginx для освобождения порта 80
docker compose -f /путь/к/docker-compose.yml down
# Обновляем сертификаты
certbot renew --quiet
# Копируем обновленные сертификаты
cp /etc/letsencrypt/live/hooks.domain.com/fullchain.pem /etc/ssl/private/hooks.fullchain.pem
cp /etc/letsencrypt/live/hooks.domain.com/privkey.pem /etc/ssl/private/hooks.privkey.pem
cp /etc/letsencrypt/live/miniapp.domain.com/fullchain.pem /etc/ssl/private/miniapp.fullchain.pem
cp /etc/letsencrypt/live/miniapp.domain.com/privkey.pem /etc/ssl/private/miniapp.privkey.pem
chmod 600 /etc/ssl/private/*.pem
# Запускаем Nginx обратно
docker compose -f /путь/к/docker-compose.yml up -d
EOF
# Сделайте скрипт исполняемым
sudo chmod +x /opt/renew-certs.sh
# Добавьте в cron (запуск каждый день в 3:00 AM)
echo "0 3 * * * /opt/renew-certs.sh" | sudo crontab -
Проверка работы SSL
curl -I https://hooks.domain.com
curl -I https://miniapp.domain.com
Важно:
- Замените
domain.comиyour-email@example.comна свои данные - Замените
/путь/к/docker-compose.ymlна реальный путь к вашему docker-compose файлу - Убедитесь, что DNS записи для доменов указывают на IP вашего сервера
⚙️ Конфигурация
🔧 Основные параметры
| Настройка | Где взять | Пример |
|---|---|---|
| 🤖 BOT_TOKEN | @BotFather | 1234567890:AABBCCdd... |
| 👑 ADMIN_IDS | Твой Telegram ID | 123456789,987654321 |
| BOT_RUN_MODE | определяет способ приёма обновлений: polling или webhook. |
Полный список доступных параметров:
🌐 Интеграция веб-админки
Подробное пошаговое руководство по запуску административного веб-API и подключению внешней панели находится в docs/web-admin-integration.md.
🤖 Режимы запуска бота
BOT_RUN_MODE— определяет способ приёма обновлений:pollingилиwebhook.WEBHOOK_SECRET_TOKEN— секрет для проверки заголовкаX-Telegram-Bot-Api-Secret-Tokenпри работе через вебхуки.WEBHOOK_DROP_PENDING_UPDATES— управляет очисткой очереди сообщений при установке вебхука.WEBHOOK_MAX_QUEUE_SIZE— ограничивает длину очереди входящих обновлений, чтобы защащаться от перегрузок.WEBHOOK_WORKERS— количество фоновых воркеров, параллельно обрабатывающих обновления Telegram.WEBHOOK_ENQUEUE_TIMEOUT— сколько секунд ждать свободного места в очереди перед отказом (0 — немедленный отказ).WEBHOOK_WORKER_SHUTDOWN_TIMEOUT— таймаут корректного завершения воркеров при остановке приложения.
📱 Telegram Mini App ЛК
Инструкция по развёртыванию мини-приложения, публикации статической страницы и настройке reverse-proxy доступна в docs/miniapp-setup.md.
Путь к статическим файлам мини-приложения можно переопределить через переменную MINIAPP_STATIC_PATH.
📊 Статус серверов в главном меню
| Переменная | Описание | Пример |
|---|---|---|
SERVER_STATUS_MODE |
Режим работы кнопки: disabled, external_link, external_link_miniapp или xray |
xray |
SERVER_STATUS_EXTERNAL_URL |
Прямаяссылка на внешний мониторинг | https://status.example.com |
SERVER_STATUS_METRICS_URL |
URL страницы метрик XrayChecker | https://sub.example.com/metrics |
🛡️ Защита панели Remnawave
Для панелей, защищенных через remnawave-reverse-proxy:
# Для панелей установленных скриптом eGames
REMNAWAVE_SECRET_KEY=XXXXXXX:DDDDDDDD
# Или если ключ и значение одинаковые
REMNAWAVE_SECRET_KEY=secret_key_name
📡 Вебхуки Remnawave (real-time события)
Бот может принимать входящие вебхуки от панели Remnawave для мгновенной реакции на события подписок. Это значительно улучшает скорость обновления данных по сравнению с периодической синхронизацией.
Поддерживаемые события
| Событие | Описание |
|---|---|
user.expired |
Подписка истекла |
user.disabled |
Подписка деактивирована |
user.enabled |
Подписка активирована |
user.limited |
Превышен лимит трафика |
user.traffic_reset |
Трафик сброшен |
user.modified |
Данные подписки изменены (трафик, дата, URL) |
user.deleted |
Пользователь удалён |
user.revoked |
Ключи подписки отозваны |
user.created |
Пользователь создан |
user.expires_in_* |
Предупреждения об истечении (72ч, 48ч, 24ч) |
user.first_connected |
Первое подключение |
user.bandwidth_usage_threshold_reached |
Порог трафика достигнут |
user_hwid_devices.* |
Устройство добавлено/удалено |
node.*, service.* |
Административные события (ноды, сервис) |
Настройка
1. Переменные окружения в .env:
REMNAWAVE_WEBHOOK_ENABLED=true
REMNAWAVE_WEBHOOK_PATH=/remnawave-webhook
REMNAWAVE_WEBHOOK_SECRET=your_secret_min_32_chars_here
Сгенерируйте секрет:
openssl rand -hex 32
2. Настройка в панели Remnawave:
В env панели Remnawave заполните:
- URL:
https://hooks.domain.com/remnawave-webhook - Secret: тот же секрет, что и в
REMNAWAVE_WEBHOOK_SECRET
3. Настройка прокси:
Добавьте путь /remnawave-webhook в конфигурацию обратного прокси.
Caddy:
handle /remnawave-webhook {
reverse_proxy remnawave_bot:8080 {
header_up Host {host}
header_up X-Real-IP {remote_host}
transport http {
read_buffer 0
}
}
}
Nginx:
location = /remnawave-webhook {
proxy_pass http://remnawave_bot_unified;
proxy_set_header Host $host;
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_read_timeout 120s;
proxy_send_timeout 120s;
proxy_buffering off;
proxy_request_buffering off;
}
4. Проверка работоспособности:
# Health-check (GET запрос)
curl -s https://hooks.domain.com/remnawave-webhook | jq
# Ожидаемый ответ:
# {"status": "ok", "service": "remnawave_webhook", "enabled": true}
Важно:
- Секрет должен быть не менее 32 символов
- Бот верифицирует подпись
X-Remnawave-Signature(HMAC-SHA256) для каждого запроса - При включённых вебхуках бот автоматически защищает подписки от перезаписи данными из периодической синхронизации в течение 60 секунд после получения события
- Если бот и панель на одном сервере, URL вебхука может быть
http://remnawave_bot:8080/remnawave-webhook(внутри Docker-сети)
💳 Freekassa
Платёжный провайдер Freekassa поддерживает NSPK СБП и банковские карты.
FREEKASSA_ENABLED=true
FREEKASSA_SHOP_ID=12345
FREEKASSA_API_KEY=your_api_key
FREEKASSA_SECRET_WORD_1=secret1
FREEKASSA_SECRET_WORD_2=secret2
FREEKASSA_USE_API=true
FREEKASSA_PAYMENT_SYSTEM_ID=44 # 44 = NSPK СБП, 42 = обычный СБП
Важно:
FREEKASSA_USE_API=true- использовать API для создания заказов (рекомендуется для NSPK)FREEKASSA_USE_API=false- редирект на платежную формуFREEKASSA_PAYMENT_SYSTEM_ID=44- для NSPK СБП (быстрее и надежнее)- Настройте webhook на
https://your-domain.com/freekassa-webhook
💳 CloudPayments
Платёжный провайдер CloudPayments поддерживает оплату банковскими картами и СБП.
CLOUDPAYMENTS_ENABLED=true
CLOUDPAYMENTS_PUBLIC_ID=pk_xxxxxxxxxxxxx
CLOUDPAYMENTS_API_SECRET=your_api_secret
CLOUDPAYMENTS_CURRENCY=RUB
Важно:
CLOUDPAYMENTS_PUBLIC_ID- Public ID из личного кабинета CloudPaymentsCLOUDPAYMENTS_API_SECRET- API Secret для подписи запросов- Настройте webhook (Pay/Fail уведомления) на
https://your-domain.com/cloudpayments-webhook - Поддерживает 3D-Secure для безопасных платежей
💳 Platega.io
Платёжный провайдер Platega.io добавляет ещё один способ приёма оплат картой и по СБП. Включите его, если у вас есть кабинет мерчанта и доступ к API.
- В кабинете Platega получите
Merchant IDиSecret(раздел Интеграция → API). - В настройках провайдера укажите URL возврата и ошибки. Их можно задать в
.env(PLATEGA_RETURN_URL,PLATEGA_FAILED_URL). - Активируйте только нужные платёжные методы и пропишите их ID через запятую в
PLATEGA_ACTIVE_METHODS. - Добавьте вебхук
https://your-domain.com/platega-webhookв личном кабинете Platega.
Пример набора переменных окружения:
PLATEGA_ENABLED=true
PLATEGA_MERCHANT_ID=your_merchant_id
PLATEGA_SECRET=your_secret_key
PLATEGA_RETURN_URL=https://your-domain.com/payments/success
PLATEGA_FAILED_URL=https://your-domain.com/payments/failed
PLATEGA_ACTIVE_METHODS=2,10,11
PLATEGA_MIN_AMOUNT_KOPEKS=100
PLATEGA_MAX_AMOUNT_KOPEKS=5000000
PLATEGA_CURRENCY=RUB
PLATEGA_WEBHOOK_PATH=/platega-webhook
Остальные параметры (PLATEGA_BASE_URL, PLATEGA_WEBHOOK_HOST, PLATEGA_WEBHOOK_PORT) оставьте по умолчанию, если работаете через встроенный FastAPI сервер.
📊 Режимы продажи трафика
Выбираемые пакеты (по умолчанию)
TRAFFIC_SELECTION_MODE=selectable
TRAFFIC_PACKAGES_CONFIG="5:2000:false,10:3500:false,25:7000:false,50:11000:true,100:15000:true,250:17000:false,500:19000:false,1000:19500:true,0:20000:true"
Фиксированный лимит
TRAFFIC_SELECTION_MODE=fixed
FIXED_TRAFFIC_LIMIT_GB=100 # 0 = безлимит
TRAFFIC_PACKAGES_CONFIG="100:15000:true"
🎯 Режим тарифов
Альтернативный режим продаж с готовыми тарифными планами:
# Включение режима тарифов
SALES_MODE=tariffs # classic | tariffs
# Тарифы настраиваются в админ-панели бота
# Каждый тариф содержит: название, период, трафик, устройства, серверы, цену
Преимущества режима тарифов:
- Готовые пакеты без сложного выбора параметров
- Упрощенный UX для пользователей
- Возможность создавать акционные тарифы
- Поддержка скидок промогрупп на тарифы
💰 Система ценообразования
Цена подписки рассчитывается по формуле: Базовая цена + Стоимость трафика + Доп. устройства + Доп. серверы
Пример расчета для подписки на 180 дней:
- Базовый период: 400₽
- Трафик безлимит: 200₽/мес × 6 мес = 1200₽
- 4 устройства: 50₽/мес × 6 мес = 300₽
- 2 сервера: 100₽/мес × 6 мес = 1200₽
- Итого: 3100₽
📱 Управление устройствами
# Бесплатные устройства в триал подписке
TRIAL_DEVICE_LIMIT=1
# Требовать оплату за активацию триала
TRIAL_PAYMENT_ENABLED=false
# Стоимость активации триала (в копейках)
TRIAL_ACTIVATION_PRICE=0
# Бесплатные устройства в платной подписке
DEFAULT_DEVICE_LIMIT=3
# Максимум устройств для покупки (0 = без лимита)
MAX_DEVICES_LIMIT=15
💥 Реферальная система
# Включение/выключение реферальной программы
REFERRAL_PROGRAM_ENABLED=true
# Минимальная сумма пополнения для активации бонусов
REFERRAL_MINIMUM_TOPUP_KOPEKS=10000
# Бонус новому пользователю при первом пополнении
REFERRAL_FIRST_TOPUP_BONUS_KOPEKS=10000
# Бонус пригласившему при первом пополнении реферала
REFERRAL_INVITER_BONUS_KOPEKS=10000
# Процент комиссии с последующих пополнений
REFERRAL_COMMISSION_PERCENT=25
🔄 Автосинхронизация Remnawave
# Включение автоматической синхронизации серверов
REMNAWAVE_AUTO_SYNC_ENABLED=true
# Время синхронизации (через запятую, формат HH:MM)
REMNAWAVE_AUTO_SYNC_TIMES=03:00,15:00
🛡️ Мониторинг и техническое обслуживание
# Автоматический режим тех. работ
MAINTENANCE_MODE=false
MAINTENANCE_AUTO_ENABLE=true
MAINTENANCE_MONITORING_ENABLED=true
MAINTENANCE_CHECK_INTERVAL=30
MAINTENANCE_RETRY_ATTEMPTS=1
# Интервал проверки состояния панели (секунды)
MONITORING_INTERVAL=60
🛒 Умная корзина
# Redis для сохранения корзины (требуется)
REDIS_URL=redis://redis:6379/0
🎮 Конкурсы и игры
# Видимость кнопки конкурсов в главном меню
CONTEST_BUTTON_VISIBLE=true
# Конкурсы и ежедневные игры настраиваются в админ-панели
# Типы призов: баланс, дни подписки, промогруппа
Возможности системы конкурсов:
- Реферальные конкурсы с рейтингами
- Ежедневные игры с гарантированными призами
- Детальная статистика участников
- Гибкая настройка призов (баланс, подписка, промогруппа)
🚫 Система ограничений пользователей
# Управление ограничениями через админ-панель
# Типы ограничений: покупка, триал, пополнение баланса
Позволяет блокировать отдельные функции для пользователей без полной блокировки аккаунта.
📝 Ротация логов
# Настройка ротации логов
LOG_ROTATION_ENABLED=true
LOG_ROTATION_MAX_SIZE_MB=100
LOG_ROTATION_MAX_FILES=10
👁️ Управление видимостью
# Скрытие кнопок пополнения баланса
HIDE_TOPUP_BUTTONS=false
# Скрытие реферальной программы
REFERRAL_PROGRAM_VISIBLE=true
# Видимость кнопки конкурсов
CONTEST_BUTTON_VISIBLE=true
⭐ Функционал
💤 Для пользователей🧭 Онбординг и доступ
🛒 Умная покупка подписок
🧪 Тестовая подписка
💰 Платежи и баланс
📱 Управление подписками
🛟 Поддержка и самообслуживание
🧩 Бонусы и промо
🎮 Конкурсы и игры
💎 Промо-группы и скидки
📱 Mini App и гайды
|
⚙️ Для администраторов📊 Аналитика и отчётность
💥 Управление пользователями
🎯 Продажи, маркетинг и удержание
🛟 Поддержка и модерация
🔔 Уведомления и коммуникации
🧰 Обслуживание и DevOps
🗄️ Бекапы и восстановление
💳 Биллинг и настройки
⚙️ Remnawave
🗃️ REST API для интеграций
|
🤖 Автоматизация и экосистема
- 🔄 Мониторинг Remnawave - регулярная проверка API, автоматическое включение/выключение техработ
- 🔄 Автосинхронизация серверов - фоновая синхронизация по расписанию
- 🛒 Умная корзина - сохранение параметров подписки в Redis при недостатке баланса
- 🛡️ Антифрод - валидация подписки на канал
- 🚫 Защита от блокировок - автоблокировка подозрительных никнеймов и имитация фишинг аккаунтов
- 🧠 Асинхронная архитектура - aiogram 3, PostgreSQL/SQLite, Redis и очереди задач
- 🌐 Мультиязычность - локализации RU/EN, быстрый выбор языка
- 📦 Интеграция с Remnawave API - автоматическое создание пользователей и синхронизация
- 🔄 Миграция сквадов - массовый перенос пользователей между сквадами
- 🧾 История операций - хранение всех транзакций и действий для аудита
- 💸 Сервис автопроверки транзакций - автоматическая проверка транзакций в статусе "В ожидании оплаты" за последние 24ч
- 📝 Ротация логов - автоматическая очистка и архивация старых логов
- 🎮 Система конкурсов - ежедневные игры и реферальные конкурсы с призами
🌐 Веб-API и мини-приложение
- ⚙️ FastAPI Web API с эндпоинтами для управления всеми аспектами бота
- 🔒 Управление API-ключами - выпуск, отзыв, реактивация токенов
- 🛰️ Mini App - полноценный личный кабинет внутри Telegram
- 💳 Интегрированные платежи в Mini App (Stars, Pal24, YooKassa, WATA, Freekassa, CloudPayments)
- 🧭 Единый стандартный app-config.json - централизованная раздача ссылок на клиенты
- 🪙 Платёжные вебхуки - встроенные серверы для всех платёжных систем
- 📡 Мониторинг серверов - REST-эндпоинты для просмотра нод и статистики
🚀 Производительность
| Пользователей | Память | CPU | Диск | Описание |
|---|---|---|---|---|
| 1,000 | 512MB | 1 vCPU | 10GB | ✅ Стартап |
| 10,000 | 2GB | 2 vCPU | 50GB | ✅ Малый бизнес |
| 50,000 | 4GB | 4 vCPU | 100GB | ✅ Средний бизнес |
| 100,000+ | 8GB+ | 8+ vCPU | 200GB+ | 🚀 Enterprise |
🗃️ Технологический стек
💪 Современные технологии
- 🐍 Python 3.13+ с AsyncIO - максимальная производительность
- 🗄️ PostgreSQL 15+ - надежное хранение данных
- ⚡ Redis - быстрое кеширование и сессии (для корзины)
- Docker - простое развертывание в любой среде
- 🔗 SQLAlchemy ORM - безопасная работа с БД
- 🚀 aiogram 3 - современная Telegram Bot API
- ⚡ FastAPI - высокопроизводительный REST API
- 📦 Pydantic v2 - валидация данных
🔧 Первичная настройка
После запуска необходимо:
-
📡 Синхронизация серверов (обязательно!)
- Зайди в бот → Админ панель → Подписки → Управление серверами
- Нажми Синхронизация и дождись завершения
- Без этого пользователи не смогут выбирать страны!
-
💥 Синхронизация пользователей (если есть база)
- Админ панель → Remnawave → Синхронизация
- Синхронизировать всех → дождись импорта
-
💳 Настройка платежных систем
- Telegram Stars: Работает автоматически
- Tribute: Настрой webhook на
https://your-domain.com/tribute-webhook - YooKassa: Настрой webhook на
https://your-domain.com/yookassa-webhook - CryptoBot: Настрой webhook на
https://your-domain.com/cryptobot-webhook - Heleket: Настрой webhook на
https://your-domain.com/heleket-webhook - MulenPay: Настрой webhook на
https://your-domain.com/mulenpay-webhook - PayPalych: Укажи Result URL
https://your-domain.com/pal24-webhookв кабинете Pal24 - Platega: Настрой webhook на
https://your-domain.com/platega-webhook - WATA: Настрой webhook на
https://your-domain.com/wata-webhook - Freekassa: Настрой webhook на
https://your-domain.com/freekassa-webhook - CloudPayments: Настрой Pay/Fail уведомления на
https://your-domain.com/cloudpayments-webhook
-
🔄 Настройка автосинхронизации (опционально)
- В
.envустановиREMNAWAVE_AUTO_SYNC_ENABLED=true - Укажи время синхронизации в
REMNAWAVE_AUTO_SYNC_TIMES=03:00,15:00
- В
🛠️ Настройка уведомлений в топик группы
1. Переменные окружения
Добавьте в файл .env:
# Уведомления администраторов
ADMIN_NOTIFICATIONS_ENABLED=true
ADMIN_NOTIFICATIONS_CHAT_ID=-1001234567890 # ID канала/группы
ADMIN_NOTIFICATIONS_TOPIC_ID=123 # ID топика (опционально)
ADMIN_NOTIFICATIONS_TICKET_TOPIC_ID=126 # ID топика для тикетов
2. Создание канала
- Создайте приватный канал или группу для уведомлений
- Добавьте бота как администратора с правами отправки сообщений
- Получите ID канала:
- Отправьте любое сообщение в канал
- Перешлите его боту @userinfobot
- Скопируйте Chat ID (например:
-1001234567890)
3. Настройка топиков (опционально)
Если используете супергруппу с топиками:
- Включите топики в настройках группы
- Создайте топики для уведомлений (например, "Уведомления", "Тикеты")
- Получите ID топика из URL веб-версии Telegram или используйте бота
🛠 Устранение неполадок
🥼 Health Checks
- Unified сервер:
http://localhost:8080/health/unified(или/health, если административное API отключено) - Telegram webhook:
http://localhost:8080/health/telegram-webhook - Платёжные webhooks:
http://localhost:8080/health/payment-webhooks
🔧 Полезные команды
# Просмотр логов в реальном времени
docker compose logs -f bot
# Статус всех контейнеров
docker compose ps
# Перезапуск только бота
docker compose restart bot
# Проверка базы данных
docker compose exec postgres pg_isready -U remnawave_user
# Подключение к базе данных
docker compose exec postgres psql -U remnawave_user -d remnawave_bot
# Проверка Redis
docker compose exec redis redis-cli ping
# Проверка использования ресурсов
docker stats
# Очистка Docker
docker system prune
🚨 Частые проблемы и решения
| Проблема | Диагностика | Решение |
|---|---|---|
| Бот не отвечает | docker logs remnawave_bot |
Проверь BOT_TOKEN и интернет |
| Ошибки БД | docker compose ps postgres |
Проверь статус PostgreSQL |
| Webhook не работает | curl http://localhost:8080/health/telegram-webhook |
Проверь WEBHOOK_URL, прокси и секрет |
| API недоступен | Проверь логи бота | Проверь REMNAWAVE_API_URL |
| Корзина не сохраняется | docker compose ps redis |
Проверь статус Redis |
| Платежи не проходят | Проверь webhook'и | Настрой URL в платежных системах |
💡 Использование
💤 Для пользователей
- 🚀 Старт → Найди бота и нажми
/start - 🌐 Язык → Выбери язык интерфейса (RU/EN)
- 📋 Правила → Прими правила сервиса
- 💰 Баланс → Пополни через любой удобный способ
- 🛒 Подписка → Выбери тариф и параметры
- 📱 Подключение → Получи ссылку или конфиг
- 💥 Партнерка → Поделись ссылкой и получай бонусы
⚙️ Для администраторов
Доступ через "⚙️ Админ панель":
- 📦 Подписки → настройка серверов, цен, синхронизация
- 💥 Пользователи → поиск, редактирование, блокировка
- 💎 Промо-группы → управление скидочными группами и уровнями
- 🎁 Промокоды → создание и статистика
- 🎯 Промо-предложения → персональные акции и скидки
- 📨 Рассылки → уведомления по сегментам
- 📣 Кампании → управление рекламными кампаниями
- 🎫 Тикеты → система поддержки
- 🔄 Контент → политика, оферта, FAQ
- 🖥 Remnawave → мониторинг, синхронизация
- 📊 Статистика → детальная аналитика
🛡️ Безопасность
🔍 Защита панели Remnawave
Бот поддерживает интеграцию с системой защиты панели:
# Для защищенных панелей
REMNAWAVE_SECRET_KEY=secret_name:secret_value
# Для панелей eGames скрипта
REMNAWAVE_SECRET_KEY=XXXXXXX:DDDDDDDD
🔒 Дополнительные меры безопасности
- Валидация всех входящих данных
- Rate limiting для защиты от спама
- Шифрование чувствительных данных
- Автоматическое управление сессиями
- Мониторинг подозрительной активности
- Защита от запрещенных никнеймов - автоблокировка имитации официальных аккаунтов
- Защита от обфусцированных доменов в отображаемом имени
🤝 Как помочь проекту
- 🐛 Сообщай о багах с подробным описанием
- 💡 Предлагай идеи для улучшения
- ⭐ Ставь звезды проекту - это мотивирует разработку!
- 📢 Рассказывай друзьям о проекте
- 👍 Поддержи разработку - помоги проекту расти
- 🔧 Отправляй Pull Requests - внеси свой вклад в код
💬 Поддержка и сообщество
📞 Контакты
- 💬 Telegram: @fringg - вопросы по разработке (только по делу!)
- 💬 Telegram Group: Bedolaga Chat - общение, вопросы, предложения
- 🐛 Issues: GitHub Issues - баги и предложения
📚 Полезные ресурсы
- 📖 https://docs.remna.st)) - документация панели
- 🤖 Telegram Bot API - API ботов
- 🐳 Docker Guide - обучение Docker
- 🛡️ Reverse Proxy - защита панели
🎉 Сообщество
- Remnawave Team - за отличную панель и стабильный API
- Сообщество Bedolaga - за активное тестирование и обратную связь
- Всем пользователям - за доверие и использование бота
📋 Roadmap
🚧 В разработке
- 🌎 Веб-панель - полноценная административная панель
- 🔄 API для интеграций - подключение внешних сервисов
- 🎨 Темы оформления - Новая тема интерфейса Mini App by https://t.me/arpicme
📄 Лицензия
Проект распространяется под лицензией MIT
🚀 Начни уже сегодня!
🧪 Протестируй бота |
💬 Присоединись к сообществу |
⭐ Поставь звезду |
💝 Поддержи проект |
📈 Статистика проекта
🎯 Ключевые особенности в цифрах
| Метрика | Значение |
|---|---|
| 💳 Платёжных систем | 11 (Stars, YooKassa, Tribute, CryptoBot, Heleket, MulenPay, Pal24, Platega, WATA, Freekassa, CloudPayments) |
| 🌍 Языков интерфейса | 2 (RU, EN) с возможностью расширения |
| 📊 Периодов подписки | 6 (от 14 дней до года) |
| 🎁 Типов промо-акций | 5 (коды, группы, предложения, скидки, кампании) |
| 🔌 REST API эндпоинтов | 50+ для полного управления |
| 📱 Режимов работы | 3 (классический + тарифы + MiniApp focus) |
| 🛡️ Методов авторизации | 4 (API Key, Bearer, Basic Auth, eGames) |
| 🗄️ Способов хранения | 2 (PostgreSQL, SQLite) с автовыбором |
🔥 Почему выбирают Bedolaga?
💼 Для бизнеса
✅ Быстрый запуск - от установки до первых продаж за 10 минут
✅ Полная автоматизация - бот работает 24/7 без вашего участия
✅ Прозрачная аналитика - всегда знаете, сколько зарабатываете
✅ Гибкие тарифы - настройте цены под свою аудиторию
✅ Система лояльности - удерживайте клиентов промо-группами и скидками
✅ Масштабируемость - от 10 до 100,000+ пользователей
🛠️ Для разработчиков
✅ Современный стек - Python 3.13, AsyncIO, PostgreSQL, Redis
✅ Модульная архитектура - легко расширять и модифицировать
✅ Полное API - интегрируйте с любыми сервисами
✅ Docker-ready - разворачивается за минуты
✅ Подробная документация - все описано и понятно
✅ Активное сообщество - помощь в Telegram чате
👥 Для пользователей
✅ Простой интерфейс - интуитивно понятное меню на родном языке
✅ Много способов оплаты - выбирайте удобный вариант
✅ Быстрая поддержка - система тикетов с приоритетами
✅ Прозрачность - всегда видите, за что платите
✅ Бонусы и скидки - реферальная программа и промо-акции
✅ Удобное управление - все в одном месте, в Telegram
💡 Советы по оптимизации
⚡ Повышение производительности
- Используйте Redis для корзины и кэширования
- Настройте автосинхронизацию в ночное время
- Включите автобэкапы с отправкой в Telegram
- Оптимизируйте логирование - LOG_LEVEL=INFO для продакшена
- Используйте PostgreSQL вместо SQLite для больших баз
💰 Увеличение продаж
- Включите реферальную программу - пользователи приведут друзей
- Настройте промо-группы - дайте скидки постоянным клиентам
- Используйте персональные акции - реактивируйте неактивных
- Запускайте кампании - привлекайте новых через deeplink
- Добавьте быстрое пополнение - упростите процесс оплаты
🎯 Улучшение UX
- Включите Mini App режим - современный интерфейс
- Настройте корзину - пользователи не потеряют выбор
- Добавьте FAQ - ответьте на частые вопросы заранее
- Настройте быстрые ответы - ускорьте поддержку
- Используйте уведомления - держите пользователей в курсе
🔐 Безопасность и соответствие
🛡️ Защита данных
- ✅ Шифрование чувствительных данных в БД
- ✅ Безопасное хранение токенов и ключей
- ✅ Валидация всех входящих данных
- ✅ Защита от SQL-инъекций через ORM
- ✅ Rate limiting для предотвращения злоупотреблений
- ✅ Аудит всех административных действий
📋 Юридическое соответствие
- ✅ Политика конфиденциальности (настраивается)
- ✅ Публичная оферта (настраивается)
- ✅ Правила использования (настраивается)
- ✅ История транзакций для аудита
- ✅ Соответствие требованиям платёжных систем
- ✅ GDPR-ready (возможность удаления данных)
📞 Нужна помощь?
🆘 Частые вопросы
Какие требования к серверу?
Минимальные:
- 1 vCPU
- 512 MB RAM
- 10 GB диск
- Ubuntu 20.04+ или Debian 11+
- Docker и Docker Compose
Рекомендуемые:
- 2+ vCPU
- 2+ GB RAM
- 50+ GB SSD
- Стабильное интернет-соединение
Как настроить платёжную систему?
- Получите ключи API в личном кабинете платёжной системы
- Добавьте их в
.envфайл - Настройте webhook URL в кабинете провайдера
- Протестируйте через админ-панель бота
- Включите метод для пользователей
Подробнее: docs/payment-setup.md
Как обновить бота?
Вручную:
cd /root/remnawave-bedolaga-telegram-bot
# Обновление до последнего коммита (до последней мастер ветки, не всегда стабильно):
git pull origin main
# Обновление до конкретной версии (более стабильно, релиз версии):
git fetch --tags
git checkout v2.7.0
# Перезагружаем конты:
make reload
# Перезагружаем конты с логами:
make reload-follow
Скрипт автоматически создаст бэкап перед обновлением!
Как сделать бэкап?
Автоматически:
- Настройте в
.env:BACKUP_AUTO_ENABLED=true - Бэкапы создаются по расписанию
Через админ-панель:
- Админ панель → Настройки → Бэкапы → Создать
Бот не отвечает, что делать?
- Проверьте статус:
docker compose ps - Посмотрите логи:
docker compose logs -f bot - Проверьте BOT_TOKEN в
.env - Убедитесь, что все контейнеры запущены
- Попробуйте перезапустить:
docker compose restart
Если не помогло - пишите в чат поддержки
💬 Куда обратиться?
- 🐛 Баг? → GitHub Issues
- 💡 Идея? → GitHub Discussions
- 🆘 Вопрос? → Bedolaga Chat
- 📧 Личное? → @fringg
Made with ❤️ by @fringg and amazing contributors