Fringg ebd6bee05e feat: allow tariff deletion with active subscriptions
Remove blocking check that prevented tariff deletion when subscriptions
exist. DB schema already supports SET NULL on tariff FK, so subscriptions
gracefully become "legacy" and users pick a new tariff on renewal.
Return affected_subscriptions count in API response.
2026-02-09 22:30:26 +03:00
2025-09-09 04:30:52 +03:00
2025-08-23 11:41:20 +03:00
2025-10-12 02:47:46 +03:00
2026-02-08 20:35:58 +00:00
2025-09-13 10:19:21 +03:00
2026-02-08 20:35:58 +00:00
2025-12-21 02:54:58 +03:00

🚀 Remnawave Bedolaga Bot

🆕 Новый веб-кабинет (Cabinet WebApp) https://github.com/BEDOLAGA-DEV/bedolaga-cabinet/

Вышла новая версия личного кабинета пользователя — веб-интерфейс для управления подписками!

Переменные окружения для Cabinet:

Переменная Описание По умолчанию
CABINET_ENABLED Включить личный кабинет false
CABINET_JWT_SECRET Секретный ключ для JWT токенов BOT_TOKEN
CABINET_ACCESS_TOKEN_EXPIRE_MINUTES Время жизни access token (минуты) 15
CABINET_REFRESH_TOKEN_EXPIRE_DAYS Время жизни refresh token (дни) 7
CABINET_ALLOWED_ORIGINS Разрешённые origins для CORS
CABINET_EMAIL_VERIFICATION_ENABLED Включить верификацию email false
CABINET_EMAIL_VERIFICATION_EXPIRE_HOURS Время жизни токена верификации email (часы) 24
CABINET_PASSWORD_RESET_EXPIRE_HOURS Время жизни токена сброса пароля (часы) 1

Для работы email-уведомлений настройте SMTP-переменные: SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASSWORD, SMTP_FROM_EMAIL, SMTP_FROM_NAME, SMTP_USE_TLS.

Image

🤖 Современный Telegram-бот для управления VPN подписками через Remnawave API

Полнофункциональное решение с управлением пользователями, платежами и администрированием

Python PostgreSQL License GitHub Stars

🚀 Быстрый старт📖 Функционал🳠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 32
  • WEB_API_DEFAULT_TOKEN - сгенерируйте командой openssl rand -hex 32
  • WEBHOOK_URL должен быть доступен извне по HTTPS
  • WEB_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
            }
        }
    }

    # 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;
        }

        # 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

💳 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 из личного кабинета CloudPayments
  • CLOUDPAYMENTS_API_SECRET - API Secret для подписи запросов
  • Настройте webhook (Pay/Fail уведомления) на https://your-domain.com/cloudpayments-webhook
  • Поддерживает 3D-Secure для безопасных платежей

💳 Platega.io

Платёжный провайдер Platega.io добавляет ещё один способ приёма оплат картой и по СБП. Включите его, если у вас есть кабинет мерчанта и доступ к API.

  1. В кабинете Platega получите Merchant ID и Secret (раздел Интеграция → API).
  2. В настройках провайдера укажите URL возврата и ошибки. Их можно задать в .env (PLATEGA_RETURN_URL, PLATEGA_FAILED_URL).
  3. Активируйте только нужные платёжные методы и пропишите их ID через запятую в PLATEGA_ACTIVE_METHODS.
  4. Добавьте вебхук 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

Функционал

💤 Для пользователей

🧭 Онбординг и доступ

  • 🌐 Выбор языка интерфейса (RU/EN), динамическая локализация
  • 📜 Принятие правил, оферты и политики конфиденциальности
  • 📡 Проверка подписки на обязательный канал
  • 🔗 Deeplink-инвайты, UTM-кампании и реферальные коды

