diff --git a/addons/grafana/10/README.md b/addons/grafana/10/README.md
new file mode 100644
index 00000000..3b1bd86a
--- /dev/null
+++ b/addons/grafana/10/README.md
@@ -0,0 +1,692 @@
+<!--- app-name: Grafana -->
+
+# Grafana packaged by Bitnami
+
+Grafana is an open source metric analytics and visualization suite for visualizing time series data that supports various types of data sources.
+
+[Overview of Grafana](https://grafana.com/)
+
+Trademarks: This software listing is packaged by Bitnami. The respective trademarks mentioned in the offering are owned by the respective companies, and use of them does not imply any affiliation or endorsement.
+
+## TL;DR
+
+```console
+$ helm repo add my-repo https://charts.drycc.com/drycc
+$ helm install my-release my-repo/grafana
+```
+
+## Introduction
+
+This chart bootstraps a [grafana](https://github.com/drycc/containers/tree/main/drycc/grafana) deployment on a [Kubernetes](https://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager.
+
+Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters.
+
+## Prerequisites
+
+- Kubernetes 1.19+
+- Helm 3.2.0+
+- PV provisioner support in the underlying infrastructure
+- ReadWriteMany volumes for deployment scaling
+
+## Installing the Chart
+
+To install the chart with the release name `my-release`:
+
+```console
+$ helm repo add my-repo https://charts.drycc.com/drycc
+$ helm install my-release my-repo/grafana
+```
+
+These commands deploy grafana on the Kubernetes cluster in the default configuration. The [Parameters](#parameters) section lists the parameters that can be configured during installation.
+
+> **Tip**: List all releases using `helm list`
+
+## Uninstalling the Chart
+
+To uninstall/delete the `my-release` deployment:
+
+```console
+$ helm delete my-release
+```
+
+The command removes all the Kubernetes components associated with the chart and deletes the release. Use the option `--purge` to delete all persistent volumes too.
+
+## Differences between the Bitnami Grafana chart and the Bitnami Grafana Operator chart
+
+In the Bitnami catalog we offer both the drycc/grafana and drycc/grafana-operator charts. Each solution covers different needs and use cases.
+
+The *drycc/grafana* chart deploys a single Grafana installation (with grafana-image-renderer) using a Kubernetes Deployment object (together with Services, PVCs, ConfigMaps, etc.). The figure below shows the deployed objects in the cluster after executing *helm install*:
+
+```
+                    +--------------+             +-----+
+                    |              |             |     |
+ Service & Ingress  |    Grafana   +<------------+ PVC |
+<-------------------+              |             |     |
+                    |  Deployment  |             +-----+
+                    |              |
+                    +-----------+--+
+                                ^                +------------+
+                                |                |            |
+                                +----------------+ Configmaps |
+                                                 |   Secrets  |
+                                                 |            |
+                                                 +------------+
+
+```
+
+Its lifecycle is managed using Helm and, at the Grafana container level, the following operations are automated: persistence management, configuration based on environment variables and plugin initialization. The chart also allows deploying dashboards and data sources using ConfigMaps. The Deployments do not require any ServiceAccounts with special RBAC privileges so this solution would fit better in more restricted Kubernetes installations.
+
+The *drycc/grafana-operator* chart deploys a Grafana Operator installation using a Kubernetes Deployment.  The figure below shows the Grafana operator deployment after executing *helm install*:
+
+```
++--------------------+
+|                    |      +---------------+
+|  Grafana Operator  |      |               |
+|                    |      |     RBAC      |
+|    Deployment      |      |   Privileges  |
+|                    |      |               |
++-------+------------+      +-------+-------+
+        ^                           |
+        |   +-----------------+     |
+        +---+ Service Account +<----+
+            +-----------------+
+```
+
+The operator will extend the Kubernetes API with the following objects: *Grafana*, *GrafanaDashboards* and *GrafanaDataSources*. From that moment, the user will be able to deploy objects of these kinds and the previously deployed Operator will take care of deploying all the required Deployments, ConfigMaps and Services for running a Grafana instance. Its lifecycle is managed using *kubectl* on the Grafana, GrafanaDashboards and GrafanaDataSource objects. The following figure shows the deployed objects after
+ deploying a *Grafana* object using *kubectl*:
+
+```
++--------------------+
+|                    |      +---------------+
+|  Grafana Operator  |      |               |
+|                    |      |     RBAC      |
+|    Deployment      |      |   Privileges  |
+|                    |      |               |
++--+----+------------+      +-------+-------+
+   |    ^                           |
+   |    |   +-----------------+     |
+   |    +---+ Service Account +<----+
+   |        +-----------------+
+   |
+   |
+   |
+   |
+   |                                                   Grafana
+   |                     +---------------------------------------------------------------------------+
+   |                     |                                                                           |
+   |                     |                          +--------------+             +-----+             |
+   |                     |                          |              |             |     |             |
+   +-------------------->+       Service & Ingress  |    Grafana   +<------------+ PVC |             |
+                         |      <-------------------+              |             |     |             |
+                         |                          |  Deployment  |             +-----+             |
+                         |                          |              |                                 |
+                         |                          +-----------+--+                                 |
+                         |                                      ^                +------------+      |
+                         |                                      |                |            |      |
+                         |                                      +----------------+ Configmaps |      |
+                         |                                                       |   Secrets  |      |
+                         |                                                       |            |      |
+                         |                                                       +------------+      |
+                         |                                                                           |
+                         +---------------------------------------------------------------------------+
+
+```
+
+This solution allows to easily deploy multiple Grafana instances compared to the *drycc/grafana* chart. As the operator automatically deploys Grafana installations, the Grafana Operator pods will require a ServiceAccount with privileges to create and destroy mulitple Kubernetes objects. This may be problematic for Kubernetes clusters with strict role-based access policies.
+
+## Parameters
+
+### Global parameters
+
+| Name                      | Description                                     | Value |
+| ------------------------- | ----------------------------------------------- | ----- |
+| `global.imageRegistry`    | Global Docker image registry                    | `""`  |
+| `global.imagePullSecrets` | Global Docker registry secret names as an array | `[]`  |
+| `global.storageClass`     | Global StorageClass for Persistent Volume(s)    | `""`  |
+
+
+### Common parameters
+
+| Name                | Description                                                                             | Value           |
+| ------------------- | --------------------------------------------------------------------------------------- | --------------- |
+| `kubeVersion`       | Force target Kubernetes version (using Helm capabilities if not set)                    | `""`            |
+| `extraDeploy`       | Array of extra objects to deploy with the release                                       | `[]`            |
+| `nameOverride`      | String to partially override grafana.fullname template (will maintain the release name) | `""`            |
+| `fullnameOverride`  | String to fully override grafana.fullname template                                      | `""`            |
+| `clusterDomain`     | Default Kubernetes cluster domain                                                       | `cluster.local` |
+| `commonLabels`      | Labels to add to all deployed objects                                                   | `{}`            |
+| `commonAnnotations` | Annotations to add to all deployed objects                                              | `{}`            |
+
+
+### Grafana parameters
+
+| Name                               | Description                                                                                                                                          | Value                             |
+| ---------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- |
+| `image.registry`                   | Grafana image registry                                                                                                                               | `docker.io`                       |
+| `image.repository`                 | Grafana image repository                                                                                                                             | `drycc/grafana`                 |
+| `image.tag`                        | Grafana image tag (immutable tags are recommended)                                                                                                   | `9.1.7-debian-11-r0`              |
+| `image.digest`                     | Grafana image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag                                              | `""`                              |
+| `image.pullPolicy`                 | Grafana image pull policy                                                                                                                            | `IfNotPresent`                    |
+| `image.pullSecrets`                | Grafana image pull secrets                                                                                                                           | `[]`                              |
+| `admin.user`                       | Grafana admin username                                                                                                                               | `admin`                           |
+| `admin.password`                   | Admin password. If a password is not provided a random password will be generated                                                                    | `""`                              |
+| `admin.existingSecret`             | Name of the existing secret containing admin password                                                                                                | `""`                              |
+| `admin.existingSecretPasswordKey`  | Password key on the existing secret                                                                                                                  | `password`                        |
+| `smtp.enabled`                     | Enable SMTP configuration                                                                                                                            | `false`                           |
+| `smtp.user`                        | SMTP user                                                                                                                                            | `user`                            |
+| `smtp.password`                    | SMTP password                                                                                                                                        | `password`                        |
+| `smtp.host`                        | Custom host for the smtp server                                                                                                                      | `""`                              |
+| `smtp.fromAddress`                 | From address                                                                                                                                         | `""`                              |
+| `smtp.fromName`                    | From name                                                                                                                                            | `""`                              |
+| `smtp.skipVerify`                  | Enable skip verify                                                                                                                                   | `false`                           |
+| `smtp.existingSecret`              | Name of existing secret containing SMTP credentials (user and password)                                                                              | `""`                              |
+| `smtp.existingSecretUserKey`       | User key on the existing secret                                                                                                                      | `user`                            |
+| `smtp.existingSecretPasswordKey`   | Password key on the existing secret                                                                                                                  | `password`                        |
+| `plugins`                          | Grafana plugins to be installed in deployment time separated by commas                                                                               | `""`                              |
+| `ldap.enabled`                     | Enable LDAP for Grafana                                                                                                                              | `false`                           |
+| `ldap.allowSignUp`                 | Allows LDAP sign up for Grafana                                                                                                                      | `false`                           |
+| `ldap.configuration`               | Specify content for ldap.toml configuration file                                                                                                     | `""`                              |
+| `ldap.configMapName`               | Name of the ConfigMap with the ldap.toml configuration file for Grafana                                                                              | `""`                              |
+| `ldap.secretName`                  | Name of the Secret with the ldap.toml configuration file for Grafana                                                                                 | `""`                              |
+| `ldap.uri`                         | Server URI, eg. ldap://ldap_server:389                                                                                                               | `""`                              |
+| `ldap.binddn`                      | DN of the account used to search in the LDAP server.                                                                                                 | `""`                              |
+| `ldap.bindpw`                      | Password for binddn account.                                                                                                                         | `""`                              |
+| `ldap.basedn`                      | Base DN path where binddn account will search for the users.                                                                                         | `""`                              |
+| `ldap.searchAttribute`             | Field used to match with the user name (uid, samAccountName, cn, etc). This value will be ignored if 'ldap.searchFilter' is set                      | `uid`                             |
+| `ldap.searchFilter`                | User search filter, for example "(cn=%s)" or "(sAMAccountName=%s)" or "(|(sAMAccountName=%s)(userPrincipalName=%s)"                                  | `""`                              |
+| `ldap.extraConfiguration`          | Extra ldap configuration.                                                                                                                            | `""`                              |
+| `ldap.tls.enabled`                 | Enabled TLS configuration.                                                                                                                           | `false`                           |
+| `ldap.tls.startTls`                | Use STARTTLS instead of LDAPS.                                                                                                                       | `false`                           |
+| `ldap.tls.skipVerify`              | Skip any SSL verification (hostanames or certificates)                                                                                               | `false`                           |
+| `ldap.tls.certificatesMountPath`   | Where LDAP certifcates are mounted.                                                                                                                  | `/opt/drycc/grafana/conf/ldap/` |
+| `ldap.tls.certificatesSecret`      | Secret with LDAP certificates.                                                                                                                       | `""`                              |
+| `ldap.tls.CAFilename`              | CA certificate filename. Should match with the CA entry key in the ldap.tls.certificatesSecret.                                                      | `""`                              |
+| `ldap.tls.certFilename`            | Client certificate filename to authenticate against the LDAP server. Should match with certificate the entry key in the ldap.tls.certificatesSecret. | `""`                              |
+| `ldap.tls.certKeyFilename`         | Client Key filename to authenticate against the LDAP server. Should match with certificate the entry key in the ldap.tls.certificatesSecret.         | `""`                              |
+| `config.useGrafanaIniFile`         | Allows to load a `grafana.ini` file                                                                                                                  | `false`                           |
+| `config.grafanaIniConfigMap`       | Name of the ConfigMap containing the `grafana.ini` file                                                                                              | `""`                              |
+| `config.grafanaIniSecret`          | Name of the Secret containing the `grafana.ini` file                                                                                                 | `""`                              |
+| `dashboardsProvider.enabled`       | Enable the use of a Grafana dashboard provider                                                                                                       | `false`                           |
+| `dashboardsProvider.configMapName` | Name of a ConfigMap containing a custom dashboard provider                                                                                           | `""`                              |
+| `dashboardsConfigMaps`             | Array with the names of a series of ConfigMaps containing dashboards files                                                                           | `[]`                              |
+| `datasources.secretName`           | The name of an externally-managed secret containing custom datasource files.                                                                         | `""`                              |
+| `datasources.secretDefinition`     | The contents of a secret defining a custom datasource file. Only used if datasources.secretName is empty or not defined.                             | `{}`                              |
+| `notifiers.configMapName`          | Name of a ConfigMap containing Grafana notifiers configuration                                                                                       | `""`                              |
+
+
+### Grafana Deployment parameters
+
+| Name                                         | Description                                                                                             | Value           |
+| -------------------------------------------- | ------------------------------------------------------------------------------------------------------- | --------------- |
+| `grafana.replicaCount`                       | Number of Grafana nodes                                                                                 | `1`             |
+| `grafana.updateStrategy.type`                | Set up update strategy for Grafana installation.                                                        | `RollingUpdate` |
+| `grafana.hostAliases`                        | Add deployment host aliases                                                                             | `[]`            |
+| `grafana.schedulerName`                      | Alternative scheduler                                                                                   | `""`            |
+| `grafana.terminationGracePeriodSeconds`      | In seconds, time the given to the Grafana pod needs to terminate gracefully                             | `""`            |
+| `grafana.priorityClassName`                  | Priority class name                                                                                     | `""`            |
+| `grafana.podLabels`                          | Extra labels for Grafana pods                                                                           | `{}`            |
+| `grafana.podAnnotations`                     | Grafana Pod annotations                                                                                 | `{}`            |
+| `grafana.podAffinityPreset`                  | Pod affinity preset. Ignored if `affinity` is set. Allowed values: `soft` or `hard`                     | `""`            |
+| `grafana.podAntiAffinityPreset`              | Pod anti-affinity preset. Ignored if `affinity` is set. Allowed values: `soft` or `hard`                | `soft`          |
+| `grafana.containerPorts.grafana`             | Grafana container port                                                                                  | `3000`          |
+| `grafana.nodeAffinityPreset.type`            | Node affinity preset type. Ignored if `affinity` is set. Allowed values: `soft` or `hard`               | `""`            |
+| `grafana.nodeAffinityPreset.key`             | Node label key to match Ignored if `affinity` is set.                                                   | `""`            |
+| `grafana.nodeAffinityPreset.values`          | Node label values to match. Ignored if `affinity` is set.                                               | `[]`            |
+| `grafana.affinity`                           | Affinity for pod assignment                                                                             | `{}`            |
+| `grafana.nodeSelector`                       | Node labels for pod assignment                                                                          | `{}`            |
+| `grafana.tolerations`                        | Tolerations for pod assignment                                                                          | `[]`            |
+| `grafana.topologySpreadConstraints`          | Topology spread constraints rely on node labels to identify the topology domain(s) that each Node is in | `[]`            |
+| `grafana.podSecurityContext.enabled`         | Enable securityContext on for Grafana deployment                                                        | `true`          |
+| `grafana.podSecurityContext.fsGroup`         | Group to configure permissions for volumes                                                              | `1001`          |
+| `grafana.podSecurityContext.runAsUser`       | User for the security context                                                                           | `1001`          |
+| `grafana.podSecurityContext.runAsNonRoot`    | Run containers as non-root users                                                                        | `true`          |
+| `grafana.containerSecurityContext.enabled`   | Enabled Grafana Image Renderer containers' Security Context                                             | `true`          |
+| `grafana.containerSecurityContext.runAsUser` | Set Grafana Image Renderer containers' Security Context runAsUser                                       | `1001`          |
+| `grafana.resources.limits`                   | The resources limits for Grafana containers                                                             | `{}`            |
+| `grafana.resources.requests`                 | The requested resources for Grafana containers                                                          | `{}`            |
+| `grafana.livenessProbe.enabled`              | Enable livenessProbe                                                                                    | `true`          |
+| `grafana.livenessProbe.path`                 | Path for livenessProbe                                                                                  | `/api/health`   |
+| `grafana.livenessProbe.scheme`               | Scheme for livenessProbe                                                                                | `HTTP`          |
+| `grafana.livenessProbe.initialDelaySeconds`  | Initial delay seconds for livenessProbe                                                                 | `120`           |
+| `grafana.livenessProbe.periodSeconds`        | Period seconds for livenessProbe                                                                        | `10`            |
+| `grafana.livenessProbe.timeoutSeconds`       | Timeout seconds for livenessProbe                                                                       | `5`             |
+| `grafana.livenessProbe.failureThreshold`     | Failure threshold for livenessProbe                                                                     | `6`             |
+| `grafana.livenessProbe.successThreshold`     | Success threshold for livenessProbe                                                                     | `1`             |
+| `grafana.readinessProbe.enabled`             | Enable readinessProbe                                                                                   | `true`          |
+| `grafana.readinessProbe.path`                | Path for readinessProbe                                                                                 | `/api/health`   |
+| `grafana.readinessProbe.scheme`              | Scheme for readinessProbe                                                                               | `HTTP`          |
+| `grafana.readinessProbe.initialDelaySeconds` | Initial delay seconds for readinessProbe                                                                | `30`            |
+| `grafana.readinessProbe.periodSeconds`       | Period seconds for readinessProbe                                                                       | `10`            |
+| `grafana.readinessProbe.timeoutSeconds`      | Timeout seconds for readinessProbe                                                                      | `5`             |
+| `grafana.readinessProbe.failureThreshold`    | Failure threshold for readinessProbe                                                                    | `6`             |
+| `grafana.readinessProbe.successThreshold`    | Success threshold for readinessProbe                                                                    | `1`             |
+| `grafana.startupProbe.enabled`               | Enable startupProbe                                                                                     | `false`         |
+| `grafana.startupProbe.path`                  | Path for readinessProbe                                                                                 | `/api/health`   |
+| `grafana.startupProbe.scheme`                | Scheme for readinessProbe                                                                               | `HTTP`          |
+| `grafana.startupProbe.initialDelaySeconds`   | Initial delay seconds for startupProbe                                                                  | `30`            |
+| `grafana.startupProbe.periodSeconds`         | Period seconds for startupProbe                                                                         | `10`            |
+| `grafana.startupProbe.timeoutSeconds`        | Timeout seconds for startupProbe                                                                        | `5`             |
+| `grafana.startupProbe.failureThreshold`      | Failure threshold for startupProbe                                                                      | `6`             |
+| `grafana.startupProbe.successThreshold`      | Success threshold for startupProbe                                                                      | `1`             |
+| `grafana.customLivenessProbe`                | Custom livenessProbe that overrides the default one                                                     | `{}`            |
+| `grafana.customReadinessProbe`               | Custom readinessProbe that overrides the default one                                                    | `{}`            |
+| `grafana.customStartupProbe`                 | Custom startupProbe that overrides the default one                                                      | `{}`            |
+| `grafana.lifecycleHooks`                     | for the Grafana container(s) to automate configuration before or after startup                          | `{}`            |
+| `grafana.sidecars`                           | Attach additional sidecar containers to the Grafana pod                                                 | `[]`            |
+| `grafana.initContainers`                     | Add additional init containers to the Grafana pod(s)                                                    | `[]`            |
+| `grafana.extraVolumes`                       | Additional volumes for the Grafana pod                                                                  | `[]`            |
+| `grafana.extraVolumeMounts`                  | Additional volume mounts for the Grafana container                                                      | `[]`            |
+| `grafana.extraEnvVarsCM`                     | Name of existing ConfigMap containing extra env vars for Grafana nodes                                  | `""`            |
+| `grafana.extraEnvVarsSecret`                 | Name of existing Secret containing extra env vars for Grafana nodes                                     | `""`            |
+| `grafana.extraEnvVars`                       | Array containing extra env vars to configure Grafana                                                    | `[]`            |
+| `grafana.extraConfigmaps`                    | Array to mount extra ConfigMaps to configure Grafana                                                    | `[]`            |
+| `grafana.command`                            | Override default container command (useful when using custom images)                                    | `[]`            |
+| `grafana.args`                               | Override default container args (useful when using custom images)                                       | `[]`            |
+
+
+### Persistence parameters
+
+| Name                        | Description                                                                                               | Value           |
+| --------------------------- | --------------------------------------------------------------------------------------------------------- | --------------- |
+| `persistence.enabled`       | Enable persistence                                                                                        | `true`          |
+| `persistence.annotations`   | Persistent Volume Claim annotations                                                                       | `{}`            |
+| `persistence.accessMode`    | Persistent Volume Access Mode                                                                             | `ReadWriteOnce` |
+| `persistence.accessModes`   | Persistent Volume Access Modes                                                                            | `[]`            |
+| `persistence.storageClass`  | Storage class to use with the PVC                                                                         | `""`            |
+| `persistence.existingClaim` | If you want to reuse an existing claim, you can pass the name of the PVC using the existingClaim variable | `""`            |
+| `persistence.size`          | Size for the PV                                                                                           | `10Gi`          |
+
+
+### RBAC parameters
+
+| Name                                          | Description                                                                                                           | Value   |
+| --------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | ------- |
+| `serviceAccount.create`                       | Specifies whether a ServiceAccount should be created                                                                  | `true`  |
+| `serviceAccount.name`                         | The name of the ServiceAccount to use. If not set and create is true, a name is generated using the fullname template | `""`    |
+| `serviceAccount.annotations`                  | Annotations to add to the ServiceAccount Metadata                                                                     | `{}`    |
+| `serviceAccount.automountServiceAccountToken` | Automount service account token for the application controller service account                                        | `false` |
+
+
+### Traffic exposure parameters
+
+| Name                               | Description                                                                                                                      | Value                    |
+| ---------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | ------------------------ |
+| `service.type`                     | Kubernetes Service type                                                                                                          | `ClusterIP`              |
+| `service.clusterIP`                | Grafana service Cluster IP                                                                                                       | `""`                     |
+| `service.ports.grafana`            | Grafana service port                                                                                                             | `3000`                   |
+| `service.nodePorts.grafana`        | Specify the nodePort value for the LoadBalancer and NodePort service types                                                       | `""`                     |
+| `service.loadBalancerIP`           | loadBalancerIP if Grafana service type is `LoadBalancer` (optional, cloud specific)                                              | `""`                     |
+| `service.loadBalancerSourceRanges` | loadBalancerSourceRanges if Grafana service type is `LoadBalancer` (optional, cloud specific)                                    | `[]`                     |
+| `service.annotations`              | Provide any additional annotations which may be required.                                                                        | `{}`                     |
+| `service.externalTrafficPolicy`    | Grafana service external traffic policy                                                                                          | `Cluster`                |
+| `service.extraPorts`               | Extra port to expose on Redmine service                                                                                          | `[]`                     |
+| `service.sessionAffinity`          | Session Affinity for Kubernetes service, can be "None" or "ClientIP"                                                             | `None`                   |
+| `service.sessionAffinityConfig`    | Additional settings for the sessionAffinity                                                                                      | `{}`                     |
+| `ingress.enabled`                  | Set to true to enable ingress record generation                                                                                  | `false`                  |
+| `ingress.pathType`                 | Ingress Path type                                                                                                                | `ImplementationSpecific` |
+| `ingress.apiVersion`               | Override API Version (automatically detected if not set)                                                                         | `""`                     |
+| `ingress.hostname`                 | When the ingress is enabled, a host pointing to this will be created                                                             | `grafana.local`          |
+| `ingress.path`                     | Default path for the ingress resource                                                                                            | `/`                      |
+| `ingress.annotations`              | Additional annotations for the Ingress resource. To enable certificate autogeneration, place here your cert-manager annotations. | `{}`                     |
+| `ingress.tls`                      | Enable TLS configuration for the hostname defined at ingress.hostname parameter                                                  | `false`                  |
+| `ingress.extraHosts`               | The list of additional hostnames to be covered with this ingress record.                                                         | `[]`                     |
+| `ingress.extraPaths`               | Any additional arbitrary paths that may need to be added to the ingress under the main host.                                     | `[]`                     |
+| `ingress.extraTls`                 | The tls configuration for additional hostnames to be covered with this ingress record.                                           | `[]`                     |
+| `ingress.secrets`                  | If you're providing your own certificates, please use this to add the certificates as secrets                                    | `[]`                     |
+| `ingress.secrets`                  | It is also possible to create and manage the certificates outside of this helm chart                                             | `[]`                     |
+| `ingress.selfSigned`               | Create a TLS secret for this ingress record using self-signed certificates generated by Helm                                     | `false`                  |
+| `ingress.ingressClassName`         | IngressClass that will be be used to implement the Ingress (Kubernetes 1.18+)                                                    | `""`                     |
+| `ingress.extraRules`               | Additional rules to be covered with this ingress record                                                                          | `[]`                     |
+
+
+### Metrics parameters
+
+| Name                                       | Description                                                                                                                               | Value   |
+| ------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------- | ------- |
+| `metrics.enabled`                          | Enable the export of Prometheus metrics                                                                                                   | `false` |
+| `metrics.service.annotations`              | Annotations for Prometheus metrics service                                                                                                | `{}`    |
+| `metrics.serviceMonitor.enabled`           | if `true`, creates a Prometheus Operator ServiceMonitor (also requires `metrics.enabled` to be `true`)                                    | `false` |
+| `metrics.serviceMonitor.namespace`         | Namespace in which Prometheus is running                                                                                                  | `""`    |
+| `metrics.serviceMonitor.interval`          | Interval at which metrics should be scraped.                                                                                              | `""`    |
+| `metrics.serviceMonitor.scrapeTimeout`     | Timeout after which the scrape is ended                                                                                                   | `""`    |
+| `metrics.serviceMonitor.selector`          | Prometheus instance selector labels                                                                                                       | `{}`    |
+| `metrics.serviceMonitor.relabelings`       | RelabelConfigs to apply to samples before scraping                                                                                        | `[]`    |
+| `metrics.serviceMonitor.metricRelabelings` | MetricRelabelConfigs to apply to samples before ingestion                                                                                 | `[]`    |
+| `metrics.serviceMonitor.honorLabels`       | Labels to honor to add to the scrape endpoint                                                                                             | `false` |
+| `metrics.serviceMonitor.labels`            | Additional custom labels for the ServiceMonitor                                                                                           | `{}`    |
+| `metrics.serviceMonitor.jobLabel`          | The name of the label on the target service to use as the job name in prometheus.                                                         | `""`    |
+| `metrics.prometheusRule.enabled`           | if `true`, creates a Prometheus Operator PrometheusRule (also requires `metrics.enabled` to be `true` and `metrics.prometheusRule.rules`) | `false` |
+| `metrics.prometheusRule.namespace`         | Namespace for the PrometheusRule Resource (defaults to the Release Namespace)                                                             | `""`    |
+| `metrics.prometheusRule.additionalLabels`  | Additional labels that can be used so PrometheusRule will be discovered by Prometheus                                                     | `{}`    |
+| `metrics.prometheusRule.rules`             | PrometheusRule rules to configure                                                                                                         | `[]`    |
+
+
+### Grafana Image Renderer parameters
+
+| Name                                                     | Description                                                                                                                               | Value                            |
+| -------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- |
+| `imageRenderer.enabled`                                  | Enable using a remote rendering service to render PNG images                                                                              | `false`                          |
+| `imageRenderer.image.registry`                           | Grafana Image Renderer image registry                                                                                                     | `docker.io`                      |
+| `imageRenderer.image.repository`                         | Grafana Image Renderer image repository                                                                                                   | `drycc/grafana-image-renderer` |
+| `imageRenderer.image.tag`                                | Grafana Image Renderer image tag (immutable tags are recommended)                                                                         | `3.6.1-debian-11-r10`            |
+| `imageRenderer.image.digest`                             | Grafana Image Renderer image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag                    | `""`                             |
+| `imageRenderer.image.pullPolicy`                         | Grafana Image Renderer image pull policy                                                                                                  | `IfNotPresent`                   |
+| `imageRenderer.image.pullSecrets`                        | Grafana image Renderer pull secrets                                                                                                       | `[]`                             |
+| `imageRenderer.replicaCount`                             | Number of Grafana Image Renderer Pod replicas                                                                                             | `1`                              |
+| `imageRenderer.updateStrategy.type`                      | Grafana Image Renderer deployment strategy type.                                                                                          | `RollingUpdate`                  |
+| `imageRenderer.podAnnotations`                           | Grafana Image Renderer Pod annotations                                                                                                    | `{}`                             |
+| `imageRenderer.podLabels`                                | Extra labels for Grafana Image Renderer pods                                                                                              | `{}`                             |
+| `imageRenderer.nodeSelector`                             | Node labels for pod assignment                                                                                                            | `{}`                             |
+| `imageRenderer.hostAliases`                              | Grafana Image Renderer pods host aliases                                                                                                  | `[]`                             |
+| `imageRenderer.tolerations`                              | Tolerations for pod assignment                                                                                                            | `[]`                             |
+| `imageRenderer.priorityClassName`                        | Grafana Image Renderer pods' priorityClassName                                                                                            | `""`                             |
+| `imageRenderer.schedulerName`                            | Name of the k8s scheduler (other than default)                                                                                            | `""`                             |
+| `imageRenderer.terminationGracePeriodSeconds`            | In seconds, time the given to the Grafana Image Renderer pod needs to terminate gracefully                                                | `""`                             |
+| `imageRenderer.topologySpreadConstraints`                | Topology Spread Constraints for pod assignment                                                                                            | `[]`                             |
+| `imageRenderer.podAffinityPreset`                        | Pod affinity preset. Ignored if `affinity` is set. Allowed values: `soft` or `hard`                                                       | `""`                             |
+| `imageRenderer.podAntiAffinityPreset`                    | Pod anti-affinity preset. Ignored if `affinity` is set. Allowed values: `soft` or `hard`                                                  | `soft`                           |
+| `imageRenderer.nodeAffinityPreset.type`                  | Node affinity preset type. Ignored if `affinity` is set. Allowed values: `soft` or `hard`                                                 | `""`                             |
+| `imageRenderer.nodeAffinityPreset.key`                   | Node label key to match Ignored if `affinity` is set.                                                                                     | `""`                             |
+| `imageRenderer.nodeAffinityPreset.values`                | Node label values to match. Ignored if `affinity` is set.                                                                                 | `[]`                             |
+| `imageRenderer.extraEnvVars`                             | Array containing extra env vars to configure Grafana                                                                                      | `{}`                             |
+| `imageRenderer.affinity`                                 | Affinity for pod assignment                                                                                                               | `{}`                             |
+| `imageRenderer.resources.limits`                         | The resources limits for Grafana containers                                                                                               | `{}`                             |
+| `imageRenderer.resources.requests`                       | The requested resources for Grafana containers                                                                                            | `{}`                             |
+| `imageRenderer.podSecurityContext.enabled`               | Enable securityContext on for Grafana Image Renderer deployment                                                                           | `true`                           |
+| `imageRenderer.podSecurityContext.fsGroup`               | Group to configure permissions for volumes                                                                                                | `1001`                           |
+| `imageRenderer.podSecurityContext.runAsUser`             | User for the security context                                                                                                             | `1001`                           |
+| `imageRenderer.podSecurityContext.runAsNonRoot`          | Run containers as non-root users                                                                                                          | `true`                           |
+| `imageRenderer.containerSecurityContext.enabled`         | Enabled Grafana Image Renderer containers' Security Context                                                                               | `true`                           |
+| `imageRenderer.containerSecurityContext.runAsUser`       | Set Grafana Image Renderer containers' Security Context runAsUser                                                                         | `1001`                           |
+| `imageRenderer.service.type`                             | Kubernetes Service type                                                                                                                   | `ClusterIP`                      |
+| `imageRenderer.service.clusterIP`                        | Grafana service Cluster IP                                                                                                                | `""`                             |
+| `imageRenderer.service.ports.imageRenderer`              | Grafana Image Renderer metrics port                                                                                                       | `8080`                           |
+| `imageRenderer.service.nodePorts.grafana`                | Specify the nodePort value for the LoadBalancer and NodePort service types                                                                | `""`                             |
+| `imageRenderer.service.loadBalancerIP`                   | loadBalancerIP if Grafana service type is `LoadBalancer` (optional, cloud specific)                                                       | `""`                             |
+| `imageRenderer.service.loadBalancerSourceRanges`         | loadBalancerSourceRanges if Grafana service type is `LoadBalancer` (optional, cloud specific)                                             | `[]`                             |
+| `imageRenderer.service.annotations`                      | Provide any additional annotations which may be required.                                                                                 | `{}`                             |
+| `imageRenderer.service.externalTrafficPolicy`            | Grafana service external traffic policy                                                                                                   | `Cluster`                        |
+| `imageRenderer.service.extraPorts`                       | Extra port to expose on Redmine service                                                                                                   | `[]`                             |
+| `imageRenderer.service.sessionAffinity`                  | Session Affinity for Kubernetes service, can be "None" or "ClientIP"                                                                      | `None`                           |
+| `imageRenderer.service.sessionAffinityConfig`            | Additional settings for the sessionAffinity                                                                                               | `{}`                             |
+| `imageRenderer.metrics.enabled`                          | Enable the export of Prometheus metrics                                                                                                   | `false`                          |
+| `imageRenderer.metrics.annotations`                      | Annotations for Prometheus metrics service[object] Prometheus annotations                                                                 | `{}`                             |
+| `imageRenderer.metrics.serviceMonitor.enabled`           | if `true`, creates a Prometheus Operator ServiceMonitor (also requires `metrics.enabled` to be `true`)                                    | `false`                          |
+| `imageRenderer.metrics.serviceMonitor.namespace`         | Namespace in which Prometheus is running                                                                                                  | `""`                             |
+| `imageRenderer.metrics.serviceMonitor.jobLabel`          | The name of the label on the target service to use as the job name in prometheus.                                                         | `""`                             |
+| `imageRenderer.metrics.serviceMonitor.interval`          | Interval at which metrics should be scraped.                                                                                              | `""`                             |
+| `imageRenderer.metrics.serviceMonitor.scrapeTimeout`     | Timeout after which the scrape is ended                                                                                                   | `""`                             |
+| `imageRenderer.metrics.serviceMonitor.relabelings`       | RelabelConfigs to apply to samples before scraping                                                                                        | `[]`                             |
+| `imageRenderer.metrics.serviceMonitor.metricRelabelings` | MetricRelabelConfigs to apply to samples before ingestion                                                                                 | `[]`                             |
+| `imageRenderer.metrics.serviceMonitor.selector`          | ServiceMonitor selector labels                                                                                                            | `{}`                             |
+| `imageRenderer.metrics.serviceMonitor.labels`            | Extra labels for the ServiceMonitor                                                                                                       | `{}`                             |
+| `imageRenderer.metrics.serviceMonitor.honorLabels`       | honorLabels chooses the metric's labels on collisions with target labels                                                                  | `false`                          |
+| `imageRenderer.metrics.prometheusRule.enabled`           | if `true`, creates a Prometheus Operator PrometheusRule (also requires `metrics.enabled` to be `true` and `metrics.prometheusRule.rules`) | `false`                          |
+| `imageRenderer.metrics.prometheusRule.namespace`         | Namespace for the PrometheusRule Resource (defaults to the Release Namespace)                                                             | `""`                             |
+| `imageRenderer.metrics.prometheusRule.additionalLabels`  | Additional labels that can be used so PrometheusRule will be discovered by Prometheus                                                     | `{}`                             |
+| `imageRenderer.metrics.prometheusRule.rules`             | Prometheus Rule definitions                                                                                                               | `[]`                             |
+| `imageRenderer.initContainers`                           | Add additional init containers to the Grafana Image Renderer pod(s)                                                                       | `[]`                             |
+| `imageRenderer.sidecars`                                 | Add additional sidecar containers to the Grafana Image Renderer pod(s)                                                                    | `[]`                             |
+| `imageRenderer.extraEnvVarsCM`                           | Name of existing ConfigMap containing extra env vars for Grafana Image Renderer nodes                                                     | `""`                             |
+| `imageRenderer.extraEnvVarsSecret`                       | Name of existing Secret containing extra env vars for Grafana Image Renderer nodes                                                        | `""`                             |
+| `imageRenderer.extraVolumes`                             | Optionally specify extra list of additional volumes for the Grafana Image Renderer pod(s)                                                 | `[]`                             |
+| `imageRenderer.extraVolumeMounts`                        | Optionally specify extra list of additional volumeMounts for the Grafana Image Renderer container(s)                                      | `[]`                             |
+| `imageRenderer.command`                                  | Override default container command (useful when using custom images)                                                                      | `[]`                             |
+| `imageRenderer.args`                                     | Override default container args (useful when using custom images)                                                                         | `[]`                             |
+| `imageRenderer.lifecycleHooks`                           | for the Grafana Image Renderer container(s) to automate configuration before or after startup                                             | `{}`                             |
+
+
+### Volume permissions init Container Parameters
+
+| Name                                                   | Description                                                                                                   | Value                   |
+| ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------- | ----------------------- |
+| `volumePermissions.enabled`                            | Enable init container that changes the owner/group of the PV mount point to `runAsUser:fsGroup`               | `false`                 |
+| `volumePermissions.image.registry`                     | Bitnami Shell image registry                                                                                  | `docker.io`             |
+| `volumePermissions.image.repository`                   | Bitnami Shell image repository                                                                                | `drycc/drycc-shell` |
+| `volumePermissions.image.tag`                          | Bitnami Shell image tag (immutable tags are recommended)                                                      | `11-debian-11-r38`      |
+| `volumePermissions.image.digest`                       | Bitnami Shell image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag | `""`                    |
+| `volumePermissions.image.pullPolicy`                   | Bitnami Shell image pull policy                                                                               | `IfNotPresent`          |
+| `volumePermissions.image.pullSecrets`                  | Bitnami Shell image pull secrets                                                                              | `[]`                    |
+| `volumePermissions.resources.limits`                   | The resources limits for the init container                                                                   | `{}`                    |
+| `volumePermissions.resources.requests`                 | The requested resources for the init container                                                                | `{}`                    |
+| `volumePermissions.containerSecurityContext.runAsUser` | Set init container's Security Context runAsUser                                                               | `0`                     |
+
+
+### Diagnostic Mode Parameters
+
+| Name                     | Description                                                                             | Value          |
+| ------------------------ | --------------------------------------------------------------------------------------- | -------------- |
+| `diagnosticMode.enabled` | Enable diagnostic mode (all probes will be disabled and the command will be overridden) | `false`        |
+| `diagnosticMode.command` | Command to override all containers in the deployment                                    | `["sleep"]`    |
+| `diagnosticMode.args`    | Args to override all containers in the deployment                                       | `["infinity"]` |
+
+
+Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example,
+
+```console
+$ helm install my-release \
+  --set admin.user=admin-user my-repo/grafana
+```
+
+The above command sets the Grafana admin user to `admin-user`.
+
+> NOTE: Once this chart is deployed, it is not possible to change the application's access credentials, such as usernames or passwords, using Helm. To change these application credentials after deployment, delete any persistent volumes (PVs) used by the chart and re-deploy it, or use the application's built-in administrative tools if available.
+
+Alternatively, a YAML file that specifies the values for the parameters can be provided while installing the chart. For example,
+
+```console
+$ helm install my-release -f values.yaml my-repo/grafana
+```
+
+> **Tip**: You can use the default [values.yaml](values.yaml)
+
+## Configuration and installation details
+
+### [Rolling VS Immutable tags](https://docs.drycc.com/containers/how-to/understand-rolling-tags-containers/)
+
+It is strongly recommended to use immutable tags in a production environment. This ensures your deployment does not change automatically if the same tag is updated with a different image.
+
+Bitnami will release a new chart updating its containers if a new version of the main container, significant changes, or critical vulnerabilities exist.
+
+### Using custom configuration
+
+Grafana supports multiples configuration files. Using kubernetes you can mount a file using a ConfigMap or a Secret. For example, to mount a custom `grafana.ini` file or `custom.ini` file you can create a ConfigMap like the following:
+
+```yaml
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: myconfig
+data:
+  grafana.ini: |-
+    # Raw text of the file
+```
+
+And now you need to pass the ConfigMap name, to the corresponding parameters: `config.useGrafanaIniFile=true` and `config.grafanaIniConfigMap=myconfig`.
+
+To provide dashboards on deployment time, Grafana needs a dashboards provider and the dashboards themselves.
+A default provider is created if enabled, or you can mount your own provider using a ConfigMap, but have in mind that the path to the dashboard folder must be `/opt/drycc/grafana/dashboards`.
+  1. To create a dashboard, it is needed to have a datasource for it. The datasources must be created mounting a secret with all the datasource files in it. In this case, it is not a ConfigMap because the datasource could contain sensitive information.
+  2. To load the dashboards themselves you need to create a ConfigMap for each one containing the `json` file that defines the dashboard and set the array with the ConfigMap names into the `dashboardsConfigMaps` parameter.
+Note the difference between the datasources and the dashboards creation. For the datasources we can use just one secret with all of the files, while for the dashboards we need one ConfigMap per file.
+
+For example, create the dashboard ConfigMap(s) and datasource Secret as described below:
+
+```console
+$ kubectl create secret generic datasource-secret --from-file=datasource-secret.yaml
+$ kubectl create configmap my-dashboard-1 --from-file=my-dashboard-1.json
+$ kubectl create configmap my-dashboard-2 --from-file=my-dashboard-2.json
+```
+
+> Note: the commands above assume you had previously exported your dashboards in the JSON files: *my-dashboard-1.json* and *my-dashboard-2.json*
+
+> Note: the commands above assume you had previously created a datasource config file *datasource-secret.yaml*. Find an example at https://grafana.com/docs/grafana/latest/administration/provisioning/#example-datasource-config-file
+
+Once you have them, use the following parameters to deploy Grafana with 2 custom dashboards:
+
+```console
+dashboardsProvider.enabled=true
+datasources.secretName=datasource-secret
+dashboardsConfigMaps[0].configMapName=my-dashboard-1
+dashboardsConfigMaps[0].fileName=my-dashboard-1.json
+dashboardsConfigMaps[1].configMapName=my-dashboard-2
+dashboardsConfigMaps[1].fileName=my-dashboard-2.json
+```
+
+More info at [Grafana documentation](https://grafana.com/docs/grafana/latest/administration/provisioning/#dashboards).
+
+### LDAP configuration
+
+To enable LDAP authentication it is necessary to provide a ConfigMap with the Grafana LDAP configuration file. For instance:
+
+**configmap.yaml**:
+
+```yaml
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: ldap-config
+data:
+  ldap.toml: |-
+      [[servers]]
+      # Ldap server host (specify multiple hosts space separated)
+      host = "ldap"
+      # Default port is 389 or 636 if use_ssl = true
+      port = 389
+      # Set to true if ldap server supports TLS
+      use_ssl = false
+      # Set to true if connect ldap server with STARTTLS pattern (create connection in insecure, then upgrade to secure connection with TLS)
+      start_tls = false
+      # set to true if you want to skip ssl cert validation
+      ssl_skip_verify = false
+      # set to the path to your root CA certificate or leave unset to use system defaults
+      # root_ca_cert = "/path/to/certificate.crt"
+      # Authentication against LDAP servers requiring client certificates
+      # client_cert = "/path/to/client.crt"
+      # client_key = "/path/to/client.key"
+
+      # Search user bind dn
+      bind_dn = "cn=admin,dc=example,dc=org"
+      # Search user bind password
+      # If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;"""
+      bind_password = 'admin'
+
+      # User search filter, for example "(cn=%s)" or "(sAMAccountName=%s)" or "(uid=%s)"
+      # Allow login from email or username, example "(|(sAMAccountName=%s)(userPrincipalName=%s))"
+      search_filter = "(uid=%s)"
+
+      # An array of base dns to search through
+      search_base_dns = ["ou=People,dc=support,dc=example,dc=org"]
+
+      # group_search_filter = "(&(objectClass=posixGroup)(memberUid=%s))"
+      # group_search_filter_user_attribute = "distinguishedName"
+      # group_search_base_dns = ["ou=groups,dc=grafana,dc=org"]
+
+      # Specify names of the ldap attributes your ldap uses
+      [servers.attributes]
+      name = "givenName"
+      surname = "sn"
+      username = "cn"
+      member_of = "memberOf"
+      email =  "email"
+```
+
+Create the ConfigMap into the cluster and deploy the Grafana Helm Chart using the existing ConfigMap and the following parameters:
+
+```console
+ldap.enabled=true
+ldap.configMapName=ldap-config
+ldap.allowSignUp=true
+```
+
+### Supporting HA (High Availability)
+
+To support HA Grafana just need an external database where store dashboards, users and other persistent data.
+To configure the external database provide a configuration file containing the [database section](https://grafana.com/docs/installation/configuration/#database)
+
+More information about Grafana HA [here](https://grafana.com/docs/tutorials/ha_setup/)
+
+### Setting Pod's affinity
+
+This chart allows you to set your custom affinity using the `affinity` parameter. Find more information about Pod's affinity in the [kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity).
+
+As an alternative, you can use of the preset configurations for pod affinity, pod anti-affinity, and node affinity available at the [drycc/common](https://github.com/drycc/charts/tree/master/drycc/common#affinities) chart. To do so, set the `podAffinityPreset`, `podAntiAffinityPreset`, or `nodeAffinityPreset` parameters.
+
+## Persistence
+
+The [Bitnami Grafana](https://github.com/drycc/containers/tree/main/drycc/grafana) image stores the Grafana data and configurations at the `/opt/drycc/grafana/data` path of the container.
+
+Persistent Volume Claims are used to keep the data across deployments. This is known to work in GCE, AWS, and minikube.
+See the [Parameters](#parameters) section to configure the PVC or to disable persistence.
+
+## Troubleshooting
+
+Find more information about how to deal with common errors related to Bitnami's Helm charts in [this troubleshooting guide](https://docs.drycc.com/general/how-to/troubleshoot-helm-chart-issues).
+
+## Upgrading
+
+### To 8.0.0
+
+This major release only bumps the Grafana version to 9.x. No major issues are expected during the upgrade. See the upstream changelog https://grafana.com/docs/grafana/latest/release-notes/release-notes-9-0-0/ for more info about the changes included in this new major version of the application
+
+### To 7.0.0
+
+This major release renames several values in this chart and adds missing features, in order to be inline with the rest of assets in the Bitnami charts repository.
+
+Since the volume access mode when persistence is enabled is `ReadWriteOnce` in order to upgrade the deployment you will need to either use the `Recreate` strategy or delete the old deployment.
+
+```console
+kubectl delete deployment <deployment-name>
+helm upgrade <release-name> my-repo/grafana
+```
+
+### To 4.1.0
+
+This version also introduces `drycc/common`, a [library chart](https://helm.sh/docs/topics/library_charts/#helm) as a dependency. More documentation about this new utility could be found [here](https://github.com/drycc/charts/tree/master/drycc/common#drycc-common-library-chart). Please, make sure that you have updated the chart dependencies before executing any upgrade.
+
+### To 4.0.0
+
+[On November 13, 2020, Helm v2 support was formally finished](https://github.com/helm/charts#status-of-the-project), this major version is the result of the required changes applied to the Helm Chart to be able to incorporate the different features added in Helm v3 and to be consistent with the Helm project itself regarding the Helm v2 EOL.
+
+**What changes were introduced in this major version?**
+
+- Previous versions of this Helm Chart use `apiVersion: v1` (installable by both Helm 2 and 3), this Helm Chart was updated to `apiVersion: v2` (installable by Helm 3 only). [Here](https://helm.sh/docs/topics/charts/#the-apiversion-field) you can find more information about the `apiVersion` field.
+- The different fields present in the *Chart.yaml* file has been ordered alphabetically in a homogeneous way for all the Bitnami Helm Charts
+
+**Considerations when upgrading to this version**
+
+- If you want to upgrade to this version from a previous one installed with Helm v3, you shouldn't face any issues
+- If you want to upgrade to this version using Helm v2, this scenario is not supported as this version doesn't support Helm v2 anymore
+- If you installed the previous version with Helm v2 and wants to upgrade to this version with Helm v3, please refer to the [official Helm documentation](https://helm.sh/docs/topics/v2_v3_migration/#migration-use-cases) about migrating from Helm v2 to v3
+
+**Useful links**
+
+- https://docs.drycc.com/tutorials/resolve-helm2-helm3-post-migration-issues/
+- https://helm.sh/docs/topics/v2_v3_migration/
+- https://helm.sh/blog/migrate-from-helm-v2-to-helm-v3/
+
+### To 3.0.0
+
+Deployment label selector is immutable after it gets created, so you cannot "upgrade".
+
+In https://github.com/drycc/charts/pull/2773 the deployment label selectors of the resources were updated to add the component name. Resulting in compatibility breakage.
+
+In order to "upgrade" from a previous version, you will need to [uninstall](#uninstalling-the-chart) the existing chart manually.
+
+This major version signifies this change.
+
+## License
+
+Copyright &copy; 2022 Bitnami
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
\ No newline at end of file
diff --git a/addons/grafana/10/chart/grafana/Chart.yaml b/addons/grafana/10/chart/grafana/Chart.yaml
new file mode 100644
index 00000000..250b38d0
--- /dev/null
+++ b/addons/grafana/10/chart/grafana/Chart.yaml
@@ -0,0 +1,27 @@
+annotations:
+  category: Analytics
+apiVersion: v2
+appVersion: 9.1.7
+dependencies:
+  - name: common
+    repository: oci://registry.drycc.cc/charts
+    tags:
+      - drycc-common
+    version: ~1.1.2
+description: Grafana is an open source metric analytics and visualization suite for visualizing time series data that supports various types of data sources.
+engine: gotpl
+home: https://github.com/drycc/charts/tree/master/drycc/grafana
+icon: https://drycc.com/assets/stacks/grafana/img/grafana-stack-220x234.png
+keywords:
+  - analytics
+  - monitoring
+  - metrics
+  - logs
+maintainers:
+  - name: Bitnami
+    url: https://github.com/drycc/charts
+name: grafana
+sources:
+  - https://github.com/drycc/containers/tree/main/drycc/grafana
+  - https://grafana.com/
+version: 8.2.11
diff --git a/addons/grafana/10/chart/grafana/create-instance-schema.json b/addons/grafana/10/chart/grafana/create-instance-schema.json
new file mode 100644
index 00000000..66ebbaa0
--- /dev/null
+++ b/addons/grafana/10/chart/grafana/create-instance-schema.json
@@ -0,0 +1,12 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "imagePullPolicy": {
+      "type": "string",
+      "enum": ["Always", "IfNotPresent", "Never"],
+      "default": "IfNotPresent",
+      "title": "Image pull policy"
+    }
+  }
+}
\ No newline at end of file
diff --git a/addons/grafana/10/chart/grafana/templates/NOTES.txt b/addons/grafana/10/chart/grafana/templates/NOTES.txt
new file mode 100644
index 00000000..97a0ba1e
--- /dev/null
+++ b/addons/grafana/10/chart/grafana/templates/NOTES.txt
@@ -0,0 +1,34 @@
+CHART NAME: {{ .Chart.Name }}
+CHART VERSION: {{ .Chart.Version }}
+APP VERSION: {{ .Chart.AppVersion }}
+
+** Please be patient while the chart is being deployed **
+
+1. Get the application URL by running these commands:
+
+{{- if .Values.ingress.enabled }}
+    {{ ternary "https" "http" .Values.ingress.tls }}://{{ .Values.ingress.hostname }}{{ .Values.ingress.path }}
+{{- else if contains "NodePort" .Values.service.type }}
+    export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "common.names.fullname" . }})
+    export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
+    echo http://$NODE_IP:$NODE_PORT
+{{- else if contains "LoadBalancer" .Values.service.type }}
+     NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+           You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "common.names.fullname" . }}'
+    export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "common.names.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
+    echo http://$SERVICE_IP:{{ .Values.service.ports.grafana }}
+{{- else if contains "ClusterIP" .Values.service.type }}
+    echo "Browse to http://127.0.0.1:8080"
+    kubectl port-forward svc/{{ include "common.names.fullname" . }} 8080:{{ .Values.service.ports.grafana }} &
+{{- end }}
+
+2. Get the admin credentials:
+
+    echo "User: {{ .Values.admin.user }}"
+    echo "Password: $(kubectl get secret {{ include "grafana.adminSecretName" . }} --namespace {{ .Release.Namespace }} -o jsonpath="{.data.{{ include "grafana.adminSecretPasswordKey" . }}}" | base64 -d)"
+
+{{- include "common.warnings.rollingTag" .Values.image }}
+{{- include "common.warnings.rollingTag" .Values.imageRenderer.image }}
+{{- include "common.warnings.rollingTag" .Values.volumePermissions.image }}
+{{ include "grafana.validateValues" . }}
+{{ include "grafana.validateValues.database" . }}
diff --git a/addons/grafana/10/chart/grafana/templates/_helpers.tpl b/addons/grafana/10/chart/grafana/templates/_helpers.tpl
new file mode 100644
index 00000000..011ba817
--- /dev/null
+++ b/addons/grafana/10/chart/grafana/templates/_helpers.tpl
@@ -0,0 +1,236 @@
+{{/* vim: set filetype=mustache: */}}
+
+{{/*
+Return the proper Grafana image name
+*/}}
+{{- define "grafana.image" -}}
+{{- include "common.images.image" (dict "imageRoot" .Values.image "global" .Values.global) -}}
+{{- end -}}
+
+{{/*
+Return the proper Grafana Image Renderer image name
+*/}}
+{{- define "grafana.imageRenderer.image" -}}
+{{- include "common.images.image" (dict "imageRoot" .Values.imageRenderer.image "global" .Values.global) -}}
+{{- end -}}
+
+{{/*
+Return the proper image name (for the init container volume-permissions image)
+*/}}
+{{- define "volumePermissions.image" -}}
+{{- include "common.images.image" ( dict "imageRoot" .Values.volumePermissions.image "global" .Values.global ) -}}
+{{- end -}}
+
+{{/*
+Return the proper Docker Image Registry Secret Names
+*/}}
+{{- define "grafana.imagePullSecrets" -}}
+{{- include "common.images.pullSecrets" (dict "images" (list .Values.image .Values.imageRenderer.image) "global" .Values.global) -}}
+{{- end }}
+
+{{/*
+Return  the proper Storage Class
+*/}}
+{{- define "grafana.storageClass" -}}
+{{- include "common.storage.class" (dict "persistence" .Values.persistence "global" .Values.global) -}}
+{{- end -}}
+
+{{/*
+Return the Grafana admin credentials secret
+*/}}
+{{- define "grafana.adminSecretName" -}}
+{{- if .Values.admin.existingSecret -}}
+    {{- printf "%s" (tpl .Values.admin.existingSecret $) -}}
+{{- else -}}
+    {{- printf "%s-admin" (include "common.names.fullname" .) -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Return the Grafana admin password key
+*/}}
+{{- define "grafana.adminSecretPasswordKey" -}}
+{{- if and .Values.admin.existingSecret .Values.admin.existingSecretPasswordKey -}}
+    {{- printf "%s" (tpl .Values.admin.existingSecretPasswordKey $) -}}
+{{- else -}}
+    {{- printf "GF_SECURITY_ADMIN_PASSWORD" -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Return true if a secret object should be created
+*/}}
+{{- define "grafana.createAdminSecret" -}}
+{{- if not .Values.admin.existingSecret }}
+    {{- true -}}
+{{- else -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Return the Grafana SMTP credentials secret
+*/}}
+{{- define "grafana.smtpSecretName" -}}
+{{- if .Values.smtp.existingSecret }}
+    {{- printf "%s" (tpl .Values.smtp.existingSecret $) -}}
+{{- else -}}
+    {{- printf "%s-smtp" (include "common.names.fullname" .) -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Return the Grafana SMTP user key
+*/}}
+{{- define "grafana.smtpSecretUserKey" -}}
+{{- if and .Values.smtp.existingSecret .Values.smtp.existingSecretUserKey -}}
+    {{- printf "%s" (tpl .Values.smtp.existingSecretUserKey $) -}}
+{{- else -}}
+    {{- printf "GF_SMTP_USER" -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Return the Grafana SMTP password key
+*/}}
+{{- define "grafana.smtpSecretPasswordKey" -}}
+{{- if and .Values.smtp.existingSecret .Values.smtp.existingSecretPasswordKey -}}
+    {{- printf "%s" (tpl .Values.smtp.existingSecretPasswordKey $) -}}
+{{- else -}}
+    {{- printf "GF_SMTP_PASSWORD" -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Return true if a secret object should be created
+*/}}
+{{- define "grafana.createSMTPSecret" -}}
+{{- if and .Values.smtp.enabled (not .Values.smtp.existingSecret) }}
+    {{- true -}}
+{{- else -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Returns the proper service account name depending if an explicit service account name is set
+in the values file. If the name is not set it will default to either common.names.fullname if serviceAccount.create
+is true or default otherwise.
+*/}}
+{{- define "grafana.serviceAccountName" -}}
+    {{- if .Values.serviceAccount.create -}}
+        {{ default (include "common.names.fullname" .) .Values.serviceAccount.name }}
+    {{- else -}}
+        {{ default "default" .Values.serviceAccount.name }}
+    {{- end -}}
+{{- end -}}
+
+{{/*
+Validate values for Grafana.
+*/}}
+{{- define "grafana.validateValues" -}}
+{{- $messages := list -}}
+{{- $messages := append $messages (include "grafana.validateValues.configmapsOrSecrets" .) -}}
+{{- $messages := append $messages (include "grafana.validateValues.ldap.configuration" .) -}}
+{{- $messages := append $messages (include "grafana.validateValues.ldap.configmapsecret" .) -}}
+{{- $messages := append $messages (include "grafana.validateValues.ldap.tls" .) -}}
+{{- $messages := without $messages "" -}}
+{{- $message := join "\n" $messages -}}
+
+{{- if $message -}}
+{{-   printf "\nVALUES VALIDATION:\n%s" $message | fail -}}
+{{- end -}}
+{{- end -}}
+
+{{/* Validate values of Grafana - A ConfigMap or Secret name must be provided when loading a custom grafana.ini file */}}
+{{- define "grafana.validateValues.configmapsOrSecrets" -}}
+{{- if and .Values.config.useGrafanaIniFile (not .Values.config.grafanaIniSecret) (not .Values.config.grafanaIniConfigMap) -}}
+grafana: config.useGrafanaIniFile config.grafanaIniSecret and config.grafanaIniConfigMap
+        You enabled config.useGrafanaIniFile but did not specify config.grafanaIniSecret nor config.grafanaIniConfigMap
+{{- end -}}
+{{- end -}}
+
+{{/* Validate values of Grafana - A custom ldap.toml file must be provided when enabling LDAP */}}
+{{- define "grafana.validateValues.ldap.configuration" -}}
+{{- if and .Values.ldap.enabled (empty .Values.ldap.uri) (empty .Values.ldap.basedn) (empty .Values.ldap.configuration) (empty .Values.ldap.configMapName) (empty .Values.ldap.secretName) -}}
+grafana: ldap.enabled ldap.uri ldap.basedn ldap.configuration ldap.configMapName and ldap.secretName
+        You must provide the uri and basedn of your LDAP Sever (--set ldap.uri="aaa" --set ldap.basedn="bbb")
+        or the  content of your custom ldap.toml file when enabling LDAP (--set ldap.configuration="xxx")
+        As an alternative, you can set the name of an existing ConfigMap (--set ldap.configMapName="yyy") or
+        an an existing Secret (--set ldap.secretName="zzz") containging the custom ldap.toml file.
+{{- end -}}
+{{- end -}}
+
+{{/* Validate values of Grafana - Only a ConfigMap or Secret name must be provided when loading a custom ldap.toml file */}}
+{{- define "grafana.validateValues.ldap.configmapsecret" -}}
+{{- if and .Values.ldap.enabled (not (empty .Values.ldap.configMapName)) (not (empty .Values.ldap.secretName)) -}}
+grafana: ldap.enabled ldap.configMapName and ldap.secretName
+        You cannot load a custom ldap.toml file both from a ConfigMap and a Secret simultaneously
+{{- end -}}
+{{- end -}}
+
+{{/* Validate values of Grafana - LDAP TLS validation */}}
+{{- define "grafana.validateValues.ldap.tls" -}}
+{{- if and .Values.ldap.enabled .Values.ldap.tls.enabled (empty .Values.ldap.tls.certificatesSecret) (or (not (empty .Values.ldap.tls.CAFilename)) (not (empty .Values.ldap.tls.certFilename)) (not (empty .Values.ldap.tls.certKeyFilename))) -}}
+grafana: ldap.enabled ldap.tls.enabled ldap.tls.certificatesSecret ldap.tls.CAFilename ldap.tls.certFilename and ldap.tls.certKeyFilename
+        You must set ldap.tls.certificatesSecret if you want to specify any certificate for LDAP TLS connection
+{{- end -}}
+{{- end -}}
+
+{{/*
+Return LDAP configuration generated from ldap properties.
+*/}}
+{{- define "grafana.ldap.config" -}}
+{{- $hostPort := get (urlParse (required "You must set ldap.uri" .Values.ldap.uri)) "host" -}}
+[[servers]]
+# Ldap server host (specify multiple hosts space separated)
+host = {{ index (splitList ":" $hostPort) 0 | quote }}
+# Default port is 389 or 636 if use_ssl = true
+port = {{ index (splitList ":" $hostPort) 1 | default 389 }}
+# Set to true if LDAP server should use an encrypted TLS connection (either with STARTTLS or LDAPS)
+{{- if .Values.ldap.tls.enabled }}
+use_ssl = {{ .Values.ldap.tls.enabled }}
+ssl_skip_verify = {{ .Values.ldap.tls.skipVerify }}
+# If set to true, use LDAP with STARTTLS instead of LDAPS
+start_tls = {{ .Values.ldap.tls.startTls }}
+{{- if .Values.ldap.tls.CAFilename }}
+# set to the path to your root CA certificate or leave unset to use system defaults
+root_ca_cert = {{ printf "%s/%s" .Values.ldap.tls.certificatesMountPath .Values.ldap.tls.CAFilename | quote }}
+{{- end }}
+{{- if .Values.ldap.tls.certFilename }}
+# Authentication against LDAP servers requiring client certificates
+client_cert = {{ printf "%s/%s" .Values.ldap.tls.certificatesMountPath .Values.ldap.tls.certFilename | quote }}
+client_key = {{ printf "%s/%s" .Values.ldap.tls.certificatesMountPath (required "ldap.tls.certKeyFilename is required when ldap.tls.certFilename is defined" .Values.ldap.tls.certKeyFilename) | quote }}
+{{- end }}
+{{- end }}
+{{- if .Values.ldap.binddn }}
+# Search user bind dn
+bind_dn = {{ .Values.ldap.binddn | quote }}
+{{- end }}
+{{- if .Values.ldap.bindpw }}
+# Search user bind password
+# If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;"""
+bind_password = {{ .Values.ldap.bindpw | quote }}
+{{- end }}
+
+# User search filter, for example "(cn=%s)" or "(sAMAccountName=%s)" or "(uid=%s)"
+# Allow login from email or username, example "(|(sAMAccountName=%s)(userPrincipalName=%s))"
+{{- if .Values.ldap.searchFilter }}
+search_filter = {{ .Values.ldap.searchFilter | quote }}
+{{- else if .Values.ldap.searchAttribute }}
+search_filter = "({{ .Values.ldap.searchAttribute }}=%s)"
+{{- end }}
+# An array of base dns to search through
+search_base_dns = [{{ (required "You must set ldap.basedn" .Values.ldap.basedn) | quote }}]
+
+{{ .Values.ldap.extraConfiguration }}
+{{- end -}}
+
+{{/* Validate values of Grafana - Requirements to use an external database */}}
+{{- define "grafana.validateValues.database" -}}
+{{- $replicaCount := int .Values.grafana.replicaCount }}
+{{- if gt $replicaCount 1 -}}
+grafana: replicaCount
+        Using more than one replica requires using an external database to share data between Grafana instances.
+        By default Grafana uses an internal sqlite3 per instance but you can configure an external MySQL or PostgreSQL.
+        Please, ensure you provide a configuration file configuring the external database to share data between replicas.
+{{- end -}}
+{{- end -}}
diff --git a/addons/grafana/10/chart/grafana/templates/configmap.yaml b/addons/grafana/10/chart/grafana/templates/configmap.yaml
new file mode 100644
index 00000000..1d5393ce
--- /dev/null
+++ b/addons/grafana/10/chart/grafana/templates/configmap.yaml
@@ -0,0 +1,34 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: {{ include "common.names.fullname" . }}-envvars
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+    app.kubernetes.io/component: grafana
+  {{- if .Values.commonAnnotations }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+data:
+  GF_SECURITY_ADMIN_USER: {{ .Values.admin.user | quote }}
+  {{- if .Values.imageRenderer.enabled }}
+  {{- $domain := .Values.clusterDomain }}
+  {{- $namespace := .Release.Namespace }}
+  GF_RENDERING_SERVER_URL: "http://{{ include "common.names.fullname" . }}-image-renderer.{{ $namespace }}.svc.{{ $domain }}:{{ .Values.imageRenderer.service.ports.imageRenderer }}/render"
+  GF_RENDERING_CALLBACK_URL: "http://{{ include "common.names.fullname" . }}.{{ $namespace }}.svc.{{ $domain }}:{{ .Values.service.ports.grafana }}/"
+  {{- end }}
+  {{- if .Values.plugins }}
+  GF_INSTALL_PLUGINS: {{ .Values.plugins | quote }}
+  {{- else }}
+  GF_INSTALL_PLUGINS: ""
+  {{- end }}
+  GF_PATHS_PLUGINS: "/opt/drycc/grafana/data/plugins"
+  GF_AUTH_LDAP_ENABLED: {{ .Values.ldap.enabled | quote }}
+  GF_AUTH_LDAP_CONFIG_FILE: "/opt/drycc/grafana/conf/ldap.toml"
+  GF_AUTH_LDAP_ALLOW_SIGN_UP: {{ .Values.ldap.allowSignUp | quote }}
+  GF_PATHS_PROVISIONING: "/opt/drycc/grafana/conf/provisioning"
+  GF_PATHS_CONFIG: "/opt/drycc/grafana/conf/grafana.ini"
+  GF_PATHS_DATA: "/opt/drycc/grafana/data"
+  GF_PATHS_LOGS: "/opt/drycc/grafana/logs"
diff --git a/addons/grafana/10/chart/grafana/templates/dashboard-provider.yaml b/addons/grafana/10/chart/grafana/templates/dashboard-provider.yaml
new file mode 100644
index 00000000..9eb36063
--- /dev/null
+++ b/addons/grafana/10/chart/grafana/templates/dashboard-provider.yaml
@@ -0,0 +1,41 @@
+{{- if and .Values.dashboardsProvider.enabled (not .Values.dashboardsProvider.configMapName) }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: {{ include "common.names.fullname" . }}-provider
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+    app.kubernetes.io/component: grafana
+  {{- if .Values.commonAnnotations }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+data:
+  default-provider.yaml: |-
+    apiVersion: 1
+
+    providers:
+      # <string> an unique provider name
+    - name: 'default-provider'
+      # <int> org id. will default to orgId 1 if not specified
+      orgId: 1
+      # <string, required> name of the dashboard folder. Required
+      folder: dashboards
+      # <string> folder UID. will be automatically generated if not specified
+      folderUid: ''
+      # <string, required> provider type. Required
+      type: file
+      # <bool> disable dashboard deletion
+      disableDeletion: false
+      # <bool> enable dashboard editing
+      editable: true
+      # <int> how often Grafana will scan for changed dashboards
+      updateIntervalSeconds: 10
+      options:
+        # <string, required> path to dashboard files on disk. Required
+        path: /opt/drycc/grafana/dashboards
+        # <bool> enable folders creation for dashboards
+        #foldersFromFilesStructure: true
+{{- end }}
diff --git a/addons/grafana/10/chart/grafana/templates/datasources-secret.yaml b/addons/grafana/10/chart/grafana/templates/datasources-secret.yaml
new file mode 100644
index 00000000..0b29e264
--- /dev/null
+++ b/addons/grafana/10/chart/grafana/templates/datasources-secret.yaml
@@ -0,0 +1,15 @@
+{{- if .Values.datasources.secretDefinition }}
+apiVersion: v1
+kind: Secret
+metadata:
+  name: {{ include "common.names.fullname" . }}-datasources
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+    app.kubernetes.io/component: grafana
+type: Opaque
+data:
+  datasources.yaml: {{ .Values.datasources.secretDefinition | toYaml | b64enc }}
+{{- end }}
diff --git a/addons/grafana/10/chart/grafana/templates/deployment.yaml b/addons/grafana/10/chart/grafana/templates/deployment.yaml
new file mode 100644
index 00000000..38426a73
--- /dev/null
+++ b/addons/grafana/10/chart/grafana/templates/deployment.yaml
@@ -0,0 +1,342 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: {{ include "common.names.fullname" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+    app.kubernetes.io/component: grafana
+  {{- if .Values.commonAnnotations }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+spec:
+  replicas: {{ .Values.grafana.replicaCount }}
+  selector:
+    matchLabels: {{- include "common.labels.matchLabels" . | nindent 6 }}
+      app.kubernetes.io/component: grafana
+  {{- if .Values.grafana.updateStrategy }}
+  strategy: {{ include "common.tplvalues.render" (dict "value" .Values.grafana.updateStrategy "context" $) | nindent 4 }}
+  {{- end }}
+  template:
+    metadata:
+      labels: {{- include "common.labels.standard" . | nindent 8 }}
+        app.kubernetes.io/component: grafana
+        {{- if .Values.grafana.podLabels }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.grafana.podLabels "context" $) | nindent 8 }}
+        {{- end }}
+      annotations:
+        {{- if (include "grafana.createAdminSecret" .) }}
+        checksum/secret: {{ include (print $.Template.BasePath "/secret.yaml") . | sha256sum }}
+        {{- end }}
+        {{- if (include "grafana.createSMTPSecret" .) }}
+        checksum/smtp-secret: {{ include (print $.Template.BasePath "/smtp-secret.yaml") . | sha256sum }}
+        {{- end }}
+        checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
+        checksum/dashboard-provider: {{ include (print $.Template.BasePath "/dashboard-provider.yaml") . | sha256sum }}
+        {{- if and .Values.ldap.enabled (or (not (empty .Values.ldap.configuration)) (not (empty .Values.ldap.uri))) (empty .Values.ldap.configMapName) (empty .Values.ldap.secretName) }}
+        checksum/ldap: {{ include (print $.Template.BasePath "/ldap-secret.yaml") . | sha256sum }}
+        {{- end }}
+        {{- if .Values.grafana.podAnnotations }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.grafana.podAnnotations "context" $) | nindent 8 }}
+        {{- end }}
+    spec:
+      {{- include "grafana.imagePullSecrets" . | nindent 6 }}
+      {{- if .Values.grafana.hostAliases }}
+      hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.grafana.hostAliases "context" $) | nindent 8 }}
+      {{- end }}
+      serviceAccountName: {{ include "grafana.serviceAccountName" . }}
+      {{- if .Values.grafana.schedulerName }}
+      schedulerName: {{ .Values.grafana.schedulerName | quote }}
+      {{- end }}
+      {{- if .Values.grafana.priorityClassName }}
+      priorityClassName: {{ .Values.grafana.priorityClassName | quote }}
+      {{- end }}
+      {{- if .Values.grafana.affinity }}
+      affinity: {{- include "common.tplvalues.render" (dict "value" .Values.grafana.affinity "context" $) | nindent 8 }}
+      {{- else }}
+      affinity:
+        podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.grafana.podAffinityPreset "component" "grafana" "context" $) | nindent 10 }}
+        podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.grafana.podAntiAffinityPreset "component" "grafana" "context" $) | nindent 10 }}
+        nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.grafana.nodeAffinityPreset.type "key" .Values.grafana.nodeAffinityPreset.key "values" .Values.grafana.nodeAffinityPreset.values) | nindent 10 }}
+      {{- end }}
+      {{- if .Values.grafana.nodeSelector }}
+      nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.grafana.nodeSelector "context" $) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.grafana.tolerations }}
+      tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.grafana.tolerations "context" $) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.grafana.topologySpreadConstraints }}
+      topologySpreadConstraints: {{- include "common.tplvalues.render" (dict "value" .Values.grafana.topologySpreadConstraints "context" $) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.grafana.podSecurityContext.enabled }}
+      securityContext: {{- omit .Values.grafana.podSecurityContext "enabled" | toYaml | nindent 8 }}
+      {{- end }}
+      {{- if .Values.grafana.terminationGracePeriodSeconds }}
+      terminationGracePeriodSeconds: {{ .Values.grafana.terminationGracePeriodSeconds }}
+      {{- end }}
+      initContainers:
+        {{- if .Values.volumePermissions.enabled }}
+        - name: volume-permissions
+          image: {{ include "volumePermissions.image" . }}
+          imagePullPolicy: {{ .Values.volumePermissions.image.pullPolicy | quote }}
+          command:
+            - /bin/bash
+          args:
+            - -ec
+            - |
+              mkdir -p /drycc/grafana
+              find /drycc/grafana -mindepth 1 -maxdepth 1 -not -name ".snapshot" -not -name "lost+found" | xargs -r chown -R {{ .Values.grafana.containerSecurityContext.runAsUser }}:{{ .Values.grafana.podSecurityContext.fsGroup }}
+          securityContext: {{- include "common.tplvalues.render" (dict "value" .Values.volumePermissions.containerSecurityContext "context" $) | nindent 12 }}
+          {{- if .Values.volumePermissions.resources }}
+          resources: {{- include "common.tplvalues.render" (dict "value" .Values.volumePermissions.resources "context" $) | nindent 12 }}
+          {{- end }}
+          volumeMounts:
+            - name: data
+              mountPath: /drycc/grafana
+        {{- end }}
+        {{- if .Values.grafana.initContainers }}
+          {{- include "common.tplvalues.render" (dict "value" .Values.grafana.initContainers "context" $) | nindent 8 }}
+        {{- end }}
+      containers:
+        - name: grafana
+          image: {{ include "grafana.image" . }}
+          imagePullPolicy: {{ .Values.image.pullPolicy }}
+          {{- if .Values.grafana.containerSecurityContext.enabled }}
+          securityContext: {{- omit .Values.grafana.containerSecurityContext "enabled" | toYaml | nindent 12 }}
+          {{- end }}
+          {{- if .Values.diagnosticMode.enabled }}
+          command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }}
+          {{- else if .Values.grafana.command }}
+          command: {{- include "common.tplvalues.render" (dict "value" .Values.grafana.command "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.diagnosticMode.enabled }}
+          args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }}
+          {{- else if .Values.grafana.args }}
+          args: {{- include "common.tplvalues.render" (dict "value" .Values.grafana.args "context" $) | nindent 12 }}
+          {{- end }}
+          envFrom:
+            - configMapRef:
+                name: {{ include "common.names.fullname" . }}-envvars
+            {{- if .Values.grafana.extraEnvVarsCM }}
+            - configMapRef:
+                name: {{ include "common.tplvalues.render" (dict "value" .Values.grafana.extraEnvVarsCM "context" $) }}
+            {{- end }}
+            {{- if .Values.grafana.extraEnvVarsSecret }}
+            - secretRef:
+                name: {{ include "common.tplvalues.render" (dict "value" .Values.grafana.extraEnvVarsSecret "context" $) }}
+            {{- end }}
+          env:
+            - name: GF_SECURITY_ADMIN_PASSWORD
+              valueFrom:
+                secretKeyRef:
+                  name: {{ include "grafana.adminSecretName" . }}
+                  key: {{ include "grafana.adminSecretPasswordKey" . }}
+            {{- if .Values.smtp.enabled }}
+            - name: GF_SMTP_ENABLED
+              value: "true"
+            {{- if .Values.smtp.host }}
+            - name: GF_SMTP_HOST
+              value: {{ .Values.smtp.host }}
+            {{- end }}
+            {{- if .Values.smtp.fromAddress }}
+            - name: GF_SMTP_FROM_ADDRESS
+              value: {{ .Values.smtp.fromAddress }}
+            {{- end }}
+            {{- if .Values.smtp.fromName }}
+            - name: GF_SMTP_FROM_NAME
+              value: {{ .Values.smtp.fromName }}
+            {{- end }}
+            {{- if .Values.smtp.skipVerify }}
+            - name: GF_SMTP_SKIP_VERIFY
+              value: "{{ .Values.smtp.skipVerify }}"
+            {{- end }}
+            - name: GF_SMTP_USER
+              valueFrom:
+                secretKeyRef:
+                  name: {{ include "grafana.smtpSecretName" . }}
+                  key: {{ include "grafana.smtpSecretUserKey" . }}
+            - name: GF_SMTP_PASSWORD
+              valueFrom:
+                secretKeyRef:
+                  name: {{ include "grafana.smtpSecretName" . }}
+                  key: {{ include "grafana.smtpSecretPasswordKey" . }}
+            {{- end }}
+            {{- if .Values.grafana.extraEnvVars }}
+            {{- include "common.tplvalues.render" (dict "value" .Values.grafana.extraEnvVars "context" $) | nindent 12 }}
+            {{- end }}
+          volumeMounts:
+            {{- if .Values.config.useGrafanaIniFile }}
+            - name: grafana-ini
+              mountPath: /opt/drycc/grafana/conf/grafana.ini
+              subPath: grafana.ini
+            {{- end }}
+            - name: data
+              mountPath: /opt/drycc/grafana/data
+            {{- if .Values.dashboardsProvider.enabled }}
+            - name: dashboards-provider
+              mountPath: /opt/drycc/grafana/conf/provisioning/dashboards
+            {{- end }}
+            {{- range .Values.dashboardsConfigMaps }}
+            - name: {{ .configMapName }}
+            {{- if .folderName }}
+              mountPath: /opt/drycc/grafana/dashboards/{{ .folderName }}/{{ .fileName }}
+            {{- else }}
+              mountPath: /opt/drycc/grafana/dashboards/{{ .fileName }}
+            {{- end }}
+              subPath: {{ .fileName }}
+            {{- end }}
+            {{- if or (.Values.datasources.secretName) (.Values.datasources.secretDefinition) }}
+            - name: datasources
+              mountPath: /opt/drycc/grafana/conf/provisioning/datasources
+            {{- end }}
+            {{- if .Values.notifiers.configMapName }}
+            - name: notifiers
+              mountPath: /opt/drycc/grafana/conf/provisioning/notifiers
+            {{- end }}
+            {{- if .Values.ldap.enabled }}
+            - name: ldap
+              mountPath: /opt/drycc/grafana/conf/ldap.toml
+              subPath: ldap.toml
+            {{- end }}
+            {{- if and .Values.ldap.tls.enabled .Values.ldap.tls.certificatesSecret }}
+            - name: ldap-tls
+              mountPath: {{ .Values.ldap.tls.certificatesMountPath }}
+            {{- end }}
+            {{- range .Values.grafana.extraConfigmaps }}
+            - name: {{ .name }}
+              mountPath: {{ .mountPath }}
+              subPath: {{ .subPath | default "" }}
+              readOnly: {{ .readOnly }}
+            {{- end }}
+            {{- if .Values.grafana.extraVolumeMounts }}
+            {{- include "common.tplvalues.render" (dict "value" .Values.grafana.extraVolumeMounts "context" $) | nindent 12 }}
+            {{- end }}
+          ports:
+            - name: dashboard
+              containerPort: {{ .Values.grafana.containerPorts.grafana }}
+              protocol: TCP
+          {{- if .Values.grafana.customLivenessProbe }}
+          livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.grafana.customLivenessProbe "context" $) | nindent 12 }}
+          {{- else if .Values.grafana.livenessProbe.enabled }}
+          livenessProbe:
+            httpGet:
+              path: {{ .Values.grafana.livenessProbe.path }}
+              port: dashboard
+              scheme: {{ .Values.grafana.livenessProbe.scheme }}
+            initialDelaySeconds: {{ .Values.grafana.livenessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.grafana.livenessProbe.periodSeconds }}
+            timeoutSeconds: {{ .Values.grafana.livenessProbe.timeoutSeconds }}
+            successThreshold: {{ .Values.grafana.livenessProbe.successThreshold }}
+            failureThreshold: {{ .Values.grafana.livenessProbe.failureThreshold }}
+          {{- end }}
+          {{- if .Values.grafana.customReadinessProbe }}
+          readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.grafana.customReadinessProbe "context" $) | nindent 12 }}
+          {{- else if .Values.grafana.readinessProbe.enabled }}
+          readinessProbe:
+            httpGet:
+              path: {{ .Values.grafana.readinessProbe.path }}
+              port: dashboard
+              scheme: {{ .Values.grafana.readinessProbe.scheme }}
+            initialDelaySeconds: {{ .Values.grafana.readinessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.grafana.readinessProbe.periodSeconds }}
+            timeoutSeconds: {{ .Values.grafana.readinessProbe.timeoutSeconds }}
+            successThreshold: {{ .Values.grafana.readinessProbe.successThreshold }}
+            failureThreshold: {{ .Values.grafana.readinessProbe.failureThreshold }}
+          {{- end }}
+          {{- if .Values.grafana.customStartupProbe }}
+          startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.grafana.customStartupProbe "context" $) | nindent 12 }}
+          {{- else if .Values.grafana.startupProbe.enabled }}
+          startupProbe:
+            httpGet:
+              path: {{ .Values.grafana.startupProbe.path }}
+              port: dashboard
+              scheme: {{ .Values.grafana.startupProbe.scheme }}
+            initialDelaySeconds: {{ .Values.grafana.startupProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.grafana.startupProbe.periodSeconds }}
+            timeoutSeconds: {{ .Values.grafana.startupProbe.timeoutSeconds }}
+            successThreshold: {{ .Values.grafana.startupProbe.successThreshold }}
+            failureThreshold: {{ .Values.grafana.startupProbe.failureThreshold }}
+          {{- end }}
+          {{- if .Values.grafana.lifecycleHooks }}
+          lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.grafana.lifecycleHooks "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.grafana.resources }}
+          resources: {{- include "common.tplvalues.render" (dict "value" .Values.grafana.resources "context" $) | nindent 12 }}
+          {{- end }}
+        {{- if .Values.grafana.sidecars }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.grafana.sidecars "context" $) | nindent 8 }}
+        {{- end }}
+      volumes:
+        - name: data
+        {{- if .Values.persistence.enabled }}
+          persistentVolumeClaim:
+            claimName: {{ .Values.persistence.existingClaim | default (include "common.names.fullname" .) }}
+        {{- else }}
+          emptyDir: {}
+        {{- end }}
+        {{- if .Values.ldap.enabled }}
+        - name: ldap
+          {{- if not (empty .Values.ldap.configMapName) }}
+          configMap:
+            name: {{ .Values.ldap.configMapName }}
+          {{- else if not (empty .Values.ldap.secretName) }}
+          secret:
+            secretName: {{ .Values.ldap.secretName }}
+          {{- else }}
+          secret:
+            secretName: {{ printf "%s-ldap-conf" (include "common.names.fullname" .) }}
+          {{- end }}
+        {{- end }}
+        {{- if .Values.dashboardsProvider.enabled }}
+        - name: dashboards-provider
+          configMap:
+            {{- if .Values.dashboardsProvider.configMapName }}
+            name: {{ include "common.tplvalues.render" ( dict "value" .Values.dashboardsProvider.configMapName "context" $) }}
+            {{- else }}
+            name: {{ include "common.names.fullname" . }}-provider
+            {{- end }}
+        {{- end }}
+        {{- range .Values.dashboardsConfigMaps }}
+        - name: {{ .configMapName }}
+          configMap:
+            name: {{ .configMapName }}
+        {{- end }}
+        {{- if .Values.datasources.secretName }}
+        - name: datasources
+          secret:
+            secretName: {{ .Values.datasources.secretName }}
+        {{- else if .Values.datasources.secretDefinition }}
+        - name: datasources
+          secret:
+            secretName: {{ include "common.names.fullname" . }}-datasources
+        {{- end }}
+        {{- if .Values.notifiers.configMapName }}
+        - name: notifiers
+          configMap:
+            name: {{ .Values.notifiers.configMapName }}
+        {{- end }}
+        {{- if .Values.config.useGrafanaIniFile }}
+        - name: grafana-ini
+          {{- if .Values.config.grafanaIniConfigMap }}
+          configMap:
+            name: {{ .Values.config.grafanaIniConfigMap }}
+          {{- else if .Values.config.grafanaIniSecret }}
+          secret:
+            secretName: {{ .Values.config.grafanaIniSecret }}
+          {{- end }}
+        {{- end }}
+        {{- if and .Values.ldap.tls.enabled .Values.ldap.tls.certificatesSecret }}
+        - name: ldap-tls
+          secret:
+            secretName: {{ .Values.ldap.tls.certificatesSecret }}
+        {{- end }}
+        {{- range .Values.grafana.extraConfigmaps }}
+        - name: {{ .name }}
+          configMap:
+            name: {{ .name }}
+        {{- end }}
+        {{- if .Values.grafana.extraVolumes }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.grafana.extraVolumes  "context" $) | nindent 8 }}
+        {{- end }}
diff --git a/addons/grafana/10/chart/grafana/templates/extra-list.yaml b/addons/grafana/10/chart/grafana/templates/extra-list.yaml
new file mode 100644
index 00000000..9ac65f9e
--- /dev/null
+++ b/addons/grafana/10/chart/grafana/templates/extra-list.yaml
@@ -0,0 +1,4 @@
+{{- range .Values.extraDeploy }}
+---
+{{ include "common.tplvalues.render" (dict "value" . "context" $) }}
+{{- end }}
diff --git a/addons/grafana/10/chart/grafana/templates/image-renderer-deployment.yaml b/addons/grafana/10/chart/grafana/templates/image-renderer-deployment.yaml
new file mode 100644
index 00000000..858ac788
--- /dev/null
+++ b/addons/grafana/10/chart/grafana/templates/image-renderer-deployment.yaml
@@ -0,0 +1,127 @@
+{{- if .Values.imageRenderer.enabled }}
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: {{ include "common.names.fullname" . }}-image-renderer
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+    app.kubernetes.io/component: image-renderer
+  {{- if .Values.commonAnnotations }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+spec:
+  replicas: {{ .Values.imageRenderer.replicaCount }}
+  {{- if .Values.imageRenderer.updateStrategy }}
+  strategy: {{- toYaml .Values.imageRenderer.updateStrategy | nindent 4 }}
+  {{- end }}
+  selector:
+    matchLabels: {{- include "common.labels.matchLabels" . | nindent 6 }}
+      app.kubernetes.io/component: image-renderer
+  template:
+    metadata:
+      labels: {{- include "common.labels.standard" . | nindent 8 }}
+        app.kubernetes.io/component: image-renderer
+        {{- if .Values.imageRenderer.podLabels }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.imageRenderer.podLabels "context" $) | nindent 8 }}
+        {{- end }}
+      {{- if .Values.imageRenderer.podAnnotations }}
+      annotations: {{- toYaml .Values.imageRenderer.podAnnotations | nindent 8 }}
+      {{- end }}
+    spec:
+      {{- include "grafana.imagePullSecrets" . | nindent 6 }}
+      serviceAccountName: {{ template "grafana.serviceAccountName" . }}
+      {{- if .Values.imageRenderer.hostAliases }}
+      hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.imageRenderer.hostAliases "context" $) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.imageRenderer.affinity }}
+      affinity: {{- include "common.tplvalues.render" (dict "value" .Values.imageRenderer.affinity "context" $) | nindent 8 }}
+      {{- else }}
+      affinity:
+        podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.imageRenderer.podAffinityPreset "component" "image-renderer" "context" $) | nindent 10 }}
+        podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.imageRenderer.podAntiAffinityPreset "component" "image-renderer" "context" $) | nindent 10 }}
+        nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.imageRenderer.nodeAffinityPreset.type "key" .Values.imageRenderer.nodeAffinityPreset.key "values" .Values.imageRenderer.nodeAffinityPreset.values) | nindent 10 }}
+      {{- end }}
+      {{- if .Values.imageRenderer.nodeSelector }}
+      nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.imageRenderer.nodeSelector "context" $) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.imageRenderer.tolerations }}
+      tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.imageRenderer.tolerations "context" $) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.imageRenderer.priorityClassName }}
+      priorityClassName: {{ .Values.imageRenderer.priorityClassName | quote }}
+      {{- end }}
+      {{- if .Values.imageRenderer.schedulerName }}
+      schedulerName: {{ .Values.imageRenderer.schedulerName | quote }}
+      {{- end }}
+      {{- if .Values.imageRenderer.topologySpreadConstraints }}
+      topologySpreadConstraints: {{- include "common.tplvalues.render" (dict "value" .Values.imageRenderer.topologySpreadConstraints "context" $) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.imageRenderer.podSecurityContext.enabled }}
+      securityContext: {{- omit .Values.imageRenderer.podSecurityContext "enabled" | toYaml | nindent 8 }}
+      {{- end }}
+      {{- if .Values.imageRenderer.terminationGracePeriodSeconds }}
+      terminationGracePeriodSeconds: {{ .Values.imageRenderer.terminationGracePeriodSeconds }}
+      {{- end }}
+      initContainers:
+        {{- if .Values.imageRenderer.initContainers }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.imageRenderer.initContainers "context" $) | nindent 8 }}
+        {{- end }}
+      containers:
+        - name: grafana-image-renderer
+          image: {{ template "grafana.imageRenderer.image" . }}
+          imagePullPolicy: {{ .Values.imageRenderer.image.pullPolicy }}
+          {{- if .Values.imageRenderer.containerSecurityContext.enabled }}
+          securityContext: {{- omit .Values.imageRenderer.containerSecurityContext "enabled" | toYaml | nindent 12 }}
+          {{- end }}
+          {{- if .Values.diagnosticMode.enabled }}
+          command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }}
+          {{- else if .Values.imageRenderer.command }}
+          command: {{- include "common.tplvalues.render" (dict "value" .Values.imageRenderer.command "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.diagnosticMode.enabled }}
+          args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }}
+          {{- else if .Values.imageRenderer.args }}
+          args: {{- include "common.tplvalues.render" (dict "value" .Values.imageRenderer.args "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.imageRenderer.lifecycleHooks }}
+          lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.imageRenderer.lifecycleHooks "context" $) | nindent 12 }}
+          {{- end }}
+          envFrom:
+            {{- if .Values.imageRenderer.extraEnvVarsCM }}
+            - configMapRef:
+                name: {{ include "common.tplvalues.render" (dict "value" .Values.imageRenderer.extraEnvVarsCM "context" $) }}
+            {{- end }}
+            {{- if .Values.imageRenderer.extraEnvVarsSecret }}
+            - secretRef:
+                name: {{ include "common.tplvalues.render" (dict "value" .Values.imageRenderer.extraEnvVarsSecret "context" $) }}
+            {{- end }}
+          env:
+            - name: HTTP_PORT
+              value: "8080"
+            - name: HTTP_HOST
+              value: "::"
+            - name: ENABLE_METRICS
+              value: {{ ternary "true" "false" .Values.imageRenderer.metrics.enabled | quote }}
+            {{- if .Values.imageRenderer.extraEnvVars }}
+            {{- include "common.tplvalues.render" (dict "value" .Values.imageRenderer.extraEnvVars "context" $) | nindent 12 }}
+            {{- end }}
+          ports:
+            - name: http
+              containerPort: 8080
+              protocol: TCP
+          {{- if .Values.imageRenderer.resources }}
+          resources: {{- toYaml .Values.imageRenderer.resources | nindent 12 }}
+          {{- end }}
+          {{- if .Values.imageRenderer.extraVolumeMounts }}
+          volumeMounts: {{- include "common.tplvalues.render" (dict "value" .Values.imageRenderer.extraVolumeMounts "context" $) | nindent 12 }}
+          {{- end }}
+        {{- if .Values.imageRenderer.sidecars }}
+        {{- include "common.tplvalues.render" ( dict "value" .Values.imageRenderer.sidecars "context" $) | nindent 8 }}
+        {{- end }}
+      {{- if .Values.imageRenderer.extraVolumes }}
+      volumes: {{- include "common.tplvalues.render" (dict "value" .Values.imageRenderer.extraVolumes "context" $) | nindent 8 }}
+      {{- end }}
+{{- end }}
diff --git a/addons/grafana/10/chart/grafana/templates/image-renderer-prometheusrules.yaml b/addons/grafana/10/chart/grafana/templates/image-renderer-prometheusrules.yaml
new file mode 100644
index 00000000..670ffdc7
--- /dev/null
+++ b/addons/grafana/10/chart/grafana/templates/image-renderer-prometheusrules.yaml
@@ -0,0 +1,24 @@
+{{- if and .Values.imageRenderer.metrics.enabled .Values.imageRenderer.metrics.prometheusRule.enabled  }}
+apiVersion: monitoring.coreos.com/v1
+kind: PrometheusRule
+metadata:
+  name: {{ include "common.names.fullname" . }}-image-renderer
+  {{- if .Values.imageRenderer.metrics.prometheusRule.namespace }}
+  namespace: {{ .Values.imageRenderer.metrics.prometheusRule.namespace }}
+  {{- else }}
+  namespace: {{ .Release.Namespace | quote }}
+  {{- end }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/component: metrics
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.imageRenderer.metrics.prometheusRule.additionalLabels "context" $ ) | nindent 4 }}
+  {{- if .Values.commonAnnotations }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+spec:
+  groups:
+  - name: {{ include "common.names.fullname" . }}-image-renderer
+    rules: {{- include "common.tplvalues.render" ( dict "value" .Values.imageRenderer.metrics.prometheusRule.rules "context" $ ) | nindent 6 }}
+{{- end }}
diff --git a/addons/grafana/10/chart/grafana/templates/image-renderer-service.yaml b/addons/grafana/10/chart/grafana/templates/image-renderer-service.yaml
new file mode 100644
index 00000000..d8da4176
--- /dev/null
+++ b/addons/grafana/10/chart/grafana/templates/image-renderer-service.yaml
@@ -0,0 +1,53 @@
+{{- if .Values.imageRenderer.enabled  }}
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ include "common.names.fullname" . }}-image-renderer
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+    app.kubernetes.io/component: image-renderer
+  {{- if and .Values.imageRenderer.metrics.enabled .Values.imageRenderer.metrics.annotations }}
+  annotations: {{- include "common.tplvalues.render" (dict "value" .Values.imageRenderer.metrics.annotations "context" $) | nindent 4 }}
+    {{- if .Values.commonAnnotations }}
+    {{- include "common.tplvalues.render" (dict "value" .Values.commonAnnotations "context" $) | nindent 4 }}
+    {{- end }}
+  {{- end }}
+spec:
+  type: {{ .Values.imageRenderer.service.type }}
+  {{- if and (eq .Values.imageRenderer.service.type "LoadBalancer") (not (empty .Values.imageRenderer.service.loadBalancerIP)) }}
+  loadBalancerIP: {{ .Values.imageRenderer.service.loadBalancerIP }}
+  {{- end }}
+  {{- if and (eq .Values.imageRenderer.service.type "LoadBalancer") (not (empty .Values.imageRenderer.service.loadBalancerSourceRanges)) }}
+  loadBalancerSourceRanges: {{ .Values.imageRenderer.service.loadBalancerSourceRanges }}
+  {{- end }}
+  {{- if and .Values.imageRenderer.service.clusterIP (eq .Values.imageRenderer.service.type "ClusterIP") }}
+  clusterIP: {{ .Values.imageRenderer.service.clusterIP }}
+  {{- end }}
+  {{- if or (eq .Values.imageRenderer.service.type "LoadBalancer") (eq .Values.imageRenderer.service.type "NodePort") }}
+  externalTrafficPolicy: {{ .Values.imageRenderer.service.externalTrafficPolicy | quote }}
+  {{- end }}
+  {{- if .Values.imageRenderer.service.sessionAffinity }}
+  sessionAffinity: {{ .Values.imageRenderer.service.sessionAffinity }}
+  {{- end }}
+  {{- if .Values.imageRenderer.service.sessionAffinityConfig }}
+  sessionAffinityConfig: {{- include "common.tplvalues.render" (dict "value" .Values.imageRenderer.service.sessionAffinityConfig "context" $) | nindent 4 }}
+  {{- end }}
+  ports:
+    - port: {{ .Values.imageRenderer.service.ports.imageRenderer }}
+      targetPort: http
+      protocol: TCP
+      name: http
+      {{- if and (or (eq .Values.imageRenderer.service.type "NodePort") (eq .Values.imageRenderer.service.type "LoadBalancer")) (not (empty .Values.imageRenderer.service.nodePorts.grafana)) }}
+      nodePort: {{ .Values.imageRenderer.service.nodePorts.grafana }}
+      {{- else if eq .Values.imageRenderer.service.type "ClusterIP" }}
+      nodePort: null
+      {{- end }}
+    {{- if .Values.imageRenderer.service.extraPorts }}
+    {{- include "common.tplvalues.render" (dict "value" .Values.imageRenderer.service.extraPorts "context" $) | nindent 4 }}
+    {{- end }}
+  selector: {{- include "common.labels.matchLabels" . | nindent 4 }}
+    app.kubernetes.io/component: image-renderer
+{{- end }}
diff --git a/addons/grafana/10/chart/grafana/templates/image-renderer-servicemonitor.yaml b/addons/grafana/10/chart/grafana/templates/image-renderer-servicemonitor.yaml
new file mode 100644
index 00000000..86be1e73
--- /dev/null
+++ b/addons/grafana/10/chart/grafana/templates/image-renderer-servicemonitor.yaml
@@ -0,0 +1,46 @@
+{{- if and .Values.imageRenderer.metrics.enabled .Values.imageRenderer.metrics.serviceMonitor.enabled }}
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+  name: {{ include "common.names.fullname" . }}-image-renderer
+  namespace: {{ default .Release.Namespace .Values.imageRenderer.metrics.serviceMonitor.namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/component: image-renderer
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.imageRenderer.metrics.serviceMonitor.labels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.imageRenderer.metrics.serviceMonitor.labels "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- if .Values.commonAnnotations }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+spec:
+  selector:
+    matchLabels: {{ include "common.labels.matchLabels" . | nindent 6 }}
+      {{- if .Values.imageRenderer.metrics.serviceMonitor.selector }}
+      {{- include "common.tplvalues.render" (dict "value" .Values.imageRenderer.metrics.serviceMonitor.selector "context" $) | nindent 6 }}
+      {{- end }}
+      app.kubernetes.io/component: image-renderer
+  endpoints:
+    - port: http
+      path: "/metrics"
+      {{- if .Values.imageRenderer.metrics.serviceMonitor.interval }}
+      interval: {{ .Values.imageRenderer.metrics.serviceMonitor.interval }}
+      {{- end }}
+      {{- if .Values.imageRenderer.metrics.serviceMonitor.scrapeTimeout }}
+      scrapeTimeout: {{ .Values.imageRenderer.metrics.serviceMonitor.scrapeTimeout }}
+      {{- end }}
+      {{- if .Values.imageRenderer.metrics.serviceMonitor.honorLabels }}
+      honorLabels: {{ .Values.imageRenderer.metrics.serviceMonitor.honorLabels }}
+      {{- end }}
+      {{- if .Values.imageRenderer.metrics.serviceMonitor.metricRelabelings }}
+      metricRelabelings: {{- include "common.tplvalues.render" ( dict "value" .Values.imageRenderer.metrics.serviceMonitor.metricRelabelings "context" $) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.imageRenderer.metrics.serviceMonitor.relabelings }}
+      relabelings: {{- include "common.tplvalues.render" ( dict "value" .Values.imageRenderer.metrics.serviceMonitor.relabelings "context" $) | nindent 8 }}
+      {{- end }}
+  namespaceSelector:
+    matchNames:
+      - {{ .Release.Namespace | quote }}
+{{- end }}
diff --git a/addons/grafana/10/chart/grafana/templates/ingress.yaml b/addons/grafana/10/chart/grafana/templates/ingress.yaml
new file mode 100644
index 00000000..83048bf3
--- /dev/null
+++ b/addons/grafana/10/chart/grafana/templates/ingress.yaml
@@ -0,0 +1,66 @@
+{{- if .Values.ingress.enabled -}}
+apiVersion: {{ include "common.capabilities.ingress.apiVersion" . }}
+kind: Ingress
+metadata:
+  name: {{ include "common.names.fullname" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+    app.kubernetes.io/component: grafana
+  annotations:
+    {{- if .Values.ingress.certManager }}
+    kubernetes.io/tls-acme: "true"
+    {{- end }}
+    {{- if .Values.ingress.annotations }}
+    {{- include "common.tplvalues.render" (dict "value" .Values.ingress.annotations "context" $) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.commonAnnotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+    {{- end }}
+spec:
+  {{- if and .Values.ingress.ingressClassName (eq "true" (include "common.ingress.supportsIngressClassname" .)) }}
+  ingressClassName: {{ .Values.ingress.ingressClassName | quote }}
+  {{- end }}
+  rules:
+    {{- if .Values.ingress.hostname }}
+    - http:
+        paths:
+          {{- if .Values.ingress.extraPaths }}
+          {{- toYaml .Values.ingress.extraPaths | nindent 10 }}
+          {{- end }}
+          - path: {{ .Values.ingress.path }}
+            {{- if eq "true" (include "common.ingress.supportsPathType" .) }}
+            pathType: {{ .Values.ingress.pathType }}
+            {{- end }}
+            backend: {{- include "common.ingress.backend" (dict "serviceName" (include "common.names.fullname" .) "servicePort" "http" "context" $)  | nindent 14 }}
+      {{- if ne .Values.ingress.hostname "*" }}
+      host: {{ .Values.ingress.hostname }}
+      {{- end }}
+    {{- end }}
+    {{- range .Values.ingress.extraHosts }}
+    - host: {{ .name | quote }}
+      http:
+        paths:
+          - path: {{ default "/" .path }}
+            {{- if eq "true" (include "common.ingress.supportsPathType" $) }}
+            pathType: {{ default "ImplementationSpecific" .pathType }}
+            {{- end }}
+            backend: {{- include "common.ingress.backend" (dict "serviceName" (include "common.names.fullname" $) "servicePort" "http" "context" $) | nindent 14 }}
+    {{- end }}
+    {{- if .Values.ingress.extraRules }}
+    {{- include "common.tplvalues.render" (dict "value" .Values.ingress.extraRules "context" $) | nindent 4 }}
+    {{- end }}
+  {{- if or (and .Values.ingress.tls (or (include "common.ingress.certManagerRequest" ( dict "annotations" .Values.ingress.annotations )) .Values.ingress.selfSigned)) .Values.ingress.extraTls }}
+  tls:
+    {{- if and .Values.ingress.tls (or (include "common.ingress.certManagerRequest" ( dict "annotations" .Values.ingress.annotations )) .Values.ingress.selfSigned) }}
+    - hosts:
+        - {{ .Values.ingress.hostname | quote }}
+      secretName: {{ printf "%s-tls" .Values.ingress.hostname }}
+    {{- end }}
+    {{- if .Values.ingress.extraTls }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.ingress.extraTls "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- end }}
+{{- end }}
diff --git a/addons/grafana/10/chart/grafana/templates/ldap-secret.yaml b/addons/grafana/10/chart/grafana/templates/ldap-secret.yaml
new file mode 100644
index 00000000..a38753ce
--- /dev/null
+++ b/addons/grafana/10/chart/grafana/templates/ldap-secret.yaml
@@ -0,0 +1,23 @@
+{{- if and .Values.ldap.enabled (or (not (empty .Values.ldap.configuration)) (not (empty .Values.ldap.uri))) (empty .Values.ldap.configMapName) (empty .Values.ldap.secretName) }}
+apiVersion: v1
+kind: Secret
+metadata:
+  name: {{ printf "%s-ldap-conf" (include "common.names.fullname" .) }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/component: grafana
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- if .Values.commonAnnotations }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+data:
+  {{if .Values.ldap.configuration }}
+  ldap.toml: |-
+    {{- include "common.tplvalues.render" (dict "value" .Values.ldap.configuration "context" $) | b64enc | nindent 4 }}
+  {{- else }}
+  ldap.toml: |-
+    {{- include "grafana.ldap.config" . | b64enc | nindent 4 }}
+  {{- end }}
+{{- end }}
diff --git a/addons/grafana/10/chart/grafana/templates/prometheusrules.yaml b/addons/grafana/10/chart/grafana/templates/prometheusrules.yaml
new file mode 100644
index 00000000..5ae12eb0
--- /dev/null
+++ b/addons/grafana/10/chart/grafana/templates/prometheusrules.yaml
@@ -0,0 +1,24 @@
+{{- if and .Values.metrics.enabled .Values.metrics.prometheusRule.enabled  }}
+apiVersion: monitoring.coreos.com/v1
+kind: PrometheusRule
+metadata:
+  name: {{ include "common.names.fullname" . }}
+  {{- if .Values.metrics.prometheusRule.namespace }}
+  namespace: {{ .Values.metrics.prometheusRule.namespace }}
+  {{- else }}
+  namespace: {{ .Release.Namespace | quote }}
+  {{- end }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/component: metrics
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.prometheusRule.additionalLabels "context" $ ) | nindent 4 }}
+  {{- if .Values.commonAnnotations }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+spec:
+  groups:
+  - name: {{ include "common.names.fullname" . }}
+    rules: {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.prometheusRule.rules "context" $ ) | nindent 6 }}
+{{- end }}
diff --git a/addons/grafana/10/chart/grafana/templates/pvc.yaml b/addons/grafana/10/chart/grafana/templates/pvc.yaml
new file mode 100644
index 00000000..dae7d86f
--- /dev/null
+++ b/addons/grafana/10/chart/grafana/templates/pvc.yaml
@@ -0,0 +1,34 @@
+{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) }}
+kind: PersistentVolumeClaim
+apiVersion: v1
+metadata:
+  name: {{ include "common.names.fullname" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+    app.kubernetes.io/component: grafana
+  {{- if or .Values.persistence.annotations .Values.commonAnnotations }}
+  annotations:
+    {{- if .Values.persistence.annotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.persistence.annotations "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.commonAnnotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- end }}
+spec:
+  accessModes:
+  {{- if not (empty .Values.persistence.accessModes) }}
+  {{- range .Values.persistence.accessModes }}
+    - {{ . | quote }}
+  {{- end }}
+  {{- else }}
+    - {{ .Values.persistence.accessMode | quote }}
+  {{- end }}
+  resources:
+    requests:
+      storage: {{ .Values.persistence.size | quote }}
+  {{ include "grafana.storageClass" . }}
+{{- end -}}
diff --git a/addons/grafana/10/chart/grafana/templates/secret.yaml b/addons/grafana/10/chart/grafana/templates/secret.yaml
new file mode 100644
index 00000000..bbe05846
--- /dev/null
+++ b/addons/grafana/10/chart/grafana/templates/secret.yaml
@@ -0,0 +1,16 @@
+{{- if (include "grafana.createAdminSecret" .) }}
+apiVersion: v1
+kind: Secret
+metadata:
+  name: {{ include "common.names.fullname" . }}-admin
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+    app.kubernetes.io/component: grafana
+type: Opaque
+data:
+  GF_SECURITY_ADMIN_PASSWORD: {{ ternary (randAlphaNum 10) .Values.admin.password (empty .Values.admin.password) | b64enc | quote }}
+  GF_SECURITY_ADMIN_USER: {{ .Values.admin.user | b64enc |quote }}
+{{- end }}
diff --git a/addons/grafana/10/chart/grafana/templates/service.yaml b/addons/grafana/10/chart/grafana/templates/service.yaml
new file mode 100644
index 00000000..8eb7182d
--- /dev/null
+++ b/addons/grafana/10/chart/grafana/templates/service.yaml
@@ -0,0 +1,57 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ include "common.names.fullname" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+    app.kubernetes.io/component: grafana
+  {{- if or (and .Values.metrics.enabled .Values.metrics.service.annotations) .Values.service.annotations .Values.commonAnnotations }}
+  annotations:
+  {{- if and .Values.metrics.enabled .Values.metrics.service.annotations }}
+    {{- include "common.tplvalues.render" (dict "value" .Values.metrics.service.annotations "context" $) | nindent 4 }}
+  {{- end }}
+  {{- if .Values.service.annotations }}
+    {{- include "common.tplvalues.render" (dict "value" .Values.service.annotations "context" $) | nindent 4 }}
+  {{- end }}
+  {{- if .Values.commonAnnotations }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+  {{- end }}
+spec:
+  type: {{ .Values.service.type }}
+  {{- if and (eq .Values.service.type "LoadBalancer") (not (empty .Values.service.loadBalancerIP)) }}
+  loadBalancerIP: {{ .Values.service.loadBalancerIP }}
+  {{- end }}
+  {{- if and (eq .Values.service.type "LoadBalancer") (not (empty .Values.service.loadBalancerSourceRanges)) }}
+  loadBalancerSourceRanges: {{ .Values.service.loadBalancerSourceRanges }}
+  {{- end }}
+  {{- if and .Values.service.clusterIP (eq .Values.service.type "ClusterIP") }}
+  clusterIP: {{ .Values.service.clusterIP }}
+  {{- end }}
+  {{- if or (eq .Values.service.type "LoadBalancer") (eq .Values.service.type "NodePort") }}
+  externalTrafficPolicy: {{ .Values.service.externalTrafficPolicy | quote }}
+  {{- end }}
+  {{- if .Values.service.sessionAffinity }}
+  sessionAffinity: {{ .Values.service.sessionAffinity }}
+  {{- end }}
+  {{- if .Values.service.sessionAffinityConfig }}
+  sessionAffinityConfig: {{- include "common.tplvalues.render" (dict "value" .Values.service.sessionAffinityConfig "context" $) | nindent 4 }}
+  {{- end }}
+  ports:
+    - port: {{ .Values.service.ports.grafana }}
+      targetPort: dashboard
+      protocol: TCP
+      name: http
+      {{- if and (or (eq .Values.service.type "NodePort") (eq .Values.service.type "LoadBalancer")) (not (empty .Values.service.nodePorts.grafana)) }}
+      nodePort: {{ .Values.service.nodePorts.grafana }}
+      {{- else if eq .Values.service.type "ClusterIP" }}
+      nodePort: null
+      {{- end }}
+    {{- if .Values.service.extraPorts }}
+    {{- include "common.tplvalues.render" (dict "value" .Values.service.extraPorts "context" $) | nindent 4 }}
+    {{- end }}
+  selector: {{- include "common.labels.matchLabels" . | nindent 4 }}
+    app.kubernetes.io/component: grafana
diff --git a/addons/grafana/10/chart/grafana/templates/serviceaccount.yaml b/addons/grafana/10/chart/grafana/templates/serviceaccount.yaml
new file mode 100644
index 00000000..3c9af37c
--- /dev/null
+++ b/addons/grafana/10/chart/grafana/templates/serviceaccount.yaml
@@ -0,0 +1,28 @@
+{{- if .Values.serviceAccount.create }}
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: {{ include "grafana.serviceAccountName" . }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- if .Values.serviceAccount.annotations }}
+  annotations: {{ toYaml .Values.serviceAccount.annotations | nindent 4 }}
+    {{- if .Values.commonAnnotations }}
+    {{- include "common.tplvalues.render" (dict "value" .Values.commonAnnotations "context" $) | nindent 4 }}
+    {{- end }}
+  {{- end }}
+secrets:
+  - name: {{ include "common.names.fullname" . }}-admin
+  {{- if .Values.datasources.secretName }}
+  - name: {{ .Values.datasources.secretName }}
+  {{- else if .Values.datasources.secretDefinition }}
+  - name: {{ include "common.names.fullname" . }}-datasources
+  {{- end }}
+  {{- if (include "grafana.createSMTPSecret" .) }}
+  - name: {{ include "common.names.fullname" . }}-smtp
+  {{- end }}
+automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }}
+{{- end }}
diff --git a/addons/grafana/10/chart/grafana/templates/servicemonitor.yaml b/addons/grafana/10/chart/grafana/templates/servicemonitor.yaml
new file mode 100644
index 00000000..351d7c60
--- /dev/null
+++ b/addons/grafana/10/chart/grafana/templates/servicemonitor.yaml
@@ -0,0 +1,50 @@
+{{- if and .Values.metrics.enabled .Values.metrics.serviceMonitor.enabled }}
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+  name: {{ include "common.names.fullname" . }}
+  namespace: {{ default .Release.Namespace .Values.metrics.serviceMonitor.namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.metrics.serviceMonitor.labels }}
+    {{- include "common.tplvalues.render" (dict "value" .Values.metrics.serviceMonitor.labels "context" $) | nindent 4 }}
+    {{- end }}
+    {{- if .Values.metrics.serviceMonitor.additionalLabels }}
+    {{- include "common.tplvalues.render" (dict "value" .Values.metrics.serviceMonitor.additionalLabels "context" $) | nindent 4 }}
+    {{- end }}
+    app.kubernetes.io/component: grafana
+  {{- if .Values.commonAnnotations }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+spec:
+  {{- if .Values.metrics.serviceMonitor.jobLabel }}
+  jobLabel: {{ .Values.metrics.serviceMonitor.jobLabel }}
+  {{- end }}
+  selector:
+    matchLabels: {{ include "common.labels.matchLabels" . | nindent 6 }}
+      {{- if .Values.metrics.serviceMonitor.selector }}
+      {{- include "common.tplvalues.render" (dict "value" .Values.metrics.serviceMonitor.selector "context" $) | nindent 6 }}
+      {{- end }}
+      app.kubernetes.io/component: grafana
+  endpoints:
+    - port: http
+      path: "/metrics"
+      {{- if .Values.metrics.serviceMonitor.interval }}
+      interval: {{ .Values.metrics.serviceMonitor.interval }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.scrapeTimeout }}
+      scrapeTimeout: {{ .Values.metrics.serviceMonitor.scrapeTimeout }}
+      {{- end }}
+      honorLabels: {{ .Values.metrics.serviceMonitor.honorLabels }}
+      {{- if .Values.metrics.serviceMonitor.metricRelabelings }}
+      metricRelabelings: {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.metricRelabelings "context" $) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.metrics.serviceMonitor.relabelings }}
+      relabelings: {{- include "common.tplvalues.render" ( dict "value" .Values.metrics.serviceMonitor.relabelings "context" $) | nindent 8 }}
+      {{- end }}
+  namespaceSelector:
+    matchNames:
+      - {{ .Release.Namespace | quote }}
+{{- end }}
diff --git a/addons/grafana/10/chart/grafana/templates/smtp-secret.yaml b/addons/grafana/10/chart/grafana/templates/smtp-secret.yaml
new file mode 100644
index 00000000..91ff84db
--- /dev/null
+++ b/addons/grafana/10/chart/grafana/templates/smtp-secret.yaml
@@ -0,0 +1,16 @@
+{{- if (include "grafana.createSMTPSecret" .) }}
+apiVersion: v1
+kind: Secret
+metadata:
+  name: {{ include "common.names.fullname" . }}-smtp
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+    app.kubernetes.io/component: grafana
+type: Opaque
+data:
+  GF_SMTP_USER: {{ .Values.smtp.user | b64enc | quote }}
+  GF_SMTP_PASSWORD: {{ .Values.smtp.password | b64enc | quote }}
+{{- end }}
diff --git a/addons/grafana/10/chart/grafana/templates/tls-secret.yaml b/addons/grafana/10/chart/grafana/templates/tls-secret.yaml
new file mode 100644
index 00000000..efcd1b4b
--- /dev/null
+++ b/addons/grafana/10/chart/grafana/templates/tls-secret.yaml
@@ -0,0 +1,46 @@
+{{- if .Values.ingress.enabled }}
+{{- if .Values.ingress.secrets }}
+{{- range .Values.ingress.secrets }}
+apiVersion: v1
+kind: Secret
+metadata:
+  name: {{ .name }}
+  namespace: {{ $.Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" $ | nindent 4 }}
+    app.kubernetes.io/component: grafana
+    {{- if $.Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" $.Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- if $.Values.commonAnnotations }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" $.Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+type: kubernetes.io/tls
+data:
+  tls.crt: {{ .certificate | b64enc }}
+  tls.key: {{ .key | b64enc }}
+---
+{{- end }}
+{{- end }}
+{{- if and .Values.ingress.tls .Values.ingress.selfSigned }}
+{{- $ca := genCA "grafana-ca" 365 }}
+{{- $cert := genSignedCert .Values.ingress.hostname nil (list .Values.ingress.hostname) 365 $ca }}
+apiVersion: v1
+kind: Secret
+metadata:
+  name: {{ printf "%s-tls" .Values.ingress.hostname }}
+  namespace: {{ .Release.Namespace | quote }}
+  labels: {{- include "common.labels.standard" . | nindent 4 }}
+    app.kubernetes.io/component: grafana
+    {{- if .Values.commonLabels }}
+    {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
+    {{- end }}
+  {{- if .Values.commonAnnotations }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+type: kubernetes.io/tls
+data:
+  tls.crt: {{ $cert.Cert | b64enc | quote }}
+  tls.key: {{ $cert.Key | b64enc | quote }}
+  ca.crt: {{ $ca.Cert | b64enc | quote }}
+{{- end }}
+{{- end }}
\ No newline at end of file
diff --git a/addons/grafana/10/chart/grafana/values.yaml b/addons/grafana/10/chart/grafana/values.yaml
new file mode 100644
index 00000000..9b029425
--- /dev/null
+++ b/addons/grafana/10/chart/grafana/values.yaml
@@ -0,0 +1,1214 @@
+## @section Global parameters
+## Global Docker image parameters
+## Please, note that this will override the image parameters, including dependencies, configured to use the global value
+## Current available global Docker image parameters: imageRegistry, imagePullSecrets and storageClass
+
+## @param global.imageRegistry Global Docker image registry
+## @param global.imagePullSecrets Global Docker registry secret names as an array
+## @param global.storageClass Global StorageClass for Persistent Volume(s)
+##
+global:
+  imageRegistry: ""
+  ## E.g.
+  ## imagePullSecrets:
+  ##   - myRegistryKeySecretName
+  ##
+  imagePullSecrets: []
+  storageClass: ""
+
+## @section Common parameters
+
+## @param kubeVersion Force target Kubernetes version (using Helm capabilities if not set)
+##
+kubeVersion: ""
+## @param extraDeploy Array of extra objects to deploy with the release
+##
+extraDeploy: []
+## @param nameOverride String to partially override grafana.fullname template (will maintain the release name)
+##
+nameOverride: ""
+## @param fullnameOverride String to fully override grafana.fullname template
+##
+fullnameOverride: ""
+## @param clusterDomain Default Kubernetes cluster domain
+##
+clusterDomain: cluster.local
+## @param commonLabels Labels to add to all deployed objects
+##
+commonLabels: {}
+## @param commonAnnotations Annotations to add to all deployed objects
+##
+commonAnnotations: {}
+
+## @section Grafana parameters
+
+## Bitnami Grafana image version
+## ref: https://hub.docker.com/r/drycc/grafana/tags/
+## @param image.registry Grafana image registry
+## @param image.repository Grafana image repository
+## @param image.tag Grafana image tag (immutable tags are recommended)
+## @param image.digest Grafana image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag
+## @param image.pullPolicy Grafana image pull policy
+## @param image.pullSecrets Grafana image pull secrets
+##
+image:
+  registry: registry.drycc.cc
+  repository: drycc-addons/grafana
+  tag: 10
+  digest: ""
+  ## Specify a imagePullPolicy
+  ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
+  ## ref: https://kubernetes.io/docs/user-guide/images/#pre-pulling-images
+  ##
+  pullPolicy: IfNotPresent
+  ## Optionally specify an array of imagePullSecrets.
+  ## Secrets must be manually created in the namespace.
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
+  ##
+  ## pullSecrets:
+  ##   - myRegistryKeySecretName
+  pullSecrets: []
+## Admin credentials configuration
+##
+admin:
+  ## @param admin.user Grafana admin username
+  ##
+  user: "admin"
+  ## @param admin.password Admin password. If a password is not provided a random password will be generated
+  ##
+  password: ""
+  ## @param admin.existingSecret Name of the existing secret containing admin password
+  ##
+  existingSecret: ""
+  ## @param admin.existingSecretPasswordKey Password key on the existing secret
+  ##
+  existingSecretPasswordKey: password
+## SMTP configuration
+##
+smtp:
+  ## @param smtp.enabled Enable SMTP configuration
+  ##
+  enabled: false
+  ## @param smtp.user SMTP user
+  ##
+  user: user
+  ## @param smtp.password SMTP password
+  ##
+  password: password
+  ## @param smtp.host Custom host for the smtp server
+  ## e.g:
+  ##   host: mysmtphost.com
+  ##
+  host: ""
+  ## @param smtp.fromAddress From address
+  ##
+  fromAddress: ""
+  ## @param smtp.fromName From name
+  ##
+  fromName: ""
+  ## @param smtp.skipVerify Enable skip verify
+  ##
+  skipVerify: "false"
+  ## @param smtp.existingSecret Name of existing secret containing SMTP credentials (user and password)
+  ##
+  existingSecret: ""
+  ## @param smtp.existingSecretUserKey User key on the existing secret
+  ##
+  existingSecretUserKey: user
+  ## @param smtp.existingSecretPasswordKey Password key on the existing secret
+  ##
+  existingSecretPasswordKey: password
+## @param plugins Grafana plugins to be installed in deployment time separated by commas
+## Specify plugins as a list separated by commas ( you will need to scape them when specifying from command line )
+## Example:
+## plugins: grafana-kubernetes-app,grafana-example-app
+##
+plugins: ""
+## Ldap configuration for Grafana
+##
+ldap:
+  ## @param ldap.enabled Enable LDAP for Grafana
+  ##
+  enabled: false
+  ## @param ldap.allowSignUp Allows LDAP sign up for Grafana
+  ##
+  allowSignUp: false
+  ## @param ldap.configuration Specify content for ldap.toml configuration file
+  ## e.g:
+  ## configuration: |-
+  ##   [[servers]]
+  ##   host = "127.0.0.1"
+  ##   port = 389
+  ##   use_ssl = false
+  ##   ...
+  ##
+  configuration: ""
+  ## @param ldap.configMapName Name of the ConfigMap with the ldap.toml configuration file for Grafana
+  ## NOTE: When it's set the ldap.configuration parameter is ignored
+  ##
+  configMapName: ""
+  ## @param ldap.secretName Name of the Secret with the ldap.toml configuration file for Grafana
+  ## NOTE: When it's set the ldap.configuration parameter is ignored
+  ##
+  secretName: ""
+  ## @param ldap.uri Server URI, eg. ldap://ldap_server:389
+  ##
+  uri: ""
+  ## @param ldap.binddn DN of the account used to search in the LDAP server.
+  ##
+  binddn: ""
+  ## @param ldap.bindpw Password for binddn account.
+  ##
+  bindpw: ""
+  ## @param ldap.basedn Base DN path where binddn account will search for the users.
+  ##
+  basedn: ""
+  ## @param ldap.searchAttribute Field used to match with the user name (uid, samAccountName, cn, etc). This value will be ignored if 'ldap.searchFilter' is set
+  ##
+  searchAttribute: "uid"
+  ## @param ldap.searchFilter User search filter, for example "(cn=%s)" or "(sAMAccountName=%s)" or "(|(sAMAccountName=%s)(userPrincipalName=%s)"
+  ##
+  searchFilter: ""
+  ## @param ldap.extraConfiguration Extra ldap configuration.
+  ## Example:
+  ##   extraConfiguration: |-
+  ##     # set to true if you want to skip SSL cert validation
+  ##     ssl_skip_verify = false
+  ##     # group_search_filter = "(&(objectClass=posixGroup)(memberUid=%s))"
+  ##     # group_search_filter_user_attribute = "distinguishedName"
+  ##     # group_search_base_dns = ["ou=groups,dc=grafana,dc=org"]
+  ##     # Specify names of the LDAP attributes your LDAP uses
+  ##     [servers.attributes]
+  ##     # member_of = "memberOf"
+  ##     # email =  "email"
+  ##
+  extraConfiguration: ""
+  ## @param ldap.tls.enabled Enabled TLS configuration.
+  ## @param ldap.tls.startTls Use STARTTLS instead of LDAPS.
+  ## @param ldap.tls.skipVerify Skip any SSL verification (hostanames or certificates)
+  ## @param ldap.tls.certificatesMountPath Where LDAP certifcates are mounted.
+  ## @param ldap.tls.certificatesSecret Secret with LDAP certificates.
+  ## @param ldap.tls.CAFilename  CA certificate filename. Should match with the CA entry key in the ldap.tls.certificatesSecret.
+  ## @param ldap.tls.certFilename Client certificate filename to authenticate against the LDAP server. Should match with certificate the entry key in the ldap.tls.certificatesSecret.
+  ## @param ldap.tls.certKeyFilename Client Key filename to authenticate against the LDAP server. Should match with certificate the entry key in the ldap.tls.certificatesSecret.
+  ##
+  tls:
+    enabled: false
+    startTls: false
+    skipVerify: false
+    certificatesMountPath: /opt/drycc/grafana/conf/ldap/
+    certificatesSecret: ""
+    CAFilename: ""
+    certFilename: ""
+    certKeyFilename: ""
+
+## Parameters to override the default grafana.ini file.
+## It is needed to create a configmap or a secret containing the grafana.ini file.
+## @param config.useGrafanaIniFile Allows to load a `grafana.ini` file
+## @param config.grafanaIniConfigMap Name of the ConfigMap containing the `grafana.ini` file
+## @param config.grafanaIniSecret Name of the Secret containing the `grafana.ini` file
+##
+config:
+  useGrafanaIniFile: false
+  grafanaIniConfigMap: ""
+  grafanaIniSecret: ""
+## Create dasboard provider to load dashboards, a default one is created to load dashboards
+## from "/opt/drycc/grafana/dashboards"
+## @param dashboardsProvider.enabled Enable the use of a Grafana dashboard provider
+## @param dashboardsProvider.configMapName Name of a ConfigMap containing a custom dashboard provider
+##
+dashboardsProvider:
+  enabled: false
+  ## Important to set the Path to "/opt/drycc/grafana/dashboards"
+  ## Evaluated as a template.
+  ##
+  configMapName: ""
+## @param dashboardsConfigMaps Array with the names of a series of ConfigMaps containing dashboards files
+## They will be mounted by the default dashboard provider if it is enabled
+## Use an array with the configMap names.
+## In order to use subfolders, uncomment "#foldersFromFilesStructure: true" line in default provider config. or create your own dashboard provider.
+## Example:
+## dashboardsConfigMaps:
+##   - configMapName: mydashboard
+##     folderName: foo
+##     fileName: mydashboard.json
+##   - configMapName: myotherdashboard
+##     folderName: bar
+##     fileName: myotherdashboard.json
+##
+dashboardsConfigMaps: []
+## Import datasources from an externally-managed secret, or a secret definition set via Helm values.
+##
+datasources:
+  ## @param datasources.secretName The name of an externally-managed secret containing custom datasource files.
+  ##
+  secretName: ""
+  ## @param datasources.secretDefinition The contents of a secret defining a custom datasource file. Only used if datasources.secretName is empty or not defined.
+  ## Example:
+  ## secretDefinition:
+  ##   apiVersion: 1
+  ##   datasources:
+  ##   - name: Prometheus
+  ##     type: prometheus
+  ##     url: http://prometheus-prometheus-server
+  ##     access: proxy
+  ##     isDefault: true
+  ##
+  secretDefinition: {}
+
+## Create notifiers from a configMap
+## The notifiersName must contain the files
+## @param notifiers.configMapName Name of a ConfigMap containing Grafana notifiers configuration
+##
+notifiers:
+  configMapName: ""
+
+## @section Grafana Deployment parameters
+
+grafana:
+  ## @param grafana.replicaCount Number of Grafana nodes
+  ##
+  replicaCount: 1
+  ## @param grafana.updateStrategy.type Set up update strategy for Grafana installation.
+  ## Set to Recreate if you use persistent volume that cannot be mounted by more than one pods to make sure the pods is destroyed first.
+  ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy
+  ## Example:
+  ## updateStrategy:
+  ##  type: RollingUpdate
+  ##  rollingUpdate:
+  ##    maxSurge: 25%
+  ##    maxUnavailable: 25%
+  ##
+  updateStrategy:
+    type: RollingUpdate
+  ## @param grafana.hostAliases Add deployment host aliases
+  ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/
+  ##
+  hostAliases: []
+  ## @param grafana.schedulerName Alternative scheduler
+  ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
+  ##
+  schedulerName: ""
+  ## @param grafana.terminationGracePeriodSeconds In seconds, time the given to the Grafana pod needs to terminate gracefully
+  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods
+  ##
+  terminationGracePeriodSeconds: ""
+  ## @param grafana.priorityClassName Priority class name
+  ## ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/
+  ##
+  priorityClassName: ""
+  ## @param grafana.podLabels Extra labels for Grafana pods
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
+  ##
+  podLabels: {}
+  ## @param grafana.podAnnotations Grafana Pod annotations
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
+  ##
+  podAnnotations: {}
+  ## @param grafana.podAffinityPreset Pod affinity preset. Ignored if `affinity` is set. Allowed values: `soft` or `hard`
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity
+  ##
+  podAffinityPreset: ""
+  ## @param grafana.podAntiAffinityPreset Pod anti-affinity preset. Ignored if `affinity` is set. Allowed values: `soft` or `hard`
+  ## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity
+  ##
+  podAntiAffinityPreset: soft
+  ## @param grafana.containerPorts.grafana Grafana container port
+  ##
+  containerPorts:
+    grafana: 3000
+  ## Node affinity preset
+  ## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity
+  ## @param grafana.nodeAffinityPreset.type Node affinity preset type. Ignored if `affinity` is set. Allowed values: `soft` or `hard`
+  ## @param grafana.nodeAffinityPreset.key Node label key to match Ignored if `affinity` is set.
+  ## @param grafana.nodeAffinityPreset.values Node label values to match. Ignored if `affinity` is set.
+  ##
+  nodeAffinityPreset:
+    type: ""
+    ## E.g.
+    ## key: "kubernetes.io/e2e-az-name"
+    ##
+    key: ""
+    ## E.g.
+    ## values:
+    ##   - e2e-az1
+    ##   - e2e-az2
+    ##
+    values: []
+  ## @param grafana.affinity Affinity for pod assignment
+  ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
+  ## Note: podAffinityPreset, podAntiAffinityPreset, and  nodeAffinityPreset will be ignored when it's set
+  ##
+  affinity: {}
+  ## @param grafana.nodeSelector Node labels for pod assignment
+  ## Ref: https://kubernetes.io/docs/user-guide/node-selection/
+  ##
+  nodeSelector: {}
+  ## @param grafana.tolerations Tolerations for pod assignment
+  ## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
+  ##
+  tolerations: []
+  ## @param grafana.topologySpreadConstraints Topology spread constraints rely on node labels to identify the topology domain(s) that each Node is in
+  ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/
+  ##
+  ## topologySpreadConstraints:
+  ##   - maxSkew: 1
+  ##     topologyKey: failure-domain.beta.kubernetes.io/zone
+  ##     whenUnsatisfiable: DoNotSchedule
+  ##
+  topologySpreadConstraints: []
+  ## @param grafana.podSecurityContext.enabled Enable securityContext on for Grafana deployment
+  ## @param grafana.podSecurityContext.fsGroup Group to configure permissions for volumes
+  ## @param grafana.podSecurityContext.runAsUser User for the security context
+  ## @param grafana.podSecurityContext.runAsNonRoot Run containers as non-root users
+  ##
+  podSecurityContext:
+    enabled: true
+    runAsUser: 1001
+    fsGroup: 1001
+    runAsNonRoot: true
+  ## Configure Container Security Context
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
+  ## @param grafana.containerSecurityContext.enabled Enabled Grafana Image Renderer containers' Security Context
+  ## @param grafana.containerSecurityContext.runAsUser Set Grafana Image Renderer containers' Security Context runAsUser
+  ##
+  containerSecurityContext:
+    enabled: true
+    runAsUser: 1001
+  ## Grafana containers' resource requests and limits
+  ## ref: https://kubernetes.io/docs/user-guide/compute-resources/
+  ## We usually recommend not to specify default resources and to leave this as a conscious
+  ## choice for the user. This also increases chances charts run on environments with little
+  ## resources, such as Minikube. If you do want to specify resources, uncomment the following
+  ## lines, adjust them as necessary, and remove the curly braces after 'resources:'.
+  ## @param grafana.resources.limits The resources limits for Grafana containers
+  ## @param grafana.resources.requests The requested resources for Grafana containers
+  ##
+  resources:
+    ## Example:
+    ## limits:
+    ##    cpu: 500m
+    ##    memory: 1Gi
+    limits: {}
+    ## Examples:
+    ## requests:
+    ##    cpu: 250m
+    ##    memory: 256Mi
+    requests: {}
+  ## Grafana containers' liveness probe
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes
+  ## @param grafana.livenessProbe.enabled Enable livenessProbe
+  ## @param grafana.livenessProbe.path Path for livenessProbe
+  ## @param grafana.livenessProbe.scheme Scheme for livenessProbe
+  ## @param grafana.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe
+  ## @param grafana.livenessProbe.periodSeconds Period seconds for livenessProbe
+  ## @param grafana.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe
+  ## @param grafana.livenessProbe.failureThreshold Failure threshold for livenessProbe
+  ## @param grafana.livenessProbe.successThreshold Success threshold for livenessProbe
+  ##
+  livenessProbe:
+    enabled: true
+    path: /api/health
+    scheme: HTTP
+    initialDelaySeconds: 120
+    periodSeconds: 10
+    timeoutSeconds: 5
+    failureThreshold: 6
+    successThreshold: 1
+  ## Grafana containers' readinessProbe probe
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes
+  ## @param grafana.readinessProbe.enabled Enable readinessProbe
+  ## @param grafana.readinessProbe.path Path for readinessProbe
+  ## @param grafana.readinessProbe.scheme Scheme for readinessProbe
+  ## @param grafana.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe
+  ## @param grafana.readinessProbe.periodSeconds Period seconds for readinessProbe
+  ## @param grafana.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe
+  ## @param grafana.readinessProbe.failureThreshold Failure threshold for readinessProbe
+  ## @param grafana.readinessProbe.successThreshold Success threshold for readinessProbe
+  ##
+  readinessProbe:
+    enabled: true
+    path: /api/health
+    scheme: HTTP
+    initialDelaySeconds: 30
+    periodSeconds: 10
+    timeoutSeconds: 5
+    failureThreshold: 6
+    successThreshold: 1
+  ## @param grafana.startupProbe.enabled Enable startupProbe
+  ## @param grafana.startupProbe.path Path for readinessProbe
+  ## @param grafana.startupProbe.scheme Scheme for readinessProbe
+  ## @param grafana.startupProbe.initialDelaySeconds Initial delay seconds for startupProbe
+  ## @param grafana.startupProbe.periodSeconds Period seconds for startupProbe
+  ## @param grafana.startupProbe.timeoutSeconds Timeout seconds for startupProbe
+  ## @param grafana.startupProbe.failureThreshold Failure threshold for startupProbe
+  ## @param grafana.startupProbe.successThreshold Success threshold for startupProbe
+  ##
+  startupProbe:
+    enabled: false
+    path: /api/health
+    scheme: HTTP
+    initialDelaySeconds: 30
+    periodSeconds: 10
+    timeoutSeconds: 5
+    failureThreshold: 6
+    successThreshold: 1
+  ## @param grafana.customLivenessProbe Custom livenessProbe that overrides the default one
+  ##
+  customLivenessProbe: {}
+  ## @param grafana.customReadinessProbe Custom readinessProbe that overrides the default one
+  ##
+  customReadinessProbe: {}
+  ## @param grafana.customStartupProbe Custom startupProbe that overrides the default one
+  ##
+  customStartupProbe: {}
+  ## @param grafana.lifecycleHooks for the Grafana container(s) to automate configuration before or after startup
+  ##
+  lifecycleHooks: {}
+  ## @param grafana.sidecars Attach additional sidecar containers to the Grafana pod
+  ## Example:
+  ## sidecars:
+  ##   - name: your-image-name
+  ##     image: your-image
+  ##     imagePullPolicy: Always
+  ##     ports:
+  ##       - name: portname
+  ##         containerPort: 1234
+  ##
+  sidecars: []
+  ## @param grafana.initContainers Add additional init containers to the Grafana pod(s)
+  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/
+  ## e.g:
+  ## initContainers:
+  ##  - name: your-image-name
+  ##    image: your-image
+  ##    imagePullPolicy: Always
+  ##    command: ['sh', '-c', 'echo "hello world"']
+  ##
+  initContainers: []
+  ## @param grafana.extraVolumes Additional volumes for the Grafana pod
+  ## Example:
+  ## extraVolumes:
+  ##   - name: my-volume
+  ##     emptyDir: {}
+  ##
+  extraVolumes: []
+  ## @param grafana.extraVolumeMounts Additional volume mounts for the Grafana container
+  ## Example:
+  ## extraVolumeMounts:
+  ##   - name: my-volume
+  ##     mountPath: /opt/drycc/grafana/my-stuff
+  ##
+  extraVolumeMounts: []
+  ## @param grafana.extraEnvVarsCM Name of existing ConfigMap containing extra env vars for Grafana nodes
+  ##
+  extraEnvVarsCM: ""
+  ## @param grafana.extraEnvVarsSecret Name of existing Secret containing extra env vars for Grafana nodes
+  ##
+  extraEnvVarsSecret: ""
+  ## @param grafana.extraEnvVars Array containing extra env vars to configure Grafana
+  ## For example:
+  ## extraEnvVars:
+  ##  - name: GF_DEFAULT_INSTANCE_NAME
+  ##    value: my-instance
+  ##
+  extraEnvVars: []
+  ## @param grafana.extraConfigmaps Array to mount extra ConfigMaps to configure Grafana
+  ## For example:
+  ## extraConfigmaps:
+  ##   - name: myconfigmap
+  ##     mountPath: /opt/drycc/desired-path
+  ##     subPath: file-name.extension (optional)
+  ##     readOnly: true
+  ##
+  extraConfigmaps: []
+  ## @param grafana.command Override default container command (useful when using custom images)
+  ##
+  command: []
+  ## @param grafana.args Override default container args (useful when using custom images)
+  ##
+  args: []
+
+## @section Persistence parameters
+
+## Enable persistence using Persistent Volume Claims
+## ref: https://kubernetes.io/docs/user-guide/persistent-volumes/
+## @param persistence.enabled Enable persistence
+## @param persistence.annotations Persistent Volume Claim annotations
+## @param persistence.accessMode Persistent Volume Access Mode
+## @param persistence.accessModes Persistent Volume Access Modes
+## @param persistence.storageClass Storage class to use with the PVC
+## @param persistence.existingClaim If you want to reuse an existing claim, you can pass the name of the PVC using the existingClaim variable
+## @param persistence.size Size for the PV
+##
+persistence:
+  enabled: true
+  ## If defined, storageClassName: <storageClass>
+  ## If set to "-", storageClassName: "", which disables dynamic provisioning
+  ## If undefined (the default) or set to null, no storageClassName spec is
+  ##   set, choosing the default provisioner.  (gp2 on AWS, standard on
+  ##   GKE, AWS & OpenStack)
+  ##
+  storageClass: ""
+  annotations: {}
+  existingClaim: ""
+  accessMode: ReadWriteOnce
+  accessModes: []
+  size: 10Gi
+
+## @section RBAC parameters
+
+## @param serviceAccount.create Specifies whether a ServiceAccount should be created
+## @param serviceAccount.name The name of the ServiceAccount to use. If not set and create is true, a name is generated using the fullname template
+## @param serviceAccount.annotations Annotations to add to the ServiceAccount Metadata
+## @param serviceAccount.automountServiceAccountToken Automount service account token for the application controller service account
+serviceAccount:
+  create: true
+  name: ""
+  annotations: {}
+  automountServiceAccountToken: false
+
+## @section Traffic exposure parameters
+
+## Service parameters
+##
+service:
+  ## @param service.type Kubernetes Service type
+  ##
+  type: LoadBalancer
+  ## @param service.clusterIP Grafana service Cluster IP
+  ## e.g.:
+  ## clusterIP: None
+  ##
+  clusterIP: ""
+  ## @param service.ports.grafana Grafana service port
+  ##
+  ports:
+    grafana: 3000
+  ## @param service.nodePorts.grafana Specify the nodePort value for the LoadBalancer and NodePort service types
+  ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport
+  ##
+  nodePorts:
+    grafana: ""
+  ## @param service.loadBalancerIP loadBalancerIP if Grafana service type is `LoadBalancer` (optional, cloud specific)
+  ## ref: https://kubernetes.io/docs/user-guide/services/#type-loadbalancer
+  ##
+  loadBalancerIP: ""
+  ## @param service.loadBalancerSourceRanges loadBalancerSourceRanges if Grafana service type is `LoadBalancer` (optional, cloud specific)
+  ## ref: https://kubernetes.io/docs/user-guide/services/#type-loadbalancer
+  ## e.g:
+  ## loadBalancerSourceRanges:
+  ##   - 10.10.10.0/24
+  ##
+  loadBalancerSourceRanges: []
+  ## @param service.annotations Provide any additional annotations which may be required.
+  ## This can be used to set the LoadBalancer service type to internal only.
+  ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer
+  ##
+  annotations: {}
+  ## @param service.externalTrafficPolicy Grafana service external traffic policy
+  ## ref https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip
+  ##
+  externalTrafficPolicy: Cluster
+  ## @param service.extraPorts Extra port to expose on Redmine service
+  ##
+  extraPorts: []
+  ## @param service.sessionAffinity Session Affinity for Kubernetes service, can be "None" or "ClientIP"
+  ## If "ClientIP", consecutive client requests will be directed to the same Pod
+  ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies
+  ##
+  sessionAffinity: None
+  ## @param service.sessionAffinityConfig Additional settings for the sessionAffinity
+  ## sessionAffinityConfig:
+  ##   clientIP:
+  ##     timeoutSeconds: 300
+  ##
+  sessionAffinityConfig: {}
+## Configure the ingress resource that allows you to access the
+## Grafana installation. Set up the URL
+## ref: https://kubernetes.io/docs/user-guide/ingress/
+##
+ingress:
+  ## @param ingress.enabled Set to true to enable ingress record generation
+  ##
+  enabled: false
+  ## DEPRECATED: Use ingress.annotations instead of ingress.certManager
+  ## certManager: false
+  ##
+
+  ## @param ingress.pathType Ingress Path type
+  ##
+  pathType: ImplementationSpecific
+  ## @param ingress.apiVersion Override API Version (automatically detected if not set)
+  ##
+  apiVersion: ""
+  ## @param ingress.hostname When the ingress is enabled, a host pointing to this will be created
+  ##
+  hostname: grafana.local
+  ## @param ingress.path Default path for the ingress resource
+  ## The Path to Grafana. You may need to set this to '/*' in order to use this with ALB ingress controllers.
+  ##
+  path: /
+  ## @param ingress.annotations Additional annotations for the Ingress resource. To enable certificate autogeneration, place here your cert-manager annotations.
+  ## For a full list of possible ingress annotations, please see
+  ## ref: https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md
+  ## Use this parameter to set the required annotations for cert-manager, see
+  ## ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations
+  ##
+  ## e.g:
+  ## annotations:
+  ##   kubernetes.io/ingress.class: nginx
+  ##   cert-manager.io/cluster-issuer: cluster-issuer-name
+  ##
+  annotations: {}
+  ## @param ingress.tls Enable TLS configuration for the hostname defined at ingress.hostname parameter
+  ## TLS certificates will be retrieved from a TLS secret with name: {{- printf "%s-tls" .Values.ingress.hostname }}
+  ## You can use the ingress.secrets parameter to create this TLS secret or relay on cert-manager to create it
+  ##
+  tls: false
+  ## @param ingress.extraHosts The list of additional hostnames to be covered with this ingress record.
+  ## Most likely the hostname above will be enough, but in the event more hosts are needed, this is an array
+  ## extraHosts:
+  ## - name: grafana.local
+  ##   path: /
+  ##
+  extraHosts: []
+  ## @param ingress.extraPaths Any additional arbitrary paths that may need to be added to the ingress under the main host.
+  ## For example: The ALB ingress controller requires a special rule for handling SSL redirection.
+  ## extraPaths:
+  ## - path: /*
+  ##   backend:
+  ##     serviceName: ssl-redirect
+  ##     servicePort: use-annotation
+  ##
+  extraPaths: []
+  ## @param ingress.extraTls The tls configuration for additional hostnames to be covered with this ingress record.
+  ## see: https://kubernetes.io/docs/concepts/services-networking/ingress/#tls
+  ## extraTls:
+  ## - hosts:
+  ##     - grafana.local
+  ##   secretName: grafana.local-tls
+  ##
+  extraTls: []
+  ## @param ingress.secrets If you're providing your own certificates, please use this to add the certificates as secrets
+  ## key and certificate should start with -----BEGIN CERTIFICATE----- or
+  ## -----BEGIN RSA PRIVATE KEY-----
+  ##
+  ## name should line up with a tlsSecret set further up
+  ## If you're using cert-manager, this is unneeded, as it will create the secret for you if it is not set
+  ##
+  ## @param ingress.secrets It is also possible to create and manage the certificates outside of this helm chart
+  ## Please see README.md for more information
+  ## e.g:
+  ## - name: grafana.local-tls
+  ##   key:
+  ##   certificate:
+  ##
+  secrets: []
+  ## @param ingress.selfSigned Create a TLS secret for this ingress record using self-signed certificates generated by Helm
+  ##
+  selfSigned: false
+  ## @param ingress.ingressClassName IngressClass that will be be used to implement the Ingress (Kubernetes 1.18+)
+  ingressClassName: ""
+  ## @param ingress.extraRules Additional rules to be covered with this ingress record
+  ## ref: https://kubernetes.io/docs/concepts/services-networking/ingress/#ingress-rules
+  ## e.g:
+  ## extraRules:
+  ## - host: example.local
+  ##     http:
+  ##       path: /
+  ##       backend:
+  ##         service:
+  ##           name: example-svc
+  ##           port:
+  ##             name: http
+  ##
+  extraRules: []
+
+## @section Metrics parameters
+
+## Prometheus metrics
+##
+metrics:
+  ## @param metrics.enabled Enable the export of Prometheus metrics
+  ##
+  enabled: false
+  ## Prometheus Operator ServiceMonitor configuration
+  ## @param metrics.service.annotations [object] Annotations for Prometheus metrics service
+  ##
+  service:
+    annotations:
+      prometheus.io/scrape: "true"
+      prometheus.io/port: "3000"
+      prometheus.io/path: "/metrics"
+  serviceMonitor:
+    ## @param metrics.serviceMonitor.enabled if `true`, creates a Prometheus Operator ServiceMonitor (also requires `metrics.enabled` to be `true`)
+    ##
+    enabled: false
+    ## @param metrics.serviceMonitor.namespace Namespace in which Prometheus is running
+    ##
+    namespace: ""
+    ## @param metrics.serviceMonitor.interval Interval at which metrics should be scraped.
+    ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#endpoint
+    ## e.g:
+    ## interval: 10s
+    ##
+    interval: ""
+    ## @param metrics.serviceMonitor.scrapeTimeout Timeout after which the scrape is ended
+    ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#endpoint
+    ## e.g:
+    ## scrapeTimeout: 10s
+    ##
+    scrapeTimeout: ""
+    ## @param metrics.serviceMonitor.selector Prometheus instance selector labels
+    ## ref: https://github.com/drycc/charts/tree/master/drycc/prometheus-operator#prometheus-configuration
+    ## e.g:
+    ## selector:
+    ##   prometheus: my-prometheus
+    ##
+    selector: {}
+    ## @param metrics.serviceMonitor.relabelings RelabelConfigs to apply to samples before scraping
+    ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#relabelconfig
+    ##
+    relabelings: []
+    ## @param metrics.serviceMonitor.metricRelabelings MetricRelabelConfigs to apply to samples before ingestion
+    ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#relabelconfig
+    ##
+    metricRelabelings: []
+    ## @param metrics.serviceMonitor.honorLabels Labels to honor to add to the scrape endpoint
+    ##
+    honorLabels: false
+    ## DEPRECATED metrics.serviceMonitor.additionalLabels - It will be removed in a future release, please use metrics.serviceMonitor.labels instead
+    ## @param metrics.serviceMonitor.labels Additional custom labels for the ServiceMonitor
+    ##
+    labels: {}
+    ## @param metrics.serviceMonitor.jobLabel The name of the label on the target service to use as the job name in prometheus.
+    ##
+    jobLabel: ""
+  ## Prometheus Operator PrometheusRule configuration
+  ##
+  prometheusRule:
+    ## @param metrics.prometheusRule.enabled if `true`, creates a Prometheus Operator PrometheusRule (also requires `metrics.enabled` to be `true` and `metrics.prometheusRule.rules`)
+    ##
+    enabled: false
+    ## @param metrics.prometheusRule.namespace Namespace for the PrometheusRule Resource (defaults to the Release Namespace)
+    ##
+    namespace: ""
+    ## @param metrics.prometheusRule.additionalLabels Additional labels that can be used so PrometheusRule will be discovered by Prometheus
+    ##
+    additionalLabels: {}
+    ## @param metrics.prometheusRule.rules PrometheusRule rules to configure
+    ## e.g:
+    ##  - alert: Grafana-Down
+    ##    annotations:
+    ##      message: 'Grafana instance is down'
+    ##      summary: Grafana instance is down
+    ##    expr: absent(up{job="grafana"} == 1)
+    ##    labels:
+    ##      severity: warning
+    ##      service: grafana
+    ##    for: 5m
+    ##
+    rules: []
+## @section Grafana Image Renderer parameters
+
+imageRenderer:
+  ## @param imageRenderer.enabled Enable using a remote rendering service to render PNG images
+  ##
+  enabled: false
+  ## Bitnami Grafana Image Renderer image
+  ## ref: https://hub.docker.com/r/drycc/grafana-image-renderer/tags/
+  ## @param imageRenderer.image.registry Grafana Image Renderer image registry
+  ## @param imageRenderer.image.repository Grafana Image Renderer image repository
+  ## @param imageRenderer.image.tag Grafana Image Renderer image tag (immutable tags are recommended)
+  ## @param imageRenderer.image.digest Grafana Image Renderer image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag
+  ## @param imageRenderer.image.pullPolicy Grafana Image Renderer image pull policy
+  ## @param imageRenderer.image.pullSecrets Grafana image Renderer pull secrets
+  ##
+  image:
+    registry: docker.io
+    repository: drycc/grafana-image-renderer
+    tag: 3.6.1-debian-11-r10
+    digest: ""
+    ## Specify a imagePullPolicy
+    ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
+    ## ref: https://kubernetes.io/docs/user-guide/images/#pre-pulling-images
+    ##
+    pullPolicy: IfNotPresent
+    ## Optionally specify an array of imagePullSecrets (secrets must be manually created in the namespace)
+    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
+    ## Example:
+    ## pullSecrets:
+    ##   - myRegistryKeySecretName
+    ##
+    pullSecrets: []
+  ## @param imageRenderer.replicaCount Number of Grafana Image Renderer Pod replicas
+  ##
+  replicaCount: 1
+  ## @param imageRenderer.updateStrategy.type Grafana Image Renderer deployment strategy type.
+  ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy
+  ## e.g:
+  ## updateStrategy:
+  ##  type: RollingUpdate
+  ##  rollingUpdate:
+  ##    maxSurge: 25%
+  ##    maxUnavailable: 25%
+  ##
+  updateStrategy:
+    type: RollingUpdate
+  ## @param imageRenderer.podAnnotations Grafana Image Renderer Pod annotations
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
+  ##
+  podAnnotations: {}
+  ## @param imageRenderer.podLabels Extra labels for Grafana Image Renderer pods
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
+  ##
+  podLabels: {}
+  ## @param imageRenderer.nodeSelector Node labels for pod assignment
+  ## Ref: https://kubernetes.io/docs/user-guide/node-selection/
+  ##
+  nodeSelector: {}
+  ## @param imageRenderer.hostAliases Grafana Image Renderer pods host aliases
+  ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/
+  ##
+  hostAliases: []
+  ## @param imageRenderer.tolerations Tolerations for pod assignment
+  ## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
+  ##
+  tolerations: []
+  ## @param imageRenderer.priorityClassName Grafana Image Renderer pods' priorityClassName
+  ##
+  priorityClassName: ""
+  ## @param imageRenderer.schedulerName Name of the k8s scheduler (other than default)
+  ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
+  ##
+  schedulerName: ""
+  ## @param imageRenderer.terminationGracePeriodSeconds In seconds, time the given to the Grafana Image Renderer pod needs to terminate gracefully
+  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods
+  ##
+  terminationGracePeriodSeconds: ""
+  ## @param imageRenderer.topologySpreadConstraints Topology Spread Constraints for pod assignment
+  ## https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/
+  ## The value is evaluated as a template
+  ##
+  topologySpreadConstraints: []
+  ## @param imageRenderer.podAffinityPreset Pod affinity preset. Ignored if `affinity` is set. Allowed values: `soft` or `hard`
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity
+  ##
+  podAffinityPreset: ""
+  ## @param imageRenderer.podAntiAffinityPreset Pod anti-affinity preset. Ignored if `affinity` is set. Allowed values: `soft` or `hard`
+  ## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity
+  ##
+  podAntiAffinityPreset: soft
+  ## Node affinity preset
+  ## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity
+  ## @param imageRenderer.nodeAffinityPreset.type Node affinity preset type. Ignored if `affinity` is set. Allowed values: `soft` or `hard`
+  ## @param imageRenderer.nodeAffinityPreset.key Node label key to match Ignored if `affinity` is set.
+  ## @param imageRenderer.nodeAffinityPreset.values Node label values to match. Ignored if `affinity` is set.
+  ##
+  nodeAffinityPreset:
+    type: ""
+    ## E.g.
+    ## key: "kubernetes.io/e2e-az-name"
+    ##
+    key: ""
+    ## E.g.
+    ## values:
+    ##   - e2e-az1
+    ##   - e2e-az2
+    ##
+    values: []
+  ## @param imageRenderer.extraEnvVars Array containing extra env vars to configure Grafana
+  ## For example:
+  ## extraEnvVars:
+  ##  - name: GF_DEFAULT_INSTANCE_NAME
+  ##    value: my-instance
+  ##
+  extraEnvVars: {}
+  ## @param imageRenderer.affinity Affinity for pod assignment
+  ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
+  ## Note: podAffinityPreset, podAntiAffinityPreset, and  nodeAffinityPreset will be ignored when it's set
+  ##
+  affinity: {}
+  ## Grafana Image Renderer containers' resource requests and limits
+  ## ref: https://kubernetes.io/docs/user-guide/compute-resources/
+  ## We usually recommend not to specify default resources and to leave this as a conscious
+  ## choice for the user. This also increases chances charts run on environments with little
+  ## resources, such as Minikube. If you do want to specify resources, uncomment the following
+  ## lines, adjust them as necessary, and remove the curly braces after 'resources:'.
+  ## @param imageRenderer.resources.limits The resources limits for Grafana containers
+  ## @param imageRenderer.resources.requests The requested resources for Grafana containers
+  ##
+  resources:
+    ## Example:
+    ## limits:
+    ##    cpu: 500m
+    ##    memory: 1Gi
+    limits: {}
+    ## Examples:
+    ## requests:
+    ##    cpu: 250m
+    ##    memory: 256Mi
+    requests: {}
+  ## SecurityContext configuration
+  ## @param imageRenderer.podSecurityContext.enabled Enable securityContext on for Grafana Image Renderer deployment
+  ## @param imageRenderer.podSecurityContext.fsGroup Group to configure permissions for volumes
+  ## @param imageRenderer.podSecurityContext.runAsUser User for the security context
+  ## @param imageRenderer.podSecurityContext.runAsNonRoot Run containers as non-root users
+  ##
+  podSecurityContext:
+    enabled: true
+    runAsUser: 1001
+    fsGroup: 1001
+    runAsNonRoot: true
+  ## Configure Container Security Context
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
+  ## @param imageRenderer.containerSecurityContext.enabled Enabled Grafana Image Renderer containers' Security Context
+  ## @param imageRenderer.containerSecurityContext.runAsUser Set Grafana Image Renderer containers' Security Context runAsUser
+  ##
+  containerSecurityContext:
+    enabled: true
+    runAsUser: 1001
+  service:
+    ## @param imageRenderer.service.type Kubernetes Service type
+    ##
+    type: ClusterIP
+    ## @param imageRenderer.service.clusterIP Grafana service Cluster IP
+    ## e.g.:
+    ## clusterIP: None
+    ##
+    clusterIP: ""
+    ## @param imageRenderer.service.ports.imageRenderer Grafana Image Renderer metrics port
+    ##
+    ports:
+      imageRenderer: 8080
+    ## @param imageRenderer.service.nodePorts.grafana Specify the nodePort value for the LoadBalancer and NodePort service types
+    ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport
+    ##
+    nodePorts:
+      grafana: ""
+    ## @param imageRenderer.service.loadBalancerIP loadBalancerIP if Grafana service type is `LoadBalancer` (optional, cloud specific)
+    ## ref: https://kubernetes.io/docs/user-guide/services/#type-loadbalancer
+    ##
+    loadBalancerIP: ""
+    ## @param imageRenderer.service.loadBalancerSourceRanges loadBalancerSourceRanges if Grafana service type is `LoadBalancer` (optional, cloud specific)
+    ## ref: https://kubernetes.io/docs/user-guide/services/#type-loadbalancer
+    ## e.g:
+    ## loadBalancerSourceRanges:
+    ##   - 10.10.10.0/24
+    ##
+    loadBalancerSourceRanges: []
+    ## @param imageRenderer.service.annotations Provide any additional annotations which may be required.
+    ## This can be used to set the LoadBalancer service type to internal only.
+    ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer
+    ##
+    annotations: {}
+    ## @param imageRenderer.service.externalTrafficPolicy Grafana service external traffic policy
+    ## ref https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip
+    ##
+    externalTrafficPolicy: Cluster
+    ## @param imageRenderer.service.extraPorts Extra port to expose on Redmine service
+    ##
+    extraPorts: []
+    ## @param imageRenderer.service.sessionAffinity Session Affinity for Kubernetes service, can be "None" or "ClientIP"
+    ## If "ClientIP", consecutive client requests will be directed to the same Pod
+    ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies
+    ##
+    sessionAffinity: None
+    ## @param imageRenderer.service.sessionAffinityConfig Additional settings for the sessionAffinity
+    ## sessionAffinityConfig:
+    ##   clientIP:
+    ##     timeoutSeconds: 300
+    ##
+    sessionAffinityConfig: {}
+  ## Enable Prometheus metrics endpoint
+  ##
+  metrics:
+    ## @param imageRenderer.metrics.enabled Enable the export of Prometheus metrics
+    ##
+    enabled: false
+    ## @param imageRenderer.metrics.annotations [object] Annotations for Prometheus metrics service[object] Prometheus annotations
+    ##
+    annotations:
+      prometheus.io/scrape: "true"
+      prometheus.io/port: "8080"
+      prometheus.io/path: "/metrics"
+    ## Prometheus Operator ServiceMonitor configuration
+    ##
+    serviceMonitor:
+      ## @param imageRenderer.metrics.serviceMonitor.enabled if `true`, creates a Prometheus Operator ServiceMonitor (also requires `metrics.enabled` to be `true`)
+      ##
+      enabled: false
+      ## @param imageRenderer.metrics.serviceMonitor.namespace Namespace in which Prometheus is running
+      ##
+      namespace: ""
+      ## @param imageRenderer.metrics.serviceMonitor.jobLabel The name of the label on the target service to use as the job name in prometheus.
+      ##
+      jobLabel: ""
+      ## @param imageRenderer.metrics.serviceMonitor.interval Interval at which metrics should be scraped.
+      ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#endpoint
+      ## e.g:
+      ## interval: 10s
+      ##
+      interval: ""
+      ## @param imageRenderer.metrics.serviceMonitor.scrapeTimeout Timeout after which the scrape is ended
+      ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#endpoint
+      ## e.g:
+      ## scrapeTimeout: 10s
+      ##
+      scrapeTimeout: ""
+      ## @param imageRenderer.metrics.serviceMonitor.relabelings RelabelConfigs to apply to samples before scraping
+      ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#relabelconfig
+      ##
+      relabelings: []
+      ## @param imageRenderer.metrics.serviceMonitor.metricRelabelings MetricRelabelConfigs to apply to samples before ingestion
+      ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#relabelconfig
+      ##
+      metricRelabelings: []
+      ## @param imageRenderer.metrics.serviceMonitor.selector ServiceMonitor selector labels
+      ## ref: https://github.com/drycc/charts/tree/master/drycc/prometheus-operator#prometheus-configuration
+      ##
+      ## selector:
+      ##   prometheus: my-prometheus
+      ##
+      selector: {}
+      ## @param imageRenderer.metrics.serviceMonitor.labels Extra labels for the ServiceMonitor
+      ##
+      labels: {}
+      ## @param imageRenderer.metrics.serviceMonitor.honorLabels honorLabels chooses the metric's labels on collisions with target labels
+      ##
+      honorLabels: false
+    ## Prometheus Operator PrometheusRule configuration
+    ##
+    prometheusRule:
+      ## @param imageRenderer.metrics.prometheusRule.enabled if `true`, creates a Prometheus Operator PrometheusRule (also requires `metrics.enabled` to be `true` and `metrics.prometheusRule.rules`)
+      ##
+      enabled: false
+      ## @param imageRenderer.metrics.prometheusRule.namespace Namespace for the PrometheusRule Resource (defaults to the Release Namespace)
+      ##
+      namespace: ""
+      ## @param imageRenderer.metrics.prometheusRule.additionalLabels Additional labels that can be used so PrometheusRule will be discovered by Prometheus
+      ##
+      additionalLabels: {}
+      ## @param imageRenderer.metrics.prometheusRule.rules Prometheus Rule definitions
+      ##      - alert: Grafana-Image-Renderer-Down
+      ##        expr: absent(up{job="grafana-image-renderer"} == 1)
+      ##        for: 1s
+      ##        labels:
+      ##          severity: critical
+      ##        annotations:
+      ##          summary: Grafana Image Renderer Down
+      ##          description: "Grafana Image Renderer is down. There are no values coming from grafana-image-renderer."
+      ##
+      rules: []
+  ## @param imageRenderer.initContainers Add additional init containers to the Grafana Image Renderer pod(s)
+  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/
+  ## e.g:
+  ## initContainers:
+  ##  - name: your-image-name
+  ##    image: your-image
+  ##    imagePullPolicy: Always
+  ##    command: ['sh', '-c', 'echo "hello world"']
+  ##
+  initContainers: []
+  ## @param imageRenderer.sidecars Add additional sidecar containers to the Grafana Image Renderer pod(s)
+  ## e.g:
+  ## sidecars:
+  ##   - name: your-image-name
+  ##     image: your-image
+  ##     imagePullPolicy: Always
+  ##     ports:
+  ##       - name: portname
+  ##         containerPort: 1234
+  ##
+  sidecars: []
+  ## @param imageRenderer.extraEnvVarsCM Name of existing ConfigMap containing extra env vars for Grafana Image Renderer nodes
+  ##
+  extraEnvVarsCM: ""
+  ## @param imageRenderer.extraEnvVarsSecret Name of existing Secret containing extra env vars for Grafana Image Renderer nodes
+  ##
+  extraEnvVarsSecret: ""
+  ## @param imageRenderer.extraVolumes Optionally specify extra list of additional volumes for the Grafana Image Renderer pod(s)
+  ##
+  extraVolumes: []
+  ## @param imageRenderer.extraVolumeMounts Optionally specify extra list of additional volumeMounts for the Grafana Image Renderer container(s)
+  ##
+  extraVolumeMounts: []
+  ## @param imageRenderer.command Override default container command (useful when using custom images)
+  ##
+  command: []
+  ## @param imageRenderer.args Override default container args (useful when using custom images)
+  ##
+  args: []
+  ## @param imageRenderer.lifecycleHooks for the Grafana Image Renderer container(s) to automate configuration before or after startup
+  ##
+  lifecycleHooks: {}
+
+## @section Volume permissions init Container Parameters
+
+## 'volumePermissions' init container parameters
+## Changes the owner and group of the persistent volume mount point to runAsUser:fsGroup values
+##   based on the `grafana:podSecurityContext`/`grafana:containerSecurityContext`` parameters
+## May require setting `grafana:podSecurityContext:runAsNonRoot` to false
+##
+volumePermissions:
+  ## @param volumePermissions.enabled Enable init container that changes the owner/group of the PV mount point to `runAsUser:fsGroup`
+  ##
+  enabled: false
+  ## Bitnami Shell image
+  ## ref: https://hub.docker.com/r/drycc/drycc-shell/tags/
+  ## @param volumePermissions.image.registry Bitnami Shell image registry
+  ## @param volumePermissions.image.repository Bitnami Shell image repository
+  ## @param volumePermissions.image.tag Bitnami Shell image tag (immutable tags are recommended)
+  ## @param volumePermissions.image.digest Bitnami Shell image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag
+  ## @param volumePermissions.image.pullPolicy Bitnami Shell image pull policy
+  ## @param volumePermissions.image.pullSecrets Bitnami Shell image pull secrets
+  ##
+  image:
+    registry: docker.io
+    repository: drycc/drycc-shell
+    tag: 11-debian-11-r38
+    digest: ""
+    pullPolicy: IfNotPresent
+    ## Optionally specify an array of imagePullSecrets.
+    ## Secrets must be manually created in the namespace.
+    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
+    ## e.g:
+    ## pullSecrets:
+    ##   - myRegistryKeySecretName
+    ##
+    pullSecrets: []
+  ## Init container's resource requests and limits
+  ## ref: https://kubernetes.io/docs/user-guide/compute-resources/
+  ## @param volumePermissions.resources.limits The resources limits for the init container
+  ## @param volumePermissions.resources.requests The requested resources for the init container
+  ##
+  resources:
+    limits: {}
+    requests: {}
+  ## Init container Container Security Context
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container
+  ## @param volumePermissions.containerSecurityContext.runAsUser Set init container's Security Context runAsUser
+  ## NOTE: when runAsUser is set to special value "auto", init container will try to chown the
+  ##   data folder to auto-determined user&group, using commands: `id -u`:`id -G | cut -d" " -f2`
+  ##   "auto" is especially useful for OpenShift which has scc with dynamic user ids (and 0 is not allowed)
+  ##
+  containerSecurityContext:
+    runAsUser: 0
+
+## @section Diagnostic Mode Parameters
+
+## Enable diagnostic mode in the deployment
+##
+diagnosticMode:
+  ## @param diagnosticMode.enabled Enable diagnostic mode (all probes will be disabled and the command will be overridden)
+  ##
+  enabled: false
+  ## @param diagnosticMode.command Command to override all containers in the deployment
+  ##
+  command:
+    - sleep
+  ## @param diagnosticMode.args Args to override all containers in the deployment
+  ##
+  args:
+    - infinity
diff --git a/addons/grafana/10/plans/standard-1-2/bind.yaml b/addons/grafana/10/plans/standard-1-2/bind.yaml
new file mode 100644
index 00000000..8b14d5a5
--- /dev/null
+++ b/addons/grafana/10/plans/standard-1-2/bind.yaml
@@ -0,0 +1,29 @@
+credential:
+  {{- if (eq .Values.router.service.type "LoadBalancer") }}
+  - name: host
+    valueFrom:
+      serviceRef:
+        name: {{ printf "%s-router" (include "common.names.fullname" .) }}
+        jsonpath: '{ .status.loadBalancer.ingress[*].ip }'
+  - name: password
+    valueFrom:
+      secretKeyRef:
+        name: {{ template "common.names.fullname" . }}-admin
+        jsonpath: '{ .data.GF_SECURITY_ADMIN_PASSWORD }' 
+  - name: username
+    valueFrom:
+      secretKeyRef:
+        name: {{ template "common.names.fullname" . }}-admin
+        jsonpath: '{ .data.GF_SECURITY_ADMIN_USER }' 
+  - name: portrw
+    valueFrom:
+      secretKeyRef:
+        name: {{ template "common.names.fullname" . }}-svcbind-custom-user
+        jsonpath: '{ .data.portrw }' 
+  - name: portro
+    valueFrom:
+      secretKeyRef:
+        name: {{ template "common.names.fullname" . }}-svcbind-custom-user
+        jsonpath: '{ .data.portro }' 
+  {{- end }}
+
diff --git a/addons/grafana/10/plans/standard-1-2/meta.yaml b/addons/grafana/10/plans/standard-1-2/meta.yaml
new file mode 100644
index 00000000..5facd66f
--- /dev/null
+++ b/addons/grafana/10/plans/standard-1-2/meta.yaml
@@ -0,0 +1,6 @@
+name: "standard-10"
+id: 2b455154-8725-482a-95b2-a193c180d9b5
+description: "grafana plan which limit 1c1g ,default persistence size 10Gi."
+displayName: "1C2G"
+bindable: true
+maximum_polling_duration: 1800
diff --git a/addons/grafana/10/plans/standard-1-2/values.yaml b/addons/grafana/10/plans/standard-1-2/values.yaml
new file mode 100644
index 00000000..840b3303
--- /dev/null
+++ b/addons/grafana/10/plans/standard-1-2/values.yaml
@@ -0,0 +1,7 @@
+## @param fullnameOverride String to fully override common.names.fullname template
+##
+fullnameOverride: hb-grafana-standard-10
+
+server:
+  persistence:
+    size: 10Gi
\ No newline at end of file
