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.
Databases
SetCONTROL_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:First login
Open yourOSO_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:
docker compose logs <service> to investigate anything that isn’t healthy.