Установка в Docker

Панель распространяется готовым образом gameap/gameap. Демон в Docker не запускают: он должен управлять процессами игровых серверов на выделенном сервере напрямую.

Быстрый запуск

Самый простой вариант — SQLite, без отдельной базы данных:

docker run -d \
  --name gameap \
  -p 8025:8025 \
  -p 31718:31718 \
  -e DATABASE_DRIVER=sqlite \
  -e 'DATABASE_URL=file:/var/lib/gameap/db.sqlite?_busy_timeout=5000&_journal_mode=WAL&cache=shared' \
  -e AUTH_SECRET=$(openssl rand -base64 24) \
  -e ENCRYPTION_KEY=$(openssl rand -hex 32) \
  -e GRPC_EXTERNAL_HOST=panel.example.com \
  -v gameap-data:/var/lib/gameap \
  gameap/gameap:latest

Панель откроется на http://localhost:8025. Логин и пароль первого администратора будут в журнале контейнера:

docker logs gameap

Два параметра из примера — обязательные, и оба легко упустить, потому что в готовых docker-compose.yml их нет. См. Порт 31718 и Адрес панели для демонов.

Порт 31718

По этому порту демоны подключаются к панели. В Dockerfile объявлен только 8025, и в примере docker-compose.yml из репозитория опубликован тоже только он.

Порт 31718 нужно пробрасывать самостоятельно — иначе панель будет работать, а ни один выделенный сервер к ней не подключится.

ports:
  - "8025:8025"
  - "31718:31718"

Адрес панели для демонов

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

Задайте адрес, по которому панель доступна извне:

environment:
  GRPC_EXTERNAL_HOST: panel.example.com

Если порт 31718 опубликован наружу под другим номером, укажите и его:

environment:
  GRPC_EXTERNAL_PORT: 41718

GRPC_EXTERNAL_HOST попадает в список имён самоподписанного сертификата gRPC, а сертификат создаётся при первом запуске. Задайте переменную до первого старта. Если задать позже, удалите certs/server/api-server.crt и certs/server/api-server.key в каталоге файлов панели и перезапустите контейнер. Подробнее — GRPC API.

Docker Compose

Готовый файл docker-compose.yml есть в репозитории панели. Он поднимает панель вместе с PostgreSQL и Redis:

git clone https://github.com/gameap/gameap.git
cd gameap
docker compose up -d

К нему нужно добавить проброс порта 31718 и GRPC_EXTERNAL_HOST, как описано выше.

Пароли и ключи задаются через файл .env рядом с docker-compose.yml:

AUTH_SECRET=замените_на_32_случайных_байта
ENCRYPTION_KEY=замените_на_32_случайных_байта
POSTGRES_PASSWORD=замените_на_надёжный_пароль
LOGGER_LEVEL=info

В примере docker-compose.yml значения AUTH_SECRET и ENCRYPTION_KEY по умолчанию — change-me-in-production. С такими ключами токены сессий подделываются тривиально. Замените оба значения до первого docker compose up — не после, а до.

Позже сменить ENCRYPTION_KEY уже не получится безболезненно: сохранённые секреты TOTP станут нечитаемыми, и всем пользователям придётся подключать двухфакторную аутентификацию заново. См. Безопасность.

Длина у ключей разная: AUTH_SECRET приводится ровно к 32 байтам, а ENCRYPTION_KEY хешируется целиком. Поэтому команды генерации в примере выше отличаются.

Данные и тома

Всё состояние панели хранится в /var/lib/gameap:

Что Где
Файлы панели Каталог из FILES_LOCAL_BASE_PATH, в примере compose — /var/lib/gameap/files
Сертификаты gRPC Подкаталог certs/ внутри него
Сертификаты ACME Подкаталог из ACME_STORAGE_PATH, по умолчанию acme/
База данных SQLite Там, где указано в DATABASE_URL

Сертификаты и данные ACME хранятся не в корне тома, а внутри каталога файлов панели. При настройках из примера docker-compose.yml полный путь к сертификату gRPC — /var/lib/gameap/files/certs/server/api-server.crt.

Подключайте этот каталог томом, иначе при пересоздании контейнера потеряются сертификаты — и все демоны перестанут подключаться.

Контейнер работает от непривилегированного пользователя gameap, поэтому у тома должны быть подходящие права.

Переменные окружения

Образ настраивается теми же переменными, что и обычная установка, — полный список в справочнике config.env. Файл config.env внутри контейнера не нужен.

Минимально необходимое:

Переменная Назначение
DATABASE_DRIVER postgres, mysql или sqlite
DATABASE_URL Строка подключения к базе
AUTH_SECRET Ключ подписи токенов, 32 случайных байта
ENCRYPTION_KEY Ключ шифрования секретов, 32 случайных байта
GRPC_EXTERNAL_HOST Адрес панели, по которому к ней подключаются демоны

Проверка состояния

В образе есть проверка работоспособности — запрос к /api/health:

docker inspect --format='' gameap

Журнал панели:

docker logs -f gameap

За обратным прокси

Если HTTPS обслуживает nginx или Traefik, сертификаты в панели настраивать не нужно. Прокси должен передавать заголовок X-Forwarded-Proto: https и перезаписывать его, а не дополнять.

Порт 31718 через обратный прокси обычно не проходит: демоны должны подключаться к панели напрямую. Подробнее — HTTPS и сертификаты.

Обновление

docker compose pull
docker compose up -d

Перед обновлением сделайте резервную копию базы данных и тома с данными: миграции применяются при запуске и необратимы.

docker compose exec postgres pg_dump -U gameap gameap > gameap-backup.sql