Skip to content

Docker installation

EduGameDist consists of two Flask apps that share an SQLite database and file storage:

  • Frontend shows the games and files. It has no endpoints for changing content.
  • Admin lets you edit games, upload files and change the site settings. It is not published on a host port; access is controlled by Nginx Proxy Manager (NPM).

Start

Copy docker-compose.yml to a folder of its own and start the services:

docker compose up -d

The frontend becomes available on port 80. Docker Compose also creates the network edugamedist_proxy_access. Connect the NPM container to it:

docker network connect edugamedist_proxy_access <NPM container>

In NPM, create a Proxy Host with:

  • Forward Hostname / IP: admin
  • Forward Port: 8081
  • Scheme: http
  • Access List: choose a list that only allows approved users or networks

Do not add a ports: mapping to the admin service. The Docker network and NPM should be the way into the admin app. Restrict the public frontend with NPM or a firewall as well if the games should not be available to everyone.

For large uploads to work through NPM, add the following to the host’s Advanced field:

client_max_body_size 0;
proxy_request_buffering off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;

Files are uploaded in a single streamed request and stored unchanged. client_max_body_size 0 removes the proxy’s size limit, and proxy_request_buffering off stops NPM from buffering the whole file on disk first. The app has no upload limit of its own; the real capacity is the free disk space.

Where data is stored

Location Contents
./games/<Platform>/<game>/ (bind mount at /app/public/games) Uploaded game files under their original names, e.g. ./games/Windows/oslo-2084/Oslo2084-Setup.zip. The admin container mounts it read-write, the frontend read-only.
game_db volume (/app/data) The SQLite database, cover images, the uploaded logo and the session key.
game_covers volume (/app/data/legacy-covers) Cover images migrated from NocoDB (older installations only).

The <game> folder is the game’s address on the site (its slug). When a game is renamed, its folders are renamed with it, and they are removed when the last file is deleted. You can back up or browse ./games directly, but add and remove files through the admin app so the database stays in sync.

The Docker image only writes game files to /app/public/games when it is a mounted volume, so files can never end up inside a container that is replaced on the next update. Without the mount, new game files are kept in the game_db volume and admin shows a warning.

Configuration

Variable Service Purpose
ADMIN_PASSWORD admin Password for the admin login. Empty means no login. A password saved under Innstillinger (Settings) in admin takes precedence. See Restricting access.
PUBLIC_URL admin Address of the public site, used by the Åpne nettsiden (Open website) link in admin.
TITLE both Default site title until one is saved under Settings.
SECRET_KEY admin Optional key for signing login sessions. Generated and stored in game_db when not set.

Everything else (title, logo, front page text, menu, the installation guide and the terms) is changed under Innstillinger (Settings) in admin. See Personalization.

Existing installations

See Updating. The database is migrated automatically on startup, and uploads from older versions are moved into ./games/<Platform>/<game>/.