Справочник config.env

Панель настраивается переменными окружения. Значения читаются из файла config.env:

  • Linux — /etc/gameap/config.env
  • Windows — C:\gameap\web\config.env

Формат файла — по одной паре ИМЯ=значение на строку, без кавычек и без export. Строки, начинающиеся с #, игнорируются. После изменения файла панель нужно перезапустить:

gameapctl panel restart

Переменные, заданные в окружении процесса, имеют приоритет над файлом.

Обязательных переменных всего две: DATABASE_URL и AUTH_SECRET. Без них панель не запустится. Все остальные имеют значения по умолчанию, пригодные для типовой установки на одном сервере.

Обозначения в таблицах: длительность — число с суффиксом s, m или h (30s, 5m, 12h); список — значения через запятую; размер — число с двоичным суффиксом K, M, G, T (8M, 100G), голое число трактуется как байты.

HTTP

Переменная Тип По умолчанию Назначение
HTTP_HOST строка 0.0.0.0 Имя хоста панели. Используется для CORS и как имя в самоподписанных сертификатах
HTTP_BIND_IP строка "" IP-адрес, на котором слушать. Пусто — все интерфейсы
HTTP_PORT число 8025 Порт веб-интерфейса и API
HTTPS_PORT число 443 Порт HTTPS. Слушается, только если настроен сертификат
HTTP_ALLOWED_ORIGINS список "" Источники, которым разрешены запросы из браузера. Пусто — один, выведенный из HTTP_HOST

HTTP_ALLOWED_ORIGINS задаётся полными источниками со схемой: https://panel.example.com. Подстановка * не поддерживается.

База данных

Переменная Тип По умолчанию Назначение
DATABASE_DRIVER строка mysql mysql, postgres, sqlite, inmemory
DATABASE_URL строка Обязательна. Строка подключения

Названия драйвера PostgreSQL взаимозаменяемы: postgres, postgresql, pgsql, pg, pgx.

Форматы строки подключения:

# PostgreSQL
DATABASE_DRIVER=postgres
DATABASE_URL=postgres://gameap:пароль@localhost:5432/gameap?sslmode=disable

# MySQL / MariaDB
DATABASE_DRIVER=mysql
DATABASE_URL=gameap:пароль@tcp(localhost:3306)/gameap?parseTime=true

# SQLite
DATABASE_DRIVER=sqlite
DATABASE_URL=file:/var/lib/gameap/db.sqlite?_busy_timeout=5000&_journal_mode=WAL&cache=shared

Драйвер inmemory хранит данные только в оперативной памяти и предназначен для тестов: при перезапуске всё теряется.

TLS и сертификаты

Переменная Тип По умолчанию Назначение
TLS_CERT_FILE строка "" Путь к файлу сертификата
TLS_KEY_FILE строка "" Путь к файлу приватного ключа
TLS_CERT строка "" Сертификат прямо в переменной, PEM или base64
TLS_KEY строка "" Приватный ключ прямо в переменной, PEM или base64
TLS_FORCE_HTTPS логич. false Перенаправлять HTTP на HTTPS

HTTPS включается, если задан хотя бы один источник сертификата: файлы, значения в переменных или ACME. Если не задан ни один, панель работает только по HTTP.

При TLS_FORCE_HTTPS=true все запросы по HTTP получают перенаправление 301, кроме /.well-known/acme-challenge/ — иначе выпуск сертификата Let’s Encrypt был бы невозможен.

ACME (Let’s Encrypt)

Переменная Тип По умолчанию Назначение
ACME_ENABLED логич. false Автоматический выпуск сертификата
ACME_EMAIL строка "" Адрес для уведомлений. Обязателен при включённом ACME
ACME_DOMAINS список "" Домены сертификата. Обязательны при включённом ACME
ACME_CHALLENGE_TYPE строка http-01 http-01 или dns-01
ACME_DNS_PROVIDER строка "" Провайдер DNS для dns-01, например cloudflare
ACME_DIRECTORY_URL строка боевой ACME Адрес каталога ACME. Для тестов укажите staging Let’s Encrypt
ACME_RENEWAL_THRESHOLD длительн. 720h За сколько до истечения обновлять. По умолчанию 30 суток
ACME_RENEWAL_CHECK_INTERVAL длительн. 12h Как часто проверять срок
ACME_PROPAGATION_TIMEOUT длительн. 180s Сколько ждать распространения DNS-записи при dns-01
ACME_STORAGE_PATH строка acme Каталог хранения сертификатов и ключа учётной записи ACME

