Skip to main content

Obtain the distribution

Download the distribution from the Oso dashboard: open Organization settings → Self-hosted, choose a version, and select Get link to generate a download URL for the tarball. Unpack it and enter the directory:
Self-hosted downloads are enabled per account. Contact Oso to turn on access for your account before you begin.

Load the images

The distribution bundles every image the stack needs, so you load them into Docker:

Configuration

All configuration lives in .env, next to docker-compose.yml. Run ./initialize-environment.sh to create it: the script generates the secrets and leaves blanks for you to fill in — the database URLs, public URL, OIDC settings, and admin emails. Every variable is required; the stack won’t start with one missing, and an unfilled blank counts as missing.
Run ./initialize-environment.sh once. Re-running requires --force and rotates every secret.

Databases

Set CONTROL_DATABASE_URL and AGENT_EVENTS_DATABASE_URL to the databases from Requirements → PostgreSQL. Both must already exist — the stack does not create them, so create them now if you haven’t.

Networking

The stack publishes two ports on the host: the dashboard on 8080 and the traffic proxy (which agents connect to) on 8090. Every other service — the enforcement engine, the message broker, and the optional evaluator — is reachable only over the Compose network and publishes no host port. The stack does not terminate TLS — put your load balancer or reverse proxy, with your certificate, in front, forward to 8080 (and 8090 if agents connect through it), and set OSO_PUBLIC_URL to that https:// address. The stack must be served over HTTPS except on localhost — see Security → Encryption in transit.

Authentication (OIDC)

Register <OSO_PUBLIC_URL>/web/oauth/oidc/callback as the redirect URI at your IdP. Everyone who logs in is an operator; ADMIN_EMAILS are the admins, everyone else a member.

Secrets

initialize-environment.sh generates these into .env; leave them as-is. (Operations → Configuration file management covers keeping them stable and backing them up.)

Optional features

Each of these stays switched off until you configure it:

Start the stack

Bring it all up:
Start from empty volumes. On boot the init containers sync data from your PostgreSQL databases; if the volumes already hold data, the init containers erase it first.

First login

Open your OSO_PUBLIC_URL (for example https://oso.example.com) and log in through your IdP.

Verify the stack

Confirm that the one-time setup containers — ensure_tenant_environment, seed_metadata, init_policy, and oso_sync — each finished with exited (0), then check that the health endpoints answer:
Use docker compose logs <service> to investigate anything that isn’t healthy.