Skip to content

Search is only available in production builds. Try building and previewing the site to test it out locally.

Deployment Topologies

Reactor ships as a single Rust workspace with one unified HTTP surface. How you run it is described by three independent axes:

  • Edition — who operates it and under what license (O / C / E)
  • Size — how decomposed the topology is (16, 10+)
  • Platform — where it runs (@fly, @aws, …)

Combine them into a single token: <Edition><Size>@<platform> — for example O2, C6@fly, E5@aws.

CodeEditionWho operates it
OOpen SourceYou — self-hosted, no license
CCommercial CloudWe operate it (managed Reactor.cloud)
EEnterpriseThe customer operates it, under license

Size describes topology decomposition, not raw capacity. Each rung externalizes one more component.

SizeNameLayout
1LocalOne process, embedded Postgres + vault, 127.0.0.1 only
2Single nodeOne box: all capabilities + Postgres + OpenBao co-located, TLS via reverse proxy
3External DBApp node(s) + managed/external Postgres; vault still embedded
4Shared infraExternal DB + one infra node (NATS + OpenBao + gateway co-located)
5Dedicated gatewayExternal DB + standalone gateway/edge tier; NATS + OpenBao still combined
6DecomposedEvery component independent: NATS, OpenBao, gateway, pooler, app pool
10+ElasticAutoscaling pools, multi-region, HA — use +ha, +mr, +as modifiers
TagTarget
@localLaptop / developer machine
@flyFly.io
@awsAmazon Web Services
@azureMicrosoft Azure
@gcpGoogle Cloud
@onpremCustomer datacenter / bare metal

Modifiers append to the size: +ha (DB/secret HA), +mr (multi-region), +as (autoscale). Example: C5+ha@fly.

flowchart LR
S1[1 Local] --> S2[2 Single node]
S2 --> S3[3 External DB]
S3 --> S4[4 Shared infra]
S4 --> S5[5 Dedicated gateway]
S5 --> S6[6 Decomposed]

Reactor Studio embeds reactor-server as a library inside a Tauri desktop shell. One process, one Postgres (local or Docker), bind address 127.0.0.1 only. Typically O1@local.

Characteristics:

  • All capabilities composed in-process via InProcessAuthClient — no inter-service HTTP
  • Cargo feature g1-tauri trims heavy adapters (AWS Lambda, Bun warm pool)
  • Binary size budget: ≤ 30 MB stripped
  • TLS termination handled by the desktop shell or not at all (localhost only)
  • Day-to-day development with Reactor Studio
  • Prototyping without cloud spend
  • Demos and offline environments
  • AI agent workflows that need local filesystem + shell access
# Reactor.toml — size 1 (local) minimal
[project]
name = "my-app"
id = "proj_dev_local"
[server]
bind = "127.0.0.1:8000"
[database]
url = "postgres://reactor:reactor@127.0.0.1:5432/reactor"
[admin]
token = "dev-admin-token"
allow_remote = false
[auth]
data_key = "base64-encoded-32-byte-key"
public_url = "http://127.0.0.1:8000"

The production sweet spot for self-hosters. One reactor-server binary runs every enabled capability against one Postgres and one filesystem, with OpenBao (or embedded vault) on the same box. Put Caddy or nginx in front for TLS. Typically O2 or E2.

Characteristics:

  • Full capability bundle via g2-full Cargo features (auth, data, storage, functions, jobs, sites)
  • Boot target: listening in under 1 second
  • Admin surface at /_admin/* for deploy, doctor, logs
  • Background tasks (job scheduler, signed-URL janitor, Bun warm pool) managed by the unified binary
  • Self-hosted production for a single project
  • Fly.io, Hetzner, DigitalOcean single-machine deploys
  • Teams that want full control without Kubernetes
Terminal window
# Typical size 2 stack
docker compose up -d # postgres + reactor-server
caddy reverse-proxy :443 # TLS termination
reactor deploy # push bundle via /_admin/deploy

See Self-hosting for Docker, Compose, and Fly.io walkthroughs.

When you need independent scaling, blast-radius isolation, or managed multi-tenancy, externalize components one rung at a time. Each capability can run as its own binary (reactor-auth-server, reactor-data-server, …) mounting the same router as the unified binary — the HTTP contract is byte-identical.

Characteristics:

  • Scale functions workers separately from the data API
  • Run wasmtime in its own address space (functions isolation)
  • Swap storage backend to S3 without touching auth
  • Microservices auth mode: capabilities call reactor-auth-server over HTTP

App server(s) + managed/external Postgres (Neon, RDS, Supabase). Vault stays embedded or env-injected. First externalization step.

The managed tier. Stateless reactor-shared instances front a shared PostgreSQL cluster (one database per project: tenant_<ref>), NATS JetStream for realtime, Supavisor for connection pooling, and OpenBao for secrets — a size 6 decomposed topology that we operate (edition C).

Characteristics:

  • Host-based routing: {project_ref}.reactor.cloud
  • Per-tier quotas (requests/min, storage, bandwidth)
  • Control plane handles provisioning, deploy queue, domain verification
  • No infrastructure to operate — reactor cloud create and reactor deploy --context cloud
ResourceFree tier limit
Requests/minute1,000
Concurrent functions10
Database connections5
Storage1 GB
Bandwidth/month5 GB
Terminal window
# C6@fly workflow
reactor cloud login
reactor cloud create my-saas --region iad
reactor deploy --context cloud --project my-saas
reactor cloud logs my-saas --follow
QuestionO1O2O5/E5C6@fly
Local dev only?
Single project, own infra?
Need per-capability scaling?
Multi-tenant SaaS on Reactor?
Zero ops burden?
Offline / air-gapped?

Typical path: Start at O1 with Studio → deploy to O2 or C6@fly for production → graduate to size 5–6 when traffic or compliance demands isolation.

Moving between sizes does not require application rewrites:

  1. Export your Postgres database (pg_dump)
  2. Copy blob/function/site directories from .reactor/ or /data
  3. Point Reactor.toml at the new topology’s infrastructure
  4. Run reactor-server migrate (or POST /_admin/migrate)
  5. Deploy your bundle via CLI or /_admin/deploy