🛒 Умная покупка подписок

  • 📅 Гибкие периоды (14—360 дней) со скидками
  • 📊 Выбор трафика: фиксированный лимит, пакеты или безлимит
  • 🌐 Автоматический выбор сервера или мультивыбор
  • 📱 Настройка количества устройств и серверов
  • 🧾 Динамический калькулятор стоимости
  • 💾 Сквозная корзина - сохранение параметров при недостатке баланса
  • ↩️ Быстрый возврат к оформлению после пополнения
  • 🎯 Режим тарифов - готовые пакеты без сложного выбора
  • 🛒 Простая покупка - упрощенный режим для быстрого оформления

🧪 Тестовая подписка

  • 🎁 Гибко настраиваемый триал и welcome-цепочка
  • 🔔 Уведомления об истечении и автоконверсия
  • 💎 Автовыдача бонусов за кампании и инвайты
  • 🛡️ Контроль обязательной подписки на канал (отключает подписку при отписке)
  • 💎 Автовыдача сквада из пула выбранных
  • 💳 Платный триал с выбором способа оплаты

💰 Платежи и баланс

  • Telegram Stars
  • 💳 Tribute
  • 💳 YooKassa (СБП + банковские карты)
  • 💰 CryptoBot (USDT, TON, BTC, ETH и др.)
  • 🪙 Heleket (криптовалюта с наценкой)
  • 💳 MulenPay (СБП)
  • 🦐 PayPalych/Pal24 (СБП + карты)
  • 💳 Platega (СБП + банковские карты)
  • 💳 WATA
  • 💳 Freekassa (NSPK СБП + карты)
  • 💳 CloudPayments (карты + СБП)
  • 🔥 Автогенерация счетов и webhook-уведомления
  • 💼 История операций
  • 🔄 Автоплатёж с настройкой дня списания
  • 🎁 Реферальные и промо-бонусы
  • Быстрое пополнение с кнопками быстрых сумм

📱 Управление подписками

  • 📈 Реальный трафик, устройства и серверы
  • 🌐 Переключение серверов и стран
  • 📱 Сброс HWID
  • 🧩 Смена языка, промогруппы и параметров
  • 🧾 Просмотр активных услуг и статуса
  • 🔗 Получение ссылок подключения в один клик
  • 📡 Модем-режим - дополнительные устройства для модемов

🛟 Поддержка и самообслуживание

  • 🎫 Система тикетов с вложениями
  • 📚 FAQ, правила, оферта и политика
  • 💬 Быстрые ссылки на поддержку

🧩 Бонусы и промо

  • 🎫 Промокоды на деньги, дни, триал подписку, промогруппу
  • 🎁 Персональные промо-предложения от админов
  • 💰 Тестовый доступ к серверам через промо-акции
  • 💸 Автоматические скидки при оплате и автопродлении
  • 💥 Реферальная программа с комиссиями и бонусами
  • 📊 Аналитика доходов и конверсии рефералов
  • 🔗 Генерация реферальных ссылок и QR кодов

🎮 Конкурсы и игры

  • 🎲 Ежедневные игры с призами (баланс, подписка, промогруппа)
  • 🏆 Реферальные конкурсы с рейтингами и наградами
  • 📊 Детальная статистика участия в конкурсах
  • 🎁 Разнообразные призы - баланс, дни подписки, промогруппы

💎 Промо-группы и скидки

  • 🏷️ Система промогрупп с индивидуальными скидками с приоритетами
  • 💰 Скидки на серверы, трафик и устройства
  • 📊 Скидочные уровни за траты - прозрачная система лояльности
  • 📈 Автоматическое повышение уровня при достижении порога
  • 🎯 Скидки за длительные периоды подписки для базовых юзеров

📱 Mini App и гайды

  • 🖥️ Полноценный личный кабинет в Telegram WebApp
  • 📊 Управление подпиской и параметрами
  • 💳 Интегрированные платежи
  • 🎁 Активация промо-офферов и промокодов
  • 📱 Управление устройствами
  • 💥 Реферальная статистика
  • 📋 FAQ и юридические документы
  • 📥 Библиотека загрузочных ссылок для клиентов
  • 🛰️ Web API для внешних интеграций
  • 🎯 Отображение тарифа при режиме тарифов

