Skip to main content

Environment Variables

Полный справочник всех переменных окружения для каждого сервиса.


1. Backend

Самый большой набор переменных. Задаются в Dokploy → Backend Service → Environment.

VariableRequiredDefaultОписание
NODE_ENVYesproduction, staging, development
PORTYes4000Порт, на котором слушает сервер. Задавай 4000
HOSTNo0.0.0.0На каком интерфейсе слушать. 0.0.0.0 = все (нужно в Docker)
LOG_LEVELNoinfoУровень логов: error, warn, info, debug
LOG_PRETTYNofalsePretty-print логов (только для dev)
UPLOAD_DIRYes (prod)Путь для загрузки файлов (статика). Проверяется env-validator при запуске
MAINTENANCE_BYPASS_TELEGRAM_IDSNoTelegram ID пользователей, которые могут обходить режим maintenance (через запятую)
VariableRequiredDefaultОписание
JWT_SECRETYesСекрет для подписи JWT (мин. 32 символа). Генерация: openssl rand -base64 48
JWT_EXPIRES_INYes7dВремя жизни токена
ADMIN_USERNAMENoЛогин админ-панели
ADMIN_PASSWORD_HASHNoBcrypt-хэш пароля админ-панели (cost 12). См. генерацию ниже
ENABLE_2FANofalseВключить двухфакторную аутентификацию для админ-панели
ADMIN_2FA_SECRETConditionalTOTP-секрет для 2FA. Обязателен если ENABLE_2FA=true
DOCS_OWNER_TTL_MINUTESNo240TTL сессии доступа к документации для владельца (мин.)
DOCS_ADMIN_TTL_MINUTESNo240TTL сессии доступа к документации для админа (мин.)
Генерация ADMIN_PASSWORD_HASH

Пароль хэшируется через bcrypt с cost 12. Сгенерировать хэш:

# Через Node.js (bcryptjs уже в зависимостях проекта)
node -e "const b=require('bcryptjs');b.hash('YOUR_PASSWORD',12).then(h=>console.log(h))"

Полученный хэш (начинается с $2a$12$...) — это значение ADMIN_PASSWORD_HASH.

Синхронизация 2FA

ENABLE_2FA в backend и VITE_ENABLE_2FA в Admin Panel должны совпадать. Если backend = false, а admin = true — админка покажет поле ввода 2FA-кода, но backend его проигнорирует.

Пример .env для Production

Полный пример .env для Backend (production)
# === Core ===
NODE_ENV=production
PORT=4000
HOST=0.0.0.0
LOG_LEVEL=info
UPLOAD_DIR=/var/data/goloot/uploads
MAINTENANCE_BYPASS_TELEGRAM_IDS=123456789,987654321 # Bypass maintenance mode

# === Database ===
# Способ 1: через DB_ENV
DB_ENV=prod
DATABASE_URL_PROD=postgresql://goloot:STRONG_PASSWORD@goloot-postgresql-XXXXX:5432/goloot
# Способ 2: напрямую (если одно окружение на сервер)
# DATABASE_URL=postgresql://goloot:STRONG_PASSWORD@goloot-postgresql-XXXXX:5432/goloot

# === Redis ===
# Hostname — Container Name из Dokploy UI (НЕ просто "redis")
REDIS_URL=redis://:REDIS_PASSWORD@goloot-redis-XXXXX:6379

# === JWT & Auth ===
JWT_SECRET=СГЕНЕРИРУЙ_ЧЕРЕЗ_openssl_rand_base64_48
JWT_EXPIRES_IN=7d
ADMIN_USERNAME=admin
ADMIN_PASSWORD_HASH=BCRYPT_HASH
ENABLE_2FA=true
ADMIN_2FA_SECRET=СГЕНЕРИРУЙ_ЧЕРЕЗ_openssl_rand_base64_32

# === Docs Access ===
DOCS_OWNER_TTL_MINUTES=240
DOCS_ADMIN_TTL_MINUTES=240

