Prerequisites
A copy-pasteable checklist for standing up Definite On-Prem on a fresh cluster.
Work top to bottom. definite bootstrap installs the cluster-side prerequisites
for you; definite doctor verifies the external ones. This page is the manual
reference behind both.
At a glance
| # | Prerequisite | Minimum | Installed by | Verified by |
|---|---|---|---|---|
| 1 | kubectl | 1.28+ | you | — |
| 2 | helm | 3.12+ | you | — |
| 3 | Kubernetes cluster | 1.28+ | you / cloud | definite doctor |
| 4 | Ingress controller | any current | definite bootstrap | definite doctor |
| 5 | cert-manager (+ CRDs) | 1.13+ | definite bootstrap | definite doctor |
| 6 | letsencrypt-prod ClusterIssuer | — | definite bootstrap | definite doctor |
| 7 | agent-sandbox CRDs | bundled version | definite bootstrap | definite doctor |
| 8 | StorageClass | one default, supports ReadWriteOnce | you / cloud | definite doctor |
| 9 | Postgres | 15+ | you | definite doctor |
| 10 | Object store | S3 / GCS / Azure Blob / MinIO | you | definite doctor |
Local tooling (on the machine running definite)
The CLI shells out to kubectl and helm; both must be on PATH.
-
kubectl1.28+ — within one minor version of the cluster's control plane. Check:kubectl version --client. -
helm3.12+ — Helm 3 only; Helm 2 is not supported. Check:helm version. - A kubeconfig context pointed at the target cluster, with permission to
create namespaces, CRDs, and cluster-scoped RBAC. Check:
kubectl config current-contextandkubectl auth can-i create namespace.
Kubernetes cluster
- Kubernetes 1.28 or newer. GKE, EKS, AKS, or a conformant vanilla
cluster. GKE is the primary tested target; EKS and AKS examples ship in
examples/and are actively maturing. - Outbound network access for image pulls (
ghcr.io/definite-appby default) and for the LLM provider. Air-gapped install is not supported in v1 — seenetwork-requirements.mdfor data-source connectivity andarchitecture.mdfor the component map. If you mirror images into a private registry, set theimage:block in yourconfig.yaml. - Enough headroom for the default resource requests in your chosen
examples/minimal-*.yaml. The lakehouse runs as embedded DuckDB inside the API and job-runner pods (no separate query pod), so the API and job-runner are the components to size for query memory; bumpresources.api/resources.jobRunnerfor heavy steady-state SQL, or add a compute profile for heavy bursty SQL.
Cluster prerequisites (definite bootstrap installs these)
Run definite bootstrap once against a fresh cluster, or definite bootstrap --dry-run to see what is missing first. Each item below can also be installed
by hand with helm / kubectl.
- Ingress controller. Provides HTTP/S routing for the deployment's
Ingress. Any current controller works (ingress-nginx, or a cloud controller such as the AWS Load Balancer Controller or GKE ingress). - cert-manager 1.13+ and its CRDs. Required when
deployment.tlsiscert_managerso the ingress certificate can be issued automatically. The CRDs must be installed before cert-manager itself.definite bootstrapinstalls cert-manager with its leader-election lease pinned to thecert-managernamespace (--set global.leaderElection.namespace=cert-manager) — the chart default ofkube-systemis Google-managed on GKE Autopilot and rejects writes, so without the override the webhook CA is never injected. -
letsencrypt-prodClusterIssuer. A healthy cert-manager still issues nothing without anIssuer. The Helm chart annotates theIngresswithcert-manager.io/cluster-issuer: letsencrypt-prod, so that issuer must exist.definite bootstrapcreates it (production Let's Encrypt ACME,http01solver) after cert-manager is up; the ACME contact email defaults tohello@definite.appand can be set with--acme-email. Use a real DNS hostname that you control. Shared convenience domains such as*.nip.ioare globally rate-limited by Let's Encrypt and are rejected bydefinite initwhendeployment.tlsiscert_manager. - agent-sandbox CRDs. Custom resources the Fi runtime uses to dispatch
a fresh sandbox per agent run.
definite doctorprobes for these and will fail preflight if they are absent.
Storage
The lakehouse itself needs no persistent volume — its catalog lives in Postgres
and its data lives in the object store. PVCs are only needed when Fi is enabled
(each sandbox gets an ephemeral /workspace volume).
- A StorageClass for Fi sandbox workspaces (only if
fi.enabled: true). You need a StorageClass that provisionsReadWriteOncevolumes — e.g.gp3on EKS,standard-rwo/premium-rwoon GKE,managed-csion AKS. Set it asfi.sandbox.storage_class_name(and per-profilestorage_class_nameon any compute profiles). - A sensible default StorageClass, or an explicit name in config, so
PVCs bind without manual intervention. Check:
kubectl get storageclass.
Postgres (customer-provided)
The application database. Definite operates no stateful database itself.
- Postgres 15 or newer.
definite doctorrunsSELECT version()and warns below 15. - A dedicated database and a role that owns it. Definite manages its own schema inside that database via migrations on first boot.
-
pgcryptoavailable. No extensions beyondpgcryptoare required. - Reachable from inside the cluster on its port (5432 by default). A
connection that works from your laptop can still fail from the cluster —
see
network-requirements.md. Provide the connection string aspostgres.urlin your config. - Automatic backups enabled. The application database holds all durable
state — users, integration credentials, automations, Fi history, data
apps — and a bad migration or operator mistake with no backup is
unrecoverable. Definite does not back up your Postgres for you, so the
managed instance must have automatic daily backups and point-in-time
recovery turned on before you deploy:
- Cloud SQL (GKE): create the instance with
--backup-start-time=HH:MMand--enable-point-in-time-recovery(transaction-log retention). On an existing instance:gcloud sql instances patch <instance> --backup-start-time=07:00 --enable-point-in-time-recovery --retained-backups-count=7. - RDS (EKS): the bundled Terraform (
deploy/terraform/aws) andscripts/install-eks.shalready provision RDS with a 7-daybackup_retention_periodand a daily backup window — no extra step. - Azure Database for PostgreSQL (AKS): automated backups are on by default; confirm the retention period (7-35 days) and, for important deployments, enable geo-redundant backup.
- Self-managed Postgres: schedule a daily
pg_dump(orpgBackRest) to off-host storage — seebackup-restore.md. Take an on-demand backup immediately before everydefinite upgrade; see the upgrade note inbackup-restore.md.
- Cloud SQL (GKE): create the instance with
Object store (customer-provided)
Bulk lakehouse parquet data lives here; the DuckLake catalog lives in the
ducklake_catalog Postgres database (above).
- A bucket / container on S3, GCS, Azure Blob, or MinIO, dedicated to this deployment.
- Credentials with read AND write on that bucket. S3 on EKS can use
IRSA (
object_store.credentials.mode: irsa) so pods assume a scoped IAM role through the AWS credential chain. Static HMAC credentials remain supported for S3-compatible stores and customers that prefer them; seeexamples/minimal-eks.yaml. - A prefix for Definite's objects (
lakehouse.prefix) if the bucket is shared with other workloads. - Writability confirmed.
definite doctorvalidates object-store config shape but does not yet round-trip a real write. Confirm the credentials canPutObjectinto the bucket yourself before deploying. - CORS rule for Drive. The Drive feature uploads files straight from
the browser to the bucket via presigned
PUTURLs, so the bucket needs a CORS policy allowingGETandPUTfrom the deployment's web origin (thehttps://…URL users open). Without it, browser uploads fail with a CORS error while the headlessdefinite run loadflow keeps working. On Azure the storage account's CORS must also allow thex-ms-blob-typeheader, and a private-endpoint blob account must be reachable from end-user browsers. Seedrive.mdfor the exact rules. (No effect on API access; this is browser-only.)
Optional
- OIDC provider for SSO. Local Postgres auth is the shipped fallback; OIDC (Okta, Entra) is being hardened.
- LLM credentials. Bring your own: Anthropic, Bedrock, Vertex, or Azure
OpenAI.
definite doctordoes a real API ping for Anthropic and config-validation for the others.
Next steps
definite bootstrap --dry-run— confirm what the cluster is missing.definite bootstrap— install the cluster prerequisites.cp examples/minimal-<cloud>.yaml ./config.yamland edit it.definite doctor --config config.yaml— verify Postgres, Kubernetes, object store, and LLM.definite init --config config.yaml— deploy.
See cli.md for the full command reference.