Files
netrunner-backend/.env.example
T
nineap d91aef012e
Build & Push Image / Build and push Caddy (Cloudflare DNS) image (push) Successful in 26s
Build & Push Image / Build and push to Gitea Registry (push) Successful in 9m36s
CI / fmt + clippy + test (push) Failing after 24m37s
Region-aware pricing: GeoIP + VPN-детект + публичный /plans + бот
- modules::geoip — DB-IP Lite (.mmdb, без регистрации/ключа, в отличие от
  MaxMind) для страны по IP, X4BNet lists_vpn для грубой VPN/датацентр-
  эвристики. Обе базы скачиваются в рантайме, обновление — фоновая
  задача в tasks.rs (раз в сутки по умолчанию, GEOIP_REFRESH_INTERVAL).
- GET /api/v1/billing/plans (public_router, без auth_guard) — цены в
  валюте, определённой по IP посетителя (X-Real-IP/X-Forwarded-For,
  см. nginx-конфиги). VPN/датацентр IP -> всегда базовый USD, чтобы
  обход региона через любой публичный VPN не обесценивал скидки.
- Бот: Bot API не отдаёт IP пользователя вообще — валюта определяется по
  Telegram language_code. Показ цены — в валюте региона, САМА оплата
  через CryptoBot остаётся в USD/USDT (провайдер биллит 1:1 к USD-цене
  тарифа, менять валюту списания нельзя, не меняя сам провайдер).
2026-07-11 00:55:03 +07:00

147 lines
10 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# =====================================================================
# ЭТОТ ФАЙЛ БОЛЬШЕ НЕ КОПИРУЕТСЯ РУКАМИ НА СЕРВЕР. .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