Deployment
Choose one of the three installation methods. Once you know where the data lives and how to upgrade, you have everything this page needs to cover.
Which one to select §
- Docker Compose — Recommended. One command starts the service, and one command upgrades it.
- Native binary — when you would rather not install Docker
- Windows installer — when you want a service on Windows that starts at boot
- Source code build — Use this to modify the code or build for a specific platform.
If unsure, use the first one.
Docker Compose§
git clone --depth 1 --branch v2 \ https://github.com/tbphp/gpt-load.git cd gpt-load cp .env.example .env docker compose up -d
curl --fail http://127.0.0.1:3001/health
docker compose exec gpt-load \
sh -c 'cat /app/data/auth.key'This is the easiest pitfall to fall into: inside the container, HOST is fixed to 0.0.0.0 and DATA_DIR to /app/data. Changing either in .env has no effect. External reachability is controlled by Compose port publishing, which defaults to the host's 127.0.0.1:3001 only.
Native binary §
Download the build for your platform from GitHub Releases. There are five targets: Linux and macOS each on amd64 and arm64, plus Windows on amd64.
Verify after downloading. The release page includes SHA256SUMS:
# Verify checksum
sha256sum -c SHA256SUMS --ignore-missing
chmod +x ./gpt-load-linux-amd64
HOST=127.0.0.1 DATA_DIR=./data ./gpt-load-linux-amd64Then open http://127.0.0.1:3001. The management key is stored at ./data/auth.key.
On Windows, gpt-load-windows-amd64.exe runs in the foreground, so closing the window stops the service. To keep it running, use the installer below.
Windows installer §
The release page also offers gpt-load-windows-setup.exe, the easier way to install on Windows: double-click, confirm the administrator prompt, and it handles all of this for you:
- Registers a Windows service — runs under a low-privilege account and starts at boot
- Creates shortcuts — shortcuts to the management page appear on the desktop and in the Start menu
- Starts the service — ready to use once installed; no further commands needed
The admin key generated on first run is shown only once, on the installer screen, so save it before closing the page. If you miss it, you can still find it at %ProgramData%\GPT-Load\data\auth.key.
After installation, two directories are worth knowing:
- Configuration directory —
%ProgramData%\GPT-Load; the service reads.envfrom here - Data directory —
%ProgramData%\GPT-Load\data; the database and both keys live here
To manage the service by hand, use the subcommands built into the program:
"%ProgramFiles%\GPT-Load\gpt-load.exe" service status "%ProgramFiles%\GPT-Load\gpt-load.exe" service stop "%ProgramFiles%\GPT-Load\gpt-load.exe" service start "%ProgramFiles%\GPT-Load\gpt-load.exe" service restart
Upgrading is just a matter of running the new installer over the old one; it gracefully stops the service before updating. Uninstalling removes the program and the service but keeps the data directory — which means your configuration survives a reinstall, and also means you must delete it by hand for a truly clean removal.
Source code build §
Building from source requires Go and Node. The management UI is embedded in the binary, so the frontend is built first:
git clone --branch v2 https://github.com/tbphp/gpt-load.git
cd gpt-load
# Build management UI, artifacts will be embedded in binary
make build
./gpt-loadRefer to go.mod and web/package.json at the repository root for the required Go and Node versions.
Where the data is stored §
In the default SQLite deployment, all state is stored in DATA_DIR. The logical volume name in the Compose configuration is gpt-load-data, but the actual Docker volume name is derived from the Compose project name and may differ:
gpt-load.db— The database (SQLite by default).auth.key— generated automatically whenAUTH_KEYis not explicitly setencryption.key— generated automatically whenENCRYPTION_KEYis not explicitly set
Back up the encryption key together with the database. When explicitly setting AUTH_KEY or ENCRYPTION_KEY, back them up separately from their original secure source; they are not written to the data volume automatically. See Database and backup.
Set DATABASE_DSN to use MySQL or PostgreSQL; leave it empty to use the built-in SQLite database.
Routine operations §
# Check logs docker compose logs -f # Stop the service docker compose stop # Restart docker compose restart
Upgrade and rollback §
No need to watch GitHub. The Settings page in the admin console has a System info section: it shows your current version, flags new releases with a link to the release notes, and lets you check for updates manually.
docker compose pull docker compose up -d
Data remains in the named volume during upgrades. Database schema migrations run automatically at startup; no manual action is required.
The official Compose file uses the 2 update channel. Before GA, it tracks verified 2.0 Beta and RC releases; after GA, it tracks stable 2.x releases only. Exact image tags omit the Git tag's v prefix (for example, 2.0.0-beta.25); 2.0-beta is the 2.0 Beta channel, and latest is never used. To pin a version, use an exact image tag or digest.
Database migrations are one-way; a rollback requires more than changing the image tag. Take an offline backup before upgrading. To roll back, restore the pre-upgrade database and matching keys, then start the older version associated with that backup.
After installation, use Quick start to create your first Group, then complete the Security and production checklist before production.