Hardware requirements
Size the host that runs Docker and k3d so platform services and every workspace cluster can schedule. Figures below are Kubernetes memory requests (what the scheduler reserves) and limits (the cgroup cap) from the Fontana Helm charts and platform-manifest.yaml. Live RSS can sit between those two numbers. The host also needs RAM for the operating system, Docker, and each cluster’s kube-system pods (Traefik, CoreDNS, local-path provisioner).
Host sizing
Section titled “Host sizing”| Profile | Host RAM | vCPU | When you use it |
|---|---|---|---|
| Light local | 16 Gi practical floor, 32 Gi comfortable | 4 or more | Laptop or workstation with Docling, Kokoro TTS, OpenSandbox, and per-tenant observability stack disabled; use platform Grafana/Loki remotely or local LGTM. See Fontana CLI. |
| One workspace, full stack | 16 Gi | 4 | Production default on Fontana-managed AWS (t3.xlarge). Platform cluster plus one tenant cluster, optionals on. |
| Two workspaces, full stack | 32 Gi | 8 | Two live tenant clusters on one box (Fontana staging uses AWS t3.2xlarge). |
Add another workspace only when the host has unused RAM after platform + existing tenants. Each extra workspace is a full k3d cluster with its own Convex, Postgres, Vault, and (when enabled) per-tenant observability stack.
Disk: Fontana-managed AWS hosts attach a 100 GB gp3 data volume for Docker, k3d, and persistent claims. In-cluster PVCs (Convex, FalkorDB, workflow File Store, model caches) live on that volume. Size self-hosted disks for the same claims plus snapshot archives if you keep GFS on the box. See Backup and restore.
Platform cluster
Section titled “Platform cluster”Shared across every workspace on the host. Gatus is always on. Docling, Kokoro TTS, OpenSandbox, TEI, and Infinity follow platform.* in fontana.yaml. Enable exactly one local embedding server: TEI or Infinity.
| Workload | Request | Limit | fontana.yaml |
|---|---|---|---|
| Gatus (platform health) | 128 Mi | 256 Mi | Always deployed |
| Docling | 2 Gi | 8 Gi | platform.docling.disabled: true skips |
| TEI (embeddings) | 2 Gi | 12 Gi | Opt-in; mutually exclusive with Infinity. Limit is 4 CPU for ONNX warmup |
| Infinity (embeddings) | 512 Mi | 2 Gi | Opt-in (platform.infinity.disabled: false) with TEI off |
| Kokoro TTS | 1 Gi | 6 Gi | platform.tts.disabled: true skips |
| OpenSandbox server | 4 Gi per replica | 8 Gi per replica | platform.opensandbox.disabled: true skips the stack. Chart default is 2 replicas (8 Gi request). *.localhost installs set 1 replica |
| OpenSandbox controller | 64 Mi | 128 Mi | Same OpenSandbox flag |
| OpenSandbox MCP | 64 Mi | 256 Mi | Same OpenSandbox flag |
| OpenSandbox proxy | 32 Mi | 128 Mi | Same OpenSandbox flag |
| OpenSandbox auth | 32 Mi | 128 Mi | Same OpenSandbox flag |
| Inbound SMTP (Haraka) | 128 Mi | 512 Mi | Deployed when you configure email.inbound |
Approximate platform requests (pods only, excluding kube-system):
- Full production (Gatus + Docling + TEI + Kokoro + OpenSandbox at 2 replicas): about 13 Gi reserved
- Full production with Infinity instead of TEI, OpenSandbox at 2 replicas: about 11.5 Gi
- Light local (Gatus + Infinity; Docling, Kokoro, OpenSandbox off): about 640 Mi
Workspace cluster (per tenant)
Section titled “Workspace cluster (per tenant)”Each tenant in fontana.yaml gets this stack. otel-collector (log/metrics export) runs only when platform.observability.url (remote Grafana/Loki) or platform.observability.disabled: false (local platform LGTM) is configured.
| Workload | Request | Limit | Notes |
|---|---|---|---|
| Convex backend | 2 Gi | 8 Gi | Largest always-on workspace process (functions, vector search) |
| Workflow engine | 1 Gi | 4 Gi | Includes the PyAirbyte runner sidecar in the same pod |
| KG engine | 512 Mi | 2 Gi | FalkorDB client and KG HTTP |
| FalkorDB | 512 Mi | 4 Gi | Graph and vectors |
| Postgres (Convex) | 512 Mi | 2 Gi | |
| Zitadel | 512 Mi | 2 Gi | Identity |
| Zitadel Postgres | 256 Mi | 1 Gi | Isolated from Convex Postgres |
| otel-collector | 128 Mi | 512 Mi | Only when platform observability is configured |
| observability-api | 256 Mi | 512 Mi | Always on; forwards OTLP to platform when configured |
| ImmuDB (WORM audit) | 256 Mi | 1 Gi | Stays when per-tenant observability is off |
| Vault | 128 Mi | 256 Mi | |
| Fontana Collab | 256 Mi | 512 Mi | |
| Chat channels | 256 Mi | 512 Mi | Slack / Teams bridge |
| Convex dashboard | 256 Mi | 512 Mi | |
| Gatus (tenant probes) | 128 Mi | 256 Mi |
Approximate workspace requests (pods only):
- Full stack with platform observability + otel-collector: about 7.1 Gi reserved
- Platform observability off (no otel-collector): about 7 Gi reserved
Limits are higher so Convex and FalkorDB can burst. A 16 Gi host that already reserved platform + one tenant cluster will not schedule a second tenant cluster.
Optional workloads and RAM
Section titled “Optional workloads and RAM”| Flag | What you skip | Request you free (order of magnitude) |
|---|---|---|
Omit platform.observability (no url/disabled: false) |
That tenant otel-collector DaemonSet | 128 Mi request / 512 Mi limit per workspace |
platform.docling.disabled: true |
Platform Docling | 2 Gi / 8 Gi |
platform.tts.disabled: true |
Platform Kokoro TTS | 1 Gi / 6 Gi |
platform.opensandbox.disabled: true |
OpenSandbox control plane | 4 Gi per server replica plus small edge pods |
platform.tei.disabled: true with Infinity on |
TEI | 2 Gi / 12 Gi; Infinity adds 512 Mi / 2 Gi instead |
observability-api and ImmuDB stay when platform observability is off. Logs export to platform Loki when OTLP is configured; otherwise remain on pod stdout (kubectl logs). After apply, fontana status prints ✅ 💤 for YAML-disabled services and ✅ for running ones. See Fontana CLI.
Persistent volume claims (disk)
Section titled “Persistent volume claims (disk)”These claims sit on the host data volume. They are not extra RAM.
| Claim | Typical size |
|---|---|
| Workflow engine File Store | 20 Gi |
| FalkorDB | 20 Gi |
| Convex data | 10 Gi |
| Convex Postgres | 10 Gi |
| ImmuDB WORM | 10 Gi (default) |
| TEI model cache | 10 Gi |
| Infinity model cache | 5 Gi |
| Zitadel Postgres | 2 Gi |
| Vault Raft | 1 Gi |
| Gatus | 1 Gi |
Related documentation
Section titled “Related documentation”- Architecture - platform vs workspace clusters
- Fontana CLI -
platform.*disable flags,fontana apply,fontana status - Self-hosted deployment - you operate the machine and disk
- Cloud deployment - Fontana-managed cloud and customer VPC
- Observability - Grafana, Loki, and Gatus roles