⚙️ Для администраторов

📊 Аналитика и отчётность

  • 📈 Дашборды по пользователям, подпискам и трафику
  • 💰 Детализация платежей по всем источникам
  • 🧮 Продажи по тарифам, устройствам и странам
  • 📣 Эффективность кампаний, промокодов и UTM
  • 🎯 Статистика по промо-группам и скидочным уровням
  • 📊 Расширенная фильтрация пользователей (баланс, траты, активность, трафик)
  • 🏆 Топ рефереров по периодам с детальной аналитикой
  • 📡 Мониторинг трафика и выявление злоупотреблений

💥 Управление пользователями

  • 🔍 Поиск по ID, имени, юзернейму, Telegram ID и фильтры
  • 💰 Ручное изменение баланса
  • 📱 Изменение лимитов устройств, трафика, серверов
  • 🔄 Сброс HWID и перегенерация подписки
  • 🎯 Назначение промогрупп и тарифов
  • 💳 Покупка подписки пользователю прямо из админки
  • Продление/сокращение срока подписки (±365 дней)
  • 🚫 Блокировки с таймером и аудит действий
  • 🛡️ Защита от запрещенных никнеймов с настраиваемым список банвордов
  • 💰 Установка индивидуального реферального процента юзеру
  • 💬 Отправка сообщения конкретному пользователю
  • 🚫 Система ограничений - блокировка функций (покупка, триал, пополнение)
  • 📊 Расширенные фильтры - по балансу, тратам, трафику, активности
  • 🔄 Готовы к продлению - фильтр пользователей для продления
  • 🗑️ Черный список пользователей с управлением

🎯 Продажи, маркетинг и удержание

  • 🎫 Промокоды
  • 💳 Промо-группы со скидками
  • 🎁 Персональные промо-предложения с поиском получателей
  • 💸 Тестовые серверы - временная выдача доступа
  • 💰 Автоматические скидки при оплате
  • 📣 Рекламные кампании с deeplink и бонусами
  • 📨 Рассылки по сегментам с медиа и кнопками
  • 🎨 Кастомные кнопки для рассылок
  • 📘 Настройка главного меню и приветственных экранов
  • 🎮 Управление конкурсами - создание и настройка призов
  • 🎲 Ежедневные игры с настраиваемыми призами
  • 📊 Детальная статистика реферальных конкурсов
  • 👁️ Видимость кнопок - управление отображением конкурсов и реферальной программы

🛟 Поддержка и модерация

  • 🎫 Центр тикетов с приоритетами и статусами
  • ⏱️ SLA таймеры и автоуведомления
  • 🧑‍⚖️ Роли модераторов с ограниченным доступом
  • 📊 Детальный журнал всех операций
  • 🚫 Блокировки нарушителей
  • 🧾 История диалогов и быстрые ответы
  • 🔔 Уведомления об ответах на тикеты для админов

🔔 Уведомления и коммуникации

  • 📢 Топики для событий (покупки, триалы, техработы)
  • 🔔 Настройка уведомлений и расписаний
  • 📨 Управление контентом - политика, оферта, FAQ
  • 💬 Автоматические сообщения о задолженностях

🧰 Обслуживание и DevOps

  • 🚧 Ручной и авто-режим техработ
  • 🗒️ Просмотр системных логов и health-check
  • 🔄 Автосинхронизация Remnawave по расписанию и при старте бота
  • ♻️ Проверка обновлений репозитория
  • 📊 Мониторинг серверов (интеграция с XrayChecker)
  • 📝 Ротация логов - автоматическая очистка и архивация
  • 🔄 Массовая синхронизация пользователей с Remnawave

🗄️ Бекапы и восстановление

  • 🗓️ Умные автобекапы с гибким расписанием
  • 📦 Ручные бекапы с выбором содержимого
  • 📤 Отправка архивов в выделенный чат/топик
  • 🔓 Восстановление без остановки бота
  • Автоматическая синхронизация sequences после восстановления

