ERPNext Deployment (Kubernetes + Helm)
Simple Step-by-Step
This guide deploys ERPNext on any Kubernetes cluster using the official ERPNext Helm chart repo and a standard Ingress + TLS (cert-manager) setup.
Notes - The ERPNext Helm chart repo is
https://helm.erpnext.comand chart name isfrappe/erpnext. ERPNext Helm Chart
- ERPNext needs RWX (ReadWriteMany) storage for the shared “sites/worker” volume (do not use a ReadWriteOnce class). ERPNext Helm Chart
ingress-nginxend-of-life is mentioned by cert-manager docs (planned March 2026). For now it still works; plan migration to Gateway API later. cert-manager
0) Prerequisites
Required tools (run from bastion / CI runner / admin VM)
kubectlconfigured to your clusterhelmv3+
Required cluster capabilities
- A StorageClass that supports RWX (examples: EFS, Azure Files, NFS, CephFS)
1) Install NGINX Ingress Controller (ingress-nginx)
kubectl create namespace ingress-nginx
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx \
-n ingress-nginx
Confirm
kubectl get pods -n ingress-nginx
kubectl get svc -n ingress-nginx
2) Install cert-manager (for TLS automation)
kubectl create namespace cert-manager
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm upgrade --install cert-manager jetstack/cert-manager \
-n cert-manager \
--set installCRDs=true
cert-manager supports installing via Helm and should be installed once per cluster
3) Create a Let’s Encrypt ClusterIssuer
cat <<'EOF' | kubectl apply -f -
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
email: YOUR_EMAIL
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-prod-account-key
solvers:
- http01:
ingress:
class: nginx
EOF
4) Add ERPNext Helm repo
helm repo add frappe https://helm.erpnext.com
helm repo update
5) Create namespace for ERPNext
export NAMESPACE=erpnext
kubectl create namespace $NAMESPACE
6) (Important) Pick an RWX StorageClass
Set your RWX class name (examples):
AWS EFS: efs-sc
List itemAzure Files: azurefile-csi
List itemNFS / CephFS: depends on your cluster
export RWX_STORAGE_CLASS="YOUR_RWX_STORAGECLASS"
For evaluation only: ERPNext docs show an option to install an in-cluster NFS provisioner to get an RWX nfs StorageClass
kubectl create namespace nfs
helm repo add nfs-ganesha-server-and-external-provisioner https://kubernetes-sigs.github.io/nfs-ganesha-server-and-external-provisioner
helm upgrade --install -n nfs in-cluster nfs-ganesha-server-and-external-provisioner/nfs-server-provisioner --set 'storageClass.mountOptions={vers=4.1}' --set persistence.enabled=true --set persistence.size=8Gi
7) Create a minimal values-erpnext.yaml
Decide your domain
export DOMAIN="erp.example.com"
Create values file This enables:
List itemshared RWX volume for workers
List itemIngress (nginx) + TLS (cert-manager)
List item“createSite” job to create first ERPNext site
cat > values-erpnext.yaml <<EOF
# Shared RWX volume (required)
persistence:
worker:
enabled: true
storageClass: "${RWX_STORAGE_CLASS}"
accessModes:
- ReadWriteMany
size: 20Gi
# Ingress (public URL)
ingress:
enabled: true
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
hosts:
- host: "${DOMAIN}"
paths:
- path: /
pathType: ImplementationSpecific
tls:
- secretName: erpnext-tls
hosts:
- "${DOMAIN}"
# Create first site (ERPNext)
jobs:
createSite:
enabled: true
siteName: "${DOMAIN}"
adminPassword: "ChangeThisAdminPassword!"
installApps:
- "erpnext"
dbType: "mariadb"
# Database + cache defaults (chart supports built-in DB + Dragonfly)
# You can keep defaults, or explicitly enable built-ins if your chart version requires it.
mariadb-sts:
enabled: true
rootPassword: "ChangeThisDBRootPassword!"
EOF
The ingress and jobs.createSite keys exist in the official chart values.
Recent chart direction includes built-in DB/cache defaults replacing older subcharts.
8) Deploy ERPNext with Helm
export RELEASE=frappe-bench
helm upgrade --install $RELEASE frappe/erpnext \
-n $NAMESPACE \
-f values-erpnext.yaml
ERPNext install command pattern is documented by the official chart site.
9) Wait for pods and validate
kubectl get pods -n $NAMESPACE -w
Check ingress and certificate:
kubectl get ingress -n $NAMESPACE
kubectl get certificate -n $NAMESPACE
kubectl describe certificate -n $NAMESPACE
When cert is issued, open:
- https://erp.example.com
10) Default login
URL: https://
Username: Administrator
Password: whatever you set in jobs.createSite.adminPassword