ADR-0003: Sesión 2026-05-16 — saneamiento mayor + crisis NVMe¶
| Campo | Valor |
|---|---|
| Status | Implemented (2026-05-16/17) |
| Date | 2026-05-16 |
| Decision by | ramon |
| Reviewers | claude (Opus 4.7 1M) |
| Supersedes | — |
| Builds on | ADR-0001 (routing consolidation), ADR-0002 (cleanup+retention) |
Contexto¶
Sesión maratón (~7h) que arrancó con un audit en 4 ejes (infra Proxmox / observabilidad / routing / almacenamiento) y derivó en:
- Crisis NVMe NAS: ambos Ediloca EN600Pro 256GB del cache LVM murieron en cascada en <1h por firmware defectuoso (kernel reportaba
clearing duplicate IDs for nsid 1). Cache LVM auto-detached tras reboot. - Drama reboot pmx-50: tras
apt full-upgrade(kernel salto 6.17.13→7.0.2-4-pve), reboot atascado >10min, requirió power cycle físico. - 23 tareas ejecutadas del audit + improvisadas.
Documento decisiones arquitectónicas tomadas para evitar perder contexto en futuras sesiones.
Decisiones¶
D1. Reemplazo NVMe: 1× Crucial P310 500GB en writethrough (NO RAID1 writeback)¶
Decisión: cuando llegue el reemplazo (lunes 2026-05-18), montar single NVMe en modo writethrough, no recrear el RAID1+writeback que falló.
Justificación basada en datos del cache anterior (dmsetup status capturado pre-fallo): - 99.6% read hit rate sostenido durante 15 días - 11.2% write hit rate (workload es 99% reads) - 11 dirty blocks pendientes al momento del fallo (writeback aportaba poco) - 41.6 TB servidos desde NVMe vs 158 GB de misses → working set ≤ 80 GB, cabe sobrado en 500 GB
Trade-offs: - ✅ Mitad de coste (1× P310 ~110€ vs 2× 220€) - ✅ Sin md1 RAID1 layer = menos puntos de fallo - ✅ Writethrough: datos siempre en HDD, fallo SSD = solo pierdes performance, no datos - ❌ Performance escritura no acelerada (irrelevante: workload es read-heavy) - ❌ Sin redundancia cache: si SSD muere, NAS vuelve a HDD speed hasta reemplazo
Alternativas descartadas: - 2× P310 en RAID1 writeback: coste doble, beneficio marginal para workload medido - Sin cache: HDD-only sería 100-130× más lento en random reads (datos del benchmark interno)
D2. NO consolidar cloudflared con otros LXCs¶
Decisión: mantener cloudflared aislado en LXC 123 (pmx-51), no fusionar con tv-gw o wireguard.
Justificación: el audit identificó "edge LXC consolidation" como ahorro ~600MB RAM. Pero: - Cloudflared = único punto de entrada público. Cualquier fallo = sin acceso a todos los servicios - Mixing con tv-gw (L3 transparent gateway con routing tables complejas) o wireguard (kernel module) = single point of failure crítico - 600 MB de RAM en cluster con 32 GB+ libre es coste irrelevante
Alternativa descartada: LXC "edge" único — beneficio no justifica el riesgo.
D3. Kernel 7.0.2-4-pve en ambos nodos (alineado)¶
Decisión: aceptar el salto mayor 6.17.13 → 7.0.2-4 en ambos nodos, no pinear al 6.17 antiguo.
Justificación:
- proxmox-default-kernel paquete 2.0.2 → 2.1.0 promociona 7.0 como default
- Diferir = quedarse con kernel pronto deprecated, alineación rota
- Riesgo regression: bajo (Proxmox 7.0 lleva semanas en testing; ningún reporte upstream relevante para nuestro hardware Ryzen 7735HS / Celeron N5095)
Gotcha aprendido: reboot pmx-50 con VM 208 (12 GB RAM, 54 containers) puede tardar >10 min o atascarse. Política: reboots futuros de pmx-50 con qm stop 208 graceful primero, monitor a mano, considerar IP-KVM.
D4. Tunnel CF 100% via Caddy (eliminar bypass-direct)¶
Decisión: migrar los 7 bypass-tunnel HTTP a Caddy. Solo excepción permitida: SSH (backup.monxas.casa → ssh://).
Justificación:
- Logs centralizados en Caddy access log
- Certs unificados (wildcard *.monxas.casa)
- Política Sablier lazy aplicable a cualquier host
- Posibilidad de CF Access transparente sobre todo
Trade-off aceptado: hop extra Caddy añade ~10ms latencia, irrelevante para tráfico web. WebSocket (HA) maneja Caddy transparente, validado.
D5. Monitoring preventivo BTRFS/mdadm/PCIe¶
Decisión: extender smart-collect.sh del NAS con métricas que habrían detectado el defecto Ediloca desde el día 1.
Métricas añadidas:
- btrfs_corruption_errs, btrfs_read_io_errs, btrfs_write_io_errs
- mdadm_array_active, mdadm_array_degraded, mdadm_array_devices_active/total
- pcie_link_width_current vs pcie_link_width_max — el chivato real (Ediloca negociaba x1 cuando debía x4)
Reglas Grafana asociadas (folder homelab):
- BTRFS corruption en NAS (critical, for 1m)
- RAID NAS DEGRADED (critical, for 1m)
- PCIe NVMe link downgraded NAS (warning, for 5m)
Lección general: SMART self-report es necesario pero insuficiente para detectar fallos de controller/PCIe. Monitorear el bus y el RAID layer es donde está la señal real.
D6. CF Access en 6 servicios (n8n con bypass /webhook)¶
Decisión: proteger sonarr/radarr/prowlarr/bazarr/jellyseerr/n8n con CF Access policy default (allow [email protected] + monxas.com domain).
Patrón n8n: 2 apps Access en mismo host:
- n8n.monxas.casa/webhook con decision: bypass (everyone) — webhooks externos pasan sin auth
- n8n.monxas.casa con decision: allow (default policy) — UI requiere login
Path-specific matching de CF Access permite proteger root sin romper webhooks. /webhook-test/* pasa con cookie session una vez logueado (no requiere bypass explícito).
D7. Consolidación kiwix → LXC 251 (rag)¶
Decisión: mover kiwix-serve docker + zim-http systemd de LXC 250 a LXC 251 (rag), retain LXC 250 stopped 7-14d como blue-green safety.
Justificación: kiwix usa poca RAM (~200MB), rag tiene 4c/6GB. Comparten mismo NFS mount /mnt/nas/offline-kit. Consolidación libera 1 LXC overhead, simplifica inventory.
Implementación¶
23 tareas ejecutadas. Ver MEMORY.md del workspace claude para tracking. Commit dfbf677 con cambios en ~/stacks/ (cors-anywhere stack nuevo, esp-relay, Loki bind, Caddyfile, managed.caddy, etc.).
Consecuencias¶
- Performance: NAS sin cache hasta lunes (volverá a HDD speed para 0.4% de reads). PBS pasó de 90%→54% espacio libre (quota subida 300G→500G).
- Seguridad: 6 servicios nuevos detrás de CF Access, attack surface reducida.
- Visibilidad: cluster pmx-51 vuelve a Loki tras días ciego, smart-collect extendido detectará próximo fallo HW antes.
- Mantenibilidad: 1 LXC menos (250), 1 cloudflared más simple (no consolidado).
- Riesgo residual: NVMe sin redundancia mientras llega P310. Snapshots BTRFS daily compensan.
Pendientes inmediatos¶
- Instalar Crucial P310 500GB cuando llegue (lunes 18-may)
- Decidir destino LXC 250 (destroy en 7-14d si todo OK)
- ETMF stack (working tree pendiente, no en commit)
- Considerar smart plugs Shelly + IP-KVM para drama futuro
Lecciones grabadas en memoria¶
nas_nvme_failure_20260516.md(nuevo)cf_access_homelab.md(nuevo)proxmox_issues.md#26 (reboot stuck) y #27 (NVMe cascade)observability_stack.md(Loki bind, 5 reglas preventivas)terramaster_f4423_packet_loss.md(NVMe MUERTA, monitoring extendido)