"
+```
+
+# Uninstall
+```sh
+# optional: scale Graylog down to zero
+kubectl scale sts graylog -n graylog --replicas 0 && kubectl wait --for=delete pod graylog-0 -n graylog
+
+# remove chart
+helm uninstall graylog -n graylog
+```
+
+## Removing Everything
+```sh
+# CAUTION: this will delete ALL your data!
+kubectl delete pvc,secret -n graylog --all
+```
+
+# Debugging
+Get a YAML output of the values being submitted.
+```bash
+helm template graylog graylog -f your-custom-values.yaml | yq
+```
+
+# Logging
+```sh
+# Graylog app logs
+stern statefulset/graylog-app -n graylog
+# DataNode logs
+stern statefulset/graylog-datanode -n graylog
+```
+
+---
+
+# Graylog Helm Chart Values Reference
+| Key Path | Description | Default |
+|--------------------|------------------------------------------------------------------|---------|
+| `provider` | Kubernetes provider (optional). | `""` |
+| `version` | Override Graylog and Graylog Data Node version (optional). | `""` |
+| `nameOverride` | Override the `app.kubernetes.io/name` label value (optional). | `""` |
+| `fullnameOverride` | Override the fully qualified name of the application (optional). | `""` |
+
+## Global
+These values affect Graylog, DataNode, and MongoDB.
+
+| Key Path | Description | Default |
+|-----------------------------|---------------------------------------------|---------|
+| `global.existingSecretName` | Reference to an existing Kubernetes secret. | `""` |
+| `global.imagePullSecrets` | Image pull secrets for private registries. | `[]` |
+| `global.storageClass` | Storage class to use for PVCs. | `""` |
+
+
+## Graylog application
+| Key Path | Description | Default |
+|-----------------------------------------------------------------------|-------------------------------------------------------------|---------------------------------|
+| `graylog.enabled` | Enable the Graylog server. | `true` |
+| `graylog.enterprise` | Enable enterprise features. | `true` |
+| `graylog.replicas` | Number of Graylog server replicas. | `2` |
+| `graylog.service.nameOverride` | Override for service name. | `""` |
+| `graylog.service.type` | Kubernetes service type. | `ClusterIP` |
+| `graylog.service.ports.app` | Graylog web UI port. | `9000` |
+| `graylog.service.ports.metrics` | Metrics endpoint port. | `9833` |
+| `graylog.service.metrics.enabled` | Enable metrics collection. | `true` |
+| `graylog.inputs` | List of inputs to configure. | See below |
+| `graylog.plugins` | List of plugins to configure. | See below |
+| `graylog.env` | Custom environment variables. | `{}` |
+| `graylog.config.rootUsername` | Root admin username. | `"admin"` |
+| `graylog.config.rootPassword` | Root admin password. | `""` |
+| `graylog.config.customSecretPepper` | Internal hashing pepper (randomized when empty). | `""` |
+| `graylog.config.timezone` | Timezone for the Graylog server. | `"UTC"` |
+| `graylog.config.selfSignedStartup` | Use self-signed certs on startup. | `"true"` |
+| `graylog.config.serverJavaOpts` | Java options for server. | `"-Xms1g -Xmx1g"` |
+| `graylog.config.extraServerJavaOpts` | Additional Java options for server. | `[]` |
+| `graylog.config.leaderElectionMode` | Mode for leader election. | `"automatic"` |
+| `graylog.config.contentPacksAutoInstall` | Auto-install content packs. | `"true"` |
+| `graylog.config.isCloud` | Indicates if deployment is on cloud. | `"false"` |
+| `graylog.config.tls.enabled` | Enable TLS for Graylog. | `false` |
+| `graylog.config.tls.secretName` | Name of the TLS secret. | `""` |
+| `graylog.config.tls.keyPassword` | Password for the TLS key. | `""` |
+| `graylog.config.tls.updateKeyStore` | Update Java keystore with TLS cert. | `true` |
+| `graylog.config.tls.keyStorePass` | Password for the Java keystore. | `"changeit"` |
+| `graylog.config.mongodb.customUri` | Custom MongoDB connection URI. | `""` |
+| `graylog.config.mongodb.maxConnections` | Max MongoDB connections. | `"1000"` |
+| `graylog.config.mongodb.versionProbeAttempts` | MongoDB version probe attempts. | `"0"` |
+| `graylog.config.messageJournal.enabled` | Enable message journal. | `"true"` |
+| `graylog.config.messageJournal.flushAge` | Journal flush age. | `"1m"` |
+| `graylog.config.messageJournal.flushInterval` | Journal flush interval. | `"1000000"` |
+| `graylog.config.messageJournal.maxAge` | Max journal age. | `"12h"` |
+| `graylog.config.messageJournal.segmentAge` | Journal segment age. | `"1h"` |
+| `graylog.config.messageJournal.segmentSize` | Journal segment size. | `"100mb"` |
+| `graylog.config.network.connectTimeout` | Network connect timeout. | `"5s"` |
+| `graylog.config.network.enableCors` | Enable CORS. | `"false"` |
+| `graylog.config.network.enableGzip` | Enable Gzip compression. | `"true"` |
+| `graylog.config.network.maxHeaderSize` | Max header size. | `"8192"` |
+| `graylog.config.network.readTimeout` | Network read timeout. | `"10s"` |
+| `graylog.config.network.threadPoolSize` | Network thread pool size. | `"64"` |
+| `graylog.config.network.externalUri` | External URI for Graylog web interface. | `""` |
+| `graylog.config.performance.asyncEventbusProcessors` | Async event bus processors. | `"2"` |
+| `graylog.config.performance.autoRestartInputs` | Automatically restart inputs. | `"false"` |
+| `graylog.config.performance.inputBufferProcessors` | Input buffer processors. | `"2"` |
+| `graylog.config.performance.inputBufferRingSize` | Input buffer ring size. | `"65536"` |
+| `graylog.config.performance.inputBufferWaitStrategy` | Input buffer wait strategy. | `"blocking"` |
+| `graylog.config.performance.jobSchedulerConcurrencyLimits` | Scheduler concurrency limits. | `""` |
+| `graylog.config.performance.outputBatchSize` | Output batch size. | `"500"` |
+| `graylog.config.performance.outputFaultCountThreshold` | Output fault threshold. | `"5"` |
+| `graylog.config.performance.outputFaultPenaltySeconds` | Output fault penalty seconds. | `"30"` |
+| `graylog.config.performance.outputFlushInterval` | Output flush interval. | `"1"` |
+| `graylog.config.performance.outputBufferProcessorThreadsCorePoolSize` | Output processor thread pool size. | `"3"` |
+| `graylog.config.performance.outputBufferProcessors` | Output buffer processors. | `""` |
+| `graylog.config.performance.processBufferProcessors` | Process buffer processors. | `""` |
+| `graylog.config.email.enabled` | Enable email notifications. | `"false"` |
+| `graylog.config.email.senderAddress` | Email sender address. | `"graylog@example.com"` |
+| `graylog.config.email.hostname` | SMTP hostname. | `"mail.example.com"` |
+| `graylog.config.email.port` | SMTP port. | `"587"` |
+| `graylog.config.email.socketConnectionTimeout` | SMTP socket connect timeout. | `"10s"` |
+| `graylog.config.email.socketTimeout` | SMTP socket timeout. | `"10s"` |
+| `graylog.config.email.useAuth` | Use SMTP authentication. | `"true"` |
+| `graylog.config.email.useSsl` | Use SSL for SMTP. | `"false"` |
+| `graylog.config.email.useTls` | Use TLS for SMTP. | `"true"` |
+| `graylog.config.email.webInterfaceUrl` | Web interface URL for email links. | `"https://graylog.example.com"` |
+| `graylog.config.plugins.enabled` | Enable Graylog plugin system. | `false` |
+| `graylog.config.geolocation.enabled` | Enable the Geolocation Processor. | `false` |
+| `graylog.config.geolocation.maxmindGeoIp.enabled` | Enable the MaxMind GeoIP update CronJob. | `true` |
+| `graylog.config.geolocation.maxmindGeoIp.accountId` | MaxMind Account ID. | |
+| `graylog.config.geolocation.maxmindGeoIp.licenseKey` | MaxMind License Key. | |
+| `graylog.config.geolocation.maxmindGeoIp.cronSchedule` | Cron schedule expression. | `"0 0 * * *"` |
+| `graylog.config.geolocation.maxmindGeoIp.postInstallRun` | Enable post-installation helm hook Job. | `true` |
+| `graylog.config.geolocation.mmdbSources.city.url` | GeoLite2-City.mmdb URL (only for initial asset fetch). | |
+| `graylog.config.geolocation.mmdbSources.city.checksum` | GeoLite2-City.mmdb checksum (only for initial asset fetch). | |
+| `graylog.config.geolocation.mmdbSources.asn.url` | GeoLite2-ASN.mmdb URL (only for initial asset fetch). | |
+| `graylog.config.geolocation.mmdbSources.asn.checksum` | GeoLite2-ASN.mmdb checksum (only for initial asset fetch). | |
+| `graylog.config.init.assetFetch.enabled` | Enable asset fetch init. | `false` |
+| `graylog.config.init.assetFetch.skipChecksum` | Skip checksum validation for assets. | `false` |
+| `graylog.config.init.assetFetch.allowHttp` | Allow HTTP fetch for assets. | `false` |
+| `graylog.config.init.assetFetch.plugins.enabled` | Enable plugin asset fetch. | `false` |
+| `graylog.config.init.assetFetch.plugins.baseUrl` | Base URL for plugin assets. | `""` |
+| `graylog.config.init.assetFetch.geolocation.enabled` | Enable geolocation asset fetch. | `false` |
+| `graylog.config.init.assetFetch.geolocation.baseUrl` | Base URL for geolocation assets. | `""` |
+| `graylog.image.repository` | Image repository for Graylog. | `""` |
+| `graylog.image.tag` | Image tag for Graylog. | `""` |
+| `graylog.image.imagePullPolicy` | Pull policy for Graylog image. | `IfNotPresent` |
+| `graylog.image.imagePullSecrets` | Pull secrets for image. | `[]` |
+| `graylog.updateStrategy.type` | Pod update strategy for StatefulSet. | `"RollingUpdate"` |
+| `graylog.updateStrategy.rollingUpdate.maxUnavailable` | Max unavailable pods during an update. | `1` |
+| `graylog.updateStrategy.rollingUpdate.partition` | Pods that will remain unaffected by the update. | `""` |
+| `graylog.resources.limits.cpu` | CPU limit for the Graylog pod. | `"2"` |
+| `graylog.resources.limits.memory` | Memory limit for the Graylog pod. | `"2Gi"` |
+| `graylog.resources.requests.cpu` | CPU request for the Graylog pod. | `"1"` |
+| `graylog.resources.requests.memory` | Memory request for the Graylog pod. | `"1Gi"` |
+| `graylog.persistence.enabled` | Enable persistent storage. | `true` |
+| `graylog.persistence.storageClass` | Storage class for the persistent volume. | `""` |
+| `graylog.persistence.volumeNameOverride` | Override name of the persistent volume. | `""` |
+| `graylog.persistence.existingClaim` | Use an existing PVC. | `""` |
+| `graylog.persistence.mountPath` | Path where volume will be mounted. | `""` |
+| `graylog.persistence.accessModes` | Access modes for the persistent volume. | `[]` |
+| `graylog.persistence.size` | Size of the persistent volume. | `""` |
+| `graylog.persistence.annotations` | Annotations for the persistent volume claim. | `{}` |
+| `graylog.persistence.labels` | Labels for the persistent volume claim. | `{}` |
+| `graylog.persistence.selector` | Selector for the persistent volume. | `{}` |
+| `graylog.livenessProbe.enabled` | Enable liveness probe. | `true` |
+| `graylog.livenessProbe.initialDelaySeconds` | Initial delay for liveness probe. | `60` |
+| `graylog.livenessProbe.periodSeconds` | Period between liveness probe checks. | `10` |
+| `graylog.livenessProbe.timeoutSeconds` | Timeout for the liveness probe. | `5` |
+| `graylog.livenessProbe.failureThreshold` | Failure threshold for the liveness probe. | `6` |
+| `graylog.livenessProbe.successThreshold` | Success threshold for the liveness probe. | `1` |
+| `graylog.readinessProbe.enabled` | Enable readiness probe. | `true` |
+| `graylog.readinessProbe.initialDelaySeconds` | Initial delay for readiness probe. | `30` |
+| `graylog.readinessProbe.periodSeconds` | Period between readiness probe checks. | `10` |
+| `graylog.readinessProbe.timeoutSeconds` | Timeout for the readiness probe. | `5` |
+| `graylog.readinessProbe.failureThreshold` | Failure threshold for the readiness probe. | `6` |
+| `graylog.readinessProbe.successThreshold` | Success threshold for the readiness probe. | `1` |
+| `graylog.podDisruptionBudget.enabled` | Enable PodDisruptionBudget. | `false` |
+| `graylog.podDisruptionBudget.minAvailable` | Minimum available pods during disruption. | `1` |
+| `graylog.podAnnotations` | Additional pod annotations. | `{}` |
+| `graylog.nodeSelector` | Node selector for scheduling. | `{}` |
+| `graylog.tolerations` | Tolerations for scheduling. | `[]` |
+| `graylog.affinity` | Affinity rules for scheduling. | `{}` |
+| `graylog.extraEnv` | Custom EnvVar environment variables. | `[]` |
+
+
+### Graylog inputs
+| Key Path | Description | Example |
+|--------------------------------|-----------------------------------|--------------------|
+| `graylog.inputs[i].name` | Name to identify this input. | `input-gelf` |
+| `graylog.inputs[i].port` | Port exposed for this input. | `12201` |
+| `graylog.inputs[i].targetPort` | Target container port (optional). | `12201` |
+| `graylog.inputs[i].protocol` | Protocol used for this input. | `TCP` |
+
+### Graylog plugins
+| Key Path | Description | Example |
+|------------------------------------|----------------------------------------|--------------------------------------------------------------------|
+| `graylog.plugins[i].name` | Name to identify this plugin. | `graylog-plugin-slack` |
+| `graylog.plugins[i].image` | Image containing the JAR to be copied. | `myrepo/graylog-plugin-slack:1.2.3` |
+| `graylog.plugins[i].existingClaim` | Existing PVC with JAR to be copied. | `myotherapp-pvc-0` |
+| `graylog.plugins[i].url` | URL of JAR to be retrieved. | `https://myurl/plugins/graylog-plugin-slack.jar` |
+| `graylog.plugins[i].checksum` | Checksum of JAR file. | `13550350a8681c84c861aac2e5b440161c2b33a3e4f302ac680ca5b686de48de` |
+
+### Graylog environment variables
+| Key Path | Description | Example |
+|--------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `graylog.env` | Simple key/value environment variables | `graylog.env.FOO=BAR`, `graylog.env.HELLO=123` |
+| `graylog.extraEnv` | [EnvVar spec](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#environment-variables)-compliant environment variables (valueFrom, configMaps, secrets, etc.) | extraEnv:
- name: MADE_UP_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
|
+
+## Datanode
+| Key Path | Description | Default |
+|--------------------------------------------------------|-------------------------------------------------|-------------------|
+| `datanode.enabled` | Enable Graylog datanode. | `true` |
+| `datanode.replicas` | Number of datanode replicas. | `3` |
+| `datanode.service.ports.api` | API communication port. | `8999` |
+| `datanode.service.ports.data` | Data communication port. | `9200` |
+| `datanode.service.ports.config` | Configuration communication port. | `9300` |
+| `datanode.env` | Custom environment variables. | `{}` |
+| `datanode.config.nodeIdFile` | Path to datanode ID file. | `""` |
+| `datanode.config.opensearchHeap` | OpenSearch heap size. | `"2g"` |
+| `datanode.config.javaOpts` | Java options for datanode. | `"-Xms1g -Xmx1g"` |
+| `datanode.config.skipPreflightChecks` | Skip startup checks. | `"false"` |
+| `datanode.config.nodeSearchCacheSize` | Size of search cache. | `"10gb"` |
+| `datanode.config.s3ClientDefaultSecretKey` | Default S3 client secret key. | `""` |
+| `datanode.config.s3ClientDefaultAccessKey` | Default S3 client access key. | `""` |
+| `datanode.config.s3ClientDefaultEndpoint` | Default S3 client endpoint. | `""` |
+| `datanode.config.s3ClientDefaultRegion` | Default S3 client region. | `"us-east-2"` |
+| `datanode.config.s3ClientDefaultProtocol` | Default S3 client protocol. | `"http"` |
+| `datanode.config.s3ClientDefaultPathStyleAccess` | Enable path-style access for S3 client. | `"true"` |
+| `datanode.image.repository` | Datanode image repository. | `""` |
+| `datanode.image.tag` | Datanode image tag. | `""` |
+| `datanode.image.imagePullPolicy` | Image pull policy. | `IfNotPresent` |
+| `datanode.image.imagePullSecrets` | Image pull secrets. | `[]` |
+| `datanode.updateStrategy.type` | Pod update strategy for StatefulSet. | `"RollingUpdate"` |
+| `datanode.updateStrategy.rollingUpdate.maxUnavailable` | Max unavailable pods during an update. | `1` |
+| `datanode.updateStrategy.rollingUpdate.partition` | Pods that will remain unaffected by the update. | `""` |
+| `datanode.resources.limits.cpu` | CPU limit for the datanode pod. | `"1"` |
+| `datanode.resources.limits.memory` | Memory limit for the datanode pod. | `"5Gi"` |
+| `datanode.resources.requests.cpu` | CPU request for the datanode pod. | `"500m"` |
+| `datanode.resources.requests.memory` | Memory request for the datanode pod. | `"3.5Gi"` |
+| `datanode.persistence.enabled` | Enable persistence. | `true` |
+| `datanode.persistence.data.enabled` | Enable persistent volume for data. | `true` |
+| `datanode.persistence.data.storageClass` | Storage class for data PVC. | `""` |
+| `datanode.persistence.data.existingClaim` | Use existing PVC for data. | `""` |
+| `datanode.persistence.data.mountPath` | Mount path for data volume. | `""` |
+| `datanode.persistence.data.accessModes` | Access modes for data PVC. | `[]` |
+| `datanode.persistence.data.size` | Size of the data volume. | `"8Gi"` |
+| `datanode.persistence.data.annotations` | Annotations for data PVC. | `{}` |
+| `datanode.persistence.data.labels` | Labels for data PVC. | `{}` |
+| `datanode.persistence.data.selector` | Selector for data PVC. | `{}` |
+| `datanode.persistence.data.dataSource` | Data source for data PVC. | `{}` |
+| `datanode.persistence.nativeLibs.enabled` | Enable persistence for native libraries. | `false` |
+| `datanode.persistence.nativeLibs.storageClass` | Storage class for native libs PVC. | `""` |
+| `datanode.persistence.nativeLibs.existingClaim` | Use existing PVC for native libs. | `""` |
+| `datanode.persistence.nativeLibs.mountPath` | Mount path for native libs volume. | `""` |
+| `datanode.persistence.nativeLibs.accessModes` | Access modes for native libs PVC. | `[]` |
+| `datanode.persistence.nativeLibs.size` | Size of the native libs volume. | `"2Gi"` |
+| `datanode.persistence.nativeLibs.annotations` | Annotations for native libs PVC. | `{}` |
+| `datanode.persistence.nativeLibs.labels` | Labels for native libs PVC. | `{}` |
+| `datanode.persistence.nativeLibs.selector` | Selector for native libs PVC. | `{}` |
+| `datanode.livenessProbe.enabled` | Enable liveness probe. | `true` |
+| `datanode.livenessProbe.initialDelaySeconds` | Initial delay for liveness probe. | `30` |
+| `datanode.livenessProbe.periodSeconds` | Period between liveness probe checks. | `10` |
+| `datanode.livenessProbe.timeoutSeconds` | Timeout for the liveness probe. | `5` |
+| `datanode.livenessProbe.failureThreshold` | Failure threshold for the liveness probe. | `6` |
+| `datanode.livenessProbe.successThreshold` | Success threshold for the liveness probe. | `1` |
+| `datanode.readinessProbe.enabled` | Enable readiness probe. | `true` |
+| `datanode.readinessProbe.initialDelaySeconds` | Initial delay for readiness probe. | `10` |
+| `datanode.readinessProbe.periodSeconds` | Period between readiness probe checks. | `10` |
+| `datanode.readinessProbe.timeoutSeconds` | Timeout for the readiness probe. | `5` |
+| `datanode.readinessProbe.failureThreshold` | Failure threshold for the readiness probe. | `6` |
+| `datanode.readinessProbe.successThreshold` | Success threshold for the readiness probe. | `1` |
+| `datanode.podDisruptionBudget.enabled` | Enable PodDisruptionBudget. | `false` |
+| `datanode.podDisruptionBudget.minAvailable` | Minimum available pods during disruption. | `2` |
+| `datanode.podAnnotations` | Additional pod annotations. | `{}` |
+| `datanode.nodeSelector` | Node selector for scheduling datanode pods. | `{}` |
+| `datanode.tolerations` | Tolerations for scheduling. | `[]` |
+| `datanode.affinity` | Affinity rules for scheduling. | `{}` |
+| `datanode.extraEnv` | Custom EnvVar environment variables. | `[]` |
+
+
+## Service Account
+| Key Path | Description | Default |
+|-------------------------------|---------------------------------------------------------|---------|
+| `serviceAccount.create` | Create a new service account. | `true` |
+| `serviceAccount.automount` | Automount service account token. | `true` |
+| `serviceAccount.annotations` | Annotations for service account. | `{}` |
+| `serviceAccount.nameOverride` | Override name of service account. | `""` |
+| `serviceAccount.role.create` | Create a new role to bind to this service account. | `false` |
+| `serviceAccount.role.rules` | Rules for the new role to bind to this service account. | `[]` |
+
+
+## Ingress
+
+| Key Path | Description | Default |
+|-------------------------------------------------|--------------------------------------------------|---------|
+| `ingress.enabled` | Enable ingress resources. | `false` |
+| `ingress.config.defaultBackend.enabled` | Enable default backend for ingress. | `true` |
+| `ingress.config.tls.clusterIssuer.existingName` | Name of existing ClusterIssuer for TLS. | `""` |
+| `ingress.config.tls.issuer.existingName` | Name of existing Issuer for TLS. | `""` |
+| `ingress.config.tls.issuer.managed.enabled` | Enable auto-issuing of TLS certificates. | `false` |
+| `ingress.config.tls.issuer.managed.staging` | Use staging environment for auto-issued certs. | `true` |
+
+### Web Ingress
+| Key Path | Description | Default |
+|------------------------------------------|------------------------------------|--------------------------|
+| `ingress.web.enabled` | Enable ingress for Graylog Web. | `false` |
+| `ingress.web.className` | Ingress class name. | `""` |
+| `ingress.web.annotations` | Annotations for ingress resource. | `{}` |
+| `ingress.web.hosts[0].host` | Hostname for ingress (optional). | `""` |
+| `ingress.web.hosts[0].paths[0].path` | Path for routing. | `/` |
+| `ingress.web.hosts[0].paths[0].pathType` | Path matching type. | `ImplementationSpecific` |
+| `ingress.web.tls` | TLS configuration. | `[]` |
+
+### Forwarder Ingress
+| Key Path | Description | Default |
+|------------------------------------------------|---------------------------------------|--------------------------|
+| `ingress.forwarder.enabled` | Enable ingress for Graylog Forwarder. | `false` |
+| `ingress.forwarder.className` | Ingress class name. | `""` |
+| `ingress.forwarder.annotations` | Annotations for ingress resource. | `{}` |
+| `ingress.forwarder.hosts[0].host` | Hostname for ingress. | `chart-example.local` |
+| `ingress.forwarder.hosts[0].paths[0].path` | Path for routing. | `/` |
+| `ingress.forwarder.hosts[0].paths[0].pathType` | Path matching type. | `ImplementationSpecific` |
+| `ingress.forwarder.tls` | TLS configuration. | `[]` |
+
+## MongoDB
+MongoDB Community Resource configuration.
+Requires the MCK Operator: https://github.com/mongodb/mongodb-kubernetes/tree/master/docs/mongodbcommunity
+
+| Key Path | Description | Default |
+|---------------------------------------|-------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `mongodb.communityResource.enabled` | Enables creation of the `MongoDBCommunity` custom resource. | `true` |
+| `mongodb.version` | MongoDB server version for the replica set. | `"7.0.25"` |
+| `mongodb.replicas` | Number of data-bearing replica set members. | `2` |
+| `mongodb.arbiters` | Number of arbiter nodes to deploy. | `1` |
+| `mongodb.persistence.storageClass` | StorageClass to use for persistent volumes. | `""` |
+| `mongodb.persistence.size.data` | Persistent volume size for data storage. | `"10G"` |
+| `mongodb.persistence.size.logs` | Persistent volume size for MongoDB logs. | `"2G"` |
+| `mongodb.serviceAccount.create` | Create a new service account for MongoDB workloads. | `true` |
+| `mongodb.serviceAccount.automount` | Automount service account token. | `true` |
+| `mongodb.serviceAccount.annotations` | Annotations for service account. | `{}` |
+| `mongodb.serviceAccount.nameOverride` | Override name of service account. | `""` |
+| `mongodb.serviceAccount.role.create` | Create a new role to bind to this service account. | `true` |
+| `mongodb.serviceAccount.role.rules` | Rules for the new role to bind to this service account. | rules:
- apiGroups: [ "" ]
resources: [ "secrets" ]
verbs: [ "get" ]
- apiGroups: [ "" ]
resources: [ "pods" ]
verbs: [ "get", "patch", "delete" ]
|
diff --git a/graylog/templates/NOTES.txt b/charts/graylog/templates/NOTES.txt
similarity index 100%
rename from graylog/templates/NOTES.txt
rename to charts/graylog/templates/NOTES.txt
diff --git a/graylog/templates/_helpers.tpl b/charts/graylog/templates/_helpers.tpl
similarity index 100%
rename from graylog/templates/_helpers.tpl
rename to charts/graylog/templates/_helpers.tpl
diff --git a/graylog/templates/auth/mongo-sa.yaml b/charts/graylog/templates/auth/mongo-sa.yaml
similarity index 100%
rename from graylog/templates/auth/mongo-sa.yaml
rename to charts/graylog/templates/auth/mongo-sa.yaml
diff --git a/graylog/templates/auth/sa.yaml b/charts/graylog/templates/auth/sa.yaml
similarity index 100%
rename from graylog/templates/auth/sa.yaml
rename to charts/graylog/templates/auth/sa.yaml
diff --git a/graylog/templates/config/datanode.yaml b/charts/graylog/templates/config/datanode.yaml
similarity index 100%
rename from graylog/templates/config/datanode.yaml
rename to charts/graylog/templates/config/datanode.yaml
diff --git a/graylog/templates/config/fallback.yaml b/charts/graylog/templates/config/fallback.yaml
similarity index 100%
rename from graylog/templates/config/fallback.yaml
rename to charts/graylog/templates/config/fallback.yaml
diff --git a/graylog/templates/config/graylog.yaml b/charts/graylog/templates/config/graylog.yaml
similarity index 100%
rename from graylog/templates/config/graylog.yaml
rename to charts/graylog/templates/config/graylog.yaml
diff --git a/graylog/templates/config/init-graylog.yaml b/charts/graylog/templates/config/init-graylog.yaml
similarity index 100%
rename from graylog/templates/config/init-graylog.yaml
rename to charts/graylog/templates/config/init-graylog.yaml
diff --git a/graylog/templates/config/sc/aws-gp3.yaml b/charts/graylog/templates/config/sc/aws-gp3.yaml
similarity index 100%
rename from graylog/templates/config/sc/aws-gp3.yaml
rename to charts/graylog/templates/config/sc/aws-gp3.yaml
diff --git a/graylog/templates/config/secret/datanode.yaml b/charts/graylog/templates/config/secret/datanode.yaml
similarity index 100%
rename from graylog/templates/config/secret/datanode.yaml
rename to charts/graylog/templates/config/secret/datanode.yaml
diff --git a/graylog/templates/config/secret/secrets.yaml b/charts/graylog/templates/config/secret/secrets.yaml
similarity index 100%
rename from graylog/templates/config/secret/secrets.yaml
rename to charts/graylog/templates/config/secret/secrets.yaml
diff --git a/graylog/templates/custom/issuer.yaml b/charts/graylog/templates/custom/issuer.yaml
similarity index 100%
rename from graylog/templates/custom/issuer.yaml
rename to charts/graylog/templates/custom/issuer.yaml
diff --git a/graylog/templates/custom/mongo-rs.yaml b/charts/graylog/templates/custom/mongo-rs.yaml
similarity index 100%
rename from graylog/templates/custom/mongo-rs.yaml
rename to charts/graylog/templates/custom/mongo-rs.yaml
diff --git a/graylog/templates/policy/pdb/datanode.yaml b/charts/graylog/templates/policy/pdb/datanode.yaml
similarity index 100%
rename from graylog/templates/policy/pdb/datanode.yaml
rename to charts/graylog/templates/policy/pdb/datanode.yaml
diff --git a/graylog/templates/policy/pdb/graylog.yaml b/charts/graylog/templates/policy/pdb/graylog.yaml
similarity index 100%
rename from graylog/templates/policy/pdb/graylog.yaml
rename to charts/graylog/templates/policy/pdb/graylog.yaml
diff --git a/graylog/templates/service/datanode.yaml b/charts/graylog/templates/service/datanode.yaml
similarity index 100%
rename from graylog/templates/service/datanode.yaml
rename to charts/graylog/templates/service/datanode.yaml
diff --git a/graylog/templates/service/fallback.yaml b/charts/graylog/templates/service/fallback.yaml
similarity index 100%
rename from graylog/templates/service/fallback.yaml
rename to charts/graylog/templates/service/fallback.yaml
diff --git a/graylog/templates/service/graylog.yaml b/charts/graylog/templates/service/graylog.yaml
similarity index 100%
rename from graylog/templates/service/graylog.yaml
rename to charts/graylog/templates/service/graylog.yaml
diff --git a/graylog/templates/service/ingress/graylog-forwarder.yaml b/charts/graylog/templates/service/ingress/graylog-forwarder.yaml
similarity index 100%
rename from graylog/templates/service/ingress/graylog-forwarder.yaml
rename to charts/graylog/templates/service/ingress/graylog-forwarder.yaml
diff --git a/graylog/templates/service/ingress/graylog.yaml b/charts/graylog/templates/service/ingress/graylog.yaml
similarity index 100%
rename from graylog/templates/service/ingress/graylog.yaml
rename to charts/graylog/templates/service/ingress/graylog.yaml
diff --git a/graylog/templates/tests/test-credentials-secret.yaml b/charts/graylog/templates/tests/test-credentials-secret.yaml
similarity index 100%
rename from graylog/templates/tests/test-credentials-secret.yaml
rename to charts/graylog/templates/tests/test-credentials-secret.yaml
diff --git a/graylog/templates/tests/test-datanode-registration.yaml b/charts/graylog/templates/tests/test-datanode-registration.yaml
similarity index 100%
rename from graylog/templates/tests/test-datanode-registration.yaml
rename to charts/graylog/templates/tests/test-datanode-registration.yaml
diff --git a/graylog/templates/tests/test-graylog-api-health.yaml b/charts/graylog/templates/tests/test-graylog-api-health.yaml
similarity index 100%
rename from graylog/templates/tests/test-graylog-api-health.yaml
rename to charts/graylog/templates/tests/test-graylog-api-health.yaml
diff --git a/graylog/templates/tests/test-graylog-cluster-status.yaml b/charts/graylog/templates/tests/test-graylog-cluster-status.yaml
similarity index 100%
rename from graylog/templates/tests/test-graylog-cluster-status.yaml
rename to charts/graylog/templates/tests/test-graylog-cluster-status.yaml
diff --git a/graylog/templates/tests/test-mongodb-connectivity.yaml b/charts/graylog/templates/tests/test-mongodb-connectivity.yaml
similarity index 100%
rename from graylog/templates/tests/test-mongodb-connectivity.yaml
rename to charts/graylog/templates/tests/test-mongodb-connectivity.yaml
diff --git a/graylog/templates/workload/cronjobs/geoip.yaml b/charts/graylog/templates/workload/cronjobs/geoip.yaml
similarity index 100%
rename from graylog/templates/workload/cronjobs/geoip.yaml
rename to charts/graylog/templates/workload/cronjobs/geoip.yaml
diff --git a/graylog/templates/workload/fallback.yaml b/charts/graylog/templates/workload/fallback.yaml
similarity index 100%
rename from graylog/templates/workload/fallback.yaml
rename to charts/graylog/templates/workload/fallback.yaml
diff --git a/graylog/templates/workload/statefulsets/datanode.yaml b/charts/graylog/templates/workload/statefulsets/datanode.yaml
similarity index 100%
rename from graylog/templates/workload/statefulsets/datanode.yaml
rename to charts/graylog/templates/workload/statefulsets/datanode.yaml
diff --git a/graylog/templates/workload/statefulsets/graylog.yaml b/charts/graylog/templates/workload/statefulsets/graylog.yaml
similarity index 100%
rename from graylog/templates/workload/statefulsets/graylog.yaml
rename to charts/graylog/templates/workload/statefulsets/graylog.yaml
diff --git a/graylog/values.schema.json b/charts/graylog/values.schema.json
similarity index 100%
rename from graylog/values.schema.json
rename to charts/graylog/values.schema.json
diff --git a/graylog/values.yaml b/charts/graylog/values.yaml
similarity index 100%
rename from graylog/values.yaml
rename to charts/graylog/values.yaml
diff --git a/docs/TESTING.md b/docs/TESTING.md
index 500d978..703c1d9 100644
--- a/docs/TESTING.md
+++ b/docs/TESTING.md
@@ -169,6 +169,10 @@ kubectl get pods -n graylog -w
#### 2.3 Verify All Resources
+Verify that:
+- All pods reach Running state (Graylog, DataNode, MongoDB)
+- MongoDB replica set initializes properly
+
```sh
# List all deployed resources
helm get all graylog -n graylog
@@ -193,12 +197,12 @@ helm test graylog -n graylog
#### 3.2 Test Suite Details
-| Test | What It Validates |
-|--------------------------------------|---------------------------------------------------------------|
-| `graylog-test-api-health` | Graylog API responds with HTTP 200 on `/api/system/lbstatus` |
-| `graylog-test-cluster-status` | Authentication works, cluster nodes API accessible |
-| `graylog-test-datanode-registration` | Expected number of DataNodes registered |
-| `graylog-test-mongodb` | MongoDB replica set is healthy with a primary |
+| Test | What It Validates |
+|--------------------------------------|--------------------------------------------------------------|
+| `graylog-test-api-health` | Graylog API responds with HTTP 200 on `/api/system/lbstatus` |
+| `graylog-test-cluster-status` | Authentication works, cluster nodes API accessible |
+| `graylog-test-datanode-registration` | Expected number of DataNodes registered with Graylog |
+| `graylog-test-mongodb` | MongoDB replica set is healthy with a primary |
#### 3.3 Run Individual Tests
@@ -218,6 +222,12 @@ kubectl logs -n graylog graylog-test-api-health
These manual checks validate end-to-end functionality.
+Verify that:
+- Graylog UI is accessible and login works
+- DataNodes register with Graylog (visible in System > Nodes)
+- Inputs can be configured and receive data
+- Persistence survives pod restarts
+
#### 4.1 Access the Web UI
```sh
diff --git a/docs/microk8s-setup-guide.md b/docs/microk8s-setup-guide.md
new file mode 100644
index 0000000..3a3b257
--- /dev/null
+++ b/docs/microk8s-setup-guide.md
@@ -0,0 +1,72 @@
+# Setting up a MicroK8s cluster
+
+This Helm chart should ideally work on any Kubernetes cluster.
+For local development and iterative testing, we recommend using MicroK8s.
+This setup enables a rapid development workflow without the need to manage complex infrastructure.
+
+### Back up your existing Kubernetes configuration
+
+```bash
+[ -d $HOME/.kube ] && mv $HOME/.kube $HOME/.kube.old
+```
+
+## Install MicroK8s
+
+```bash
+microk8s install --cpu 8 --mem 24 --disk 200 --channel latest/stable
+```
+### Configure access to your new MicroK8s Kubernetes cluster
+
+```bash
+mkdir $HOME/.kube && microk8s config -o yaml > $HOME/.kube/config
+chmod 400 $HOME/.kube/config
+```
+
+## Enable [DNS](https://microk8s.io/docs/addon-dns) and [local storage](https://microk8s.io/docs/addon-hostpath-storage) addons
+
+```bash
+microk8s enable dns
+microk8s enable hostpath-storage
+```
+
+## Enable MetalLB
+
+You will need a valid IP address range on your network that MetalLB can use for LoadBalancer services.
+
+### Getting your CIDR
+
+Depending on your OS, you might be running MicroK8s directly on Linux or inside a virtual machine on macOS.
+Below are example commands for each setup:
+
+
+
+ Get CIDR on Linux using the eth0 interface
+ CIDR=$(ip -4 -o addr show scope global | grep 'eth0' | awk '{print $4}' | sed 's|[0-9]\+/|0/|')
+
+
+
+ Get CIDR on macOS using the MicroK8s VM address
+ CIDR=$(multipass info microk8s-vm --format json | jq -r '.info["microk8s-vm"].ipv4[0] + "/32"')
+
+
+You can verify that the CIDR was captured correctly with:
+
+```bash
+echo $CIDR
+```
+
+### Enable MetalLB addon
+
+Once you have your CIDR, you can enable metallb
+
+```bash
+microk8s enable metallb:$CIDR
+```
+
+> [!IMPORTANT]
+> If you are running **MicroK8s on macOS**, you will need to increase the memory map areas per VM process
+
+```bash
+# only if running microk8s on macOS
+multipass exec microk8s-vm -- sudo sysctl -w vm.max_map_count=262144
+```
\ No newline at end of file