--- apiVersion: v1 kind: Namespace metadata: name: home-assistant --- apiVersion: v1 kind: Service metadata: namespace: home-assistant name: home-assistant spec: selector: app: home-assistant type: ClusterIP ports: - name: http protocol: TCP port: 80 targetPort: 8123 --- apiVersion: v1 kind: ConfigMap metadata: namespace: home-assistant name: home-assistant-config data: configuration.yaml: | # Loads default set of integrations default_config: http: use_x_forwarded_for: true trusted_proxies: - 10.42.0.0/16 # k3s pod CIDR (Traefik pod lives here) - 10.43.0.0/16 # k3s service CIDR - 10.88.20.0/24 # node subnet (Traefik runs hostNetwork-ish, forwards from 10.88.20.11) --- apiVersion: apps/v1 kind: Deployment metadata: namespace: home-assistant name: home-assistant labels: app: home-assistant spec: replicas: 1 selector: matchLabels: app: home-assistant template: metadata: labels: app: home-assistant spec: containers: - name: home-assistant image: ghcr.io/home-assistant/home-assistant:2026.7.4 resources: requests: memory: "512Mi" limits: memory: "1Gi" ports: - containerPort: 8123 volumeMounts: - name: config mountPath: /config - name: localtime mountPath: /etc/localtime readOnly: true - name: dbus mountPath: /run/dbus readOnly: true securityContext: privileged: true capabilities: add: - NET_ADMIN - NET_RAW - SYS_ADMIN # Seed configuration.yaml from the ConfigMap onto the writable PVC so that # Home Assistant has a writable configuration.yaml (required for the UI to # create/save scripts, helpers, reloads, etc.). The ConfigMap stays the # GitOps source of truth: it is re-copied on every pod start. UI-managed # entities (scripts, automations, integrations) live in /config/.storage # on the PVC and are never overwritten by this step. initContainers: - name: seed-config image: busybox:1.36 command: ["/bin/sh", "-c"] args: - | set -e echo "Seeding /config/configuration.yaml from ConfigMap..." cp /config-cm/configuration.yaml /config/configuration.yaml echo "Done." volumeMounts: - name: config mountPath: /config - name: configuration mountPath: /config-cm readOnly: true hostNetwork: true volumes: - name: config persistentVolumeClaim: claimName: home-assistant-config - name: configuration configMap: name: home-assistant-config - name: localtime hostPath: path: /etc/localtime type: File - name: dbus hostPath: path: /run/dbus type: Directory --- apiVersion: v1 kind: PersistentVolumeClaim metadata: namespace: home-assistant name: home-assistant-config spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi ---