Install on Kubernetes
The official Helm chart installs Dagu in a plug-and-play standalone mode by default. One pod runs the Web UI, scheduler, and local workflow executor, so a regular ReadWriteOnce volume is enough for most installations.
Prerequisites
- Kubernetes 1.19 or newer
- Helm 3
- A default
StorageClassthat supportsReadWriteOnce, or the name of one to select
An Ingress controller, DNS record, and TLS certificate are needed only when the UI should be reachable through Ingress.
Install
helm repo add dagu https://dagucloud.github.io/dagu
helm repo update
helm upgrade --install dagu dagu/dagu \
--namespace dagu \
--create-namespace \
--waitThe default installation creates:
- a release-scoped Kubernetes ServiceAccount
- one Dagu Deployment running the server, scheduler, and local executor
- a 10 Gi
ReadWriteOncePersistentVolumeClaim - a
ClusterIPService for the UI and API
The PVC is retained when the Helm release is uninstalled.
If the cluster has no default StorageClass, save the selection in dagu-values.yaml:
persistence:
storageClass: standardUse that file for the installation and every later upgrade:
helm upgrade --install dagu dagu/dagu \
--namespace dagu \
--create-namespace \
--values dagu-values.yaml \
--waitOpen the UI
For temporary access, forward the UI Service:
kubectl --namespace dagu port-forward service/dagu-ui 8080:8080Open http://localhost:8080 and complete the administrator setup. Run helm get notes dagu --namespace dagu to see access commands for the installed release.
Configure Ingress
Create dagu-values.yaml, or add these settings to the existing file while preserving values such as persistence.storageClass. Replace the ingress class, hostname, and TLS Secret with values for the cluster:
ingress:
enabled: true
className: your-ingress-class
host: dagu.example.com
tls:
enabled: true
secretName: dagu-tls
config:
publicUrl: https://dagu.example.comThe TLS Secret must exist in the Dagu namespace. Leave secretName empty only when the ingress controller supplies a default certificate.
Apply the values:
helm upgrade --install dagu dagu/dagu \
--namespace dagu \
--create-namespace \
--values dagu-values.yaml \
--waitPoint dagu.example.com at the ingress controller, then check the resource:
kubectl --namespace dagu get ingress dagu-uiOpen https://dagu.example.com. The bundled UI and API use the same origin, so no CORS setting is needed. With OIDC, use the same URL for auth.oidc.clientUrl and register https://dagu.example.com/oidc-callback with the identity provider.
Proxy-header authentication has a separate trust model and cannot use the chart-managed Ingress. Follow Proxy Authentication before enabling it.
Customize storage
Set the size or StorageClass with a values file:
persistence:
size: 20Gi
storageClass: standardTo reuse a PVC managed outside the release:
persistence:
existingClaim: dagu-dataThe existing PVC must be in the release namespace. The chart does not create, resize, or delete it.
Use distributed mode
Distributed mode runs the UI server, scheduler, coordinator, and workers in separate Deployments. The server-side components require shared ReadWriteMany storage:
deploymentMode: distributed
persistence:
accessMode: ReadWriteMany
storageClass: nfs-clientWorkers use ephemeral local storage and report results through the coordinator. See Kubernetes deployment for worker pools and operational details.
Upgrade
helm repo update
helm upgrade dagu dagu/dagu \
--namespace dagu \
--values dagu-values.yaml \
--waitKeep the release configuration in a values file and pass the same file on every upgrade. If the release uses only chart defaults, omit the --values line.
Install from a source checkout
From the Dagu repository root:
helm upgrade --install dagu ./charts/dagu \
--namespace dagu \
--create-namespace \
--waitImage version
The chart uses its appVersion as the image tag by default. Override the tag only when a different Dagu version is required:
image:
tag: "<dagu-version>"Verify
kubectl --namespace dagu get pods
kubectl --namespace dagu get pvc
helm test dagu --namespace daguFor all chart settings, troubleshooting, and distributed configuration, see Kubernetes deployment. To remove the release, see Uninstall.