ACME включается только при одновременно заданных ACME_ENABLED=true, ACME_EMAIL и ACME_DOMAINS. Если чего-то не хватает, панель молча продолжит работу без ACME.

По умолчанию используется боевой каталог Let’s Encrypt с жёсткими ограничениями на число попыток. При отладке настройки указывайте staging: ACME_DIRECTORY_URL=https://acme-staging-v02.api.letsencrypt.org/directory.

Аутентификация

Переменная Тип По умолчанию Назначение
AUTH_SECRET строка Обязательна. Ключ подписи токенов, ровно 32 случайных байта
ENCRYPTION_KEY строка "" Ключ шифрования секретов в базе, ровно 32 случайных байта
AUTH_SERVICE строка paseto Формат токенов: paseto или jwt. Иное значение — панель не запустится
AUTH_BCRYPT_COST число 13 Стоимость bcrypt, от 10 до 14
AUTH_ALLOW_WEAK_PASSWORDS логич. false Отключает проверку по списку скомпрометированных паролей
AUTH_REQUIRE_MFA_FOR_ADMINS логич. true Требовать 2FA от администраторов
AUTH_MFA_HARD_FAIL_DAYS число 30 Дней до блокировки. 0 — только напоминание
AUTH_MFA_ENROLLMENT_TOKEN_TTL длительн. 15m Срок ограниченной сессии, выдаваемой после дедлайна
AUTH_SHORT_LIVED_TOKEN_TTL длительн. 10s Срок одноразовых токенов glst_. Фактически ограничен 10 секундами

Подробности — на странице Безопасность.

AUTH_SECRET приводится к 32 байтам молча: короткое значение дополняется, длинное обрезается. Задавайте ровно 32 случайных байта, например openssl rand -hex 16.

Первый администратор

Эти три переменные читаются только при первоначальном заполнении пустой базы:

Переменная Назначение
ADMIN_LOGIN Логин первого администратора
ADMIN_EMAIL Адрес электронной почты
ADMIN_PASSWORD Пароль. Если не задан, генерируется случайный и выводится в журнал при первом запуске

Пароль из ADMIN_PASSWORD не проходит проверку политики паролей: ни по длине, ни по списку скомпрометированных. Задавайте его осознанно.

Права доступа и кэш

Переменная Тип По умолчанию Назначение
RBAC_CACHE_TTL длительн. 30s Время жизни кэша проверок прав
CACHE_DRIVER строка memory memory, redis, postgres, mysql. См. ниже
CACHE_REDIS_ADDR строка localhost:6379 Адрес Redis
CACHE_REDIS_PASSWORD строка "" Пароль Redis
CACHE_REDIS_DB число 0 Номер базы Redis
CACHE_TTL_RBAC длительн. 24h Время жизни кэша прав
CACHE_TTL_GAMES длительн. 48h Время жизни кэша игр
CACHE_TTL_NODES длительн. 24h Время жизни кэша выделенных серверов
CACHE_TTL_USERS длительн. 6h Время жизни кэша пользователей
CACHE_TTL_PERSONAL_TOKENS длительн. 24h Время жизни кэша персональных токенов
CACHE_TTL_SERVER_SETTINGS длительн. 12h Время жизни кэша настроек серверов

CACHE_DRIVER принимает memory (синоним inmemory), redis, mysql (синоним database) и postgres (синонимы postgresql, pgsql, pg). Неизвестное значение приводит к аварийному завершению при старте.

Кэш хранит не только справочные данные: в нём живут ключ установки демона, список отозванных токенов и счётчики попыток входа. При CACHE_DRIVER=memory всё это теряется при перезапуске и не разделяется между несколькими экземплярами панели. Для установки из нескольких экземпляров используйте redis.

Файлы

Переменная Тип По умолчанию Назначение
FILES_DRIVER строка local local или s3
FILES_LOCAL_BASE_PATH строка "" Базовый каталог для драйвера local
FILES_S3_ENDPOINT строка "" Адрес S3-совместимого хранилища
FILES_S3_USE_SSL логич. true Обращаться к хранилищу по HTTPS
FILES_S3_ACCESS_KEY_ID строка "" Идентификатор ключа доступа
FILES_S3_SECRET_ACCESS_KEY строка "" Секретный ключ доступа
FILES_S3_BUCKET строка "" Имя бакета