# === Telegram ===
TELEGRAM_BOT_TOKEN=1234567890:ABCdefGHIjklMNOpqrsTUVwxyz
TELEGRAM_BOT_USERNAME=GoLootBot
TELEGRAM_APP_NAME=goloot
TELEGRAM_MINI_APP_URL=https://t.me/GoLootBot/goloot
TELEGRAM_WEBHOOK_URL=https://api.goloot.online/api/telegram/webhook
TELEGRAM_WEBHOOK_SECRET=СГЕНЕРИРУЙ_ЧЕРЕЗ_openssl_rand_hex_32
TELEGRAM_CHANNEL_ID=-1001234567890
TELEGRAM_CHANNEL_USERNAME=goloot_channel
TELEGRAM_DISCUSSION_GROUP_ID=-1001234567890
TELEGRAM_GROUP_ID=-1001234567890
TELEGRAM_ADMIN_IDS=123456789,987654321

# === Telegram Topics (опционально) ===
# ID топиков (тредов) в Telegram-группе. Каждый — реальное число из URL топика.
# Как узнать: группа → правый клик на топик → Copy Link → ?topic=ЧИСЛО
TELEGRAM_TOPIC_BAN_APPEAL=123 # Апелляции забаненных
TELEGRAM_TOPIC_PROBLEM=456 # Жалобы и проблемы с выводом
TELEGRAM_TOPIC_SUGGESTION=789 # Предложения пользователей
TELEGRAM_TOPIC_VERIFICATION=101 # Заявки на верификацию Steam
TELEGRAM_TOPIC_SEASONS=102 # Сезоны (старт, конец, валидация)
TELEGRAM_TOPIC_RAFFLES=103 # Розыгрыши (пул призов пуст)
TELEGRAM_TOPIC_BUDGET=104 # Экономика (Luck Pool, смена периода)
TELEGRAM_TOPIC_SECURITY=105 # Безопасность (фрод, бюджет исчерпан)
TELEGRAM_TOPIC_TRADES=107 # Трейды Steam (отправка/получение скинов)
TELEGRAM_TOPIC_REPLIES=106 # Ответы админа на тикеты
TELEGRAM_QUIZ_TTL_SECONDS=86400 # TTL публикаций квизов (24 часа)

# === Steam ===
STEAM_ENABLED=true
STEAM_API_KEY=your-steam-api-key
STEAM_USERNAME=your-steam-username
STEAM_PASSWORD=your-steam-password
STEAM_SHARED_SECRET=your-shared-secret
STEAM_IDENTITY_SECRET=your-identity-secret
STEAM_ADMIN_IDS=76561198000000001,76561198000000002 # Steam ID админов

# === URLs ===
STATIC_URL=https://static.goloot.online
WEB_APP_URL=https://goloot.online
ADMIN_URL=https://admin.goloot.online
REDIRECT_START_URL=https://start.goloot.online
REDIRECT_PUSH_URL=https://r.goloot.online

# === Quiz Generation ===
QUIZ_SQLITE_PATH=/var/data/goloot/rust_data.db

# === Monitoring ===
OTEL_SERVICE_NAME=goloot-backend
OTEL_EXPORTER_OTLP_ENDPOINT=http://tempo:4318
ENABLE_SWAGGER=true
SWAGGER_API_KEY=your-swagger-api-key

# === Economy (опционально — есть дефолты в коде) ===
REFERRAL_BONUS_XP=100
REFERRAL_BONUS_SCRAP_REFERRED=500
REFERRAL_PASSIVE_INCOME_PERCENT=10
UTM_BONUS_SCRAP=200

2. Frontend

Frontend использует build-time переменные с префиксом VITE_.

Build-time, не Runtime!

В Dokploy задавай эти переменные как Build-time Variables (Build Args), а не как Environment Variables. Vite вшивает их в статику при сборке.

