Self Host
Minimal Container

Minimal Container

Lightweight Alpine image (~20-30MB) containing only the Go backend with the embedded frontend. Requires external ClickHouse and PostgreSQL instances.

Quick Start

Pull the pre-built image and run it pointing at your databases:

docker pull ghcr.io/tracewayapp/traceway:minimal
 
docker run -d --name traceway \
  -p 80:80 \
  -v traceway-storage:/app/storage \
  -e CLICKHOUSE_SERVER="clickhouse-host:9000" \
  -e CLICKHOUSE_DATABASE="traceway" \
  -e CLICKHOUSE_USERNAME="default" \
  -e CLICKHOUSE_PASSWORD="your-password" \
  -e POSTGRES_HOST="postgres-host" \
  -e POSTGRES_PORT="5432" \
  -e POSTGRES_DATABASE="traceway" \
  -e POSTGRES_USERNAME="traceway" \
  -e POSTGRES_PASSWORD="your-password" \
  -e POSTGRES_SSLMODE="disable" \
  -e JWT_SECRET="your-jwt-secret-min-32-characters-long" \
  -e APP_BASE_URL="https://traceway.example.com" \
  ghcr.io/tracewayapp/traceway:minimal

After starting, open http://localhost/register to create your first account.

The traceway-storage volume holds blob storage: uploaded source maps, session recordings, and AI traces. Without it those files are lost when the container is recreated. To use S3 instead of a volume, see Blob Storage.

Build from Source

Only needed if you want to run a custom or modified build:

docker build -f Dockerfile.minimal -t traceway:minimal .

Then use traceway:minimal instead of ghcr.io/tracewayapp/traceway:minimal in the command above.

Required Environment Variables

VariableDescriptionExample
CLICKHOUSE_SERVERClickHouse host:portclickhouse:9000
CLICKHOUSE_DATABASEClickHouse databasetraceway
CLICKHOUSE_USERNAMEClickHouse usernamedefault
CLICKHOUSE_PASSWORDClickHouse passwordpassword
CLICKHOUSE_TLSEnable TLSfalse
POSTGRES_HOSTPostgreSQL hostpostgres
POSTGRES_PORTPostgreSQL port5432
POSTGRES_DATABASEPostgreSQL databasetraceway
POSTGRES_USERNAMEPostgreSQL usernametraceway
POSTGRES_PASSWORDPostgreSQL passwordpassword
POSTGRES_SSLMODEPostgreSQL SSL modedisable
JWT_SECRETSigns all authentication tokens (dashboard sessions and CLI/MCP device logins). Use a strong, unique secret of at least 32 chars; keep it stable. See CLI Authentication.your-secret-here
APP_BASE_URLPublic URL of your instance. Used for SDK setup instructions, email links, OAuth callback URLs, and the CLI/MCP OAuth issuer plus device-login verification URL. If unset, derived per-request from Host / X-Forwarded-*.https://traceway.example.com
STORAGE_TYPEBlob storage backend for source maps, session recordings, and AI traces: local (default) or s3. See Blob Storage for the S3 variables.local
STORAGE_PATHFolder for local blob storage. Defaults to ./storage, which is /app/storage in this image. Mount a volume there. Ignored when STORAGE_TYPE=s3./app/storage
SESSION_RECORDING_RETENTION_DAYSDays to keep on-disk session recordings under STORAGE_PATH/recordings/. Defaults to 30. Worker runs hourly and on startup. 0 disables; no effect when STORAGE_TYPE=s3.30

SSO (optional)

Adds Continue with Google / Continue with GitHub buttons to the login and register pages. See the SSO guide for the full provider setup walkthrough.

When configuring providers, set the callback URL on the provider side to <APP_BASE_URL>/api/auth/callback/{google|github}.

VariableDescriptionExample
GOOGLE_CLIENT_IDGoogle OAuth client ID. Setting both Google variables enables the Google button....apps.googleusercontent.com
GOOGLE_CLIENT_SECRETGoogle OAuth client secret.GOCSPX-...
GITHUB_CLIENT_IDGitHub OAuth App client ID. Setting both GitHub variables enables the GitHub button.Ov23li...
GITHUB_CLIENT_SECRETGitHub OAuth App client secret.(40-char hex)
OAUTH_SESSION_SECRETCookie signing secret for the OAuth round-trip. Falls back to JWT_SECRET when unset.(32+ random bytes)

Access Points

URLDescription
http://localhost/Frontend dashboard
http://localhost/api/*Backend API
http://localhost/healthHealth check

Useful Commands

# View logs
docker logs traceway
docker logs -f traceway
 
# Enter container shell
docker exec -it traceway sh
 
# Health check
curl http://localhost/health
 
# Stop and remove
docker stop traceway && docker rm traceway