Estrategia Q3 — IaC para el smart home del usuario (v1)¶
IaC pragmático para la arquitectura essentials/experimental sin k8s. No hay un role Ansible oficial que cubra HAOS (es appliance), así que el plan separa: HA Yellow gestionado mínimamente vía git de configs + backups; mini-PC gestionado fully vía Ansible + Docker Compose. Todo bajo el principio ../concepts/everything-is-code.
Contexto¶
El usuario explícitamente pidió "treat as software engineering" y "IaC". Esta página define qué se gestiona, con qué tool, dónde vive en git. Es el contrato técnico entre el código del repo y los servicios corriendo.
Contenido¶
Por componente¶
HA Yellow (essentials, HAOS)¶
- Install method: HAOS appliance. NO se gestiona via Ansible — es flasheado-via-imagen.
- Config de HA: role
bellackn/ansible-role-hass-control(ver ../sources/bellack-hass-ansible) que sincroniza bidireccionalmente vía HA API. Download mode para "yo edito en UI, sync a repo". Upload mode para "edito en repo, aplico a HA". Reemplaza el patrónscpy supera el role oficial deprecated. - Backups: scheduled HA backup → upload a NAS / S3 via Google Drive Backup addon o equivalente.
- Updates de HAOS: manualmente vía UI o
ha os updatedesde SSH addon (ver ../entities/ha-cli). - Z2M config: bind mount también → git.
Lo que NO va en git para el Yellow:
- Secrets (tokens, passwords) — usar secrets.yaml en HA + .gitignore.
- Database del recorder (binario, va a backup separado).
- database.db de Z2M (binario, backup separado).
Mini-PC (experimental + observability + agente)¶
- Host install: Debian fresh + Ansible from cold start.
- Ansible roles a tener (custom o de Galaxy):
docker— instalar Docker engine.docker-compose-deploy— pull repo, run compose up.unattended-upgrades— patches del OS automáticos.ssh-hardening— keys-only, no passwords.monitoring-stack— Loki + Promtail + Grafana + Prometheus + Gatus.-
agent-setup— instala Claude Code + creds + cron job. -
Docker Compose files en git por servicio:
compose/homeassistant.yml(HA Container, twin).compose/zigbee2mqtt.yml(si se separa Z2M del Yellow eventualmente).compose/monitoring.yml(Loki, Prometheus, Grafana, Gatus).compose/agent.yml(Claude Code worker o equivalente).-
Cada servicio con pin de versión + healthcheck.
-
Secrets: Ansible Vault (encrypted YAML en git) o sops + age. Decidir según preferencia.
Repo layout¶
homelab/
├── README.md # arranque rápido
├── ansible/
│ ├── inventory.yml
│ ├── playbooks/
│ │ ├── bootstrap-mini-pc.yml # cold start mini-PC
│ │ ├── update-services.yml
│ │ └── apply-monitoring.yml
│ ├── roles/
│ │ ├── docker/
│ │ ├── monitoring-stack/
│ │ └── agent-setup/
│ └── vault/
│ └── secrets.yml # encrypted
├── compose/
│ ├── homeassistant.yml # HA Container (twin)
│ ├── monitoring.yml
│ └── agent.yml
├── home-assistant/ # bind mount del Yellow
│ ├── automations.yaml
│ ├── scripts.yaml
│ ├── configuration.yaml
│ ├── packages/
│ └── ... # sin secrets
├── zigbee2mqtt/
│ └── configuration.yaml # template, sin coordinator binary
├── esphome/
│ ├── living-room-sensor.yaml
│ ├── kitchen-multisensor.yaml
│ └── ...
├── monitoring/
│ ├── prometheus.yml
│ ├── loki-config.yml
│ ├── promtail-config.yml
│ ├── gatus.yml
│ └── grafana-dashboards/
│ └── *.json
├── agent/
│ ├── prompts/
│ │ ├── system-skills.md
│ │ └── failure-mode-playbooks.md
│ └── cron-schedule.txt
└── docs/
├── decisions/ # ADRs
└── postmortems/
Workflow para cambios¶
local edit → commit → push → CI (lint + tests) → merge a main →
→ para mini-PC: cron de pull + compose up
→ para HA Yellow: scp manual o vía agente (patrón Beguelin)
Adopción incremental¶
Alineado con la trayectoria del agente AI:
| Paso | Qué se construye | Cuándo |
|---|---|---|
| 1 | Repo git creado, config actual del Yellow committed | Día 1 |
| 2 | Ansible inventory + bootstrap-mini-pc playbook | Semana 1 |
| 3 | Compose de monitoring desplegado en mini-PC vía Ansible | Semana 2 |
| 4 | HA Container desplegado como twin en mini-PC | Semana 2-3 |
| 5 | Compose de agent desplegado, perímetro mes 1 | Semana 3-4 |
| 6 | CI básico (lint + ha check-config) en GitHub Actions | Semana 4 |
| 7 | Z2M config templating via Ansible | Mes 2 |
| 8 | Esphome CLI en CI para build/check de configs | Mes 2 |
Lo que NO se construye¶
- Terraform: no aplica sin Proxmox. Si en el futuro hay Proxmox, se reconsidera.
- GitOps con ArgoCD/Flux: aplicaba con k8s; sin k8s, el equivalente es
git pull && docker compose up -den cron. - CI runner self-hosted: GitHub Actions free tier alcanza.
Conexión con principios¶
- ../concepts/everything-is-code: literal. Todo cambio entra por git.
- ../concepts/ai-as-operator: el agente lee/escribe en este repo via PRs.
- ../analysis/self-healing-adapted-to-user-setup: ESTA es la capa 2 (IaC) de las 5 capas.
Relaciones¶
- Implementa: Q3 (IaC) v1.
- Base de: ../analysis/self-healing-adapted-to-user-setup (capa 2).
- Habilita: ../analysis/q10-ai-tooling-strategy-v1 (el agente lee el repo) y ../analysis/q4-testing-strategy-v1 (CI corre sobre este repo).
- No usa: ../sources/ha-ansible-role-canonical (que es para HA Core deprecated).
Citas / evidencia¶
- Stack reference de madebynathan adaptado sin k8s — ../sources/madebynathan-self-healing-2026-02.
- Patrón scp + git de Beguelin — ../sources/beguelin-claude-code-ha.
- "Everything is code" — ../concepts/everything-is-code.
Abierto / gaps¶
- Ingerir
bellackn/ansible-role-hass-controlpara patrón concreto de gestión de configs HA vía API (mejor que scp para algunos casos). - Definir secret management: Ansible Vault vs sops + age. Por defecto recomiendo sops + age (más moderno, mejor UX).
- ¿Cómo se versionan los add-ons del Yellow declarativamente? HAOS no parece tener un manifest.
- Patrón concreto de drift detection: cron job que compara
ha-yellow:/configcon repo, alerta si diverge.