Install in Docker
The panel is distributed as a ready-made gameap/gameap image. The daemon is not run in Docker:
it has to manage game server processes on the dedicated server directly.
Quick Start
The simplest option is SQLite, with no separate database:
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 -hex 16) \
-e ENCRYPTION_KEY=$(openssl rand -hex 16) \
-e GRPC_EXTERNAL_HOST=panel.example.com \
-v gameap-data:/var/lib/gameap \
gameap/gameap:latest
The panel will be available at http://localhost:8025. The first administrator’s login and
password will be in the container log:
docker logs gameap
Two parameters from the example are essential, and both are easy to miss because the ready-made
docker-compose.ymlfiles lack them. See Port 31718 and Panel address for daemons.
Port 31718
Daemons connect to the panel through this port. The Dockerfile declares only 8025, and the
example docker-compose.yml from the repository publishes only that one as well.
Port 31718 has to be published yourself — otherwise the panel will work, but not a single dedicated server will connect to it.
ports:
- "8025:8025"
- "31718:31718"
Panel address for daemons
The panel substitutes its own address into the daemon installation command. By default it takes
it from the request header, and inside a container that is usually localhost or the service
name — such a command will not work on a remote dedicated server.
Set the address at which the panel is reachable from outside:
environment:
GRPC_EXTERNAL_HOST: panel.example.com
If port 31718 is published externally under a different number, set it too:
environment:
GRPC_EXTERNAL_PORT: 41718
GRPC_EXTERNAL_HOSTgoes into the name list of the self-signed gRPC certificate, and the certificate is created on first start. Set the variable before the first start. If you set it later, deletecerts/server/api-server.crtandcerts/server/api-server.keyin the panel’s files directory and restart the container. See GRPC API for details.
Docker Compose
A ready-made docker-compose.yml is available in the
panel repository. It brings up the panel together with
PostgreSQL and Redis:
git clone https://github.com/gameap/gameap.git
cd gameap
docker compose up -d
You need to add the port 31718 publication and GRPC_EXTERNAL_HOST to it, as described above.
Passwords and keys are set via a .env file next to docker-compose.yml:
AUTH_SECRET=replace_with_32_random_bytes
ENCRYPTION_KEY=replace_with_32_random_bytes
POSTGRES_PASSWORD=replace_with_a_strong_password
LOGGER_LEVEL=info
In the example
docker-compose.yml, the defaultAUTH_SECRETandENCRYPTION_KEYvalues arechange-me-in-production. With such keys, session tokens are trivial to forge. Set your own values before the first start.Keep in mind: changing
ENCRYPTION_KEYon a running installation breaks two-factor authentication for every user. See Security.
Data and Volumes
All panel state is stored in /var/lib/gameap:
| What | Where |
|---|---|
| Panel files | The directory from FILES_LOCAL_BASE_PATH, /var/lib/gameap/files in the compose example |
| gRPC certificates | The certs/ subdirectory inside it |
| ACME certificates | The subdirectory from ACME_STORAGE_PATH, acme/ by default |
| SQLite database | Wherever DATABASE_URL points |
Certificates and ACME data are stored not in the volume root but inside the panel’s files
directory. With the settings from the example docker-compose.yml, the full path to the gRPC
certificate is /var/lib/gameap/files/certs/server/api-server.crt.
Mount this directory as a volume, otherwise recreating the container will lose the certificates — and all daemons will stop connecting.
The container runs as the unprivileged gameap user, so the volume must have suitable
permissions.
Environment Variables
The image is configured with the same variables as a regular installation — the full list is in
the config.env Reference. No config.env file is needed inside the
container.
The bare minimum:
| Variable | Purpose |
|---|---|
DATABASE_DRIVER |
postgres, mysql, or sqlite |
DATABASE_URL |
Database connection string |
AUTH_SECRET |
Token signing key, 32 random bytes |
ENCRYPTION_KEY |
Secrets encryption key, 32 random bytes |
GRPC_EXTERNAL_HOST |
Panel address daemons use to connect |
Health Check
The image includes a health check — a request to /api/health:
docker inspect --format='' gameap
The panel log:
docker logs -f gameap
Behind a Reverse Proxy
If HTTPS is served by nginx or Traefik, there is no need to configure certificates in the
panel. The proxy must pass the X-Forwarded-Proto: https header and overwrite it, not
append to it.
Port 31718 usually does not go through a reverse proxy: daemons must connect to the panel directly. See HTTPS and Certificates for details.
Upgrading
docker compose pull
docker compose up -d
Before upgrading, back up the database and the data volume: migrations are applied at startup and are irreversible.
docker compose exec postgres pg_dump -U gameap gameap > gameap-backup.sql