Azure Installation
This guide covers installing DuploCloud AI Helpdesk on Azure Kubernetes Service (AKS) using Terraform.
Note: The guided skill-based installation (like the AWS
helpdesk-install-skill) is currently in development for Azure. The current method uses Terraform automation. Contact your DuploCloud account team to schedule an installation.
What Gets Deployed
Terraform provisions the following resources in order:
AKS Node Pool → Storage Class (conditional) → Namespace → ConfigMap → Helm ReleaseBackend
ASP.NET Core API — tickets, projects, agent orchestration
Frontend
React web UI served via nginx
MongoDB
Kubernetes StatefulSet with Azure Blob NFS storage
Web Terminal
Browser-based terminal for agent command execution
Duplo Agent
Claude-powered AI agent (connects to Azure AI Foundry)
Ingress
Azure Application Gateway routing HTTPS traffic
Persistent Storage
Azure Blob NFS (azureblob-nfs-premium) for backend and agent
All components run inside a dedicated namespace in your AKS cluster within your Azure subscription.
Prerequisites
Tools (DuploCloud Team)
git
Any
brew install git
terraform
>= 1.5.0
brew install terraform
azure-cli
>= 2.50
brew install azure-cli
kubectl
>= 1.27
brew install kubectl
helm
>= 3.12
brew install helm
Azure Access Required
Azure Contributor role on the AKS resource group
✅
Required for node pool creation
Kubernetes cluster-admin RBAC
✅
Required for namespace and storage class creation
Access to oci://quay.io/duplocloud Helm registry
✅
No credentials needed — public OCI registry
What the Customer Must Provide
Collect the following before starting:
Azure Subscription ID
✅
e.g. 82300ad4-6ef0-48ef-acee-a4d9e495e5a4
Resource group containing the AKS cluster
✅
e.g. duploinfra-ai
AKS cluster name
✅
e.g. ai
Azure region
✅
e.g. westus, eastus
Azure AI Foundry resource name
✅
The subdomain before .services.ai.azure.com
Azure AI Foundry API key
✅
From Keys and Endpoint in the Azure portal
Portal domain
✅
e.g. helpdesk.yourcompany.com
xterm subdomain
✅
e.g. helpdesk-xterm.yourcompany.com
Internal agent hostname
✅
e.g. helpdesk-agent.yourcompany.com
Super-user email list
✅
Comma-separated admin emails
SSL certificate name on App Gateway
✅
The name of the cert configured in Azure Application Gateway
Google OAuth Credentials
DuploCloud AI Helpdesk uses Google OAuth for user authentication. Username/password login is not supported.
To create a Google OAuth client:
Go to Google Cloud Console → APIs & Services → Credentials
Click Create Credentials → OAuth 2.0 Client ID
Application type: Web application
Add the portal URL to Authorized JavaScript origins (e.g.
https://helpdesk.yourcompany.com)Add
https://helpdesk.yourcompany.com/auth/callbackto Authorized redirect URIsCopy the Client ID and Client Secret
Azure AI Foundry Configuration
DuploCloud AI Helpdesk uses Azure AI Foundry as the AI model backend. The API key is injected into the duploAgent component at deploy time.
Finding Your Azure AI Foundry Details
Go to Azure Portal → Azure AI Foundry
Note the Resource Name — this is the subdomain before
.services.ai.azure.com(e.g. if your endpoint ishttps://my-foundry.services.ai.azure.com/anthropic, the resource name ismy-foundry)Go to Keys and Endpoint and copy the API Key
How It's Configured
The API key and endpoint URL are injected into the duploAgent pod as environment variables:
These values are set via Terraform sensitive variables — the API key is never stored in terraform.tfvars.
Managed Identity (future): Managed Identity authentication is also supported using
AZURE_CLIENT_IDinstead ofAZURE_API_KEY. Contact your DuploCloud account team if your Azure setup uses Managed Identity.
Step-by-Step Deployment
Step 1 — Clone the Repository
Step 2 — Log In to Azure and Get Cluster Credentials
Find your kube_context and kube_config_path for use in the next step:
Verify cluster access:
Credential expiry: If you get auth failures later, re-run
az aks get-credentials --overwrite-existing.
Step 3 — Check if Storage Class Exists
Found → set
create_storage_class = falseinterraform.tfvarsNot found → set
create_storage_class = true
Step 4 — Edit terraform.tfvars
terraform.tfvarsOpen terraform.tfvars and fill in all values. Do not put secrets here — those go in Step 5.
Step 5 — Export Sensitive Variables
These must never be stored in terraform.tfvars. Export them as environment variables before running Terraform:
Step 6 — Deploy
Deployment takes approximately 5–10 minutes. The node pool provisioning is the main bottleneck.
Step 7 — Verify
All pods should reach Running status before proceeding.
Step 8 — Configure DNS
Get the App Gateway IP from Terraform output:
Add the following DNS records at your provider:
A
helpdesk.<domain>
App Gateway public IP
A
helpdesk-xterm.<domain>
App Gateway public IP
A
helpdesk-agent.<domain>
App Gateway private IP
The internal agent hostname uses the App Gateway's private IP — it is not publicly accessible.
Updating a Deployment
To update an existing deployment (e.g. new Helm chart version, config change):
Multi-Client Deployments
Each client needs its own tfvars file and Terraform state. Use -var-file to target a specific client:
Without a remote backend, deploying a different client from the same directory will overwrite local state. Use a remote backend (Azure Storage or Terraform Cloud) for production multi-client setups.
Destroying a Deployment
Warning: MongoDB data will be lost if the persistent volume reclaim policy is
Delete. Back up data before destroying.
Ingress and SSL
Azure deployments use the Azure Application Gateway as the ingress controller. SSL termination is handled at the gateway using a pre-configured certificate.
The ingress annotations used:
The SSL certificate (duplo in the example above) must already be configured on the Azure Application Gateway before deployment. The customer must provide the certificate name.
Troubleshooting
403 — cannot create namespaces/storageclasses
Ensure cluster-admin RBAC is granted, or set create_storage_class = false
Helm timeout (>600s)
Node pool still scaling — run kubectl get nodes -w to monitor
StorageClass already exists
Set create_storage_class = false in tfvars
Provider auth failure
Re-run az aks get-credentials --overwrite-existing, verify kube_context in tfvars
Namespace already exists
Run terraform import kubernetes_namespace_v1.helpdesk <namespace>
Pods stuck in Pending
Check node pool status in Azure portal — node provisioning may still be in progress
502 from App Gateway
Check pod health: kubectl describe pods -n <namespace> and verify health probe status codes annotation
Last updated
Was this helpful?

