Run Vardum yourself.

One Compose file, your database, your bucket. MIT licensed.

compose.production.yml

What you need

DockerWith Compose
A bucketS3-compatible, with presigned POST and CORS, reachable by browsers. Or the bundled RustFS.
A proxyFor TLS. It must pass the original Host header through.
SMTPFor email verification, which the default allowlist requires, plus invitations and password recovery.

Quick start

Replace every secret and fill in your bucket first.

$ cp .env.production.example .env.production
$ docker compose --env-file .env.production \
    -f compose.production.yml up -d --build --wait
$ curl --fail http://localhost:8080/ready

Five services and an optional store.

gatewaynginx. Serves the app, proxies /api, /w and /v.
apiVersions, Vards, signed delivery and transforms.
workerChecks uploads and prunes old delivery events.
postgresRow-level security per workspace, a limited runtime role.
migratePrepares the schema, then exits.
rustfsOptional bundled object store, behind --profile rustfs.

Configuration

Everything lives in .env.production. The example is written for Hetzner Object Storage and shows Amazon S3 beside it.

APP_URLPublic URL of your install
POSTGRES_PASSWORDAdministrator and migrator
POSTGRES_APP_PASSWORDRuntime role for the API and worker
BETTER_AUTH_SECRETSigns sessions
TRANSFORM_SECRETSigns variant URLs
S3_*Bucket, region, endpoints and a key scoped to the bucket
ORGANIZATION_CREATIONallowlist, open or disabled
CUSTOM_DOMAIN_TARGETThe hostname custom domains point at
SMTP_*Your mail provider, if any

Built to be operated.

  • /health and /ready for your load balancer
  • Backup, restore and upgrade procedures
  • Dokploy templates for Traefik setups
  • A disposable fresh-install smoke test

Point the CLI and agents at it.

vardum init asks for your server URL. The MCP server takes --server or VARDUM_SERVER.

Start with one logo.

Start your own instance, upload it, map it into a repository, and pull.

npm i -D -E @vardum/cli