# ===================================================================== # ЭТОТ ФАЙЛ БОЛЬШЕ НЕ КОПИРУЕТСЯ РУКАМИ НА СЕРВЕР. .env на проде (и на # dev-стенде) теперь целиком собирается .gitea/workflows/deploy.yml (job # deploy-prod/deploy-dev) из repo Variables/Secrets этого репозитория при # каждом деплое — см. комментарии в самом deploy.yml, там точная карта # "какая переменная .env ← какой vars.*/secrets.*". Файл ниже остаётся # только как справочник по тому, какие ключи вообще существуют, и для # локальной разработки (docker-compose.yml, см. .env.dev.example). # ===================================================================== # ===================================================================== # === DATABASE CONFIGURATION === # ===================================================================== # ВАЖНО: значения ниже — это плейсхолдеры-заглушки (CHANGE_ME_*), не реальный # пароль. Не копировать "как есть" — реальный пароль генерировать самостоятельно # (например `openssl rand -base64 24`) и никогда не коммитить .env с настоящим # значением (см. .gitignore — .env/.env.* уже исключены). # # Postgres физически стоит НЕ на этом VPS, а на отдельном сервере вместе с # Vaultwarden (см. netrunner-data/docker-compose.yml, сервис `db`) — этот # бэкенд подключается к нему по сети. Полный DATABASE_URL собирает сам # docker-compose.prod.yml из DB_USER/DB_PASSWORD/DB_HOST/DB_PORT/DB_NAME ниже # (не пишите его здесь отдельной строкой — env_file не подставляет ${...}, # в отличие от самого docker-compose, так что отдельная строка DATABASE_URL # тут просто не сработает). sslmode=require обязателен: без него подключение # к hostssl-правилу в pg_hba.conf того сервера будет отклонено. DB_USER=netrunner_admin DB_NAME=netrunner DB_PASSWORD=CHANGE_ME_DB_PASSWORD # IP VPS, где физически стоит Postgres (netrunner-data). Совпадает с DATA_VPS_IP # в CI-переменных netrunner-data. DB_HOST=CHANGE_ME_DB_HOST_IP DB_PORT=5432 # Кеш курса TON (не источник истины — если недоступен, приложение просто # ходит в TonAPI напрямую на каждый инвойс, как раньше). REDIS_URL=redis://redis:6379 # ===================================================================== # === SECRETS & CRYPTO SECURITY === # ===================================================================== JWT_SECRET=CHANGE_ME_JWT_SECRET_openssl_rand_hex_32 ARGON_SALT=CHANGE_ME_ARGON_SALT_MIN_16_CHARS TON_MASTER_WALLET=UQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKK8y # Бэкапы Postgres (pg_dump + опциональный rclone) теперь настраиваются в # netrunner-data/.env (там же, где физически стоит БД) — см. # netrunner-data/scripts/backup.sh. Здесь их больше нет. # ===================================================================== # === НАБЛЮДАЕМОСТЬ === # ===================================================================== # Prometheus/Loki/Grafana теперь единым стеком на VPS с данными (см. # netrunner-data/docker-compose.observability.yml) — GRAFANA_PASSWORD # больше не нужен здесь. Этот бэкенд только пушит логи туда через тонкий # promtail (сервис `promtail` в docker-compose.prod.yml) — публичный адрес # того VPS, порт 3100 (обязательно зафайрволенный там на IP этого хоста). LOKI_PUSH_URL=http://CHANGE_ME_DATA_VPS_IP:3100 # Публичный URL Grafana за auth-гейтом Caddy (см. # netrunner-data/observability/Caddyfile) — отдаётся фронту через # GET /api/v1/config для встройки в ObservabilityPage.tsx (frontend/src/). # Не задан — страница просто не показывает дашборды. Ставить ТОЛЬКО после # того, как в Caddyfile настоящий backend-URL вместо CHANGE_ME_BACKEND_PUBLIC_URL — # иначе будет вести на нерабочий auth-гейт. GRAFANA_PUBLIC_URL=https://CHANGE_ME_GRAFANA_DOMAIN # Опционально: без него оплата через @CryptoBot вернёт "provider not # supported", остальные провайдеры продолжают работать. Токен — у @CryptoBot: # /pay -> Create App -> Payment Token. CRYPTOBOT_API_TOKEN= # ===================================================================== # === TELEGRAM API INTEGRATION === # ===================================================================== # BOT_ENABLED=false → реальный токен не требуется (для локальной разработки). BOT_ENABLED=true TELOXIDE_TOKEN=123456789:YOUR_REAL_TELEGRAM_BOT_TOKEN_HERE BOT_USERNAME=ntrnr_vpn_bot WEB_APP_BASE_URL=https://account.netrunner-vpn.com # ===================================================================== # === ВНУТРЕННИЙ КОНТРАКТ С ПРОКСИ-НОДАМИ (обязателен, без него старт падает) === # ===================================================================== # Общий секрет между бэкендом и КАЖДОЙ прокси-нодой (X-Internal-Secret на # POST /internal/validate и /internal/usage, см. modules::proxy_internal) — # то же самое значение прописывается на нодах при провижининге # (NodeService::provision_node_via_ssh) и в .env.example netrunner-proxy. PROXY_INTERNAL_SECRET=CHANGE_ME_PROXY_INTERNAL_SECRET_openssl_rand_hex_32 # ===================================================================== # === РЕГИОНАЛЬНЫЕ ЦЕНЫ: GEOIP + VPN-ДЕТЕКТ (см. modules::geoip) === # ===================================================================== # Все три — опциональны, дефолты в main.rs указывают прямо на публичные # раздачи, ничего заполнять не обязательно для старта: # GEOIP_DB_URL_TEMPLATE — DB-IP Lite (.mmdb.gz, тот же формат, что # MaxMind, но без регистрации/лицензионного ключа), "{}" — плейсхолдер # под "YYYY-MM" (у DB-IP имя файла с датой, единой "latest"-ссылки нет). # VPN_LIST_URL — X4BNet lists_vpn, открытый список CIDR-диапазонов # известных VPN/датацентров (эвристика, не 100% точная — см. их README). # GEOIP_REFRESH_INTERVAL — как часто (сек) перекачивать обе базы, # по умолчанию раз в сутки (86400). # GEOIP_DB_URL_TEMPLATE=https://download.db-ip.com/free/dbip-country-lite-{}.mmdb.gz # VPN_LIST_URL=https://raw.githubusercontent.com/X4BNet/lists_vpn/main/output/vpn/ipv4.txt # GEOIP_REFRESH_INTERVAL=86400 # ===================================================================== # === APPLICATION RUNTIME SETTINGS === # ===================================================================== PORT=8080 FRONTEND_DIR=frontend/dist SUBSCRIPTION_CHECK_INTERVAL=1800 # Как часто (сек) health-check воркер TCP-пингует VPN-ноды и переоценивает online/offline. NODE_HEALTH_CHECK_INTERVAL=60 APP_ENV=development RUST_LOG=netrunner_control_plane=debug,axum=info,tower_http=debug,sqlx=info # Разрешённые CORS origin'ы (через запятую): лендинг + ЛК (сабдомен) + tauri/localhost-приложение. CORS_ALLOWED_ORIGINS=https://netrunner-vpn.com,https://account.netrunner-vpn.com,tauri://localhost,http://tauri.localhost # Origin'ы, которым разрешено проходить CSRF-проверку cookie-сессий (Origin/Referer). # Обычно совпадает с "браузерными" origin'ами из CORS_ALLOWED_ORIGINS выше (без Tauri). CSRF_ALLOWED_ORIGINS=https://netrunner-vpn.com,https://account.netrunner-vpn.com # Domain для Set-Cookie сессионных cookie. Пусто → host-only cookie (для локальной # разработки/localhost). В проде — общий родительский домен лендинга и ЛК, чтобы одна # сессия работала на обоих сабдоменах. COOKIE_DOMAIN=.netrunner-vpn.com # Secure-атрибут cookie. В проде (HTTPS) — обязательно true; false допустим только # на стендах без TLS (см. .env.dev-remote.example) — иначе браузер молча выбросит # такую cookie, полученную по голому HTTP, и сессия не переживёт ни одного запроса. COOKIE_SECURE=true # ===================================================================== # === DEPLOYMENT & REPOSITORY SETTINGS === # ===================================================================== # Токен Gitea (право write:package) — нужен самому бэкенду в рантайме для # провижининга новых нод (см. NodeService::provision_node_via_ssh, шлёт этот # же токен на ноду, чтобы она тоже могла тянуть образ с Gitea Registry). GT_REGISTRY_TOKEN=CHANGE_ME_GT_REGISTRY_TOKEN VPS_IP=CHANGE_ME_VPS_IP DEPLOY_DIR=/root/netrunner-core BINARY_NAME=netrunner-control-plane # Образ, который тянет прод-стек (docker-compose.prod.yml). IMAGE=ghcr.io/nineap/netrunner-control-plane:latest