VariableRequiredDefaultОписание
VITE_API_URLNohttp://localhost:4000Backend API URL
VITE_STATIC_URLNohttps://static.goloot.onlineURL сервера статики (для картинок предметов, кейсов, аватаров)
VITE_TELEGRAM_BOT_USERNAMENoUsername бота
VITE_TELEGRAM_CHANNEL_USERNAMENoUsername канала
VITE_REDIRECT_START_URLNoURL redirect-сервиса (referral/UTM)
VITE_SEQUENTIAL_API_TIMEOUTNo5000Таймаут API (мс)
VITE_SEQUENTIAL_TOTAL_TIMEOUTNo15000Общий таймаут (мс)
VITE_AD_FETCH_TIMEOUTNo3000Таймаут рекламы (мс)
VITE_FAVORITES_CACHE_TTLNoTTL кэша избранного
VITE_BANNER_HIDE_DURATIONNoСкрытие баннера (мс)

3. Admin Panel

Тоже build-time переменные с VITE_:

VariableRequiredDefaultОписание
VITE_API_URLNohttp://localhost:4000Backend API URL
VITE_STATIC_URLNoURL статики
VITE_REDIRECT_START_URLNoURL redirect-сервиса (referral/UTM)
VITE_REDIRECT_PUSH_URLNoURL redirect-сервиса (push tracking)
VITE_ENABLE_2FANoВключить 2FA
VITE_GRAFANA_URLNoURL Grafana

4. Redirect Service

Все переменные обязательны — сервис упадёт при отсутствии:

VariableRequiredDefaultОписание
NODE_ENVYesОкружение
PORTYesПорт (3001)
HOSTYesХост (0.0.0.0)
LOG_LEVELYesУровень логов
DATABASE_URLYesPostgreSQL URL
STATIC_URLYesURL статики
START_URLYesURL фронтенда (куда редиректить пользователя)
TELEGRAM_BOT_USERNAMEYesUsername бота
TELEGRAM_APP_NAMEYesИмя приложения

5. Monitoring Stack

Переменные задаются в Dokploy → monitoring compose → Environment:

VariableServiceDefaultОписание
GRAFANA_ADMIN_USERGrafanaadminЛогин Grafana
GRAFANA_ADMIN_PASSWORDGrafanaadminПароль Grafana

Grafana Service Account Token

Для API-доступа к Grafana (автоматизация, AI-диагностика) используется Service Account Token вместо логина/пароля:

ПараметрЗначение
СозданиеGrafana UI → Administration → Service Accounts
РольViewer (read-only)
Формат токенаglsa_xxxxxxxxxxxx
ХранениеВне git: ~/.claude/projects/.../grafana-token или локальный .env
ИспользованиеAuthorization: Bearer glsa_xxx header
Не путать с GRAFANA_ADMIN_PASSWORD

GRAFANA_ADMIN_PASSWORD — пароль для входа в UI. Service Account Token — для программного API-доступа. Это разные механизмы аутентификации.

Подробнее: Monitoring Setup → Grafana API


6. GitHub Actions Secrets

Для CI/CD пайплайна нужны секреты в GitHub:

SecretОписание
SWAGGER_API_KEYКлюч для получения OpenAPI spec
DOKPLOY_DOCS_WEBHOOKWebhook URL для деплоя документации

Подробнее: CI/CD Setup


7. Генерация секретов

# JWT Secret (64 символа, base64 допустим — используется только в коде)
openssl rand -base64 48

# Пароль для PostgreSQL (hex — без спецсимволов, безопасен в connection string)
openssl rand -hex 24

# Пароль для Redis (hex — без спецсимволов, безопасен в connection string)
openssl rand -hex 24

# Swagger API Key
openssl rand -hex 32

# ADMIN_2FA_SECRET (TOTP-секрет для 2FA админ-панели, base64)
openssl rand -base64 32

# TELEGRAM_WEBHOOK_SECRET (hex, мин. 32 символа)
openssl rand -hex 32

# ADMIN_PASSWORD_HASH (bcrypt, cost 12)
node -e "const b=require('bcryptjs');b.hash('YOUR_PASSWORD',12).then(h=>console.log(h))"
Почему hex для паролей БД?

openssl rand -base64 генерирует символы /, +, = — они ломают PostgreSQL connection string и могут вызвать проблемы в shell. openssl rand -hex выдаёт только 0-9, a-f — безопасно везде.