This document explains how to deploy VaultKit in production and production-like environments. VaultKit is designed to be easy to deploy for design partners, while remaining flexible enough for advanced infrastructure setups.
Deploy: github.com/vaultkit-inc/deploy
VaultKit consists of four main components:
VaultKit uses a single entry point for both the frontend and backend.
The Console container runs nginx internally. nginx serves the React app and automatically proxies all API and auth requests to the Control Plane over Docker’s internal network. This means:
Browser → Console:5173 → nginx (inside console container)
├── /api/* → Control Plane:3000
├── /auth/oidc/* → Control Plane:3000
├── /auth/cli/* → Control Plane:3000
└── /* → React app
VaultKit supports two deployment models out of the box.
Best for:
One URL serves everything — nginx inside the Console handles routing. No external reverse proxy required.
This is the recommended starting point.
Best for:
Example:
https://app.acme.com → Console (frontend + nginx proxy)
https://api.acme.com → Control Plane (backend)
No VaultKit images need to be rebuilt — only routing and .env changes.
git clone https://github.com/vaultkit-inc/deploy.git
cd deploy
./scripts/install.sh
This does the following:
.env.example → .envvkit_priv.pem, vkit_pub.pem).envEdit .env and set APP_HOST and FRONTEND_BASE_URL to wherever VaultKit will be accessed from. Pick the option that matches your setup:
Option A — Local machine
RAILS_ENV=production
APP_HOST=http://localhost:5173
FRONTEND_BASE_URL=http://localhost:5173
DATABASE_URL=postgres://vaultkit:<password>@postgres:5432/vaultkit
FUNL_URL=http://funl-runtime:8080
VKIT_PRIVATE_KEY=/secrets/keys/vkit_priv.pem
VKIT_PUBLIC_KEY=/secrets/keys/vkit_pub.pem
Option B — Remote VM or EC2 (no domain)
RAILS_ENV=production
APP_HOST=http://54.123.45.67:5173
FRONTEND_BASE_URL=http://54.123.45.67:5173
DATABASE_URL=postgres://vaultkit:<password>@postgres:5432/vaultkit
FUNL_URL=http://funl-runtime:8080
VKIT_PRIVATE_KEY=/secrets/keys/vkit_priv.pem
VKIT_PUBLIC_KEY=/secrets/keys/vkit_pub.pem
Replace 54.123.45.67 with your server’s public IP. To find it:
curl ifconfig.me
Option C — Custom domain
RAILS_ENV=production
APP_HOST=https://vaultkit.yourdomain.com
FRONTEND_BASE_URL=https://vaultkit.yourdomain.com
DATABASE_URL=postgres://vaultkit:<password>@postgres:5432/vaultkit
FUNL_URL=http://funl-runtime:8080
VKIT_PRIVATE_KEY=/secrets/keys/vkit_priv.pem
VKIT_PUBLIC_KEY=/secrets/keys/vkit_pub.pem
For Option C, point your domain’s A record to your server’s IP address and configure TLS via Cloudflare or Let’s Encrypt before starting VaultKit.
Note: Both
APP_HOSTandFRONTEND_BASE_URLalways point to the same URL because nginx inside the Console unifies frontend and backend behind a single entry point.
docker compose up -d
Verify services:
docker compose ps
All four containers should be running:
| Container | Port | Purpose |
|---|---|---|
| vaultkit-console | 5173 | Frontend + nginx proxy — your entry point |
| vaultkit-control-plane | 3000 | Backend API (internal only) |
| vaultkit-funl | 8080 | Query execution engine (internal only) |
| vaultkit-db | — | Postgres (internal only) |
Open your browser at whichever URL you configured:
# Option A
http://localhost:5173
# Option B
http://54.123.45.67:5173
# Option C
https://vaultkit.yourdomain.com
Health check:
<your-url>/up
VaultKit supports OIDC providers such as Okta, Auth0, Azure AD, and others.
For browser-based login the redirect URI must be:
<your-url>/auth/oidc/callback
Most OIDC providers require HTTPS for redirect URIs. For local evaluation without OIDC, skip this step and use token-based access instead.
If you want separate frontend and backend domains:
.env:APP_HOST=https://api.acme.com
FRONTEND_BASE_URL=https://app.acme.com
app.acme.com → Console container (port 5173)api.acme.com → Control Plane container (port 3000)VaultKit images remain unchanged.
By default, VaultKit runs Postgres inside Docker.
If you already have Postgres:
postgres service from docker-compose.ymlDATABASE_URL to your existing databaseDATABASE_URL=postgres://vaultkit:<password>@db.acme.internal:5432/vaultkit
.env must not be committed to version controldocker compose pull
docker compose up -d
Database migrations run automatically on container startup.
docker compose logs consoledocker compose ps/auth/oidc/callback resolves to the Console URL/auth/callback is handled by the React appdocker compose logs consoleAfter deployment:
If you are a design partner and need help:
docker compose logsVaultKit is designed to deploy cleanly, predictably, and without surprises. If something feels harder than it should be, that’s a signal — and we want to hear about it.