Install with Docker Compose
Run Open Tabletop, PostgreSQL, and Redis together.
Install Git and Docker with the Compose plugin before starting. These commands create a fresh installation. Keep existing password files when upgrading.
Download and configure
git clone https://github.com/optimuspryne/open-tabletop.git
cd open-tabletop
cp .env.example .env
In .env, set BOOTSTRAP_ADMIN_USERNAME and
BOOTSTRAP_ADMIN_EMAIL for your initial administrator.
Create password files
mkdir -p secrets
openssl rand -base64 32 > secrets/db_owner_password.txt
openssl rand -base64 32 > secrets/app_db_password.txt
openssl rand -base64 32 > secrets/admin_password.txt
chmod 600 secrets/*.txt
Store these files securely. The administrator password is the content of
secrets/admin_password.txt. Do not commit the files to Git.
Secret-file permissions
The app runs as UID 100, GID 101 in the default image. On a regular Linux Docker host, mode-600 files created by your own account may be unreadable inside the app container. For the three files above, assign the default container identity before starting:
sudo chown 100:101 secrets/db_owner_password.txt secrets/app_db_password.txt secrets/admin_password.txt
sudo chmod 600 secrets/db_owner_password.txt secrets/app_db_password.txt secrets/admin_password.txt
Use the corresponding mapped host identity if Docker uses user-namespace remapping or rootless mode. Keep files readable by the container account without making them public. For optional environment settings, see Compose configuration.
Start the app
docker compose up -d
Open http://localhost:2567. From another device on your local network, use the server's LAN address and port 2567.
Sign in with the administrator you configured. Bootstrap runs only when the users table is empty. Restarting the app does not reset an existing administrator's password.
Storage and services
Compose runs the application, PostgreSQL, and Redis. The db-data volume
stores database records, and assets stores uploaded decks, boards, props, and
skyboxes. Keep both when updating. Redis stores temporary rate-limit data.
The app applies pending database migrations at startup using a separate database owner role. The normal runtime connection uses a role with fewer permissions.
Use a published image
To use a published release instead of building locally, replace build: . in
docker-compose.yml with
image: optimuspryne/open-tabletop:0.20.0. Select the version you intend to
run and read its upgrade notes. Features documented from current source may not be in that
image.
Recover administrator access
To promote an existing account, run:
docker compose exec app npm run admin:grant -- user@example.com
For password recovery, see Accounts and permissions. For internet access, follow Networking and HTTPS. For upgrades and backups, see Maintenance.
Sources checked: docker-compose.yml, Dockerfile, server/bootstrap-admin.js. Reviewed September 29, 2026 against the working source. Published releases may differ; check the changelog for your version.