Sobre el proyecto
Un repositorio de homelab personal que trata a todo el clúster como infraestructura como código. El stack se ejecuta en k3s, con playbooks, roles e inventario de Ansible como la fuente de verdad editable; un directorio de Docker Compose renderizado existe únicamente en el host Raspberry Pi. El repositorio documenta que una migración de Docker Compose a k3s se completó el 14-08-2026, cuando se desinstaló Docker del nodo servidor principal, y el registro paso a paso se conserva en una carpeta de archivo como historial.
Se describen tres hosts. daniel-box es el plano de control de k3s y ejecuta casi todas las cargas de trabajo, incluyendo el borde Traefik, Authelia SSO y emisor de OIDC, Pi-hole DNS, almacenamiento Longhorn, CrowdSec y un endpoint público de WireGuard; Ansible se ejecuta en él. daniel-server es un nodo agente de k3s con una iGPU de Intel utilizada para la transcodificación de Jellyfin/Tdarr, almacenamiento LVM y gestión de apagado UPS/NUT. daniel-pi es el único host de Docker restante, mantenido solo para LAN, que ejecuta una segunda instancia de WireGuard más un pequeño stack de utilidades.
El ingreso está centralizado en Traefik, enrutando a través de CRDs de IngressRoute, con Authelia controlando las rutas protegidas mediante el middleware forward-auth y emitiendo tokens OIDC para las aplicaciones que los soportan. Cloudflare actúa como proxy para los nombres de host públicos, mientras que los nombres locales son resueltos por Pi-hole en la LAN. El README señala que la segmentación de red no se aplica de forma generalizada: solo unos pocos roles definen NetworkPolicies, y donde existen políticas, solo las reglas de ingreso son aplicadas por el CNI del clúster.
El despliegue se divide en un play de Docker y un play de k8s, ambos impulsados por la containers_list de cada host. El play de Docker resuelve un grafo de dependencias utilizando filtros toposort personalizados y declaraciones upstream de meta/deps.yml por rol, de modo que las dependencias se inician primero y las ejecuciones etiquetadas atraen las dependencias no satisfechas. El play de k8s realiza el toposort de los roles y deriva aristas hacia Traefik (para la instalación de CRD) y Authelia (para el middleware) a partir de las propias plantillas de rol, con un depends_on explícito para las aristas que ninguna plantilla posee. Los filtros se prueban mediante unit-tests con pytest en un hook de pre-commit. Los comandos están documentados para desplegar un solo servicio, una ejecución de prueba (dry run), todo el sistema o el objetivo Pi, además de playbooks separados para el arranque y el bootstrap.
Las preocupaciones transversales incluyen secretos cifrados con SOPS/age que se descifran en tiempo de ejecución, con gitleaks en el pre-commit y un respaldo de claves fuera de banda; observabilidad con Prometheus, Grafana, Loki y Tempo con dashboards provisionados como código; respaldos programados de Longhorn hacia Backblaze B2 con procedimientos documentados de niveles por volumen y recuperación ante desastres; pull requests impulsados por Renovate para versiones de imágenes ancladas y revisiones de hooks; y herramientas de seguridad que incluyen TOTP/OIDC de Authelia, CrowdSec con agentes por nodo, fail2ban y UFW con denegación predeterminada de entrada.
Las puertas de calidad se ejecutan a través de una herramienta de pre-commit que cubre lint de YAML/JSON, ansible-lint, gitleaks, validación de plantillas renderizadas, sincronización del registro de rotación de secretos, ruff y pytest. Se incluye guía para añadir nuevos servicios, ya sea como roles de k8s que renderizan manifiestos de Deployment/Service/IngressRoute/PVC, o como roles de Docker para la Pi.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.