Self-host
Run Armalo inside your own boundary.
The on-prem install is the same product as the pooled SaaS — one codebase, deployment-shape-agnostic. This page is the production install guide. The deploy path runs on your infrastructure, not a hyperscaler fallback.
1. Architecture overview
The on-prem install runs the same five planes as pooled SaaS — Experience, Collaboration, Control, Agent Runtime, Observability. The platform is deployment-shape-agnostic; the only difference between pooled and on-prem is the network boundary and the operator who owns it.
Public edge
TLS, DNS, WAF
TLS 1.3 at the edge, DDoS protection, WAF rules, public DNS. Tenants keep their own data-plane cost — the edge sits in front of whatever you provision.
Control plane
Identity, tenancy, billing, audit
Postgres, Drizzle migrations, audit, metering, vault. Owns every authoritative room event, every tenant boundary, every spend cap.
Agent runtime
Per-tenant isolated execution
Per-tenant sandbox with snapshot/resume + persistent volume. Region selected per tenant policy. Snapshots keep cold-start under a second.
See /security for the full isolation, residency, and compliance posture against this runtime.
2. Infrastructure prerequisites
Bring your own cloud — Kubernetes, object storage, DNS, TLS, Postgres, secrets manager. The install does not require any specific hyperscaler; the substrate is the cluster you already operate. Provision the following:
- A Kubernetes cluster. Any conformant distribution — managed or self-hosted. The Helm chart targets the upstream Kubernetes API; no cloud-specific CRDs.
- Postgres 16. A managed instance or a self-managed cluster. The control plane requires the standard Postgres feature set (RLS, GUC, PITR); point the deploy scripts at the connection string.
- Object storage with a CDN in front. For artifact, attachment, and snapshot storage. The deploy script resolves the bucket from the same env file as the database.
- A public DNS zone + ACME. Custom domains and TLS certificates are minted and rotated by the platform once the zone is delegated to it.
3. The three deploy scripts
Production deploys run through three deterministic scripts in scripts/. Each script builds a fresh timestamped image tag (no mutable :latest), restarts the target container, and verifies the boot posture before returning.
scripts/deploy-server.sh
Deploys the @armalo/server image — realtime composition root, HTTP API, room credential broker, audit trail. Resolves secrets from the control-plane vault, builds a fresh timestamped tag, restarts the container, verifies /healthz before returning.
scripts/deploy-web.sh
Deploys the @armalo/web image — Next.js marketing + workspace UI. Shares the server.env file (same box, different port), builds the bundle locally on the box, restarts armalo-app-web, verifies the home route before returning.
scripts/deploy-sandbox-reaper.sh
Deploys the sandbox reaper — terminates orphaned or budget-exhausted microVMs. Required for the per-tenant cost control story; without it, stale sandboxes keep running and the bill keeps growing.
# Canonical deploy command sequence
corepack pnpm install --frozen-lockfile
corepack pnpm type-check
corepack pnpm test
corepack pnpm guards
bash scripts/deploy-server.sh
bash scripts/deploy-web.sh
bash scripts/deploy-sandbox-reaper.sh4. Helm chart for the on-prem install
For fully airgap-capable cluster installs, use the chart at infra/helm/:
values.yaml
Default installation. Public DNS, ACME certificates, default tenant policy EU.
values-airgap.yaml
Airgap-capable: external dependencies pinned to local registries; telemetry fully offline; chart distribution as a tarball.
templates/
Kubernetes manifests for control plane, agent runtime, observability, ingress, secrets, and policy engine.
helm upgrade --install armalo ./infra/helm \
-f infra/helm/values.yaml \
--set global.region=eu-fsn1 \
--set global.airgap=false \
--namespace armalo --create-namespace5. Operations runbook
Backups
Object-storage buckets are snapshot daily with a 30-day rolling window. The control-plane Postgres is backed up every 6 hours with PITR for the last 7 days. Restore runs through scripts/workspace-doctor.mjs against any historical snapshot.
Disaster recovery
The DR posture is one region failover + one region restoration. The first deploy script is also the recovery script — point the secrets resolver at the new region, run the script, verify /healthz. Active tenants continue from the replicated audit trail (replayable from the room log + CRDT states).
Monitoring
Fleet health surfaces in the compass admin dashboard. Each capsule (control plane, runtime, observability, integrations) has its own liveness + readiness probe. SLO gates block every deploy that drops a probe for more than 60 seconds.
Secret rotation
Room tokens rotate every 24 hours. Webhook secrets rotate every 90 days. KMS-managed keys rotate every 90 days. Long-lived cloud credentials are never stored in an agent or a committed file.
Need help with the install?
Our solutions team delivers the install for enterprise and agency deployments — same engine, your boundary. Reach out via /contact to scope.
