Install

Install

The fastest way to run Tabularium is the published Docker image. SQLite-backed, no extra services required.

Quick start

mkdir -p ./tabularium-data
export JWT_SECRET=$(openssl rand -hex 32)
export TOKEN_ENC_KEY=$(openssl rand -hex 32)
docker compose up -d
bash

with this docker-compose.yml:

services:
  registry:
    image: ghcr.io/tabularisdb/tabularium:latest
    restart: unless-stopped
    ports:
      - "3000:3000"
    environment:
      JWT_SECRET: ${JWT_SECRET:?run: openssl rand -hex 32}
      TOKEN_ENC_KEY: ${TOKEN_ENC_KEY:?run: openssl rand -hex 32}
      BASE_URL: "http://localhost:3000"
      DATA_DIR: "/data"
    volumes:
      - ./tabularium-data:/data
yaml

Open http://localhost:3000 . On first boot the registry generates a bootstrap password and writes it to ./tabularium-data/bootstrap-password:

cat ./tabularium-data/bootstrap-password
bash

Sign in at /login with admin@example.com + that password. The install wizard then asks for a database URL, seeds default CMS pages, and restarts.

Required env

VarNotes
JWT_SECRET≥32 chars
TOKEN_ENC_KEYexactly 64 hex chars (AES-256-GCM at-rest key)
BASE_URLhttp(s)://… — public origin, used in OAuth callbacks and webhook URLs

Everything else is optional. See Deploy → Env vars for the full list.

If you want…

…to pin the bootstrap password

Set BOOTSTRAP_PASSWORD in the environment. The registry then uses that value instead of generating one, and no file is written.

…Postgres or MySQL instead of SQLite

Configure the database via the install wizard, or pre-seed DATABASE_URL:

DialectURL form
SQLite (default)sqlite:/data/registry.sqlite
Postgrespostgres://user:pass@host:5432/db
MySQLmysql://user:pass@host:3306/db

The dialect is detected from the scheme; migrations run on first connect.

…multi-replica deployments

Switch the cache to Redis (or Dragonfly):

environment:
  CACHE_DRIVER: "redis"
  REDIS_URL: "redis://cache:6379"
yaml

…updates

docker compose pull
docker compose up -d
bash

The container reads the same DATA_DIR on restart and runs any pending migrations.

…a fresh start

Delete the persisted folder (irreversible):

docker compose down
rm -rf ./tabularium-data
bash

Or just delete the wizard lock to keep the database but re-run the wizard:

docker compose exec registry rm /data/config.json
docker compose restart
bash

Building from source

git clone https://github.com/TabularisDB/tabularium
cd Tabularium
bun install
docker compose -f compose.dev.yml up -d   # Postgres + Dragonfly for dev
cd apps/api && bun --hot src/index.ts &
cd apps/frontend && bun dev               # http://localhost:5180
bash

apps/api/.env controls runtime configuration in dev — copy from apps/api/.env.example.