# ============================================ # Конфигурация Telegram бота # Telegram Bot Configuration # ============================================ BOT_TOKEN=your_telegram_bot_token_from_botfather # Базовый URL локального Telegram Bot API (опционально) # Local Telegram Bot API base URL (optional) #BOT_API_ROOT=https://api.telegram.org # HTTP/SOCKS5 proxy URL до Telegram: бот, уведомления и бэкапы (опционально) # HTTP/SOCKS5 proxy URL to Telegram: bot, notifications and backups (optional) # socks5://user:pass@host:1080 | socks4://host:1080 | http://host:3128 # Схема socks5h не поддерживается: в socks5 имена и так резолвит прокси. #BOT_PROXY_URL= # ============================================ # Конфигурация API (Remnawave Panel) # API Configuration (Remnawave Panel) # ============================================ API_BASE_URL=http://remnawave:3000 API_TOKEN=your_api_token # X-API-Key для reverse-proxy auth перед Panel (tinyauth / Caddy, опционально) # X-API-Key for reverse-proxy auth before Panel (tinyauth / Caddy, optional) #PANEL_API_KEY= # ============================================ # Администраторы # Administrators # ============================================ # Telegram ID администраторов (через запятую) # Подсказка: Получите от @userinfobot # Telegram ID of administrators (comma-separated) # Hint: Get from @userinfobot ADMINS=your_telegram_chat_id # ============================================ # Локализация и логирование # Locale and Logging # ============================================ DEFAULT_LOCALE=ru LOG_LEVEL=INFO # ============================================ # Уведомления (опционально) # Notifications (optional) # ============================================ # ID группы/канала для уведомлений # Group/channel ID for notifications #NOTIFICATIONS_CHAT_ID=-0000000000000 # ID топика в группе (опционально) # Topic ID in the group (optional) #NOTIFICATIONS_TOPIC_ID=000 # Отдельные топики для разных типов (опционально) # Separate topics for different types (optional) #NOTIFICATIONS_TOPIC_USERS=456 # События пользователей / User events #NOTIFICATIONS_TOPIC_NODES=789 # События нод / Node events #NOTIFICATIONS_TOPIC_SERVICE=101 # Сервисные события / Service events #NOTIFICATIONS_TOPIC_HWID=102 # HWID события / HWID events #NOTIFICATIONS_TOPIC_CRM=103 # CRM события / CRM events #NOTIFICATIONS_TOPIC_FINANCE=106 # Финансовые события / Finance events #NOTIFICATIONS_TOPIC_ERRORS=104 # Ошибки / Errors #NOTIFICATIONS_TOPIC_VIOLATIONS=105 # Нарушения / Violations #NOTIFICATIONS_TOPIC_BACKUPS=107 # Файлы бэкапов / Backup files # ============================================ # Webhook # ============================================ WEBHOOK_PORT=8080 # Сгенерируйте / Generate with: openssl rand -hex 64 WEBHOOK_SECRET=your_secret_key_min_32_chars # Внутренний секрет для связи контейнеров Bot <-> Backend (настоятельно рекомендуется). # Не путать с WEBHOOK_SECRET: тот проверяет подпись вебхуков ОТ панели Remnawave, # а этот — взаимную авторизацию бота и веб-бэкенда между собой. # # С секретом: запросы бота идут через внутренний прокси бэкенда — с RBAC-правами, # квотами и аудит-логом; события панели и уведомления идут по внутреннему каналу. # Без секрета: всё работает в легаси-режиме — бот ходит в Panel API напрямую по # API_TOKEN, мимо RBAC/квот/аудита (в логах будет DEPRECATED-предупреждение). # Секрет должен совпадать у бота и бэкенда (при общем .env — совпадает сам). # # Internal secret for Bot <-> Backend container communication (strongly recommended). # Not to be confused with WEBHOOK_SECRET (verifies webhooks FROM the Remnawave panel); # this one mutually authenticates the bot and the web backend to each other. # With it: bot requests go through the backend proxy with RBAC, quotas and audit. # Without it: legacy mode — the bot calls the Panel API directly via API_TOKEN, # bypassing RBAC/quotas/audit (a DEPRECATED warning is logged). # Сгенерируйте / Generate with: openssl rand -base64 32 INTERNAL_API_SECRET=your_internal_api_secret_here_min_32_chars # Адрес коллектора для снимка диагностики в раздельном режиме (APP_MODE=api). # По умолчанию — имя контейнера из docker-compose и его порт. Менять, только # если коллектор назван иначе. # # Collector address for the diagnostics snapshot in split mode (APP_MODE=api). # Defaults to the compose container name and its port. #COLLECTOR_INTERNAL_URL=http://remnawave-web-collector:8081 # URL веб-бэкенда для внутреннего API (опционально, только если container_name изменён) # Web backend URL for internal API (optional, only if container_name was changed) # # По умолчанию бот обращается к http://web-backend:8081. # Если в docker-compose.yml вы изменили container_name для web-backend # (или service name на remnawave-admin-web-backend), укажите правильный адрес: # # INTERNAL_API_BACKEND_URL=http://ваш_container_name:8081 # # If you changed the default container_name/service name for web-backend # in your docker-compose.yml, set this to match: # # INTERNAL_API_BACKEND_URL=http://your_container_name:8081 #INTERNAL_API_BACKEND_URL=http://web-backend:8081 # ============================================ # База данных PostgreSQL (ОБЯЗАТЕЛЬНО) # PostgreSQL Database (REQUIRED) # ============================================ # Установите перед первым запуском! # Set before first run! POSTGRES_USER=remnawave POSTGRES_PASSWORD=your_secure_password_here POSTGRES_DB=remnawave_bot # URL подключения (должен соответствовать данным выше) # Connection URL (must match the credentials above) DATABASE_URL=postgresql://remnawave:your_secure_password_here@remnawave-admin-db:5432/remnawave_bot # Пул соединений # Connection pool DB_POOL_MIN_SIZE=2 DB_POOL_MAX_SIZE=10 # Интервал синхронизации (секунды) # Sync interval (seconds) SYNC_INTERVAL_SECONDS=300 # ============================================ # GeoIP — MaxMind GeoLite2 (опционально / optional) # ============================================ # Без MaxMind используется ip-api.com (~1000 запросов/день). # Without MaxMind, ip-api.com is used (~1000 requests/day). # # С MaxMind — локальная база, без лимитов, мгновенные lookup'ы. # With MaxMind — local database, no limits, instant lookups. # # 1. Зарегистрируйтесь / Sign up: https://www.maxmind.com/en/geolite2/signup # 2. Account -> Manage License Keys -> Generate New License Key # 3. Раскомментируйте строку ниже и вставьте ключ / Uncomment the line below and paste your key: # MAXMIND_LICENSE_KEY=your_maxmind_license_key # Своё зеркало GeoLite2, пробуется первым; {edition} — GeoLite2-City / GeoLite2-ASN # Own GeoLite2 mirror, tried first; {edition} is GeoLite2-City / GeoLite2-ASN # MAXMIND_MIRROR_URL=https://example.com/geoip/{edition}.mmdb # ============================================ # Веб-панель (опционально) # Web Panel (optional) # ============================================ # Запуск / Run: docker compose --profile web up -d # Секретный ключ для JWT (ОБЯЗАТЕЛЬНО для веб-панели) # Secret key for JWT (REQUIRED for web panel) # # Сгенерируйте / Generate with: openssl rand -hex 32 WEB_SECRET_KEY=your_jwt_secret_key_here_minimum_32_chars # Время жизни сессии / Session lifetime # Access token (минуты / minutes), refresh token (часы / hours) = общее время сессии / total session time WEB_JWT_EXPIRE_MINUTES=30 WEB_JWT_REFRESH_HOURS=6 # Порты веб-панели # Web panel ports WEB_BACKEND_PORT=8081 WEB_FRONTEND_PORT=3000 # ── Разделение контейнеров (опционально, для высоконагруженных инстансов) ── # Container separation (optional, for high-load instances) # APP_MODE определяет что запускает web-backend / APP_MODE defines what web-backend runs: # full — всё в одном контейнере (по умолчанию, ничего менять не нужно) # everything in one container (default, no changes needed) # api — только UI API, плагины, автоматизация, WebSocket # UI API, plugins, automation, WebSocket only # collector — только collector (приём данных от агентов) + violation detection + sync # collector only (receives data from agents) + violation detection + sync # # Для разделения на 2 контейнера / To split into 2 containers: # 1. Установи APP_MODE=api и WEB_BACKEND_PORT=8082 / Set APP_MODE=api and WEB_BACKEND_PORT=8082 # 2. Запусти / Run: docker compose --profile collector up -d # → Collector остаётся на порту 8081 — агенты ничего не меняют # Collector stays on port 8081 — agents don't need changes # → Админка переезжает на 8082 — обнови URL в nginx/Caddy # Admin moves to 8082 — update URL in nginx/Caddy #APP_MODE=full # ── Redis (опционально, для общего кэша и rate limiting) ── # Redis (optional, for shared cache and rate limiting) # # Включить / Enable: docker compose --profile redis up -d # # Даёт: общий кэш аналитики между api и collector, distributed rate limiting # Provides: shared analytics cache between api and collector, distributed rate limiting #REDIS_URL=redis://redis:6379/0 # CORS origins (ваш домен / your domain) WEB_CORS_ORIGINS=https://admin.yourdomain.com # Публичный https-адрес панели. Используется для ссылок в письмах и кнопкой # «Открыть панель» в боте (Telegram Mini App с автовходом). Можно задать # и в настройках панели: Общие → Публичный URL панели. # Public https address of the panel. Used for links in emails and by the bot's # "Open panel" button (Telegram Mini App auto-login). Can also be set in the # panel settings: General → Public panel URL. #APP_PUBLIC_URL=https://admin.yourdomain.com # External API v3 (disabled by default; set to true to enable public API at /api/v3) EXTERNAL_API_ENABLED=false # Swagger UI for External API (disabled by default; set to true to expose /api/v3/docs) EXTERNAL_API_DOCS=false # Username бота (без @) для Telegram Login Widget # Bot username (without @) for Telegram Login Widget TELEGRAM_BOT_USERNAME=your_bot_username # Авторизация по логину/паролю # Login/password authentication # # При первом запуске администратор регистрируется через веб-интерфейс (только один раз). # On first run, an admin registers through the web interface (one-time only). # # Сменить пароль можно в веб-панели: Настройки -> Смена пароля. # Password can be changed in the web panel: Settings -> Change Password. # # Опционально: fallback через .env (если БД недоступна) # Optional: .env fallback (if DB is unavailable) #WEB_ADMIN_LOGIN=admin #WEB_ADMIN_PASSWORD=your_secure_admin_password # Белый список IP (опционально, через запятую, поддерживается CIDR) # IP whitelist (optional, comma-separated, CIDR supported) # # Если не задан — доступ с любого IP. При указании — только с этих адресов. # If not set — access from any IP. If set — only from these addresses. #WEB_ALLOWED_IPS=1.2.3.4,10.0.0.0/24 # Доверенные reverse-proxy (через запятую, CIDR) / Trusted reverse proxies # # X-Real-IP / X-Forwarded-For принимаются ТОЛЬКО если запрос пришёл с этих # адресов; иначе берётся реальный адрес сокета. Это не даёт подделать свой IP # при прямом обращении к порту бэкенда (он же публичный порт коллектора) и # обойти WEB_ALLOWED_IPS, блокировку перебора и fail2ban. # X-Real-IP / X-Forwarded-For are honored ONLY from these addresses; otherwise # the raw socket address is used. Prevents IP spoofing when the backend port is # reached directly, bypassing WEB_ALLOWED_IPS, the login lockout and fail2ban. # # Пусто = доверять приватным/loopback диапазонам (как nginx set_real_ip_from). # РЕКОМЕНДАЦИЯ для прода: укажите ТОЧНЫЙ адрес вашего прокси/фронтенда, чтобы # исключить и docker-gateway (например адрес контейнера web-frontend). # Empty = trust private/loopback ranges. For production pin this to your proxy's # exact address so the docker gateway is excluded too. #WEB_TRUSTED_PROXIES=172.18.0.0/16 # Секретный URL-путь (опционально) # Secret URL path (optional) # # Если задан — панель доступна только по этому пути, остальные URL возвращают 404. # If set, the panel is only accessible via this path; other URLs return 404. # # API агентов (collector, ws, health) работают без префикса. # Agent APIs (collector, ws, health) work without prefix. # # Сгенерируйте / Generate with: openssl rand -hex 16 #WEB_SECRET_PATH=/s/your_random_secret_here # ============================================ # Мониторинг / Monitoring (Prometheus + Grafana) # ============================================ # # Бэкенд всегда отдаёт /metrics в формате Prometheus. # Backend always exposes /metrics in Prometheus format. # # Чтобы поднять Prometheus рядом с панелью — добавь профиль monitoring: # To run Prometheus alongside the panel, add the monitoring profile: # # docker compose --profile monitoring up -d # # Grafana остаётся отдельным сервисом (своя инсталляция / Grafana Cloud / etc). # Grafana remains a separate service (your own installation / Grafana Cloud / etc). # # В Grafana добавь datasource # In Grafana, add a datasource: # # - тип / type: Prometheus # - URL: http://server:9090 (или / or http://remnawave-prometheus:9090 если Grafana в той же docker network / if Grafana is in the same docker network) # # Затем импортируй дашборды из docs/grafana/ (5 шт., начинать с overview.json). # Then import dashboards from docs/grafana/ (5 files, start with overview.json). # # Защита /metrics эндпоинта Bearer-токеном (рекомендуется в проде). # Protect the /metrics endpoint with a Bearer token (recommended in production). # # Сгенерировать / Generate with: openssl rand -hex 32 # # При запуске --profile monitoring токен автоматически подставляется в # When using --profile monitoring the token is automatically injected into # # /tmp/prometheus.yml entrypoint-скриптом контейнера (см. monitoring/entrypoint.sh). # /tmp/prometheus.yml by the container's entrypoint script (see monitoring/entrypoint.sh). #METRICS_AUTH_TOKEN= # Порт Prometheus (только при --profile monitoring) # Prometheus port (only with --profile monitoring) PROMETHEUS_PORT=9090 # Сколько дней хранить метрики в Prometheus # How many days to retain metrics in Prometheus PROMETHEUS_RETENTION=30d # Память Postgres админской базы. Дефолты рассчитаны на небольшую установку; # на базе от нескольких гигабайт их стоит поднять — признак нехватки виден в # pg_stat_bgwriter, где buffers_backend догоняет buffers_checkpoint (бэкенды # сами вытесняют грязные страницы вместо чекпоинтера). # Ориентир для машины с 8 ГБ ОЗУ: 512MB / 3GB / 16MB. # # Postgres memory for the admin database. Defaults suit a small install; raise # them once the database grows to several gigabytes. ADMIN_DB_SHARED_BUFFERS=256MB ADMIN_DB_EFFECTIVE_CACHE_SIZE=1GB ADMIN_DB_WORK_MEM=8MB