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"
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