{ "$schema": "https://json-schema.org/draft-07/schema#", "title": "homeassistant values", "description": "Strict values schema (issue #68). additionalProperties is false on every chart-owned object level, so a key that the chart does not read is rejected at render time instead of being silently ignored. The only objects that stay open are the ones passed verbatim into the Kubernetes pod spec (probes, security contexts, volumes, scheduling, global) - the chart does not interpret their contents, so it cannot judge which keys are meaningful. The hardening, probe and resources blocks additionally accept null, because an erased block falls back to the chart defaults (issue #99). Note that this chart keeps replicas, resources, probes and securityContext at the TOP level, and that its ingress block deliberately follows the upstream host/tls style (documented exception in the README).", "type": "object", "additionalProperties": false, "properties": { "global": { "description": "Helm's conventional cross-chart values. Unused by this chart, kept open so an umbrella install cannot break on it.", "type": "object" }, "scaleDown": { "type": "boolean" }, "replicas": { "type": "integer", "minimum": 0 }, "service": { "type": "object", "additionalProperties": false, "properties": { "type": { "type": ["string", "null"] }, "port": { "type": ["integer", "null"], "minimum": 1, "maximum": 65535 } } }, "ingress": { "description": "Documented exception (README): this chart keeps the upstream-style flexible ingress values - host and tls lists instead of the repo's required domain/clusterIssuer pair. The list entries go verbatim into the Ingress spec, so they stay open.", "type": "object", "additionalProperties": false, "properties": { "enabled": { "type": "boolean" }, "className": { "description": "Set to \"\" to omit ingressClassName from the rendered Ingress.", "type": ["string", "null"] }, "annotations": { "type": "object" }, "hosts": { "type": ["array", "null"] }, "tls": { "type": ["array", "null"] } } }, "securityContext": { "$ref": "#/definitions/securityContext" }, "resources": { "$ref": "#/definitions/resources" }, "livenessProbe": { "$ref": "#/definitions/probe" }, "readinessProbe": { "$ref": "#/definitions/probe" }, "startupProbe": { "$ref": "#/definitions/probe" }, "env": { "$ref": "#/definitions/env" }, "volumes": { "description": "Additional volumes, rendered verbatim into the pod spec.", "type": ["array", "null"] }, "volumeMounts": { "description": "Additional volumeMounts, rendered verbatim into the container.", "type": ["array", "null"] }, "nodeSelector": { "description": "Rendered verbatim into the pod spec.", "type": ["object", "null"] }, "tolerations": { "description": "Rendered verbatim into the pod spec.", "type": ["array", "null"] }, "affinity": { "description": "Rendered verbatim into the pod spec.", "type": ["object", "null"] }, "core": { "type": "object", "additionalProperties": false, "properties": { "timezone": { "type": ["string", "null"] }, "storage": { "description": "The config PVC. Not null-safe on purpose: an erased block yields an invalid PVC rather than a silently degraded workload.", "type": "object", "additionalProperties": false, "properties": { "size": { "type": ["string", "null"] }, "storageClass": { "type": ["string", "null"] } } } } }, "secrets": { "type": "object", "additionalProperties": false, "properties": { "configSecretRef": { "description": "op:// item path holding config, http-config and recorder-config. Changing the PATH restarts the pod via the checksum/secret-ref annotation; changing the item CONTENT does not - see the note in values.yaml (#82).", "type": ["string", "null"] } } } }, "definitions": { "resources": { "description": "May be null / empty: the chart then falls back to its default requests and computed limits (issue #99) instead of rendering a container without resource accounting.", "type": ["object", "null"], "additionalProperties": false, "properties": { "limitFactor": { "type": "number", "exclusiveMinimum": 0 }, "requests": { "$ref": "#/definitions/resourceList" }, "limits": { "$ref": "#/definitions/resourceList" } } }, "resourceList": { "type": ["object", "null"], "additionalProperties": false, "properties": { "cpu": { "type": ["string", "number", "null"] }, "memory": { "type": ["string", "number", "null"] }, "ephemeral-storage": { "type": ["string", "number", "null"] }, "ephemeralStorage": { "type": ["string", "number", "null"] } } }, "env": { "type": "array", "items": { "type": "object", "additionalProperties": false, "required": ["name"], "properties": { "name": { "type": "string" }, "value": { "type": "string" }, "valueFrom": { "type": "object", "additionalProperties": false, "properties": { "secretKeyRef": { "$ref": "#/definitions/keyRef" }, "configMapKeyRef": { "$ref": "#/definitions/keyRef" } } } } } }, "keyRef": { "type": "object", "additionalProperties": false, "required": ["name", "key"], "properties": { "name": { "type": "string" }, "key": { "type": "string" } } }, "securityContext": { "description": "May be null / empty at any level: the chart then falls back to its hardening defaults (issue #99). Note that this chart's hardening is a documented deviation - the pod context is deliberately empty because the image must start as root (s6-overlay), and capabilities.add keeps NET_RAW for device discovery.", "type": ["object", "null"], "additionalProperties": false, "properties": { "pod": { "description": "Merged onto the chart's pod defaults (empty by design) and rendered as the pod's securityContext; kept open because the chart does not interpret the individual fields.", "type": ["object", "null"] }, "container": { "description": "Merged onto the chart's container defaults and rendered as the container's securityContext; kept open because the chart does not interpret the individual fields.", "type": ["object", "null"] } } }, "probe": { "description": "Merged onto the chart's probe defaults and rendered as a container probe; kept open because the chart does not interpret the individual fields. May be null / empty, which means the defaults apply (issue #99) rather than the probe disappearing.", "type": ["object", "null"] } } }