# PnvPanel — пример переменных окружения. # Скопируй в .env и заполни значения. Ключи вида Section__Key биндятся в IOptions ASP.NET Core. # ВСЕ значения-секреты ниже обязательно заменить перед запуском (особенно *_PASSWORD, *SigningKey, *BotToken). # ── PostgreSQL (контейнер db) ───────────────────────────────────────────── POSTGRES_DB=pnvpanel POSTGRES_USER=pnvpanel POSTGRES_PASSWORD=change-me-strong-db-password # Строка подключения приложения (host = имя сервиса БД в docker-compose) ConnectionStrings__Default=Host=db;Port=5432;Database=pnvpanel;Username=pnvpanel;Password=change-me-strong-db-password # ── JWT ─────────────────────────────────────────────────────────────────── Jwt__Issuer=PnvPanel Jwt__Audience=PnvPanel Jwt__SigningKey=change-me-min-32-chars-random-secret Jwt__AccessTokenMinutes=15 Jwt__RefreshTokenDays=30 # ── Data Protection (шифрование секретов нод 3x-ui at-rest) ──────────────── # Путь к тому с key-ring (должен быть примонтирован и переживать перезапуск контейнера) DataProtection__KeyRingPath=/app/keys # ── Файловое хранилище (вложения тикетов поддержки) ───────────────────────── # Путь на диске для скриншотов к тикетам — должен быть на постоянном томе (см. docker-compose.yml, # FileStorage__RootPath там уже задан явно под volume 'ticket_uploads', эту строку трогать не нужно). # FileStorage__RootPath=/app/uploads # ── Сид администратора (создаётся при первом старте, если не существует) ─── # Логин в систему — по username. Email в системе не используется. AdminSeed__Username=admin AdminSeed__Password=change-me-strong-admin-password # ── Роли по умолчанию ───────────────────────────────────────────────────── # Квота конфигов для системной роли "user" (выдаётся при регистрации). Roles__DefaultUserMaxConfigs=3 # Лимит одновременных IP на клиента (limitIp в 3x-ui) для системной роли "user"; -1 = без лимита. Roles__DefaultUserMaxIpLimit=2 # ── Rate limiting ──────────────────────────────────────────────────────── # Лимит запросов/мин на auth-эндпоинты (login/register/refresh/telegram/subscription). По умолчанию 20. # RateLimiting__AuthPermitLimit=20 # ── Telegram-бот ────────────────────────────────────────────────────────── # Если BotToken пуст — бот не стартует, панель работает без него. Транспорт — только long polling # (webhook не реализован, отдельного режима/URL для него нет). Username бота для диплинков # (кнопка «Привязать Telegram»/QR) панель узнаёт сама через Bot API (getMe) — задавать его отдельно # не нужно и негде (раньше был Telegram__BotUsername — убран, чтобы не ломать диплинк опечаткой/пробелом). Telegram__BotToken= # Telegram id(ы) администраторов (через запятую). Дают права админа в боте (кнопки активации) # и получают уведомления о запросах на активацию. Узнать id: @userinfobot. # Не связано с сид-админом выше — привязка Telegram к сид-админу делается вручную в UI. Telegram__AdminTelegramUserIds=123456789 # Прокси для запросов к Bot API (обычно socks5://[user:pass@]host:port) — на случай, если Telegram # заблокирован напрямую с сети сервера. Пусто (по умолчанию) — без прокси, прямое подключение. # Telegram__ProxyUrl=socks5://127.0.0.1:39372 # Ссылка на сайт панели — кнопка «🌐 Сайт панели» в главном меню бота. Пусто — кнопки не будет. # Telegram__PublicSiteUrl=https://dashboard.example.com # ── ASP.NET Core ────────────────────────────────────────────────────────── ASPNETCORE_ENVIRONMENT=Production ASPNETCORE_HTTP_PORTS=8080 # ── Доверенные прокси (X-Forwarded-For/Proto) ────────────────────────────── # TLS терминируется вне compose внешним прокси/шлюзом. Чтобы клиент не мог подделать свой IP/схему # напрямую (в обход прокси), по умолчанию доверяется только loopback (дефолт ASP.NET Core). Если # прокси стоит не на loopback (отдельный контейнер/хост), перечисли его через запятую — конкретные # IP через KnownProxies и/или сети в формате CIDR через KnownNetworks. # ForwardedHeaders__KnownProxies=203.0.113.10 # ForwardedHeaders__KnownNetworks=172.18.0.0/16