Wiki contents
Installing and hosting

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.