Automation Script
Save as deployerpnext.sh and run: bash deployerpnext.sh
#!/usr/bin/env bash
set -euo pipefail
# ====== REQUIRED ENV VARS ======
: "${DOMAIN:?Set DOMAIN (e.g., erp.example.com)}"
: "${RWX_STORAGE_CLASS:?Set RWX_STORAGE_CLASS (e.g., efs-sc)}"
: "${LETSENCRYPT_EMAIL:?Set LETSENCRYPT_EMAIL (e.g., admin@example.com)}"
# ====== OPTIONAL ENV VARS ======
NAMESPACE="${NAMESPACE:-erpnext}"
RELEASE="${RELEASE:-frappe-bench}"
ADMIN_PASSWORD="${ADMIN_PASSWORD:-ChangeThisAdminPassword!}"
DB_ROOT_PASSWORD="${DB_ROOT_PASSWORD:-ChangeThisDBRootPassword!}"
echo "==> Using:"
echo " DOMAIN=$DOMAIN"
echo " RWX_STORAGE_CLASS=$RWX_STORAGE_CLASS"
echo " NAMESPACE=$NAMESPACE"
echo " RELEASE=$RELEASE"
# 1) ingress-nginx
kubectl get ns ingress-nginx >/dev/null 2>&1 || kubectl create ns ingress-nginx
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx >/dev/null 2>&1 || true
helm repo update >/dev/null
helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx -n ingress-nginx
# 2) cert-manager
kubectl get ns cert-manager >/dev/null 2>&1 || kubectl create ns cert-manager
helm repo add jetstack https://charts.jetstack.io >/dev/null 2>&1 || true
helm repo update >/dev/null
helm upgrade --install cert-manager jetstack/cert-manager -n cert-manager --set installCRDs=true
# 3) ClusterIssuer
cat <<EOF | kubectl apply -f -
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
email: ${LETSENCRYPT_EMAIL}
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-prod-account-key
solvers:
- http01:
ingress:
class: nginx
EOF
# 4) ERPNext repo + namespace
helm repo add frappe https://helm.erpnext.com >/dev/null 2>&1 || true
helm repo update >/dev/null
kubectl get ns "$NAMESPACE" >/dev/null 2>&1 || kubectl create ns "$NAMESPACE"
# 5) values file (generated)
VALUES_FILE="$(mktemp -t values-erpnext-XXXX.yaml)"
cat > "$VALUES_FILE" <<EOF
persistence:
worker:
enabled: true
storageClass: "${RWX_STORAGE_CLASS}"
accessModes:
- ReadWriteMany
size: 20Gi
ingress:
enabled: true
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
hosts:
- host: "${DOMAIN}"
paths:
- path: /
pathType: ImplementationSpecific
tls:
- secretName: erpnext-tls
hosts:
- "${DOMAIN}"
jobs:
createSite:
enabled: true
siteName: "${DOMAIN}"
adminPassword: "${ADMIN_PASSWORD}"
installApps:
- "erpnext"
dbType: "mariadb"
mariadb-sts:
enabled: true
rootPassword: "${DB_ROOT_PASSWORD}"
EOF
# 6) Deploy
helm upgrade --install "$RELEASE" frappe/erpnext -n "$NAMESPACE" -f "$VALUES_FILE"
# 7) Wait (basic)
echo "==> Waiting for pods to become Ready..."
kubectl wait --for=condition=Ready pods --all -n "$NAMESPACE" --timeout=20m || true
echo "==> Deployment complete."
echo "URL: https://${DOMAIN}"
echo "Login:"
echo " Username: Administrator"
echo " Password: ${ADMIN_PASSWORD}"
echo "Values used: $VALUES_FILE"