Self-host Oriant
Run the Oriant MCP gateway and dashboard on your own machine or server with Docker. Two commands, one Postgres, no account needed.
The self-hosted edition runs the MCP gateway and the dashboard on one machine: Postgres, a migration step, and the dashboard. Your AI clients connect to Oriant instead of straight to the MCP server, and every call is checked and recorded in your own database.
View as MarkdownRequirements
- Docker with Compose v2 (Docker Desktop on macOS or Windows, Docker Engine on Linux).
- An Intel/AMD or ARM machine. The images are built for
linux/amd64andlinux/arm64. - Outbound internet, so Oriant can reach the MCP servers you connect (Linear, Notion, Atlassian and others).
Quick start
Write the configuration
initasks for the owner email, the organization name and the address Oriant is served at, generates the secrets, and writesdocker-compose.yml,Caddyfileand.envinto./oriant. It refuses to overwrite an existing.env.docker run --rm -it -v "$PWD/oriant:/out" --user "$(id -u):$(id -g)" \ ghcr.io/4ug-aug/oriant-migrate-sh:latest initStart Oriant
migrateanddb-rolesrun once and exit with code 0.dashboardandpostgreskeep running.cd oriant && docker compose up -ddocker compose ps -aGet the owner password
Oriant creates the owner and their organization on first boot and prints a generated password once.
docker compose logs dashboard | grep -A3 'created admin user'Sign in
Open the address you gave
init(defaulthttp://localhost:3000) and sign in as the owner. You land in your organization.Connect an AI client
In Oriant, open MCP Connections, add a server such as Linear, and name it. Then point Claude Code at it and run
/mcpinside Claude Code to sign in. Oriant asks you to sign in to Linear on first use, and the call shows on the connection page.claude mcp add --transport http linear http://localhost:3000/mcp/linear
Without a terminal
Without a terminal (CI, scripts), pass the answers as environment variables:
docker run --rm -v "$PWD/oriant:/out" --user "$(id -u):$(id -g)" \
-e OWNER_EMAIL=you@example.com -e OWNER_ORG_NAME="Acme" \
-e ORIANT_URL=http://localhost:3000 \
ghcr.io/4ug-aug/oriant-migrate-sh:latest initEnvironment variables
All settings live in oriant/.env. init fills it in; edit it and run docker compose up -d to apply a change.
Address
ORIANT_URL
required, default
http://localhost:3000The address people and AI clients use. Every MCP address and sign-in callback is built from it, so changing it later means re-adding each MCP connection and reconnecting every AI client. Browse Oriant at exactly this address.
ORIANT_PORT
optional, default
3000Host port for the dashboard, bound to 127.0.0.1. Must match the port in
ORIANT_URL.initsets it when the address uses another port.COMPOSE_PROFILES
optional
Set to
httpsto put Caddy in front of the dashboard on ports 80 and 443.initsets it when the address starts withhttps://.ORIANT_TLS
optional, default
internalWhere Caddy gets its certificate: an email address for Let’s Encrypt (needs public DNS and port 80 open),
internalfor Caddy’s own CA (clients must trust it), or/certs/cert.pem /certs/key.pemfor a company certificate placed inoriant/certs/.
Version
ORIANT_VERSION
set by init
Image tag for the dashboard and migrate images:
latestor a release tag such asv0.1.63.initpins it to the release it came from.
Database
POSTGRES_PASSWORD
set by init
Password of the Postgres superuser, used only by the migration step. Postgres is not published to the host.
DASHBOARD_DB_PASSWORD
set by init
Password of the restricted database role the dashboard connects as. That role cannot bypass row-level security.
Sign-in
BETTER_AUTH_SECRET
set by init
Signs sessions and encrypts each member’s MCP server tokens. Rotating it signs everyone out and makes them sign in to each MCP server again.
OWNER_EMAIL
required
Email of the first admin, created on first boot.
OWNER_PASSWORD
optional
Password for the first admin. Leave it empty and Oriant generates one and prints it once in
docker compose logs dashboard.OWNER_ORG_NAME
optional
Organization created for the owner on first boot. Without it, create the organization under Admin → Organizations and accept the invitation.
EMAIL_TRANSPORT
optional, default
loglogprints invitations and sign-in links indocker compose logs dashboardinstead of sending them. Clear it when you setSMTP_URL.SMTP_URL
optional
SMTP relay for real email, for example
smtps://user:pass@smtp.example.com:465.EMAIL_FROM
optional
Sender address for email sent through
SMTP_URL.
Which AI clients can reach it
- Claude Code and Cursor. Sign in through a callback on the user’s own machine, so they work on an internal address, including
http://localhost. - Claude on web, desktop and mobile. Connectors are called from Anthropic’s cloud, so
ORIANT_URLmust be public HTTPS. - MCP servers. Called from the Oriant server, which needs outbound internet. Their sign-in returns through the member’s browser, so the server itself does not have to be public for them.
Operations
Run it on a server with HTTPS
Set the address to your domain and turn on the
httpsprofile in.env, then restart. WithORIANT_TLS=internal, Claude Code needsNODE_EXTRA_CA_CERTSpointing at Caddy’s root certificate.ORIANT_URL=https://oriant.example.com COMPOSE_PROFILES=https ORIANT_TLS=you@example.comdocker compose cp caddy:/data/caddy/pki/authorities/local/root.crt ./oriant-root.crtUpgrade
Set
ORIANT_VERSIONin.envto the new release tag, then pull and restart. The migration step applies only new database changes.docker compose pull && docker compose up -dBack up
Postgres is the only datastore.
docker compose exec postgres pg_dump -U oriant oriant > oriant.sqlStart over
Deletes the database volume and everything in it.
docker compose down -v
License
Oriant is free to self-host under the Elastic License 2.0. You may not offer it to others as a hosted or managed service.