💳 Биллинг и настройки

  • ⚙️ Управление ценами без перезапуска бота
  • 📘 Управление пакетами трафика (включение/отключение)
  • 🧪 Тестовые платежи для каждого провайдера
  • 🪙 Управление вебхуками всех платёжных систем
  • ⚙️ Управление настройками из бота (с приоритетом в .env)
  • 🎯 Режим тарифов - готовые планы с фиксированными параметрами
  • 🛒 Простая покупка подписки - упрощенный режим без выбора параметров
  • 👁️ Скрытие кнопок пополнения баланса
  • 👁️ Скрытие реферальной программы

⚙️ Remnawave

  • Синхронизация юзеров из панели в бота (Ручная/автоматическая по таймеру)
  • Синхронизация юзеров из бота в панель
  • Синхронизация сквадов(серверов) из панели в бота
  • Управление нодами/сквадами прямо в боте
  • Детальная статистика по нодам/панели
  • Создание/Редактивание сквадов в боте

🗃️ REST API для интеграций

  • 🔌 FastAPI Web API с полной документацией
  • 🔒 Управление API-ключами и токенами
  • 📊 Эндпоинты для подписок, пользователей, транзакций
  • 🎁 API промо-системы и рассылок
  • 📋 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 - валидация данных

🔧 Первичная настройка

После запуска необходимо:

  1. 📡 Синхронизация серверов (обязательно!)

    • Зайди в бот → Админ панельПодпискиУправление серверами
    • Нажми Синхронизация и дождись завершения
    • Без этого пользователи не смогут выбирать страны!
  2. 💥 Синхронизация пользователей (если есть база)

    • Админ панельRemnawaveСинхронизация
    • Синхронизировать всех → дождись импорта
  3. 💳 Настройка платежных систем

    • 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
  4. 🔄 Настройка автосинхронизации (опционально)

    • В .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. Создание канала

  1. Создайте приватный канал или группу для уведомлений
  2. Добавьте бота как администратора с правами отправки сообщений
  3. Получите ID канала:
    • Отправьте любое сообщение в канал
    • Перешлите его боту @userinfobot
    • Скопируйте Chat ID (например: -1001234567890)

3. Настройка топиков (опционально)

Если используете супергруппу с топиками:

  1. Включите топики в настройках группы
  2. Создайте топики для уведомлений (например, "Уведомления", "Тикеты")
  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 в платежных системах

💡 Использование

💤 Для пользователей

  1. 🚀 Старт → Найди бота и нажми /start
  2. 🌐 Язык → Выбери язык интерфейса (RU/EN)
  3. 📋 Правила → Прими правила сервиса
  4. 💰 Баланс → Пополни через любой удобный способ
  5. 🛒 Подписка → Выбери тариф и параметры
  6. 📱 Подключение → Получи ссылку или конфиг
  7. 💥 Партнерка → Поделись ссылкой и получай бонусы

⚙️ Для администраторов

Доступ через "⚙️ Админ панель":

  • 📦 Подписки → настройка серверов, цен, синхронизация
  • 💥 Пользователи → поиск, редактирование, блокировка
  • 💎 Промо-группы → управление скидочными группами и уровнями
  • 🎁 Промокоды → создание и статистика
  • 🎯 Промо-предложения → персональные акции и скидки
  • 📨 Рассылки → уведомления по сегментам
  • 📣 Кампании → управление рекламными кампаниями
  • 🎫 Тикеты → система поддержки
  • 🔄 Контент → политика, оферта, FAQ
  • 🖥 Remnawave → мониторинг, синхронизация
  • 📊 Статистика → детальная аналитика

🛡️ Безопасность

🔍 Защита панели Remnawave

Бот поддерживает интеграцию с системой защиты панели:

# Для защищенных панелей
REMNAWAVE_SECRET_KEY=secret_name:secret_value

# Для панелей eGames скрипта
REMNAWAVE_SECRET_KEY=XXXXXXX:DDDDDDDD

