# Install Dapr Ops Dashboard with Helm

Dapr Ops Dashboard cluster connections can be backed with basic Kubernetes manifests or packaged as a [Helm](https://helm.sh/) chart. Helm is ideal if you already manage Kubernetes apps with Helm/GitOps (ArgoCD, Flux, etc.) and want Dapr Ops Dashboard and optional Dapr control plane changes to flow through the same pipeline. When you manage a cluster connection entirely through Helm, the Dapr Ops Dashboard console treats it as read-only: all configuration lives in Helm values.

:::note Enterprise-only

Helm-managed cluster connections are specific to the Dapr Ops Dashboard Enterprise plan

:::

Two Helm charts are involved:

- The Dapr Ops Dashboard agent chart, which deploys the agent and its [supporting components](../getting-started/prerequisites.mdx#cluster-resource-requirements).
- The Dapr control plane chart, sourced from the [Dapr upstream chart](https://github.com/dapr/dapr/blob/master/charts/dapr/README.md).

Use the tiles below to jump to the workflow that matches how you provision clusters.

- [Install with CLI](#cli-install) — Walk through Diagrid CLI commands to create a Helm-managed cluster connection and deploy both charts.
- [Install with Console](#console-install) — Use the Dapr Ops Dashboard console to generate Helm commands, download values files, and run them in your pipeline.
- [Reference values](#helm-values-reference) — Review every agent and Dapr Helm value, including recommended Dev/Prod resource profiles.

:::warning
When Dapr is managed by Helm, the following features are **not supported in Dapr Ops Dashboard**:

- Automatic agent upgrades
- Automatic Dapr configuration sync
- Application and sidecar rollouts
- Dapr upgrades via the web console/CLI
- Cluster connection updates via the web console/CLI
- Automatically applying advisories
  :::

## Installation workflows

### CLI workflow

Ensure you have the [Diagrid CLI](https://docs.diagrid.io/references/conductor/conductor-cli-intro) set up.

**1. Authenticate with Diagrid**

<pre>
  <code>diagrid login</code>
</pre>

**2. Target the Dapr Ops Dashboard product**

Helpful if you also manage Catalyst resources from the same CLI.

{"\n\n"}

<pre>
  <code>diagrid product use conductor</code>
</pre>

**3. Create a Helm-managed cluster connection**

<pre>
  <code>
    {`diagrid clusters connect -n <new-cluster-name> --helm-managed`}
  </code>
</pre>

{"\n"}

Replace <code>\<new-cluster-name></code> with a descriptive
name. Capture the cluster ID from the command output for the next step.

**4. Download the agent Helm values**

This file contains the credentials Dapr Ops Dashboard uses to communicate with your
cluster.

{"\n\n"}

<pre>
  <code>
    {`diagrid clusters helmvalues <cluster-id> > conductor-agent-values.yaml`}
  </code>
</pre>

{"\n"}

Store the file securely and avoid committing it to public repositories.

**5. Install the Dapr Ops Dashboard agent chart**

Get the latest Helm chart version from the public images gallery or from the Dapr Ops Dashboard console: https://gallery.ecr.aws/diagrid/conductor-charts/agent.

<pre>
  <code>
    {`helm install conductor-agent oci://public.ecr.aws/diagrid/conductor-charts/agent \\
      --version <version-number> \\
      -n diagrid-cloud --create-namespace \\
      -f conductor-agent-values.yaml`}
  </code>
</pre>

**6. Install Dapr via Helm**

<pre>
  <code>
    {`helm repo add dapr https://dapr.github.io/helm-charts/
      helm repo update
      helm install dapr dapr/dapr \\
      --version=<dapr-version> \\
      --namespace dapr-system --create-namespace --wait`}
  </code>
</pre>

**7. Verify resources in Dapr Ops Dashboard**

Watch the agent and Dapr control plane come online in the console.

{"\n\n"}

[https://diagrid.ws/conductor](https://diagrid.ws/conductor)

### Console workflow

**1. Create a Helm-managed cluster connection**

In the [Dapr Ops Dashboard console](https://diagrid.ws/conductor), select
the Kubernetes distribution, cluster type, and enable <code>Helm managed</code>.

{"\n\n"}

![Create Helm-managed cluster connection](https://docs.diagrid.io/img/conductor/helm-managed-create.png)

**2. Decide whether to install Dapr**

Toggle <code>Install Dapr</code> if you want Dapr Ops Dashboard to generate a separate
Helm chart configuration. Set the version, namespace, and Helm values using the provided profiles or your own overrides.

{"\n\n"}

![Configure Dapr Helm install](https://docs.diagrid.io/img/conductor/helm-managed-dapr-install.png)

**3. Adjust advanced agent settings**

Use <code>Advanced agent configuration</code> to change namespaces, labels,
tolerations, and more.

{"\n\n"}

![Advanced agent configuration](https://docs.diagrid.io/img/conductor/helm-managed-advanced-config.png)

**4. Generate Helm commands and values**

Select <code>Create</code> to produce downloadable values files and matching Helm commands.

{"\n\n"}

![Download Helm values](https://docs.diagrid.io/img/conductor/helm-managed-values.png)

**5. Download and inspect the values files**

Review the agent and Dapr values before storing them in source control. Reference the{" "}
[Helm values tables](#helm-values-reference) below to confirm each setting.

**6. Install the Helm charts**

Run the generated commands (or use the samples below) for the agent and, if enabled, Dapr.

{"\n\n"}

<pre>
  <code>
    {`# Sample Agent Helm installation
      helm install <cluster-connection-name> oci://public.ecr.aws/diagrid/conductor-charts/agent \\
      --version <version-number> \\
      -n diagrid-cloud --create-namespace \\
      -f https://api.r1.diagrid.io/apis/diagrid.io/v1beta1/clusters/<cluster-id>/helmvalues?token=<cluster-token>

      # Sample Dapr Helm installation

      helm install dapr dapr/dapr \\
      --version=<dapr-version> \\
      --namespace dapr-system --create-namespace --wait \\
      -f https://api.r1.diagrid.io/apis/diagrid.io/v1beta1/clusters/<cluster-id>/daprhelmvalues?token=<cluster-token>`}
  </code>
</pre>

**7. Verify resources in Dapr Ops Dashboard**

Monitor the cluster status at{" "}

[https://diagrid.ws/conductor](https://diagrid.ws/conductor)

## Agent Helm values reference

<details>
  <summary><strong>Required values</strong></summary>

  It is important that you do not overwrite the following Helm values when modifying or providing your own custom Helm values, as these supply the connection details from your Kubernetes cluster that allow it to connect to your Dapr Ops Dashboard organization.

  ```yaml
  caCertPem: "your-ca-cert-pem"

  global:
    orgId: "your-org-id"
    agentId: "your-agent-id"
    manifestId: "your-manifest-id"

  agent:
    key: "your-agent-key"
    keyB64: "your-agent-key-base64"
  ```
</details>

<details>
  <summary><strong>Global configuration</strong></summary>

  Global configuration applies to the Dapr Ops Dashboard agent and OpenTelemetry logs and metrics collectors.

  | Parameter                          | Description                | Default                      |
  | ---------------------------------- | -------------------------- | ---------------------------- |
  | global.namespace                   | Namespace for deployment   | diagrid-cloud                |
  | global.namespaceDefault            | Default namespace          | diagrid-cloud                |
  | global.cloudUrl                    | Diagrid cloud endpoint     | `cloudgrid.diagrid.io:443`   |
  | global.orgId                       | Organization ID            | ""                           |
  | global.agentId                     | Agent ID                   | ""                           |
  | global.manifestId                  | Manifest ID                | ""                           |
  | global.imageTag                    | Global image tag           | ""                           |
  | global.mainServiceAccountName      | Main service account name  | diagrid-agent                |
  | global.sccTargetServiceAccountName | SCC target service account | diagrid-agent-logs-collector |
  | global.kubernetesOs                | Kubernetes OS              | linux                        |
  | global.isOpenShift                 | OpenShift deployment flag  | false                        |
  | global.isLocal                     | Local deployment flag      | false                        |
  | global.customCA                    | Custom CA certificate      | ""                           |
  | global.proxyConfig                 | Proxy configuration        | {}                           |
</details>

<details>
  <summary><strong>Dapr Ops Dashboard agent</strong></summary>

  | Parameter                 | Description              | Default                                                                               |
  | ------------------------- | ------------------------ | ------------------------------------------------------------------------------------- |
  | agent.enableComponentValidation | Enable component validation/init checks. See [Disabling initialization](https://docs.diagrid.io/dapr-open-source/dapr-ops-dashboard/observe/components#disabling-initialization) for more details. | true                                                             |
  | agent.image               | Agent image repository   | us-central1-docker.pkg.dev/prj-common-p-shared-79896/reg-p-common-docker-public/agent |
  | agent.replicas            | Number of agent replicas | 2                                                                                     |
  | agent.logLevel            | Logging level            | info                                                                                  |
  | agent.installDependencies | Install dependencies     | false                                                                                 |
  | agent.tlsEnabled          | Enable TLS               | true                                                                                  |
  | agent.tlsMutual           | Enable mutual TLS        | false                                                                                 |
  | agent.key                 | Agent key                | ""                                                                                    |
  | agent.keyB64              | Base64 encoded agent key | ""                                                                                    |
  | agent.goMemLimit          | Go memory limit          | 675MiB                                                                                |
</details>

<details>
  <summary><strong>Dapr Ops Dashboard OpenTelemetry metrics collector</strong></summary>

  | Parameter                                   | Description              | Default                                                                                                |
  | ------------------------------------------- | ------------------------ | ------------------------------------------------------------------------------------------------------ |
  | otelMetricsCollector.enabled                | Enable metrics collector | true                                                                                                   |
  | otelMetricsCollector.labels                 | Additional labels        | {}                                                                                                     |
  | otelMetricsCollector.replicas               | Number of replicas       | 2                                                                                                      |
  | otelMetricsCollector.image                  | Collector image          | us-central1-docker.pkg.dev/prj-common-p-shared-79896/reg-p-common-docker-public/diagrid-otel-collector |
  | otelMetricsCollector.logLevel               | Logging level            | info                                                                                                   |
  | otelMetricsCollector.memoryLimiter          | Memory limiter settings  | See values.yaml                                                                                        |
  | otelMetricsCollector.tlsEnabled             | Enable TLS               | true                                                                                                   |
  | otelMetricsCollector.remoteWriteURL         | Metrics endpoint         | `https://metrics.diagrid.io/api/v1/push`                                                               |
  | otelMetricsCollector.remoteWriteTlsInsecure | Allow insecure TLS       | true                                                                                                   |
  | otelMetricsCollector.remoteWriteAuthEnabled | Enable auth              | true                                                                                                   |
</details>

<details>
  <summary><strong>Dapr Ops Dashboard OpenTelemetry logs collector</strong></summary>

  | Parameter                       | Description             | Default                                                                                                |
  | ------------------------------- | ----------------------- | ------------------------------------------------------------------------------------------------------ |
  | otelLogsCollector.enabled       | Enable logs collector   | true                                                                                                   |
  | otelLogsCollector.labels        | Additional labels       | {}                                                                                                     |
  | otelLogsCollector.image         | Collector image         | us-central1-docker.pkg.dev/prj-common-p-shared-79896/reg-p-common-docker-public/diagrid-otel-collector |
  | otelLogsCollector.logLevel      | Logging level           | info                                                                                                   |
  | otelLogsCollector.daprLogsURL   | Dapr logs endpoint      | `cloudgrid.diagrid.io:443`                                                                             |
  | otelLogsCollector.memoryLimiter | Memory limiter settings | See values.yaml                                                                                        |
  | otelLogsCollector.tlsEnabled    | Enable TLS              | true                                                                                                   |
  | otelLogsCollector.tlsInsecure   | Allow insecure TLS      | false                                                                                                  |
  | otelLogsCollector.isLogsLimited | Enable log limiting     | true                                                                                                   |
</details>

<details>
  <summary><strong>Certificate management rotation</strong></summary>

  | Parameter                                          | Description                                | Default |
  | -------------------------------------------------- | ------------------------------------------ | ------- |
  | certificateRotation.enabled                        | Enable automatic mTLS certificate rotation | false   |
  | certificateRotation.validForDays                   | Certificate validity period in days        | 365     |
  | certificateRotation.renewHoursBeforeExpiry         | Renew this many hours before expiry        | 72      |
  | certificateRotation.preferredRenewalTime           | Preferred renewal schedule (object)        | -       |
  | certificateRotation.preferredRenewalTime.dayOfWeek | Preferred day of week (0-6, Sunday=0)      | -       |
  | certificateRotation.preferredRenewalTime.hour      | Preferred hour (0-23)                      | -       |
  | certificateRotation.preferredRenewalTime.minute    | Preferred minute (0-59)                    | -       |

  To enable and configure certificate rotation, set the Helm values under the certificateRotation section. Start by setting `certificateRotation.enabled` to `true`, then adjust parameters like `validForDays` and `renewHoursBeforeExpiry` as needed. You can also optionally specify a `preferredRenewalTime` to control when rotations occur. These values determine how and when the system automatically renews and rotates mTLS certificates.
</details>

## Dapr Helm values reference

All Dapr Helm values are from the Dapr open-source Helm chart. Use the Dapr Helm README [Configuration](https://github.com/dapr/dapr/blob/master/charts/dapr/README.md#configuration) to modify any properties required in your Dapr installation. Default Helm arguments profiles are provided, for example the following for `Dev` environments.

:::warning
Dapr is installed as a separate Helm chart, removing the management from Dapr Ops Dashboard and effectively putting its console into "read-only-mode".
:::

<details>
  <summary><strong>Default Helm arguments profile (Dev)</strong></summary>

  ```yaml
  global:
    registry: docker.io/daprio
    ha:
      enabled: false
    mtls:
      enabled: true
  dapr_rbac: {}
  dapr_operator:
    watchInterval: 3m
    resources:
      requests:
        memory: 100Mi
        cpu: 100m
      limits:
        memory: 500Mi
        cpu: "1"
  dapr_sidecar_injector:
    resources:
      requests:
        memory: 30Mi
        cpu: 100m
      limits:
        memory: 500Mi
        cpu: "1"
  dapr_sentry:
    resources:
      requests:
        memory: 30Mi
        cpu: 100m
      limits:
        memory: 500Mi
        cpu: "1"
  dapr_placement:
    cluster:
      forceInMemoryLog: true
    resources:
      requests:
        memory: 75Mi
        cpu: 250m
      limits:
        memory: 500Mi
        cpu: "1"
  dapr_scheduler:
    resources:
      requests:
        memory: 150Mi
        cpu: 250m
      limits:
        memory: 1024Mi
        cpu: "1"
  ```
</details>

## Default resource settings

The following are the default values for the Dapr Ops Dashboard agent and Dapr control plane resource settings. These are considered a good starting place for Dev/Prod environments respectively, but should be monitored and then updated to ensure appropriate values are set.

<details>
  <summary><strong>Dapr control plane: Dev</strong></summary>

  ```yaml
  dapr:
    dapr_operator:
      resources:
        requests:
          memory: 100Mi
          cpu: 100m
        limits:
          memory: 500Mi
          cpu: "1"
    dapr_sidecar_injector:
      resources:
        requests:
          memory: 30Mi
          cpu: 100m
        limits:
          memory: 500Mi
          cpu: "1"
    dapr_sentry:
      resources:
        requests:
          memory: 30Mi
          cpu: 100m
        limits:
          memory: 500Mi
          cpu: "1"
    dapr_placement:
      resources:
        requests:
          memory: 75Mi
          cpu: 250m
        limits:
          memory: 500Mi
          cpu: "1"
    dapr_scheduler:
      resources:
        requests:
          memory: 150Mi
          cpu: 250m
        limits:
          memory: 1024Mi
          cpu: "1"
  ```
</details>

<details>
  <summary><strong>Dapr control plane: Prod</strong></summary>

  ```yaml
  dapr_operator:
    resources:
      requests:
        memory: 100Mi
        cpu: 100m
      limits:
        memory: 1024Mi
        cpu: "1"
  dapr_sidecar_injector:
    resources:
      requests:
        memory: 60Mi
        cpu: 100m
      limits:
        memory: 200Mi
        cpu: "1"
  dapr_sentry:
    resources:
      requests:
        memory: 60Mi
        cpu: 100m
      limits:
        memory: 1024Mi
        cpu: "1"
  dapr_placement:
    resources:
      requests:
        memory: 75Mi
        cpu: 250m
      limits:
        memory: 1024Mi
        cpu: "1"
  dapr_scheduler:
    resources:
      requests:
        memory: 250Mi
        cpu: 250m
      limits:
        memory: 1024Mi
        cpu: "1"
  ```
</details>

<details>
  <summary><strong>Dapr Ops Dashboard agent</strong></summary>

  ```yaml
  resources:
    limits:
      memory: 750Mi
    requests:
      cpu: 10m
      memory: 250Mi
  ```
</details>

<details>
  <summary><strong>Dapr Ops Dashboard OpenTelemetry metrics collector</strong></summary>

  ```yaml
  resources:
    limits:
      memory: 2Gi
    requests:
      cpu: 100m
      memory: 250Mi
  ```
</details>

<details>
  <summary><strong>Dapr Ops Dashboard OpenTelemetry logs collector</strong></summary>

  ```yaml
  resources:
    limits:
      memory: 750Mi
    requests:
      cpu: 10m
      memory: 250Mi
  ```
</details>
