Skip to content

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).

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.

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

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.

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.

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