🔒 Дополнительные меры безопасности

  • Валидация всех входящих данных
  • Rate limiting для защиты от спама
  • Шифрование чувствительных данных
  • Автоматическое управление сессиями
  • Мониторинг подозрительной активности
  • Защита от запрещенных никнеймов - автоблокировка имитации официальных аккаунтов
  • Защита от обфусцированных доменов в отображаемом имени

🤝 Как помочь проекту


💬 Поддержка и сообщество

📞 Контакты

  • 💬 Telegram: @fringg - вопросы по разработке (только по делу!)
  • 💬 Telegram Group: Bedolaga Chat - общение, вопросы, предложения
  • 🐛 Issues: GitHub Issues - баги и предложения

📚 Полезные ресурсы


🎉 Сообщество

  • Remnawave Team - за отличную панель и стабильный API
  • Сообщество Bedolaga - за активное тестирование и обратную связь
  • Всем пользователям - за доверие и использование бота

📋 Roadmap

🚧 В разработке

  • 🌎 Веб-панель - полноценная административная панель
  • 🔄 API для интеграций - подключение внешних сервисов
  • 🎨 Темы оформления - Новая тема интерфейса Mini App by https://t.me/arpicme

📄 Лицензия

Проект распространяется под лицензией MIT

📜 Посмотреть лицензию


🚀 Начни уже сегодня!

🧪 Протестируй бота

Test Bot

💬 Присоединись к сообществу

Community

Поставь звезду

Star

💝 Поддержи проект

Donate

📈 Статистика проекта

GitHub stars GitHub forks GitHub watchers

GitHub last commit GitHub commit activity GitHub contributors

GitHub issues GitHub pull requests GitHub closed issues


🎯 Ключевые особенности в цифрах

Метрика Значение
💳 Платёжных систем 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


💡 Советы по оптимизации

Повышение производительности

  1. Используйте Redis для корзины и кэширования
  2. Настройте автосинхронизацию в ночное время
  3. Включите автобэкапы с отправкой в Telegram
  4. Оптимизируйте логирование - LOG_LEVEL=INFO для продакшена
  5. Используйте PostgreSQL вместо SQLite для больших баз

💰 Увеличение продаж

  1. Включите реферальную программу - пользователи приведут друзей
  2. Настройте промо-группы - дайте скидки постоянным клиентам
  3. Используйте персональные акции - реактивируйте неактивных
  4. Запускайте кампании - привлекайте новых через deeplink
  5. Добавьте быстрое пополнение - упростите процесс оплаты

🎯 Улучшение UX

  1. Включите Mini App режим - современный интерфейс
  2. Настройте корзину - пользователи не потеряют выбор
  3. Добавьте FAQ - ответьте на частые вопросы заранее
  4. Настройте быстрые ответы - ускорьте поддержку
  5. Используйте уведомления - держите пользователей в курсе

🔐 Безопасность и соответствие

🛡️ Защита данных

  • Шифрование чувствительных данных в БД
  • Безопасное хранение токенов и ключей
  • Валидация всех входящих данных
  • Защита от 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
  • Стабильное интернет-соединение
Как настроить платёжную систему?
  1. Получите ключи API в личном кабинете платёжной системы
  2. Добавьте их в .env файл
  3. Настройте webhook URL в кабинете провайдера
  4. Протестируйте через админ-панель бота
  5. Включите метод для пользователей

Подробнее: 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
  • Бэкапы создаются по расписанию

Через админ-панель:

  • Админ панель → Настройки → Бэкапы → Создать
Бот не отвечает, что делать?
  1. Проверьте статус: docker compose ps
  2. Посмотрите логи: docker compose logs -f bot
  3. Проверьте BOT_TOKEN в .env
  4. Убедитесь, что все контейнеры запущены
  5. Попробуйте перезапустить: docker compose restart

Если не помогло - пишите в чат поддержки

💬 Куда обратиться?


Made with ❤️ by @fringg and amazing contributors

Не забудь поставить звезду проекту!

Star History Chart

Description
No description provided
Readme MIT 66 MiB
Languages
Python 99.9%