From 591643d3649ba68387fe5e7047ccead490a832f6 Mon Sep 17 00:00:00 2001 From: nineap Date: Thu, 9 Jul 2026 15:33:33 +0700 Subject: [PATCH] =?UTF-8?q?=D0=A7=D0=B8=D0=BD=D0=B8=D1=82=20.env.example:?= =?UTF-8?q?=20=D1=83=D0=B1=D0=B8=D1=80=D0=B0=D0=B5=D1=82=20=D0=BC=D1=91?= =?UTF-8?q?=D1=80=D1=82=D0=B2=D1=8B=D0=B9=20ADMIN=5FTG=5FID,=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F=D0=B5=D1=82=20PROXY=5FINTE?= =?UTF-8?q?RNAL=5FSECRET?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ADMIN_TG_ID нигде не читается с тех пор, как admin_guard заменили на ролевую систему (owner/staff/node_manage/partner_guard) — оставлять его в примерах вводит в заблуждение. PROXY_INTERNAL_SECRET, наоборот, обязателен (main.rs падает без него при старте), но отсутствовал во всех трёх .env*.example. Заодно поправлен src/modules/auth/README.md — описывал admin_guard, которого больше не существует. --- .env.dev-remote.example | 6 ++++- .env.dev.example | 5 +++- .env.example | 49 +++++++++++++++++++++++++++----------- src/modules/auth/README.md | 9 ++++--- 4 files changed, 50 insertions(+), 19 deletions(-) diff --git a/.env.dev-remote.example b/.env.dev-remote.example index 701bfb7..d5b8e1f 100644 --- a/.env.dev-remote.example +++ b/.env.dev-remote.example @@ -28,7 +28,11 @@ CF_API_TOKEN=CHANGE_ME_CLOUDFLARE_DNS_EDIT_TOKEN JWT_SECRET=CHANGE_ME_DEV_JWT_SECRET ARGON_SALT=CHANGE_ME_DEV_ARGON_SALT_MIN_16_CHARS TON_MASTER_WALLET=UQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKK8y -ADMIN_TG_ID=0 + +# Общий секрет с прокси-нодами этого dev-стенда (--require-auth) — обязателен, +# без него бэкенд не стартует. То же значение должно быть в .env.example +# netrunner-proxy на самих нодах. +PROXY_INTERNAL_SECRET=CHANGE_ME_DEV_PROXY_INTERNAL_SECRET # Опционально: без него оплата через @CryptoBot просто вернёт "provider not # supported", остальное продолжает работать как раньше. Токен берётся у diff --git a/.env.dev.example b/.env.dev.example index 498befb..4009682 100644 --- a/.env.dev.example +++ b/.env.dev.example @@ -21,9 +21,12 @@ RUST_LOG=netrunner_control_plane=debug,axum=info,tower_http=debug,sqlx=warn JWT_SECRET=dev_jwt_secret_change_me ARGON_SALT=dev_stealth_salt_minimum_16_chars TON_MASTER_WALLET=UQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKK8y -ADMIN_TG_ID=0 TELOXIDE_TOKEN=123456789:YOUR_DEV_BOT_TOKEN_HERE +# Общий секрет с локальным прокси (--require-auth, см. .env.example +# netrunner-proxy) — обязателен, без него бэкенд не стартует. +PROXY_INTERNAL_SECRET=dev_stealth_salt_minimum_16_chars_proxy + # Опционально: без него оплата через @CryptoBot вернёт "provider not # supported", остальное работает как обычно. Токен — у @CryptoBot: /pay -> # Create App -> Payment Token. diff --git a/.env.example b/.env.example index 4f3a10e..2cdc5eb 100644 --- a/.env.example +++ b/.env.example @@ -1,17 +1,22 @@ # ===================================================================== # === DATABASE CONFIGURATION === # ===================================================================== +# ВАЖНО: значения ниже — это плейсхолдеры-заглушки (CHANGE_ME_*), не реальный +# пароль. Не копировать "как есть" — реальный пароль генерировать самостоятельно +# (например `openssl rand -base64 24`) и никогда не коммитить .env с настоящим +# значением (см. .gitignore — .env/.env.* уже исключены). +# # ДЛЯ ЛОКАЛЬНЫХ ТЕСТОВ НА ТВОЕМ ПК: -# DATABASE_URL=postgres://netrunner_admin:dev_root_123@77.110.106.113:5432/netrunner +# DATABASE_URL=postgres://netrunner_admin:CHANGE_ME_DB_PASSWORD@:5432/netrunner # # ДЛЯ ЗАПУСКА НА САМОЙ ВПС (Через Docker Compose): -# DATABASE_URL=postgres://netrunner_admin:dev_root_123@db:5432/netrunner +# DATABASE_URL=postgres://netrunner_admin:CHANGE_ME_DB_PASSWORD@db:5432/netrunner -DATABASE_URL=postgres://netrunner_admin:dev_root_123@77.110.106.113:5432/netrunner +DATABASE_URL=postgres://netrunner_admin:CHANGE_ME_DB_PASSWORD@db:5432/netrunner DB_USER=netrunner_admin DB_NAME=netrunner -DB_PASSWORD=dev_root_123 +DB_PASSWORD=CHANGE_ME_DB_PASSWORD # Кеш курса TON (не источник истины — если недоступен, приложение просто # ходит в TonAPI напрямую на каждый инвойс, как раньше). @@ -20,11 +25,24 @@ REDIS_URL=redis://redis:6379 # ===================================================================== # === SECRETS & CRYPTO SECURITY === # ===================================================================== -JWT_SECRET=YOUR_RANDOM_SECRET_KEY_CHANGE_ME_IN_PRODUCTION -ARGON_SALT=какая-то-рандомная-длинная-строка-минимум-16-символов -GRAFANA_PASSWORD=netrunner_admin_2026 +JWT_SECRET=CHANGE_ME_JWT_SECRET_openssl_rand_hex_32 +ARGON_SALT=CHANGE_ME_ARGON_SALT_MIN_16_CHARS +GRAFANA_PASSWORD=CHANGE_ME_GRAFANA_PASSWORD TON_MASTER_WALLET=UQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKK8y +# ===================================================================== +# === БЭКАПЫ POSTGRES (см. scripts/backup.sh, сервис `backup` в +# === docker-compose.prod.yml) === +# ===================================================================== +# Без RCLONE_REMOTE/RCLONE_CONFIG_CONTENT бэкапы всё равно снимаются каждые +# BACKUP_INTERVAL_SEC (по умолчанию 6ч) и хранятся локально в volume +# netrunner_db_backups — но только на этом же VPS. Для реальной защиты от +# падения диска/потери сервера нужна офсайт-копия: +# BACKUP_INTERVAL_SEC=21600 +# BACKUP_RETENTION_DAYS=14 +# RCLONE_REMOTE=b2:netrunner-backups +# RCLONE_CONFIG_CONTENT содержимое rclone.conf одной переменной, см. rclone.conf.example + # Опционально: без него оплата через @CryptoBot вернёт "provider not # supported", остальные провайдеры продолжают работать. Токен — у @CryptoBot: # /pay -> Create App -> Payment Token. @@ -39,6 +57,15 @@ 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 === # ===================================================================== @@ -75,10 +102,4 @@ VPS_IP=77.110.106.113 DEPLOY_DIR=/root/netrunner-core BINARY_NAME=netrunner-control-plane # Образ, который тянет прод-стек (docker-compose.prod.yml). -IMAGE=ghcr.io/nineap/netrunner-control-plane:latest - - -# ===================================================================== -# === ADMIN === -# ===================================================================== -ADMIN_TG_ID=00000 \ No newline at end of file +IMAGE=ghcr.io/nineap/netrunner-control-plane:latest \ No newline at end of file diff --git a/src/modules/auth/README.md b/src/modules/auth/README.md index 8b0acae..b4374b2 100644 --- a/src/modules/auth/README.md +++ b/src/modules/auth/README.md @@ -47,9 +47,12 @@ cookie**, дополнительно проверяет `Origin`/`Referer` против `CSRF_ALLOWED_ORIGINS` — это CSRF-защита. Bearer-запросы её не проходят и не должны: подделать `Authorization`-заголовок с чужого origin браузер не даст, поэтому CSRF для них неактуален. -- `admin_guard` — должен идти **после** `auth_guard` в цепочке слоёв (читает юзера из - extensions). Пропускает, если `tg_id` юзера совпадает с `ADMIN_TG_ID` из `.env` или его - `role == "admin"`. +- `owner_guard` / `staff_guard` / `node_manage_guard` / `partner_guard` — ролевые гварды + админки (Owner/Moderator/Partner), должны идти **после** `auth_guard` в цепочке слоёв + (читают роль юзера из extensions, второй запрос к БД не нужен). Без завязки на Telegram — + роль назначается через `staff`-модуль (создание Owner — CLI `--create-owner`, дальше + Owner/Moderator создают друг друга через API). `node_manage_guard` — Owner всегда, либо + Moderator с выданным правом `can_manage_nodes`. ## Sybil-защита