Overview
Production deployment usesunoverse deploy, which reads your groundβs rendered configuration and runs Ansible playbooks to install and configure services on your VM.
Prerequisites
- SSH access to target VM
- Ansible installed locally (
pip install ansible) - DOCR token for pulling images
- PostgreSQL instance provisioned (customer-managed)
Quick Deploy (Single VM)
What the Rendered Configuration Contains
You never write it (Terraform renders it; deploy places it on the server), but for the curious it is the same format as.env, plus:
.env.
Runbooks
For detailed step-by-step guides, see the Runbooks:Deploying Your Own Work
Content does not rideunoverse deploy (that moves platform images only). Your work reaches the server three ways:
- The carve-out (nodes,
rx/, prompts in your repo):unoverse updateon the server pulls your git repo and rebuilds. - Marketplace items: installed per item from Studioβs Marketplace tab; database-driven, no restart.
- Studio publish: publishes straight to the universe over the API (publish key via
unoverse key).
Start on a Test Domain, Swap Later
The domain is a Terraform input, not a commitment. Deploy today under any domain you control (even a delegated subdomain likeacme-poc.yourcompany.com) and move to the real one when it exists. Nothing in the universeβs data references the hostname.
The swap:
- Change
domaininterraform.tfvars, thenterraform apply. A new certificate and DNS records are created; the VM, database, Redis, and everything in them are untouched. - Redeploy: delete
.env.productionat the repo root and rununoverse deployβ it re-renders from the applied ground. - Update your IdP: add the new origins and callback URLs in Auth0 or Cognito. This is the only manual step, and the one people forget.
http://IP:3001 and http://IP:4105 prove a deployment is healthy. You just cannot log in until HTTPS exists, because OIDC providers refuse plain-IP redirect flows.

