Files
netrunner-backend/.env.example
T
nineap 91e214dad2 Единый мониторинг: бизнес-метрики + вынос Prometheus/Loki/Grafana на VPS с данными
Prometheus/Loki/Grafana больше не живут внутри backend-стека — единый
стек теперь на VPS с данными (netrunner-data), т.к. ему нужно видеть
ещё лендинг и все прокси-ноды, не только бэкенд. Отсюда только тонкий
promtail, пушащий логи по сети (LOKI_PUSH_URL).

Новые бизнес-метрики поверх уже существующих generic HTTP-метрик:
payments_total{provider,status}, nodes_online/nodes_total,
support_tickets_total{status}, referral_signups_total,
partner_commission_total{currency} — тем же макросом metrics::counter!/
gauge!, что уже был в api.rs/error.rs.

Новый гейт-эндпоинт GET /api/v1/admin/observability/check (только
Owner/Moderator) — для Caddy forward_auth перед Grafana (см.
netrunner-data/observability/Caddyfile), встройка в админку через
GRAFANA_PUBLIC_URL в GET /api/v1/config.

templates/init_node.sh — добавляет --metrics-port 9093 в провижининг
новых прокси-нод.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-09 23:20:44 +07:00

118 lines
7.8 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.
# =====================================================================
# === 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
# =====================================================================
# === 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 ===
# =====================================================================
GHCR_TOKEN=ghp_ТВОЙ_ТОКЕН_ОТ_ГИТХАБА_ДЛЯ_ДОСТУПА_К_РЕЕСТРУ
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