What you’ll create
| Resource | Notes |
|---|---|
| Resource group | Holds the AKS cluster, database, storage account, and networking |
| Virtual network + subnet | Subnet for AKS nodes; private endpoints for Postgres and Blob recommended |
| AKS cluster | Kubernetes 1.28+ |
| Azure Database for PostgreSQL (Flexible Server) | Postgres 15+, private access |
| Azure Storage Account + Blob container | Lakehouse data |
| Azure AD app (optional) | For OIDC SSO via Entra ID |
Prerequisites
Azure access
A subscription where you have permission to create AKS, Postgres Flexible Server, and Storage Accounts. The
az CLI must be authenticated (az login) and the subscription set (az account set --subscription <your-subscription-id>).Local tooling
Install the following on the machine you’ll run
az and definite from:| Tool | Version | Check |
|---|---|---|
az | recent | az version |
kubectl | 1.28+ | kubectl version --client |
helm | 3.12+ | helm version |
LLM access
Decide which LLM provider Fi will use. Azure OpenAI is the most common choice for Azure deployments because it lives in the same subscription. Anthropic, Bedrock, and Vertex are also supported. If you go with Azure OpenAI, make sure you’ve requested model access and created a deployment (the URL is your
llm.endpoint).Definite license key
On-prem Definite requires a license key issued by Definite. It looks like
onprem_ followed by a long hex string, and you reference it from config.yaml. If you do not have one yet, email hello@definite.app. Until the license is activated the deployment comes up unlicensed and returns HTTP 403 on every product API route.Phase 1: Provision Azure infrastructure
Set up shared env vars first:1. Create the resource group
2. Create the AKS cluster
3. Create Azure Database for PostgreSQL (Flexible Server)
4. Create a Storage Account + Blob container
5. (If using Entra ID SSO) Register an app
Create an Azure AD app for OIDC, sethttps://<your-hostname>/auth/callback as a redirect URI, and create a client secret. You’ll plug the tenant ID, client ID, and client secret into auth.mode: oidc in config.yaml.
Phase 2: Install Definite with the definite CLI
1. Install the CLI
2. Bootstrap cluster prerequisites
letsencrypt-prod ClusterIssuer, and the agent-sandbox CRDs the Fi runtime needs.
3. Discover the load balancer IP
nip.io host for demos, or create an A record in your DNS provider pointing your chosen hostname at it.
4. Build config.yaml
Start from the AKS example config: minimal-aks.yaml. The shape:
Azure uses a single shared storage key (not an HMAC pair). Pull it from the Storage Account’s “Access keys” blade, or via
az storage account keys list as shown above.5. Export secrets
6. Preflight and deploy
If your Postgres Flexible Server is on private access (the recommended production setup),
definite doctor and the definite init preflight cannot reach it from a laptop and will fail the Postgres check. On v0.0.8, pass --skip-preflight to definite init for laptop installs and run doctor from a pod inside the cluster instead.init renders the bundled Helm chart and runs helm upgrade --install. Watch the rollout:
7. Set the initial admin user
The chart does not auto-create an initial admin. Afterdefinite init returns successfully and the pods are Ready, set INITIAL_ADMIN_EMAIL and INITIAL_ADMIN_PASSWORD on the api Deployment; the api creates the admin record on its next start.
Known limitations on Azure
A few things are worth flagging up front; these are why this guide is labeled preliminary:definite run load(file upload via the CLI) is documented as not supported on Azure in v1; S3, GCS, and MinIO backends are. Browser-based Drive uploads still work via the configured Storage Account.definite doctorvalidates Azure config shape but does not yet round-trip a realPutBlobagainst your storage account. Confirm the storage key has write access before deploying.- Workload Identity / Entra-bound credentials for the lakehouse are not yet wired in; the storage account key is the supported path today.
Day-2 operations
Same CLI as AWS and GCP:Phase 3: Teardown
az group delete will pick up anything you miss, but the explicit order avoids a stuck LB you’d otherwise have to clean up by hand.