Загрузка файлов

Переменная Тип По умолчанию Назначение
FILES_UPLOAD_CHUNK_SIZE размер 8M Размер части при загрузке по частям
FILES_UPLOAD_MAX_CHUNKS число 100000 Предельное число частей на один файл
FILES_UPLOAD_SESSION_TTL длительн. 24h Сколько живёт незавершённая загрузка
FILES_UPLOAD_DISPATCH_TIMEOUT длительн. 2m Таймаут передачи собранного файла демону
FILES_UPLOAD_JANITOR_INTERVAL длительн. 12h Как часто убирать просроченные загрузки
FILES_UPLOAD_ALLOWED_MIMES список "" Дополняет список разрешённых типов, не заменяет его
FILES_UPLOAD_ALLOW_ARCHIVES логич. false Разрешить архивы: zip, tar, gzip, bzip2, 7z, xz
FILES_UPLOAD_ALLOW_BINARY логич. false Разрешить произвольные двоичные файлы

Предельный размер файла — произведение FILES_UPLOAD_CHUNK_SIZE на FILES_UPLOAD_MAX_CHUNKS. При значениях по умолчанию это около 780 ГБ. Отдельно действует ограничение в 100 МБ на обычную загрузку одним запросом, оно не настраивается.

Архивы

Переменная Тип По умолчанию Назначение
FILES_ARCHIVE_MAX_BYTES размер 100G Предельный размер создаваемого архива
FILES_ARCHIVE_MAX_FILES число 500000 Предельное число файлов в архиве
FILES_ARCHIVE_CONCURRENT_PER_SERVER число 2 Одновременных операций с архивами на один сервер

gRPC

Переменная Тип По умолчанию Назначение
GRPC_PORT число 31718 Порт gRPC-сервера для демонов
GRPC_TLS_ENABLED логич. true Шифрование соединения с демонами
GRPC_REQUIRE_MTLS логич. false Требовать от демона клиентский сертификат
GRPC_EXTERNAL_HOST строка "" Адрес панели, сообщаемый демону
GRPC_EXTERNAL_PORT число 0 Порт, сообщаемый демону. 0 — берётся GRPC_PORT
GRPC_MAX_RECV_MSG_SIZE число 10485760 Предельный размер входящего сообщения, байт
GRPC_MAX_SEND_MSG_SIZE число 10485760 Предельный размер исходящего сообщения, байт
GRPC_MAX_CONCURRENT_STREAMS число 100 Одновременных потоков на соединение
GRPC_ENABLE_REFLECTION логич. false Отражение схемы для отладочных утилит
DAEMON_SETUP_KEY строка "" Постоянный ключ установки демона вместо временного

Подробности — на странице GRPC API.

DAEMON_SETUP_KEY задаёт ключ, который не истекает. Это удобно для автоматического развёртывания, но такой ключ позволяет зарегистрировать в панели новый выделенный сервер кому угодно, кто его узнает. Для обычной установки не задавайте эту переменную — панель выпустит временный ключ на час.

Безопасность

Полное описание — на странице Безопасность.

Переменная Тип По умолчанию Назначение
SECURITY_HEADERS_ENABLED логич. true Общий выключатель заголовков безопасности
SECURITY_CONTENT_TYPE_OPTIONS логич. true X-Content-Type-Options: nosniff
SECURITY_FRAME_OPTIONS строка SAMEORIGIN X-Frame-Options
SECURITY_REFERRER_POLICY строка strict-origin-when-cross-origin Referrer-Policy
SECURITY_HSTS_ENABLED логич. true HSTS. Отдаётся только по HTTPS
SECURITY_HSTS_MAX_AGE число 31536000 Срок HSTS в секундах
SECURITY_HSTS_INCLUDE_SUBDOMAINS логич. false Распространить HSTS на поддомены
SECURITY_HSTS_PRELOAD логич. false Добавить preload
SECURITY_CSP_ENABLED логич. true Content Security Policy
SECURITY_CSP_REPORT_ONLY логич. false Только отчёты, без блокировки
SECURITY_CSP_POLICY строка "" Полностью заменяет генерируемую политику
SECURITY_CSP_REPORT_URI строка "" Адрес для отчётов CSP
SECURITY_CSP_EXTRA_SCRIPT_SRC список "" Дополняет script-src
SECURITY_CSP_EXTRA_STYLE_SRC список "" Дополняет style-src
SECURITY_CSP_EXTRA_CONNECT_SRC список "" Дополняет connect-src
SECURITY_CSP_EXTRA_IMG_SRC список "" Дополняет img-src
SECURITY_CSP_EXTRA_FRAME_SRC список "" Дополняет frame-src
SECURITY_CSP_EXTRA_FONT_SRC список "" Дополняет font-src
SECURITY_SENSITIVE_PATH_PREFIXES список см. ниже Пути, ответы по которым запрещено кэшировать

