# =============================================== # 🤖 REMNAWAVE BEDOLAGA BOT CONFIGURATION # =============================================== # ===== TELEGRAM BOT ===== # Токен бота от @BotFather # ВАЖНО: Также используется для авторизации виджета личного кабинета (Cabinet WebApp) # через Telegram.WebApp.initData BOT_TOKEN= ADMIN_IDS= # Email-адреса доверенных администраторов (через запятую) ADMIN_EMAILS= # Закрытая регистрация: новые аккаунты создаются только по приглашению через Telegram /start. INVITE_ONLY_ENABLED=false # Разрешать оплаченный gift как приглашение для нового или удалённого пользователя. INVITE_ONLY_ALLOW_GIFT_LINKS=true # Ссылка на поддержку: Telegram username (например, @support) или полный URL SUPPORT_USERNAME=@support # Публичные контакты сервиса — отдаются кабинетом в GET /info/service # SUPPORT_EMAIL=support@example.com # SERVICE_WEBSITE_URL=https://example.com # Имя пользователя бота (опционально, автоопределяется) # BOT_USERNAME= # ===== СЕТЬ И ПРОКСИ ===== # URL SOCKS5 прокси-сервера для маршрутизации трафика бота к Telegram API # Формат: socks5://user:password@host:port или socks5://host:port # PROXY_URL=socks5://127.0.0.1:1080 # Альтернативный URL сервера Telegram Bot API (для регионов где api.telegram.org заблокирован) # Примеры: Cloudflare Worker, self-hosted telegram-bot-api (tdlib), любой совместимый прокси # TELEGRAM_API_URL=https://your-telegram-proxy.workers.dev # ===== СИСТЕМА ПОДДЕРЖКИ ===== # Включить меню поддержки в интерфейсе SUPPORT_MENU_ENABLED=true # Режим системы поддержки: tickets (тикеты), contact (контакт), both (оба) SUPPORT_SYSTEM_MODE=both # SLA для тикетов поддержки SUPPORT_TICKET_SLA_ENABLED=false SUPPORT_TICKET_SLA_MINUTES=60 SUPPORT_TICKET_SLA_CHECK_INTERVAL_SECONDS=300 SUPPORT_TICKET_SLA_REMINDER_COOLDOWN_MINUTES=30 # ===== ЛИЧНЫЙ КАБИНЕТ (CABINET) ===== # Включить личный кабинет пользователя (веб-интерфейс для управления подпиской) CABINET_ENABLED=false # URL кабинета для ссылок в email (например: https://cabinet.example.com) CABINET_URL= # Секретный ключ для JWT токенов (если не указан, используется BOT_TOKEN) CABINET_JWT_SECRET= # Время жизни access token в минутах (по умолчанию 15) CABINET_ACCESS_TOKEN_EXPIRE_MINUTES=15 # Время жизни refresh token в днях (по умолчанию 7) CABINET_REFRESH_TOKEN_EXPIRE_DAYS=7 # Разрешенные origins для CORS (через запятую, например: https://cabinet.example.com) CABINET_ALLOWED_ORIGINS= # Включить верификацию email (требует настройки SMTP) CABINET_EMAIL_VERIFICATION_ENABLED=false # Включить регистрацию/вход по email (если false - только Telegram) CABINET_EMAIL_AUTH_ENABLED=true # Согласие с офертой и политикой при ПЕРВОЙ авторизации в кабинете (для новых юзеров). # false — чекбоксы не показываются и ничего не требуется (прежнее поведение). # Гейт сам собой отключается, если ни оферта, ни политика не включены для веба. CABINET_REQUIRE_LEGAL_CONSENT=true # true — чекбоксы показываются уже отмеченными (пользователю остаётся не снимать). # Юридически слабее явной галочки, поэтому по умолчанию выключено. CABINET_LEGAL_CONSENT_PRECHECKED=false # ===== ТЕСТОВЫЙ EMAIL ДЛЯ РАЗРАБОТКИ ===== # Тестовый email для проверки регистрации без SMTP # При использовании этого email верификация пропускается TEST_EMAIL= TEST_EMAIL_PASSWORD= # Время жизни токена верификации email в часах CABINET_EMAIL_VERIFICATION_EXPIRE_HOURS=24 # Время жизни токена сброса пароля в часах CABINET_PASSWORD_RESET_EXPIRE_HOURS=1 # Время жизни кода подтверждения смены email в минутах CABINET_EMAIL_CHANGE_CODE_EXPIRE_MINUTES=15 # ===== SMTP НАСТРОЙКИ (для email в личном кабинете) ===== # SMTP сервер (например: smtp.gmail.com, smtp.yandex.ru) SMTP_HOST= SMTP_PORT=587 SMTP_USER= SMTP_PASSWORD= # Email отправителя (если не указан, используется SMTP_USER) SMTP_FROM_EMAIL= SMTP_FROM_NAME=VPN Service # Использовать STARTTLS (порт 587 / 25). Не путать с SMTP_USE_SSL. SMTP_USE_TLS=true # Использовать implicit TLS (SMTPS). Автоматически включается при SMTP_PORT=465. # Для портов 25/587 оставить false. SMTP_USE_SSL=false # Отписка от маркетинговых писем (winback, промопредложения, email-рассылки). # Gmail/Yahoo для массовых отправителей требуют one-click unsubscribe (RFC 8058); # без него люди жмут «Спам», и репутация домена падает. Транзакционных писем # (код входа, чек, окончание подписки) отписка не касается. EMAIL_UNSUBSCRIBE_ENABLED=true # Публичный URL эндпоинта отписки. Пусто → CABINET_URL + /api/cabinet/public/unsubscribe. # Указывать явно, если API кабинета проксируется не через /api. # EMAIL_UNSUBSCRIBE_BASE_URL=https://cab.example.com/api/cabinet/public/unsubscribe # Необязательный mailto-вариант в заголовке List-Unsubscribe. # EMAIL_UNSUBSCRIBE_MAILTO=unsubscribe@example.com # Куда падают ответы клиентов на письма. Нужен, когда SMTP_FROM_EMAIL живёт на # поддомене без MX (типично для Resend/SES: noreply@mail.example.com) — ответ на # такое письмо просто отбивается. Пусто — заголовок Reply-To не ставится. # SMTP_REPLY_TO=support@example.com # Уведомления администраторов ADMIN_NOTIFICATIONS_ENABLED=true # Rich-вид сообщений админ-чата (Bot API 10.1): заголовки, таблицы, # сворачиваемые трейсбеки. Закомментирован — редактируется из админки на лету. # ADMIN_NOTIFICATIONS_RICH_ENABLED=true ADMIN_NOTIFICATIONS_CHAT_ID=-1001234567890 # Замени на ID твоего канала (-100) - ПРЕФИКС ЗАКРЫТОГО КАНАЛА! ВСТАВИТЬ СВОЙ ID СРАЗУ ПОСЛЕ (-100) БЕЗ ПРОБЕЛОВ! ADMIN_NOTIFICATIONS_TOPIC_ID=123 # Опционально: ID топика ADMIN_NOTIFICATIONS_TICKET_TOPIC_ID=126 # Опционально: ID топика для тикетов ADMIN_NOTIFICATIONS_NALOG_TOPIC_ID=133 # Опционально: ID топика для уведомлений о чеках NaloGO # Автоматические отчеты ADMIN_REPORTS_ENABLED=false ADMIN_REPORTS_CHAT_ID= # Опционально: чат для отчетов (по умолчанию ADMIN_NOTIFICATIONS_CHAT_ID) ADMIN_REPORTS_TOPIC_ID= # ID топика для отчетов ADMIN_REPORTS_SEND_TIME=10:00 # Время отправки (по МСК) ежедневного отчета # ===== МОНИТОРИНГ ТРАФИКА ===== # Логика: при запуске бота создаётся snapshot трафика всех пользователей. # Через указанный интервал проверяется дельта (разница) трафика. # Если дельта превышает порог — отправляется уведомление админам. # Быстрая проверка (дельта трафика за интервал) TRAFFIC_FAST_CHECK_ENABLED=false # Включить быструю проверку TRAFFIC_FAST_CHECK_INTERVAL_MINUTES=10 # Интервал проверки в минутах TRAFFIC_FAST_CHECK_THRESHOLD_GB=5.0 # Порог дельты в ГБ (сколько потрачено за интервал) # Суточная проверка (трафик за 24 часа через bandwidth API) TRAFFIC_DAILY_CHECK_ENABLED=false # Включить суточную проверку TRAFFIC_DAILY_CHECK_TIME=00:00 # Время суточной проверки (HH:MM по UTC) TRAFFIC_DAILY_THRESHOLD_GB=50.0 # Порог суточного трафика в ГБ # Куда отправлять уведомления SUSPICIOUS_NOTIFICATIONS_TOPIC_ID=14 # ID топика для уведомлений о подозрительной активности # Фильтрация по серверам (UUID нод через запятую) TRAFFIC_MONITORED_NODES= # Только эти ноды (пусто = все) TRAFFIC_IGNORED_NODES= # Исключить эти ноды # Исключить пользователей (id панели через запятую) TRAFFIC_EXCLUDED_USER_IDS= # Служебные/тунельные пользователи # Производительность TRAFFIC_CHECK_BATCH_SIZE=1000 # Размер батча для получения пользователей TRAFFIC_CHECK_CONCURRENCY=10 # Параллельных запросов к API TRAFFIC_NOTIFICATION_COOLDOWN_MINUTES=60 # Кулдаун уведомлений на пользователя (минуты) TRAFFIC_SNAPSHOT_TTL_HOURS=24 # TTL snapshot трафика в Redis (часы, сохраняется при рестарте) # Черный список BLACKLIST_CHECK_ENABLED=false # Включить проверку пользователей по черному списку BLACKLIST_GITHUB_URL=https://raw.githubusercontent.com/BEDOLAGA-DEV/remnawave-bedolaga-telegram-bot/refs/heads/main/blacklist.txt # URL к файлу черного списка на GitHub BLACKLIST_UPDATE_INTERVAL_HOURS=24 # Интервал обновления черного списка с GitHub (в часах) BLACKLIST_IGNORE_ADMINS=true # Игнорировать администраторов (из ADMIN_IDS) при проверке черного списка SUBSCRIPTION_RENEWAL_BALANCE_THRESHOLD_KOPEKS=20000 # Порог баланса (в копейках) для фильтра «готовы к продлению» # Channel subscription settings (channels are managed via admin panel) CHANNEL_IS_REQUIRED_SUB=false # Обязательна ли подписка на канал CHANNEL_DISABLE_TRIAL_ON_UNSUBSCRIBE=true # Отключать триальные подписки при отписке от канала CHANNEL_REQUIRED_FOR_ALL=false # Требовать подписку на канал для ВСЕХ пользователей (платных и триальных) # ===== DATABASE CONFIGURATION ===== # Режим базы данных: "auto", "postgresql", "sqlite" DATABASE_MODE=auto # Основной URL (можно оставить пустым для автоматического выбора) DATABASE_URL= # PostgreSQL настройки (для Docker и кастомных установок) POSTGRES_HOST=postgres POSTGRES_PORT=5432 POSTGRES_DB=remnawave_bot POSTGRES_USER=remnawave_user POSTGRES_PASSWORD=secure_password_123 # Пул подключений к PostgreSQL (настройка под нагрузку / несколько воркеров). # Процесс держит до DATABASE_POOL_SIZE + DATABASE_MAX_OVERFLOW соединений; при # нескольких воркерах умножайте на их число и держите ниже max_connections # PostgreSQL. Увеличивайте при ошибках "QueuePool limit of size N overflow M # reached, connection timed out". Для SQLite не применяются. DATABASE_POOL_SIZE=20 DATABASE_MAX_OVERFLOW=20 # Сколько секунд ждать свободное соединение перед TimeoutError DATABASE_POOL_TIMEOUT=30 # SQLite настройки (для локального запуска) SQLITE_PATH=./data/bot.db LOCALES_PATH=./locales # Redis REDIS_URL=redis://redis:6379/0 # Время жизни корзины пользователя в Redis (секунды, по умолчанию 1 час) CART_TTL_SECONDS=3600 # ===== REMNAWAVE API ===== REMNAWAVE_API_URL=https://panel.example.com REMNAWAVE_API_KEY=your_api_key_here # Тип авторизации: "api_key", "basic_auth", "caddy" REMNAWAVE_AUTH_TYPE=api_key REMNAWAVE_CADDY_TOKEN= # Для панелей с Basic Auth (опционально) REMNAWAVE_USERNAME= REMNAWAVE_PASSWORD= # Для панелей установленных скриптом eGames прописывать ключ в формате XXXXXXX:DDDDDDDD REMNAWAVE_SECRET_KEY= # Шаблон описания пользователя в панели Remnawave # Доступные плейсхолдеры: # {full_name} — Имя, Фамилия из Telegram # {username} — @логин из Telegram (c @) # {username_clean} — логин из Telegram (без @) # {telegram_id} — ID Telegram REMNAWAVE_USER_DESCRIPTION_TEMPLATE="Bot user: {full_name} {username}" # Шаблон имени пользователя в панели Remnawave # Доступные плейсхолдеры аналогичны описанию выше # {full_name} — Имя, Фамилия из Telegram # {username} — @логин из Telegram (c @) # {username_clean} — логин из Telegram (без @) # {telegram_id} — ID Telegram REMNAWAVE_USER_USERNAME_TEMPLATE="user_{telegram_id}" # Режим удаления пользователей из панели RemnaWave # delete - полностью удалить пользователя из панели # disable - только деактивировать пользователя REMNAWAVE_USER_DELETE_MODE=delete # Автоматическая синхронизация пользователей с панелью Remnawave REMNAWAVE_AUTO_SYNC_ENABLED=false # Времена синхронизации (через запятую, формат HH:MM по МСК) REMNAWAVE_AUTO_SYNC_TIMES=03:00 # ===== REMNAWAVE WEBHOOKS (входящие события из панели) ===== # Включить приём вебхуков от панели Remnawave (real-time события) REMNAWAVE_WEBHOOK_ENABLED=false # Путь для приёма вебхуков (должен совпадать с настройкой в панели) REMNAWAVE_WEBHOOK_PATH=/remnawave-webhook # Общий секрет для подписи HMAC-SHA256 (минимум 32 символа) # Сгенерируйте: openssl rand -hex 32 # ВАЖНО: этот же секрет указывается в панели Remnawave при создании вебхука REMNAWAVE_WEBHOOK_SECRET= # Уведомления администраторам о потере/восстановлении связи с нодами # false = не отправлять события node.connection_lost / node.connection_restored REMNAWAVE_WEBHOOK_NOTIFY_NODE_CONNECTION_STATUS=true # ===== GRACE ACCESS (ограниченный доступ после expired/limited) ===== # Настраивается в веб-кабинете: Админка → Grace-доступ. Там же проверяется # конфигурация и видно состояние сессий. # # Ключи ниже оставлены закомментированными НАМЕРЕННО. Ключ, присутствующий # в .env, попадает в ENV_OVERRIDE_KEYS: файл перекрывает базу, и настройка # перестаёт меняться из админки — раздел открывается с замком на каждом поле. # Раскомментируйте строку только если хотите закрепить значение за файлом. # Значения показаны те же, что действуют по умолчанию. # # false = выключено, observe = только журнал, true = выдавать, drain = завершать открытые # GRACE_ACCESS_MODE=false # GRACE_ACCESS_DURATION_HOURS=72 # Реально доступная пользователю квота во время grace (ГиБ) # GRACE_ACCESS_TRAFFIC_GB=1 # GRACE_ACCESS_EXPIRED_SQUAD_UUID= # GRACE_ACCESS_LIMITED_SQUAD_UUID= # Внешний сквад (External Squad) для grace-доступа: пусто = сброс в None, keep = сохранять текущий внешний сквад, либо UUID аварийного внешнего сквада # GRACE_ACCESS_EXTERNAL_SQUAD_UUID= # Дополнительные виды подписок; обычные платные несуточные разрешены при MODE=true # GRACE_ACCESS_TRIAL_ENABLED=false # GRACE_ACCESS_DAILY_ENABLED=false # GRACE_ACCESS_FREE_ENABLED=false # GRACE_ACCESS_RECONCILE_INTERVAL_SECONDS=60 # GRACE_ACCESS_RECONCILE_BATCH_SIZE=200 # GRACE_ACCESS_CANDIDATE_LOOKBACK_MINUTES=30 # ===== УВЕДОМЛЕНИЯ ОТ ВЕБХУКОВ (что получают пользователи) ===== # Глобальный переключатель уведомлений пользователям от вебхуков WEBHOOK_NOTIFY_USER_ENABLED=true # Отключение/активация подписки администратором WEBHOOK_NOTIFY_SUB_STATUS=true # Истечение подписки WEBHOOK_NOTIFY_SUB_EXPIRED=true # Предупреждения о скором истечении (72ч, 48ч, 24ч) WEBHOOK_NOTIFY_SUB_EXPIRING=true # Достижение лимита трафика WEBHOOK_NOTIFY_SUB_LIMITED=true # Сброс счётчика трафика WEBHOOK_NOTIFY_TRAFFIC_RESET=true # Удаление пользователя из панели WEBHOOK_NOTIFY_SUB_DELETED=true # Обновление ключей подписки (revoke) WEBHOOK_NOTIFY_SUB_REVOKED=true # Первое подключение к VPN WEBHOOK_NOTIFY_FIRST_CONNECTED=true # Напоминание о неподключении WEBHOOK_NOTIFY_NOT_CONNECTED=true # Предупреждение о приближении к лимиту трафика WEBHOOK_NOTIFY_BANDWIDTH_THRESHOLD=true # Подключение и отключение устройств WEBHOOK_NOTIFY_DEVICES=true # Теги пользователей в Remnawave (A-Z, 0-9, _, макс. 16 символов) # Тег для пробных пользователей (опционально) # TRIAL_USER_TAG=TRIAL # Тег для платных пользователей (опционально) # PAID_SUBSCRIPTION_USER_TAG=PAID # ========= ПОДПИСКИ ========= # ===== РЕЖИМ ПРОДАЖ ===== # Режим продаж подписок (можно переключить в кабинете: Настройки → Подписки): # "classic" - классический режим: # - Пользователь выбирает период, серверы, трафик, устройства отдельно # - Цены периодов берутся из PERIOD_PRICES ниже # - Подходит для гибкой настройки под каждого пользователя # "tariffs" - режим тарифов: # - Пользователь выбирает готовый тариф (Premium, Basic и т.д.) # - Тарифы создаются в кабинете: Админ → Тарифы # - Каждый тариф имеет свои серверы, трафик, устройства и цены за периоды # - Подходит для продажи готовых пакетов услуг SALES_MODE=tariffs # Управление сменой тарифа (для SALES_MODE=tariffs) # UPGRADE / DOWNGRADE: # true / true = все направления разрешены # true / false = только повышение (на более дорогой тариф) # false / true = только понижение (на более дешёвый тариф) # false / false = смена тарифа полностью отключена TARIFF_SWITCH_UPGRADE_ENABLED=true TARIFF_SWITCH_DOWNGRADE_ENABLED=true # Мастер-переключатель сброса бесплатного периода при переходе на платный. # true — остаток НЕ переносится ни для триала («бесплатная версия»), ни для 0₽-тарифа, # даже если TRIAL_ADD_REMAINING_DAYS_TO_PAID=true (сброс перебивает перенос). # Смена с 0₽-тарифа при этом идёт через покупку периода по полной цене # (мгновенное prorated-переключение недоступно — иначе доплата считалась бы # за весь накопленный остаток бесплатных дней). # false — разрешить перенос (для триалов тогда действует TRIAL_ADD_REMAINING_DAYS_TO_PAID). TARIFF_SWITCH_RESET_FREE_DAYS=true # Сброс привязанных устройств при продлении подписки (однократно при каждом продлении) RESET_DEVICES_ON_RENEWAL=false # ===== ТРИАЛ ПОДПИСКА ===== TRIAL_DURATION_DAYS=3 TRIAL_TRAFFIC_LIMIT_GB=10 TRIAL_DEVICE_LIMIT=1 # ID тарифа для триала в режиме тарифов (0 = использовать стандартные настройки триала) # Если указан ID тарифа, параметры триала берутся из тарифа (traffic_limit_gb, device_limit, allowed_squads) # Длительность триала всё равно берётся из TRIAL_DURATION_DAYS TRIAL_TARIFF_ID=0 # Платный триал: если TRIAL_ACTIVATION_PRICE > 0, триал становится платным # Цена в копейках (1000 = 10 рублей). Пользователь может оплатить триал любым методом оплаты. # TRIAL_PAYMENT_ENABLED опционален (для обратной совместимости) TRIAL_PAYMENT_ENABLED=false TRIAL_ACTIVATION_PRICE=0 # ===== ПЛАТНАЯ ПОДПИСКА ===== # Сколько устройств доступно по дефолту при покупке платной подписки DEFAULT_DEVICE_LIMIT=3 # Максимум устройств доступных к покупке (0 = Нет лимита) MAX_DEVICES_LIMIT=15 # Разрешать ли опускать лимит устройств НИЖЕ включённого в тариф. # false (по умолчанию) — нижняя граница уменьшения равна device_limit тарифа. # true — прежнее поведение: можно уменьшать вплоть до 1 устройства. ALLOW_DEVICES_BELOW_TARIFF_LIMIT=false # Дефолт параметры для подписок выданных через админку DEFAULT_TRAFFIC_LIMIT_GB=100 # Плюсовать остаток дней триала к платной подписке при покупке. # Действует ТОЛЬКО когда TARIFF_SWITCH_RESET_FREE_DAYS=false (иначе сброс перебивает). TRIAL_ADD_REMAINING_DAYS_TO_PAID=false # ===== ГЛОБАЛЬНЫЙ ПАРАМЕТР ДЛЯ ВСЕХ ПОДПИСОК ===== DEFAULT_TRAFFIC_RESET_STRATEGY=MONTH # Сбрасывать трафик при каждой оплате подписки RESET_TRAFFIC_ON_PAYMENT=false # ===== НАСТРОЙКИ ТРАФИКА ===== # Режим выбора трафика: # "selectable" - пользователи выбирают пакеты трафика (по умолчанию) # "fixed" - фиксированный лимит трафика для всех подписок TRAFFIC_SELECTION_MODE=selectable # Фиксированный лимит трафика в ГБ (используется только в режиме "fixed") # 0 = безлимит FIXED_TRAFFIC_LIMIT_GB=100 # ===== ДОКУПКА ТРАФИКА ===== # Включить/выключить функцию докупки трафика к существующей подписке TRAFFIC_TOPUP_ENABLED=true # Показывать кнопку "Докупить трафик" в меню BUY_TRAFFIC_BUTTON_VISIBLE=true # Пакеты для докупки трафика (формат: "гб:цена_в_копейках:enabled") # Пустая строка = использовать TRAFFIC_PACKAGES_CONFIG # Пример: "10:5000:true,25:10000:true,50:15000:true,100:25000:true" TRAFFIC_TOPUP_PACKAGES_CONFIG= # ===== СБРОС ТРАФИКА ===== # Режим расчета цены сброса трафика: # "period" - фиксированная цена = стоимость периода 30 дней (старое поведение, может быть абьюзом!) # "traffic" - цена = стоимость текущего пакета трафика подписки # "traffic_with_purchased" - цена = стоимость базового + докупленного трафика (рекомендуется) TRAFFIC_RESET_PRICE_MODE=traffic_with_purchased # Базовая цена сброса в копейках (0 = использовать PERIOD_PRICES[30]) # Используется как минимальная цена или фиксированная в режиме "period" TRAFFIC_RESET_BASE_PRICE=0 # ===== ПЕРИОДЫ ПОДПИСКИ ===== # Доступные периоды подписки (через запятую) # Возможные значения: 14,30,60,90,180,360 AVAILABLE_SUBSCRIPTION_PERIODS=30,90,180 AVAILABLE_RENEWAL_PERIODS=30,90,180 # ===== ПРОСТАЯ ПОКУПКА ПОДПИСКИ ===== SIMPLE_SUBSCRIPTION_ENABLED=true # Стандартный период (должен совпадать с одним из AVAILABLE_SUBSCRIPTION_PERIODS) SIMPLE_SUBSCRIPTION_PERIOD_DAYS=30 # Сколько устройств выдаётся в рамках простой подписки SIMPLE_SUBSCRIPTION_DEVICE_LIMIT=1 # Лимит трафика в ГБ (0 — безлимит) SIMPLE_SUBSCRIPTION_TRAFFIC_GB=0 # UUID сквада (оставьте пустым, чтобы использовать сквады по умолчанию) # SIMPLE_SUBSCRIPTION_SQUAD_UUID= # ===== ЦЕНЫ (в копейках) ===== BASE_SUBSCRIPTION_PRICE=0 # Цены за периоды PRICE_14_DAYS=7000 PRICE_30_DAYS=1000 PRICE_60_DAYS=25900 PRICE_90_DAYS=36900 PRICE_180_DAYS=69900 PRICE_360_DAYS=109900 # Скидка для Базовых Юзеров (Для других Промогрупп не работает!) BASE_PROMO_GROUP_PERIOD_DISCOUNTS_ENABLED=false # 60:10 = скидка 10% на все доп услуги. 90:20 = 20% за 90 дней и тд BASE_PROMO_GROUP_PERIOD_DISCOUNTS=60:10,90:20,180:40,360:70 # Выводимые пакеты трафика и их цены в копейках 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:0:true" # Цена за безлимитный трафик (в копейках) PRICE_TRAFFIC_UNLIMITED=20000 # Цена за дополнительное устройство (DEFAULT_DEVICE_LIMIT идет бесплатно!) PRICE_PER_DEVICE=10000 # Включить выбор количества устройств при покупке и продлении DEVICES_SELECTION_ENABLED=true # Единое количество устройств для режима без выбора (0 — не назначать устройства) DEVICES_SELECTION_DISABLED_AMOUNT=0 # ===== МОДЕМ ===== # Включить функционал подключения модема MODEM_ENABLED=false # Цена модема в копейках за месяц (добавляется к ежемесячному платежу) MODEM_PRICE_PER_MONTH=10000 # Скидки на модем за длительный срок: "месяцев:процент,месяцев:процент" # Пример: 3 мес = 15%, 6 мес = 20%, 12 мес = 25% MODEM_PERIOD_DISCOUNTS=3:15,6:20,12:25 # Отключение превью ссылок в сообщениях бота DISABLE_WEB_PAGE_PREVIEW=false # ===== РЕФЕРАЛЬНАЯ СИСТЕМА ===== # Ключи намеренно закомментированы: значение из .env попадает в ENV_OVERRIDE_KEYS и # блокирует изменение настройки из админки — переключение ложится в БД, но не # применяется, а после перезапуска побеждает .env. Оставьте закомментированными, # чтобы управлять реферальной программой из бота и кабинета. # REFERRAL_PROGRAM_ENABLED=true # REFERRAL_MINIMUM_TOPUP_KOPEKS=10000 # REFERRAL_FIRST_TOPUP_BONUS_KOPEKS=10000 # REFERRAL_INVITER_BONUS_KOPEKS=10000 # REFERRAL_COMMISSION_PERCENT=25 # Процент комиссии с первого платежа реферала. Если не задан, используется REFERRAL_COMMISSION_PERCENT или индивидуальный процент партнёра. # REFERRAL_FIRST_PAYMENT_COMMISSION_PERCENT=30 # Градации комиссии для повторных платежей по количеству платящих рефералов партнёра: min_paid_referrals:percent # REFERRAL_RECURRING_COMMISSION_TIERS=0:10,10:15,50:20,100:25 # Макс. кол-во платежей реферала, с которых начисляется комиссия (0 = без лимита) # REFERRAL_MAX_COMMISSION_PAYMENTS=0 # Показывать раздел партнёрки в кабинете # REFERRAL_PARTNER_SECTION_VISIBLE=true # Схема наград: legacy — ключи выше; levels — многоуровневая таблица правил, # где у каждого уровня свои активные бонусы (деньги и/или дни подписки), повод # начисления и получатель. Сами уровни настраиваются в админке бота и в кабинете, # в .env их нет: конфигурация живёт в БД именно для того, чтобы её можно было # менять на лету. Значение по умолчанию — legacy, поведение прежнее. # REFERRAL_REWARD_SCHEME=legacy # Что означает номер уровня в схеме levels: # chain — глубина в цепочке: уровень 1 платит прямому пригласившему, уровень 2 — # его пригласившему, и так далее; за одно пополнение платят несколько уровней. # tiers — ранг самого партнёра: платят ТОЛЬКО прямому пригласившему, и применяется # ровно один уровень — старший из тех, чей порог по числу рефералов он набрал. # По умолчанию chain — прежнее поведение схемы. # REFERRAL_LEVELS_MODE=chain # Насколько глубоко подниматься по цепочке пригласивших в схеме levels. # Действует только в режиме chain: в режиме tiers цепочки нет вовсе. # REFERRAL_MAX_LEVEL_DEPTH=3 # Уведомления # REFERRAL_NOTIFICATIONS_ENABLED=true # REFERRAL_NOTIFICATION_RETRY_ATTEMPTS=3 # ===== ВЫВОД РЕФЕРАЛЬНОГО БАЛАНСА ===== # Включить функцию вывода реферального баланса # REFERRAL_WITHDRAWAL_ENABLED=false # Минимальная сумма вывода в копейках (по умолчанию 50000 = 500₽) # REFERRAL_WITHDRAWAL_MIN_AMOUNT_KOPEKS=50000 # Интервал между запросами на вывод (дни) # REFERRAL_WITHDRAWAL_COOLDOWN_DAYS=30 # Текст-подсказка для поля реквизитов при выводе (пустая строка = стандартный текст) # REFERRAL_WITHDRAWAL_REQUISITES_TEXT= # Выводить только реферальный баланс (true) или весь баланс (false) # REFERRAL_WITHDRAWAL_ONLY_REFERRAL_BALANCE=true # ID топика для уведомлений о заявках на вывод (0 = основной чат) # REFERRAL_WITHDRAWAL_NOTIFICATIONS_TOPIC_ID=0 # Тестовый режим (позволяет админам тестировать функционал) # REFERRAL_WITHDRAWAL_TEST_MODE=false # Настройки анализа на подозрительную активность # Минимальная сумма депозита от реферала для анализа (в копейках) # REFERRAL_WITHDRAWAL_SUSPICIOUS_MIN_DEPOSIT_KOPEKS=100000 # Максимум пополнений от одного реферала в месяц # REFERRAL_WITHDRAWAL_SUSPICIOUS_MAX_DEPOSITS_PER_MONTH=10 # Коэффициент подозрительности (пополнено в X раз больше, чем потрачено) # REFERRAL_WITHDRAWAL_SUSPICIOUS_NO_PURCHASES_RATIO=3 # ===== АВТОПРОДЛЕНИЕ ===== # Глобально включить/выключить функцию автопродления (false = функция скрыта) ENABLE_AUTOPAY=false # Дни до окончания подписки, когда отправлять предупреждение (через запятую) AUTOPAY_WARNING_DAYS=3,1 # Включить автопродление для новых пользователей по умолчанию DEFAULT_AUTOPAY_ENABLED=true DEFAULT_AUTOPAY_DAYS_BEFORE=3 # Период (в днях), на который автопродление списывает по умолчанию. # 0 = использовать самый короткий (самый дешёвый) период тарифа — поведение до версии с этим параметром. # Например 30/90/180/360. Должен присутствовать в periods тарифа или AVAILABLE_RENEWAL_PERIODS. # Конкретный пользователь может переопределить это значение в настройках автоплатежа. DEFAULT_AUTOPAY_PERIOD_DAYS=0 MIN_BALANCE_FOR_AUTOPAY_KOPEKS=10000 # ── Антиспам уведомлений об ошибке автоплатежа ── # Максимум уведомлений об ошибке списания за ОДИН цикл подписки (до следующего end_date). 0 — не отправлять вовсе. AUTOPAY_FAIL_MAX_NOTIFICATIONS=2 # За сколько часов до окончания подписки слать «финальное» напоминание. 0 — без финала. AUTOPAY_FAIL_FINAL_REMINDER_HOURS=3 # Периодические повторы между первым и финальным уведомлением, каждые N часов (legacy). 0 — без повторов (только первое + финальное). AUTOPAY_FAIL_REPEAT_INTERVAL_HOURS=0 # ===== ПЛАТЕЖНЫЕ СИСТЕМЫ ===== # Telegram Stars (работает автоматически) TELEGRAM_STARS_ENABLED=false # ₽ за 1 ⭐. Дефолт 1.0 ≈ реальный курс вывода Telegram (≈0.95–1.0 ₽/⭐ # на 2026-05). При курсе 1.0 integer-сумма в рублях конвертируется # туда-обратно без потерь. Прежний дефолт 1.3 занижал звёзды на ~30% # и приводил к рассинхрону: квота 115 ⭐ за 150 ₽ → начисление 149.50 ₽. TELEGRAM_STARS_RATE_RUB=1.0 # Tribute (https://tribute.app) TRIBUTE_ENABLED=false TRIBUTE_API_KEY= TRIBUTE_DONATE_LINK= TRIBUTE_WEBHOOK_PATH=/tribute-webhook TRIBUTE_WEBHOOK_HOST=0.0.0.0 # Примечание: индивидуальные *_WEBHOOK_PORT используются только для старой схемы запуска. # В режиме единого FastAPI сервера оставьте эти значения по умолчанию. TRIBUTE_WEBHOOK_PORT=8081 # YooKassa (https://yookassa.ru) YOOKASSA_ENABLED=false YOOKASSA_SHOP_ID= YOOKASSA_SECRET_KEY= YOOKASSA_RETURN_URL= YOOKASSA_DEFAULT_RECEIPT_EMAIL=receipts@yourdomain.com # Включить оплату через СБП (Систему быстрых платежей) YOOKASSA_SBP_ENABLED=false # Настройки чеков для налоговой YOOKASSA_VAT_CODE=1 # Коды НДС: # 1 - НДС не облагается # 2 - НДС 0% # 3 - НДС 10% # 4 - НДС 20% # 5 - НДС 10/110 # 6 - НДС 20/120 # 7 - НДС 5% # 8 - НДС 7% # 9 - НДС 5/105 # 10 - НДС 7/107 # 11 - НДС 22% # 12 - НДС 22/122 YOOKASSA_PAYMENT_MODE=full_payment # Способы расчета: # full_payment - полная оплата # partial_payment - частичная оплата # advance - аванс # full_prepayment - полная предоплата # partial_prepayment - частичная предоплата # credit - передача в кредит # credit_payment - оплата кредита YOOKASSA_PAYMENT_SUBJECT=service # Предметы расчета: # commodity - товар # excise - подакцизный товар # job - работа # service - услуга # gambling_bet - ставка в азартной игре # gambling_prize - выигрыш в азартной игре # lottery - лотерейный билет # lottery_prize - выигрыш в лотерее # intellectual_activity - результат интеллектуальной деятельности # payment - платеж # agent_commission - агентское вознаграждение # composite - составной предмет расчета # another - другое # Webhook настройки YOOKASSA_WEBHOOK_PATH=/yookassa-webhook YOOKASSA_WEBHOOK_HOST=0.0.0.0 YOOKASSA_WEBHOOK_PORT=8082 # Список ДОВЕРЕННЫХ ПРОКСИ перед ботом (CIDR, через запятую) — НЕ allowlist отправителя. # Указывайте сюда только адреса своего реверс-прокси/балансировщика: их X-Forwarded-For # будет использоваться для вычисления реального IP отправителя. Приватные сети и диапазоны # Cloudflare доверяются автоматически, для них переменная не нужна. IP самой YooKassa, # по которым проверяется отправитель, захардкожены в коде и сюда не вписываются. # YOOKASSA_TRUSTED_PROXY_NETWORKS=10.0.0.0/8,192.168.0.0/16 # Полностью отключить проверку IP-адреса отправителя вебхука. Нужно, если бот стоит за # Anti-DDoS/прокси, который не пробрасывает реальный IP клиента (до бота доходит только # адрес прокси → forbidden_ip). При включении подлинность платежа подтверждается # обязательным (fail-closed) запросом в API YooKassa; требуется исходящий доступ к # api.yookassa.ru. По умолчанию false — IP-проверка остаётся основным барьером. # YOOKASSA_SKIP_IP_CHECK=false # Лимиты сумм пополнения через YooKassa (в копейках) YOOKASSA_MIN_AMOUNT_KOPEKS=5000 YOOKASSA_MAX_AMOUNT_KOPEKS=1000000 # Рекуррентные платежи YooKassa (автосохранение карты для автоплатежей) YOOKASSA_RECURRENT_ENABLED=false # true = карта сохраняется обязательно, false = пользователь решает (чекбокс на стороне YooKassa) YOOKASSA_RECURRENT_REQUIRED=true # Отключить пополнение баланса через поддержку SUPPORT_TOPUP_ENABLED=true # Автоматическая проверка зависших пополнений и повторные обращения к провайдерам PAYMENT_VERIFICATION_AUTO_CHECK_ENABLED=false # Интервал (в минутах) между автоматическими проверками пополнений PAYMENT_VERIFICATION_AUTO_CHECK_INTERVAL_MINUTES=10 # ===== НАЛОГОВАЯ СЛУЖБА (NaloGO) ===== # Автоматическая отправка чеков в налоговую при пополнении баланса NALOGO_ENABLED=false NALOGO_INN= # ИНН самозанятого NALOGO_PASSWORD= # Пароль от личного кабинета налоговой NALOGO_DEVICE_ID= # Опционально: ID устройства для авторизации NALOGO_STORAGE_PATH=./nalogo_tokens.json # Путь к файлу с токенами NALOGO_QUEUE_CHECK_INTERVAL=300 # Интервал проверки очереди чеков (секунды) NALOGO_QUEUE_RECEIPT_DELAY=3 # Задержка между отправкой чеков (секунды) NALOGO_QUEUE_MAX_ATTEMPTS=10 # Максимум попыток отправки одного чека # NALOGO_PROXY_URL=socks5://127.0.0.1:1080 # SOCKS прокси для nalog.ru (если не задан — используется PROXY_URL) # ===== НАСТРОЙКИ ОПИСАНИЙ ПЛАТЕЖЕЙ ===== # Эти настройки позволяют изменить описания платежей, # чтобы избежать блокировок платежных систем PAYMENT_SERVICE_NAME=Интернет-сервис PAYMENT_BALANCE_DESCRIPTION=Пополнение баланса PAYMENT_SUBSCRIPTION_DESCRIPTION=Оплата подписки PAYMENT_BALANCE_TEMPLATE={service_name} - {description} PAYMENT_SUBSCRIPTION_TEMPLATE={service_name} - {description} # CRYPTOBOT CRYPTOBOT_ENABLED=false CRYPTOBOT_API_TOKEN=123456789:AAzQcZWQqQAbsfgPnOLr4FHC8Doa4L7KryC CRYPTOBOT_WEBHOOK_SECRET=your_webhook_secret_here CRYPTOBOT_BASE_URL=https://pay.crypt.bot CRYPTOBOT_TESTNET=false CRYPTOBOT_WEBHOOK_PATH=/cryptobot-webhook # Эти порты используются только при ручном запуске старого aiohttp сервера. # В новой конфигурации все вебхуки обрабатываются через порт 8080. CRYPTOBOT_WEBHOOK_PORT=8081 CRYPTOBOT_DEFAULT_ASSET=USDT CRYPTOBOT_ASSETS=USDT,TON,BTC,ETH,LTC,BNB,TRX,USDC CRYPTOBOT_INVOICE_EXPIRES_HOURS=24 # HELEKET HELEKET_ENABLED=false HELEKET_MERCHANT_ID= HELEKET_API_KEY= HELEKET_BASE_URL=https://api.heleket.com/v1 HELEKET_DEFAULT_CURRENCY=USDT HELEKET_DEFAULT_NETWORK= HELEKET_INVOICE_LIFETIME=3600 HELEKET_MARKUP_PERCENT=0 HELEKET_WEBHOOK_PATH=/heleket-webhook HELEKET_WEBHOOK_HOST=0.0.0.0 HELEKET_WEBHOOK_PORT=8086 HELEKET_CALLBACK_URL= HELEKET_RETURN_URL= HELEKET_SUCCESS_URL= # MULENPAY MULENPAY_ENABLED=false MULENPAY_API_KEY= MULENPAY_SECRET_KEY= MULENPAY_SHOP_ID= # необязательно, есть дефолтные значения MULENPAY_BASE_URL=https://mulenpay.ru/api MULENPAY_WEBHOOK_PATH=/mulenpay-webhook # Название кнопки в интерфейсе MULENPAY_DISPLAY_NAME=Mulen Pay MULENPAY_DESCRIPTION="Пополнение баланса" # Запрещённые ключевые слова в display_name (КАЗИНО, СТАВКИ и т.п. — блокируются Mulenpay) # DISPLAY_NAME_BANNED_KEYWORDS=КАЗИНО,СТАВКИ,CASINO,BET,1XBET MULENPAY_LANGUAGE=ru MULENPAY_VAT_CODE=0 MULENPAY_PAYMENT_SUBJECT=4 MULENPAY_PAYMENT_MODE=4 MULENPAY_MIN_AMOUNT_KOPEKS=10000 MULENPAY_MAX_AMOUNT_KOPEKS=10000000 # Ожидаемый origin для iframe (опционально, для безопасности) # MULENPAY_IFRAME_EXPECTED_ORIGIN=https://mulenpay.ru # URL для редиректа после оплаты (по умолчанию WEBHOOK_URL) # MULENPAY_WEBSITE_URL=https://your-cabinet-url.com # PAYPALYCH / PAL24 PAL24_ENABLED=false PAL24_API_TOKEN= PAL24_SHOP_ID= PAL24_SIGNATURE_TOKEN= PAL24_BASE_URL=https://pal24.pro/api/v1/ PAL24_WEBHOOK_PATH=/pal24-webhook PAL24_PAYMENT_DESCRIPTION="Пополнение баланса" PAL24_MIN_AMOUNT_KOPEKS=10000 PAL24_MAX_AMOUNT_KOPEKS=100000000 PAL24_REQUEST_TIMEOUT=30 # Отображать кнопку СБП в PayPalych (true - отображать, false - скрывать) PAL24_SBP_BUTTON_VISIBLE=true # Отображать кнопку оплаты картой в PayPalych (true - отображать, false - скрывать) PAL24_CARD_BUTTON_VISIBLE=true # PLATEGA PLATEGA_ENABLED=false PLATEGA_MERCHANT_ID= PLATEGA_SECRET= PLATEGA_BASE_URL=https://app.platega.io # Версия API создания платежа: v1 — /transaction/process (метод задаётся ботом), # v2 — /v2/transaction/process. Если карты (метод 11) падают с ошибкой # "No available card cascades" — переключитесь на v2 PLATEGA_API_VERSION=v1 # Название кнопки в интерфейсе PLATEGA_DISPLAY_NAME=Platega PLATEGA_RETURN_URL= PLATEGA_FAILED_URL= PLATEGA_CURRENCY=RUB # Список ID активных методов из кабинета Platega (через запятую) PLATEGA_ACTIVE_METHODS=2,11,12,13 PLATEGA_MIN_AMOUNT_KOPEKS=100 PLATEGA_MAX_AMOUNT_KOPEKS=100000000 PLATEGA_WEBHOOK_PATH=/platega-webhook PLATEGA_WEBHOOK_HOST=0.0.0.0 PLATEGA_WEBHOOK_PORT=8086 # Рекуррентные СБП-подписки Platega (автопродление). false = выключено PLATEGA_RECURRENT_ENABLED=false # ===== FREEKASSA ===== FREEKASSA_ENABLED=false FREEKASSA_SHOP_ID= FREEKASSA_API_KEY= # Секретное слово 1 (для формы оплаты) FREEKASSA_SECRET_WORD_1= # Секретное слово 2 (для webhook) FREEKASSA_SECRET_WORD_2= FREEKASSA_DISPLAY_NAME=Freekassa FREEKASSA_CURRENCY=RUB FREEKASSA_MIN_AMOUNT_KOPEKS=10000 FREEKASSA_MAX_AMOUNT_KOPEKS=100000000 FREEKASSA_PAYMENT_TIMEOUT_SECONDS=3600 FREEKASSA_WEBHOOK_PATH=/freekassa-webhook FREEKASSA_WEBHOOK_HOST=0.0.0.0 FREEKASSA_WEBHOOK_PORT=8088 # Способ оплаты: пусто = форма выбора, 42 = обычный СБП, 44 = NSPK СБП FREEKASSA_PAYMENT_SYSTEM_ID= # Использовать API для создания заказов (обязательно для NSPK СБП) FREEKASSA_USE_API=false # Раздельные методы оплаты (отображаются как отдельные кнопки) # СБП (QR код) — i=44 FREEKASSA_SBP_ENABLED=false FREEKASSA_SBP_DISPLAY_NAME=СБП (QR код) # Карты РФ — i=36 FREEKASSA_CARD_ENABLED=false FREEKASSA_CARD_DISPLAY_NAME=Карта РФ # ===== KASSA AI (api.fk.life) ===== # Отдельная платёжная система, работает параллельно с Freekassa KASSA_AI_ENABLED=false KASSA_AI_SHOP_ID= KASSA_AI_API_KEY= # Секретное слово 2 (для webhook) KASSA_AI_SECRET_WORD_2= KASSA_AI_DISPLAY_NAME=KassaAI KASSA_AI_CURRENCY=RUB KASSA_AI_MIN_AMOUNT_KOPEKS=10000 KASSA_AI_MAX_AMOUNT_KOPEKS=100000000 KASSA_AI_WEBHOOK_PATH=/kassa-ai-webhook KASSA_AI_WEBHOOK_HOST=0.0.0.0 KASSA_AI_WEBHOOK_PORT=8089 # Способ оплаты: 44 = СБП (QR), 36 = Карты РФ, 43 = SberPay KASSA_AI_PAYMENT_SYSTEM_ID=44 # ===== RIOPAY (api.riopay.online) ===== RIOPAY_ENABLED=false RIOPAY_API_TOKEN= # Ключ для HMAC-SHA512 верификации вебхуков (если не указан, используется RIOPAY_API_TOKEN) RIOPAY_WEBHOOK_SECRET= RIOPAY_DISPLAY_NAME=RioPay RIOPAY_CURRENCY=RUB RIOPAY_MIN_AMOUNT_KOPEKS=10000 RIOPAY_MAX_AMOUNT_KOPEKS=100000000 RIOPAY_WEBHOOK_PATH=/riopay-webhook # URL для редиректа после оплаты (опционально) RIOPAY_SUCCESS_URL= RIOPAY_FAIL_URL= # ===== SEVERPAY (severpay.io) ===== SEVERPAY_ENABLED=false # Merchant ID SEVERPAY_MID= # Секретный токен для HMAC-SHA256 SEVERPAY_TOKEN= SEVERPAY_DISPLAY_NAME=SeverPay SEVERPAY_CURRENCY=RUB SEVERPAY_MIN_AMOUNT_KOPEKS=10000 SEVERPAY_MAX_AMOUNT_KOPEKS=10000000 SEVERPAY_WEBHOOK_PATH=/severpay-webhook # URL возврата после оплаты # SEVERPAY_RETURN_URL= # Время жизни платежа в минутах (30-4320) SEVERPAY_LIFETIME=1440 # ===== APPLE IN-APP PURCHASE (Consumable top-ups) ===== # Optional feature switch. Set true only after all required Apple IAP settings below are configured. APPLE_IAP_ENABLED=false # Required when APPLE_IAP_ENABLED=true. # App Store Connect In-App Purchase API key ID (for example: ABC123DEFG). APPLE_IAP_KEY_ID= # Required when APPLE_IAP_ENABLED=true. # App Store Connect issuer ID (UUID from App Store Connect API access settings). APPLE_IAP_ISSUER_ID= # Required when APPLE_IAP_ENABLED=true. # Must exactly match the iOS app bundle ID and Apple signed transaction bundleId. APPLE_IAP_BUNDLE_ID=com.app.client # Required for APPLE_IAP_ENVIRONMENT=Production. Optional for Sandbox. # Numeric App Apple ID from App Store Connect, used by Apple's SignedDataVerifier. APPLE_IAP_APP_APPLE_ID= # Required when APPLE_IAP_ENABLED=true unless APPLE_IAP_PRIVATE_KEY_PATH is set. # Inline .p8 private key contents. Not recommended for production; prefer mounted secret file path. APPLE_IAP_PRIVATE_KEY= # Required when APPLE_IAP_ENABLED=true unless APPLE_IAP_PRIVATE_KEY is set. # Recommended production option: path to mounted App Store Connect .p8 private key. # Example: /run/secrets/apple/AuthKey_ABC123DEFG.p8 APPLE_IAP_PRIVATE_KEY_PATH= # Required when APPLE_IAP_ENABLED=true. # Allowed values: Sandbox, Production. TestFlight purchases are Sandbox transactions. APPLE_IAP_ENVIRONMENT=Production # Optional. Public App Store Server Notifications V2 webhook path. # Apple should call: https://your-domain.example + APPLE_IAP_WEBHOOK_PATH APPLE_IAP_WEBHOOK_PATH=/apple-iap-webhook # Required when APPLE_IAP_ENABLED=true. # Comma-separated Apple root certificate .cer paths from https://www.apple.com/certificateauthority/ # Recommended roots: Apple Inc. Root, Apple Root CA - G2 Root, Apple Root CA - G3 Root. # Example: /certs/AppleIncRootCertificate.cer,/certs/AppleRootCA-G2.cer,/certs/AppleRootCA-G3.cer APPLE_IAP_ROOT_CERTS_PATHS= # Optional. Enables Apple's online certificate checks during signed-data verification. # Recommended true in production; requires outbound network access for certificate status checks. APPLE_IAP_ENABLE_ONLINE_CERT_CHECKS=true # Optional. Allows Production backend to verify App Review/TestFlight Sandbox transactions. # Sandbox-on-production transactions are recorded for audit but not credited as real balance. APPLE_IAP_ALLOW_SANDBOX_ON_PRODUCTION=false # Required when APPLE_IAP_ENABLED=true. # JSON mapping of App Store Connect consumable product ID -> credited internal amount in kopeks. # Backend ignores client-provided price/amount and credits only values from this mapping. APPLE_IAP_PRODUCTS={"com.app.client.topup.100":10000,"com.app.client.topup.300":30000,"com.app.client.topup.500":50000} # Optional abuse protection. # Per-user and per-IP purchase verification attempts per minute. APPLE_IAP_PURCHASE_RATE_LIMIT_PER_MINUTE=10 # Optional abuse protection. # Per-user failed purchase verification attempts per hour. APPLE_IAP_PURCHASE_FAILURE_LIMIT_PER_HOUR=20 # Optional abuse protection. # If false (recommended/default), Redis errors on Apple purchase rate limiting block the financial endpoint. # Set true only if you prefer availability over abuse protection during Redis outages. APPLE_IAP_RATE_LIMIT_FAIL_OPEN=false # ===== PAYPEAR (api.paypear.ru) ===== PAYPEAR_ENABLED=false # Shop ID для HTTP Basic Auth PAYPEAR_SHOP_ID= # Secret Key для HTTP Basic Auth PAYPEAR_SECRET_KEY= PAYPEAR_DISPLAY_NAME=PayPear PAYPEAR_CURRENCY=RUB PAYPEAR_MIN_AMOUNT_KOPEKS=10000 PAYPEAR_MAX_AMOUNT_KOPEKS=10000000 PAYPEAR_WEBHOOK_PATH=/paypear-webhook # URL возврата после оплаты # PAYPEAR_RETURN_URL= # Время жизни платежа в минутах PAYPEAR_PAYMENT_LIFETIME_MINUTES=60 # ===== ROLLYPAY (rollypay.io) ===== ROLLYPAY_ENABLED=false # API ключ (X-API-Key header) ROLLYPAY_API_KEY= # Секрет для HMAC-SHA256 верификации вебхуков ROLLYPAY_SIGNING_SECRET= ROLLYPAY_DISPLAY_NAME=RollyPay ROLLYPAY_CURRENCY=RUB ROLLYPAY_MIN_AMOUNT_KOPEKS=10000 ROLLYPAY_MAX_AMOUNT_KOPEKS=10000000 ROLLYPAY_WEBHOOK_PATH=/rollypay-webhook # URL возврата после оплаты # ROLLYPAY_RETURN_URL= # ===== AURAPAY (aurapay.tech) ===== AURAPAY_ENABLED=false # API ключ (X-ApiKey header) AURAPAY_API_KEY= # UUID магазина (X-ShopId header) AURAPAY_SHOP_ID= # Секретный ключ #2 для HMAC-SHA256 верификации вебхуков AURAPAY_SECRET_KEY= AURAPAY_DISPLAY_NAME=AuraPay AURAPAY_CURRENCY=RUB AURAPAY_MIN_AMOUNT_KOPEKS=10000 AURAPAY_MAX_AMOUNT_KOPEKS=10000000 AURAPAY_WEBHOOK_PATH=/aurapay-webhook # URL возврата после оплаты # AURAPAY_RETURN_URL= # Время жизни инвойса в минутах AURAPAY_PAYMENT_LIFETIME_MINUTES=60 # ===== WATA ===== WATA_ENABLED=false WATA_BASE_URL=https://api.wata.pro WATA_ACCESS_TOKEN= WATA_TERMINAL_PUBLIC_ID= WATA_PAYMENT_DESCRIPTION=Пополнение баланса # Тип платежа: card, sbp, all WATA_PAYMENT_TYPE=all WATA_SUCCESS_REDIRECT_URL= WATA_FAIL_REDIRECT_URL= WATA_LINK_TTL_MINUTES=60 WATA_MIN_AMOUNT_KOPEKS=10000 WATA_MAX_AMOUNT_KOPEKS=10000000 WATA_REQUEST_TIMEOUT=30 WATA_WEBHOOK_PATH=/wata-webhook WATA_WEBHOOK_HOST=0.0.0.0 WATA_WEBHOOK_PORT=8087 # Кэширование публичного ключа WATA (секунды) WATA_PUBLIC_KEY_CACHE_SECONDS=3600 # URL для получения публичного ключа (опционально) # WATA_PUBLIC_KEY_URL= # ===== CLOUDPAYMENTS ===== CLOUDPAYMENTS_ENABLED=false CLOUDPAYMENTS_PUBLIC_ID= CLOUDPAYMENTS_API_SECRET= # URL API CloudPayments CLOUDPAYMENTS_API_URL=https://api.cloudpayments.ru # URL виджета оплаты CLOUDPAYMENTS_WIDGET_URL=https://widget.cloudpayments.ru/show CLOUDPAYMENTS_DESCRIPTION=Пополнение баланса CLOUDPAYMENTS_CURRENCY=RUB CLOUDPAYMENTS_MIN_AMOUNT_KOPEKS=10000 CLOUDPAYMENTS_MAX_AMOUNT_KOPEKS=10000000 CLOUDPAYMENTS_WEBHOOK_PATH=/cloudpayments-webhook CLOUDPAYMENTS_WEBHOOK_HOST=0.0.0.0 CLOUDPAYMENTS_WEBHOOK_PORT=8089 # URL для возврата после оплаты (опционально) # CLOUDPAYMENTS_RETURN_URL= # Скин виджета: mini, classic, modern CLOUDPAYMENTS_SKIN=mini CLOUDPAYMENTS_REQUIRE_EMAIL=false CLOUDPAYMENTS_TEST_MODE=false # ===== ИНТЕРФЕЙС И UX ===== # Включить логотип для всех сообщений (true - с изображением, false - только текст) ENABLE_LOGO_MODE=true LOGO_FILE=vpn_logo.png # Режим главного меню: # default - классический режим работы бота (все кнопки внутри Telegram) # cabinet - режим Cabinet с активным ЛК MiniApp, кнопки ведут на конкретные # разделы кабинета (/balance, /subscription, /referral и т.д.) # Требует MINIAPP_CUSTOM_URL # Алиасы для обратной совместимости: text, text_only, minimal MAIN_MENU_MODE=default # Rich-меню (Bot API 10.1): главное меню с заголовками, таблицей подписок, # сворачиваемыми блоками акций и датами в часовом поясе пользователя (tg-time). # Требует telegram-bot-api с Bot API 10.1+ (официальный сервер поддерживает); # при недоступности бот сам откатывается на классический рендер до рестарта. # В rich-режиме главное меню отображается без логотипа. Ключ намеренно # закомментирован, чтобы оставаться редактируемым из админки (значение из .env # блокирует изменение настройки на лету). # MAIN_MENU_RICH_ENABLED=true # Эффект сообщения при отправке rich-меню (🎉 по умолчанию; пусто — без эффекта). # Известные id: 🎉 5046509860389126442, ❤️ 5044134455711629726, 🔥 5104841245755180586. # MAIN_MENU_RICH_EFFECT_ID=5046509860389126442 # Публичный HTTPS-URL логотипа в шапке rich-меню. Пусто — авто-режим: при заданном # WEBHOOK_URL и существующем LOGO_FILE логотип отдаётся /cabinet/branding/bot-logo. # Укажите none, чтобы включить rich-меню БЕЗ логотипа (пусто = авто-режим, а не «без»). # MAIN_MENU_RICH_LOGO_URL= # Сворачивать таблицу подписок rich-меню в раскрываемый блок при >1 подписки. # MAIN_MENU_RICH_SUBSCRIPTIONS_COLLAPSIBLE=true # Bot API 10.3: показывать кнопки внутри полотна rich-сообщения, а не клавиатурой # под ним. Действует и в главном меню, и в rich-уведомлениях админ-чата. # MAIN_MENU_RICH_INLINE_BUTTONS=false # Пользовательские уведомления rich-сообщением (только при включённом rich-меню). # USER_NOTIFICATIONS_RICH_ENABLED=true # Стиль кнопок в режиме Cabinet (Bot API 9.4): # primary - синий # success - зелёный # danger - красный # (пустое) - цвета по умолчанию для каждой секции CABINET_BUTTON_STYLE= # Включить управление меню через API (позволяет динамически менять структуру кнопок) MENU_LAYOUT_ENABLED=false # Лог действий пользователя (кнопки в боте + действия в кабинете) для вкладки # «Активность» в карточке юзера. Хранение — USER_ACTION_LOG_RETENTION_DAYS дней. # Ключи закомментированы, чтобы настройки оставались редактируемыми из админки. # USER_ACTION_LOG_ENABLED=true # USER_ACTION_LOG_RETENTION_DAYS=90 # Скрыть блок с ссылкой подключения в разделе с информацией о подписке HIDE_SUBSCRIPTION_LINK=false # Режим работы кнопки "Подключиться" # guide - открывает гайд подключения (режим 1) # miniapp_subscription - открывает ссылку подписки в мини-приложении (режим 2) # miniapp_custom - открывает заданную ссылку в мини-приложении (режим 3) # link - Открывает ссылку напрямую в браузере (режим 4) # happ_cryptolink - Вывод cryptoLink ссылки на подписку Happ (режим 5) CONNECT_BUTTON_MODE=miniapp_subscription # URL для режима miniapp_custom (обязателен при CONNECT_BUTTON_MODE=miniapp_custom) MINIAPP_CUSTOM_URL= MINIAPP_STATIC_PATH=miniapp # URL для редиректа на страницу покупки в мини-приложении (опционально) # MINIAPP_PURCHASE_URL= MINIAPP_SERVICE_NAME_EN=Bedolaga VPN MINIAPP_SERVICE_NAME_RU=Bedolaga VPN MINIAPP_SERVICE_DESCRIPTION_EN=Secure & Fast Connection MINIAPP_SERVICE_DESCRIPTION_RU=Безопасное и быстрое подключение # Нижняя кнопка «Меню» в Telegram открывает веб-кабинет (WebApp). # Бот при этом продолжает работать через обычные сообщения и inline-кнопки. # При false существующая кнопка меню не трогается. MENU_BUTTON_WEBAPP_ENABLED=false # Текст кнопки меню MENU_BUTTON_WEBAPP_TEXT=Кабинет # URL веб-кабинета (только https). Пусто → используется MINIAPP_CUSTOM_URL MENU_BUTTON_WEBAPP_URL= # Параметры режима happ_cryptolink CONNECT_BUTTON_HAPP_DOWNLOAD_ENABLED=false HAPP_DOWNLOAD_LINK_IOS= HAPP_DOWNLOAD_LINK_ANDROID= HAPP_DOWNLOAD_LINK_MACOS= HAPP_DOWNLOAD_LINK_WINDOWS= # Универсальная ссылка для ПК (если MACOS и WINDOWS не заданы отдельно) HAPP_DOWNLOAD_LINK_PC= # Кнопка (Подключится) с редиректом (тк ссылки с happ:// тг не поддерживает) - Без установленной ссылки на редирект кнопки (подключится) не будет! Пример: https://sub.domain.sub/redirect-page/?redirect_to= HAPP_CRYPTOLINK_REDIRECT_TEMPLATE= # Remnawave 2.8.0 удалил серверную генерацию crypt-ссылок — недостающие ссылки # создаются через официальный Happ API (crypto.happ.su -> happ://crypt5/...). # false = отключить обращения к внешнему сервису (crypt-ссылки будут только у тех, # у кого уже сохранены в БД). HAPP_CRYPTOLINK_API_FALLBACK_ENABLED=true # У INCY есть свой формат шифрованных ссылок (incy://crypt1/...): без него ссылка # подписки уезжает в открытом виде прямо в адресе кнопки. false = вернуть обычные # incy://import/... (например, если INCY сменит ключ до обновления бота). # Ключи закомментированы намеренно: заданный в .env ключ попадает в # ENV_OVERRIDE_KEYS и перестаёт меняться из админки. # INCY_CRYPTOLINK_ENABLED=true # Имя провайдера внутри зашифрованной ссылки — INCY показывает его при добавлении # подписки. Пусто = не передавать. # INCY_CRYPTOLINK_PROVIDER_NAME= # Пропустить принятие правил использования бота SKIP_RULES_ACCEPT=false # Пропустить запрос реферального кода SKIP_REFERRAL_CODE=false # ===== МОНИТОРИНГ И УВЕДОМЛЕНИЯ ===== MONITORING_INTERVAL=60 # Месяцев бездействия до soft-delete пользователя (status=DELETED). # С 12 мес. сезонные юзеры (отпуска, командировки) не пропадают; кабинет # умеет авто-реактивировать DELETED-юзера при валидном Telegram initData # или повторном OAuth-логине, так что цена консервативного дефолта низкая. INACTIVE_USER_DELETE_MONTHS=12 # Уведомления TRIAL_WARNING_HOURS=2 ENABLE_NOTIFICATIONS=true NOTIFICATION_RETRY_ATTEMPTS=3 MONITORING_LOGS_RETENTION_DAYS=30 NOTIFICATION_CACHE_HOURS=24 # ===== СТАТУС СЕРВЕРОВ ===== # Режимы: disabled, external_link, external_link_miniapp, xray SERVER_STATUS_MODE=disabled # Ссылка на внешний мониторинг (для режимов external_link и external_link_miniapp) SERVER_STATUS_EXTERNAL_URL= # URL метрик XrayChecker (для режима xray) SERVER_STATUS_METRICS_URL= # Данные Basic Auth (опционально) SERVER_STATUS_METRICS_USERNAME= SERVER_STATUS_METRICS_PASSWORD= # Проверять SSL сертификат при запросе метрик SERVER_STATUS_METRICS_VERIFY_SSL=true # Таймаут запроса к метрикам (в секундах) SERVER_STATUS_REQUEST_TIMEOUT=10 # Количество серверов на странице в режиме интеграции SERVER_STATUS_ITEMS_PER_PAGE=10 # ===== РЕЖИМ ТЕХНИЧЕСКИХ РАБОТ ===== # Ключи намеренно закомментированы, чтобы оставаться редактируемыми из админки: # значение из .env блокирует изменение настройки на лету. Раскомментированный # MAINTENANCE_MODE — причина классической жалобы «после каждого перезапуска # техработы включаются сами»: переключение из панели ложится в БД, но на старте # побеждает .env. # MAINTENANCE_MODE=false # MAINTENANCE_CHECK_INTERVAL=30 # MAINTENANCE_AUTO_ENABLE=true # MAINTENANCE_MONITORING_ENABLED=true # MAINTENANCE_RETRY_ATTEMPTS=1 # MAINTENANCE_MESSAGE=Ведутся технические работы. Сервис временно недоступен. Попробуйте позже. # ===== ЛОКАЛИЗАЦИЯ ===== # Укажите язык из AVAILABLE_LANGUAGES. При некорректном значении используется ru. DEFAULT_LANGUAGE=ru AVAILABLE_LANGUAGES=ru,en,ua,zh,fa # Включить выбор языка при старте и отображение кнопки в меню LANGUAGE_SELECTION_ENABLED=true # Округление цен при отображении (≤50 коп вниз, >50 коп вверх) # true: 14.78₽ → 15₽, 14.12₽ → 14₽ # false: показывать точные суммы с копейками PRICE_ROUNDING_ENABLED=true # Часовой пояс TZ=Europe/Moscow # или UTC, America/New_York и т.д. # Формат даты/времени в email-уведомлениях # (subscription_expiring, subscription_renewed, autopay_success, …). # strftime-паттерн. Дефолт даёт '20.05.2026, 10:32' независимо от # locale-пакетов в контейнере. Если в образе установлен ru_RU.UTF-8, # можно поставить '%d %B %Y, %H:%M' для месяцев словами ('20 мая 2026'). # Также правится через админ-UI: системные настройки → 🗂 Timezone. EMAIL_DATE_FORMAT=%d.%m.%Y, %H:%M # ===== ДОПОЛНИТЕЛЬНЫЕ НАСТРОЙКИ ===== ENABLE_DEEP_LINKS=true APP_CONFIG_CACHE_TTL=3600 # ===== BAN SYSTEM INTEGRATION (BedolagaBan) ===== # Интеграция с системой мониторинга банов BedolagaBan # Включить интеграцию с Ban системой BAN_SYSTEM_ENABLED=false # URL API сервера Ban системы (например: http://ban-server:8000) BAN_SYSTEM_API_URL= # API токен для авторизации в Ban системе BAN_SYSTEM_API_TOKEN= # Таймаут запросов к API (секунды) BAN_SYSTEM_REQUEST_TIMEOUT=30 # ===== bschekbot: «Доступность из РФ» (Кабинет → Система → Доступность из РФ) ===== # Настройки редактируются в кабинете; раскомментированная строка здесь перекроет их. # BSCHEK_ENABLED=false # BSCHEK_API_URL=https://bsbord.com/v1 # BSCHEK_API_KEY= # BSCHEK_REQUEST_TIMEOUT=200 # BSCHEK_REFERENCE_SUBSCRIPTION= # BSCHEK_JOB_COST_LIMIT_KOPEKS=0 # ===== СИСТЕМА БЕКАПОВ ===== BACKUP_AUTO_ENABLED=true BACKUP_INTERVAL_HOURS=24 BACKUP_TIME=03:00 # Первый запуск автобекапа выполняется в ближайшее время BACKUP_TIME после старта бота, # далее копии создаются каждые BACKUP_INTERVAL_HOURS. BACKUP_MAX_KEEP=7 BACKUP_COMPRESSION=true BACKUP_INCLUDE_LOGS=false BACKUP_LOCATION=/app/data/backups # Отправка бэкапов в телеграм BACKUP_SEND_ENABLED=true BACKUP_SEND_CHAT_ID=-100123456789 # Замени на ID твоего канала (-100) - ПРЕФИКС ЗАКРЫТОГО КАНАЛА! # ВСТАВИТЬ СВОЙ ID СРАЗУ ПОСЛЕ (-100) БЕЗ ПРОБЕЛОВ! BACKUP_SEND_TOPIC_ID=123 # Опционально: ID топика # Пароль для архива бекапа (опционально). Если задан - бекап отправляется в зашифрованном ZIP с AES BACKUP_ARCHIVE_PASSWORD= # ===== ПРОВЕРКА ОБНОВЛЕНИЙ БОТА ===== VERSION_CHECK_ENABLED=true VERSION_CHECK_REPO=fr1ngg/remnawave-bedolaga-telegram-bot VERSION_CHECK_INTERVAL_HOURS=1 # ===== ЛОГИРОВАНИЕ ===== LOG_LEVEL=INFO LOG_FILE=logs/bot.log # ANSI-цвета в консоли (true — цветной вывод с Rich, false — plain-text) LOG_COLORS=true # === Ротация логов === # Включить новую систему ротации (по умолчанию старое поведение) LOG_ROTATION_ENABLED=false # Время ротации (HH:MM) LOG_ROTATION_TIME=00:00 # Хранить архивы N дней LOG_ROTATION_KEEP_DAYS=7 # Сжимать архивы gzip LOG_ROTATION_COMPRESS=true # Отправлять архивы в Telegram-канал LOG_ROTATION_SEND_TO_TELEGRAM=false # Канал для логов (если не задан, используется BACKUP_SEND_CHAT_ID) LOG_ROTATION_CHAT_ID= # Топик в канале (если не задан, используется BACKUP_SEND_TOPIC_ID) LOG_ROTATION_TOPIC_ID= # Пути к лог-файлам (при LOG_ROTATION_ENABLED=true) LOG_DIR=logs LOG_INFO_FILE=info.log LOG_WARNING_FILE=warning.log LOG_ERROR_FILE=error.log LOG_PAYMENTS_FILE=payments.log # ===== РАЗРАБОТКА ===== DEBUG=false WEBHOOK_URL= WEBHOOK_PATH=/webhook WEBHOOK_SECRET_TOKEN= # IP адрес сервера для setWebhook — Telegram будет использовать его напрямую без DNS резолва домена # Необходимо в регионах где Telegram не может резолвить домены (РФ и др.) # WEBHOOK_IP= WEBHOOK_DROP_PENDING_UPDATES=true WEBHOOK_MAX_QUEUE_SIZE=1024 WEBHOOK_WORKERS=4 WEBHOOK_ENQUEUE_TIMEOUT=0.1 WEBHOOK_WORKER_SHUTDOWN_TIMEOUT=30.0 BOT_RUN_MODE=polling # polling или webhook # ===== КОНКУРСНАЯ СИСТЕМА ===== CONTESTS_ENABLED=false CONTESTS_BUTTON_VISIBLE=false # Реферальные конкурсы (турниры среди рефералов) # REFERRAL_CONTESTS_ENABLED=false # ===== АВТОПОКУПКА ПОСЛЕ ПОПОЛНЕНИЯ ===== # Автоматическая покупка из сохранённой корзины после пополнения баланса AUTO_PURCHASE_AFTER_TOPUP_ENABLED=false # ===== КНОПКА АКТИВАЦИИ ===== ACTIVATE_BUTTON_VISIBLE=false # ACTIVATE_BUTTON_TEXT=активировать # ===== ЕДИНЫЙ ВЕБ-СЕРВЕР ===== WEB_API_ENABLED=false WEB_API_HOST=0.0.0.0 WEB_API_PORT=8080 # Количество воркеров (для продакшена рекомендуется 2-4) WEB_API_WORKERS=1 WEB_API_ALLOWED_ORIGINS=* WEB_API_DOCS_ENABLED=false # Название и версия API (для документации) WEB_API_TITLE=Remnawave Bot Admin API WEB_API_VERSION=1.0.0 # Токен по умолчанию для начальной настройки WEB_API_DEFAULT_TOKEN= WEB_API_DEFAULT_TOKEN_NAME=Bootstrap Token # Алгоритм хеширования токенов WEB_API_TOKEN_HASH_ALGORITHM=sha256 # Логирование запросов WEB_API_REQUEST_LOGGING=true # Потолок ОДНОЙ операции ручного пополнения через POST /users/{id}/deposit, в копейках. # Эндпоинт рассчитан на автоматизацию (AI-агент поддержки), поэтому у него есть # предохранитель: агент, ошибшийся на два нуля, упрётся в лимит. 0 — без ограничения. WEB_API_MANUAL_DEPOSIT_MAX_KOPEKS=1000000 MINIAPP_STATIC_PATH=miniapp