Lo que pasó de verdad.
Decisiones, trade-offs y algún que otro postmortem — redactados cerca del momento en que pasaron, no pulidos después con perspectiva.
Aislar el plano de gestión
Por qué la red que puede reiniciar el hipervisor se mantiene separada de la red que atiende peticiones, y qué se gana con ello cuando algo se ve comprometido.
Una brecha en los backups que aún no hemos cerrado
Los datos de producción no tienen una vía de restauración verificada fuera del nodo. Es un riesgo identificado y abierto, no un incidente resuelto.
Seis categorías, elegidas antes del primer post
Por qué este blog se lanzó con un enum fijo de seis categorías decidido de antemano, en lugar de tags abiertos que crecieran de forma orgánica.
De vuelta a desplegar todo, en cada ejecución
Una optimización por detección de rutas producía falsos negativos silenciosos en checkouts nuevos. Volvimos a desplegar todo, en cada ejecución.
Una sola VPN habría sido más simple, y errónea
Por qué el acceso de administración y el acceso general circulan por dos túneles WireGuard independientes, y por qué cada peer es un dispositivo, no una persona.
Workloads por cuello de botella, no por comodidad
En un cluster pequeño, cada nodo tiene un cuello de botella distinto. La ubicación de workloads debería seguir eso, no una plantilla uniforme para los tres.
Añadir un nuevo servicio
Qué requiere añadir un servicio a una plataforma personal, más allá de arrancar un container: red, ingress, observability, secrets y backup.
Cada página es su propio archivo
Una convención de este código: los archivos de ruta contienen directamente el markup de la página en vez de reexportar un componente, y su único trade-off honesto.
Métricas, logs y uptime no son la misma señal
Tratar métricas, logs y comprobaciones de uptime como señales distintas que responden preguntas distintas, no como un saco genérico de monitorización.