Значение SECURITY_SENSITIVE_PATH_PREFIXES по умолчанию: /api/auth/,/api/profile/,/api/users/,/api/tokens/.

CAPTCHA

Переменная Тип По умолчанию Назначение
CAPTCHA_PROVIDER строка "" recaptcha_v2, recaptcha_v3 или turnstile. Пусто — выключена
CAPTCHA_SITE_KEY строка "" Публичный ключ
CAPTCHA_SECRET_KEY строка "" Секретный ключ
CAPTCHA_MIN_SCORE дробное 0.5 Порог только для reCAPTCHA v3
CAPTCHA_FAIL_OPEN логич. false Пускать вход, если сервис проверки недоступен
CAPTCHA_VERIFY_URL строка "" Свой адрес проверки

Журнал аудита

Переменная Тип По умолчанию Назначение
AUDIT_ENABLED логич. true Запись событий безопасности
AUDIT_CLIENT_IP_HEADER строка "" Заголовок с реальным IP клиента

Плагины

Переменная Тип По умолчанию Назначение
PLUGINS_DISABLED логич. false Полностью отключить плагины
PLUGINS_AUTOLOAD список "" Плагины, загружаемые при старте
PLUGINS_CACHE_ENABLED логич. true Кэш скомпилированных модулей WebAssembly
PLUGINS_CACHE_DIR строка "" Каталог этого кэша
PLUGIN_STORE_URL строка https://plugins.gameap.dev/api Адрес каталога плагинов
PLUGIN_STORE_LICENSE_KEY строка "" Лицензионный ключ для платных плагинов

Сетевые запросы плагинов

Переменная Тип По умолчанию Назначение
PLUGIN_HTTP_BLOCK_PRIVATE_IPS логич. true Запрет обращений к внутренним адресам сети
PLUGIN_HTTP_ALLOWED_SCHEMES список https Разрешённые схемы
PLUGIN_HTTP_ALLOWED_HOSTS список "" Хосты-исключения из запрета внутренних адресов
PLUGIN_HTTP_MAX_TIMEOUT_SECONDS число 30 Предельное время запроса
PLUGIN_HTTP_MAX_REDIRECTS число 5 Предельное число перенаправлений
PLUGIN_HTTP_RESPONSE_HEADER_ALLOWLIST список "" Дополняет список заголовков, передаваемых плагину

Адреса служб метаданных облачных провайдеров заблокированы всегда, PLUGIN_HTTP_ALLOWED_HOSTS на них не действует.

Отдельная группа настроек управляет собственными протоколами RCON и Query, реализуемыми плагинами:

Переменная Тип По умолчанию Назначение
PLUGIN_NET_ENABLED логич. true Разрешить плагинам сетевой обмен с игровыми серверами
PLUGIN_NET_BLOCK_PRIVATE_IPS логич. false Запрет внутренних адресов. Выключен: игровые серверы часто во внутренней сети
PLUGIN_NET_ALLOWED_HOSTS список "" Хосты-исключения
PLUGIN_NET_MAX_TIMEOUT_SECONDS число 10 Предельное время одной операции
PLUGIN_NET_READ_BUFFER_BYTES число 65536 Предельный размер одного чтения
PLUGIN_NET_MAX_CONNECTIONS число 8 Одновременных соединений на плагин

Планировщик плагинов

