Skip to content

Deployment

Roster ships as a single Docker image for the platform app. The image starts the server, runs SQLite migrations before startup, and stores runtime state under /data.

Run with a persistent data volume:

Terminal window
docker run --rm \
-p 3000:3000 \
-e ROSTER_AUTH_URL=https://roster.example.com \
-e ROSTER_AUTH_SECRET=<generated-secret> \
-e ROSTER_MCP_AUTH_MODE=oauth \
-e ROSTER_MCP_RESOURCE_URI=https://roster.example.com/mcp \
-v roster_data:/data \
advantys/roster

The image defaults to:

NODE_ENV=production
HOST=0.0.0.0
PORT=3000
ROSTER_DATA_DIR=/data

With ROSTER_DATA_DIR=/data and no ROSTER_DATABASE_URL, the runtime uses /data/roster.db for startup migrations and the platform database. Set ROSTER_DATABASE_URL only when you need a custom SQLite path.

Set at least:

NODE_ENV=production
ROSTER_AUTH_URL=https://your-roster-host.example
ROSTER_AUTH_SECRET=<long-random-secret>
ROSTER_MCP_AUTH_MODE=oauth
ROSTER_MCP_RESOURCE_URI=https://your-roster-host.example/mcp

Set ROSTER_PROVIDER_SECRET_ENCRYPTION_KEY when provider secrets use encrypted storage.

The root fly.toml deploys the platform app, serves HTTP internally on port 3000, mounts /data, and uses docker/Dockerfile.

Terminal window
flyctl volumes create roster_data -a roster-alpha -r cdg -s 1
flyctl secrets set ROSTER_AUTH_SECRET=...
flyctl deploy -c fly.toml

Keep production data initialization under an approved operational runbook.