Справочник 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
Всё остальное будет взято из значений по умолчанию.