Переменная Тип По умолчанию Назначение
PLUGIN_SCHEDULER_MIN_INTERVAL длительн. 1s Наименьший допустимый интервал задачи
PLUGIN_SCHEDULER_MAX_TASKS_PER_PLUGIN число 32 Предельное число задач на плагин
PLUGIN_SCHEDULER_CALL_TIMEOUT длительн. 60s Таймаут вызова обработчика по умолчанию
PLUGIN_SCHEDULER_MAX_CALL_TIMEOUT длительн. 5m Предельный таймаут, который может запросить плагин
PLUGIN_SCHEDULER_MAX_RETRIES число 10 Предельное число повторов
PLUGIN_SCHEDULER_MAX_RETRY_DELAY длительн. 10m Предельная пауза между повторами
PLUGIN_SCHEDULER_MAX_JITTER длительн. 30s Предельный случайный разброс запуска
PLUGIN_SCHEDULER_REFRESH_INTERVAL длительн. 30s Как часто перечитывать задачи из базы

Обмен событиями между экземплярами

Нужен только при работе нескольких экземпляров панели. При одном экземпляре достаточно значений по умолчанию. Неизвестное значение PUBSUB_DRIVER приводит к аварийному завершению при старте.

Переменная Тип По умолчанию Назначение
PUBSUB_DRIVER строка memory memory, redis, postgres
PUBSUB_INSTANCE_ID строка "" Идентификатор экземпляра, должен быть уникальным
PUBSUB_REDIS_ADDR строка "" Адрес Redis
PUBSUB_REDIS_PASSWORD строка "" Пароль Redis
PUBSUB_REDIS_DB число 1 Номер базы Redis
PUBSUB_RETRY_ENABLED логич. true Повторять доставку при ошибке
PUBSUB_RETRY_MAX_RETRIES число 3 Предельное число повторов
PUBSUB_RETRY_INITIAL_DELAY длительн. 100ms Начальная пауза перед повтором
PUBSUB_RETRY_MAX_DELAY длительн. 5s Предельная пауза перед повтором
PUBSUB_RETRY_MULTIPLIER дробное 2.0 Во сколько раз увеличивать паузу
PUBSUB_DLQ_ENABLED логич. false Складывать недоставленные события в отдельную очередь
PUBSUB_DLQ_DRIVER строка memory Хранилище этой очереди
PUBSUB_DLQ_MAX_SIZE число 1000 Предельный размер очереди

Прочее

Переменная Тип По умолчанию Назначение
LOGGER_LEVEL строка info debug, info, warn, error
LOGGER_LOG_DB_QUERIES логич. false Записывать запросы к базе. Только для отладки
DEFAULT_LANGUAGE строка "" Язык интерфейса по умолчанию, например ru
GLOBAL_API_URL строка https://api.gameap.com Адрес Global API — обновление игр
GAMES_CDN_URLS список см. ниже Источники каталога игр, перебираются по порядку
TASK_REAPER_INTERVAL длительн. 1m Как часто искать зависшие задачи
TASK_REAPER_STALE_THRESHOLD длительн. 10m После какого простоя задача считается зависшей

Значение GAMES_CDN_URLS по умолчанию: https://cdn.gameap.ru/games.json,https://cdn.gameap.com/games.json.

Переменные, которые не действуют

Эти переменные разбираются панелью, но на её поведение не влияют. Не рассчитывайте на них:

Переменная Что не так
AUTH_SESSION_IDLE_TIMEOUT Завершения сессии по бездействию нет. Сессия живёт свой полный срок — 24 часа или 7 дней
AUTH_SESSION_IDLE_UPDATE_FREQ То же самое
GRPC_FILE_TRANSFER_BASE_PATH Значение никуда не передаётся
GRPC_ENABLED Такой переменной не существует вовсе. gRPC работает всегда, выключить его нельзя. Старые версии gameapctl дописывают эту строку в config.env

Ограничения частоты входов тоже не настраиваются переменными окружения — они заданы константами в коде. Значения приведены на странице Безопасность.

Пример минимальной конфигурации

DATABASE_DRIVER=postgres
DATABASE_URL=postgres://gameap:пароль@localhost:5432/gameap?sslmode=disable

AUTH_SECRET=замените_на_32_случайных_байта
ENCRYPTION_KEY=замените_на_32_случайных_байта

HTTP_HOST=panel.example.com
HTTP_PORT=8025

Всё остальное будет взято из значений по умолчанию.