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.com and chart name is frappe/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-nginx end-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)

  • kubectl configured to your cluster
  • helm v3+

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

Discard
Save
This page has been updated since your last edit. Your draft may contain outdated content. Load Latest Version
Was this article helpful?

On this page

Review Changes ← Back to Content
Message Status Space Raised By Last update on