Skip to main content
Deploy the core Gravity Platform services to a VM.

Services Deployed

Unoverse has three listeners. :4105 is the public port (JWT-gated: /api/*, MCP defs, workbench, /plugins management, /health). :4106 is the internal node runtime (/execute, /nodes, /skills, /health), it lives on the Docker network only and is deliberately never published or proxied; network isolation is the trust boundary. :4101 is the workflow engine surface (internal; other containers reach it as http://unoverse:4101).

VM Requirements

Sized by size in terraform.tfvars (small | medium | large). All sizes are single-VM: the size scales the box and the stores, never the topology.

Prerequisites

  • Terraform ground applied (VM, load balancer + TLS, firewall, Postgres, Redis: see the overview)
  • DOCR token in your terraform.tfvars (from your Unoverse admin)

Steps

1. Provision

Your applied ground IS the configuration: there is nothing to write:
It asks which cloud, completes terraform.tfvars, and applies the plan you approve. A platform team can drive Terraform directly instead (cd infra/digitalocean && terraform apply), and deploy picks up from the applied ground.
Do not set ansible_become_password or ansible_become_flags for cloud VMs. Their default users already have passwordless sudo configured by the cloud provider.

2. Run Core Platform Installation

The same unoverse deploy continues straight into this once the ground is up. To re-run this phase on its own:
One command, three phases: installs Docker, pulls DOCR images, and starts every service (unoverse, memory, Canvas, umap, Dozzle); sets up the database; and verifies connectivity. Hardening is a deliberate follow-up (unoverse deploy harden, harden) when a universe graduates from POC. The CLI reads the deploy target from your ground’s rendered configuration and generates a temporary Ansible inventory on every run, so there is no inventory file to maintain. Every deploy after the first is just:

3. Verify (re-run any time)

Expected Output

Memory dashboard is internal-only. Access via SSH tunnel: ssh -L 4104:localhost:4104 root@<VM_IP> then open http://localhost:4104/dashboard. It is never exposed through the load balancer.

Troubleshooting

Next Steps

  • database.md - Configure database connection
  • Your own nodes, design, and prompts arrive via Studio publish or the Marketplace (never via deploy)