
🌐 También en: English · Deutsch · Français
En todo homelab llega un momento en el que miras tu montón de
scripts de bash, ficheros de configuración hechos a mano y pósits que dicen cosas como
«acuérdate de hacer chown a /data antes de arrancar» y decides:
se acabó. 😅
Este es ese artículo. Hoy publico los playbooks de Ansible que uso para desplegar
y operar Nextcloud ☁️ y WordPress 📝 en un
clúster K3s de un solo nodo con AlmaLinux 9.
Todo es infraestructura como código, totalmente idempotente,
y viene con una guía de operaciones completa.
Pero antes, unas palabras de nuestros patrocinadores; es decir:
un momento de autorreflexión involuntaria. 🙂
🎉 Inciso: un momento, ¿este blog está de cumpleaños?
Ayer se cumplió exactamente un año desde que se publicó el primerísimo artículo de este blog.
Contenía exactamente dos palabras: Hallo Welt.
Que en alemán significa Hello World,
que en idioma programador significa:«Todavía no tengo ni la más remota idea de lo que hago, pero tengo un dominio, un VPS,
y porgit pushque voy a usar los dos». 🚀Sinceramente, no esperaba que este blog siguiera existiendo un año después.
La mayoría de mis proyectos personales siguen un ciclo de vida muy predecible:
git init→ arrebato de entusiasmo → tres commits →
git stash→ olvidado para siempre 💀Y sin embargo aquí estamos, con un año de uptime, lo que en términos de proyecto personal
equivale más o menos a que una empresa del Fortune 500 celebre su centenario.Las métricas son igual de impresionantes:
- 📚 varios artículos
- 👀 al menos dos lectores (uno de ellos soy yo comprobando la versión móvil)
- 📈 un dashboard de Grafana que nadie salvo yo ha mirado jamás
Logro desbloqueado. 🏆
Y ahora volvemos al tema real de este artículo.
🚀 Qué hace este repositorio
El código que publico hoy es un kit de herramientas de infraestructura basado en Ansible
que aprovisiona y gestiona cargas de trabajo en un
clúster K3s de un solo nodo con AlmaLinux 9:
- ☁️ Nextcloud: sincronización de archivos y colaboración autoalojadas,
incluido Collabora CODE para editar documentos de oficina en línea - 📝 WordPress: justo para el tipo de blog que estás leyendo ahora mismo
Ambos stacks comparten un conjunto común de roles de Ansible que cubren:
bastionado de SSH 🔐,
reglas de cortafuegos 🛡️,
monitorización 📊,
relay de correo,
actualizaciones de seguridad automáticas,
escaneo de rootkits
y registro de auditoría.
Los playbooks están diseñados para ser idempotentes:
puedes ejecutarlos una y otra vez contra un sistema en producción y solo cambian lo que de verdad
hay que cambiar. ✨
Toda la infraestructura está descrita en código.
No hay pasos manuales ocultos enterrados en una libreta en algún sitio.
Si el servidor arde (en sentido figurado, es un VPS 😄),
se puede aprovisionar uno nuevo desde cero con un único
comando ansible-playbook y una restauración desde la copia de seguridad.
☸️ Arquitectura: Nextcloud en K3s
La decisión de diseño central es un clúster de Kubernetes de un solo nodo con K3s.
Sin alta disponibilidad. Sin multi-master. Sin clúster de etcd.
Solo un servidor, un nodo, un único punto de fallo, y a propósito.
Para este tipo de carga, la sencillez operativa vale mucho más que jugar
a ser un hiperescalador en un homelab. 🙂
Aun así, K3s nos da todas las cosas buenas de Kubernetes:
- ⚙️ manifiestos declarativos
- 🔄 despliegues progresivos (rolling)
- 🔐 cert-manager
- 🌍 controladores de ingress
…sin la sobrecarga operativa.
🛡️ Seguridad: defensa en profundidad
El modelo de seguridad es por capas. No se confía en exclusiva en ningún mecanismo.
En su lugar, el stack combina varios controles independientes:
- 🔥 iptables con políticas DROP por defecto
- 🔐 configuración de SSH bastionada
- 🚫 Fail2Ban contra ataques de fuerza bruta
- ⚡ limitación de peticiones en nginx
- 🧩 SELinux en modo enforcing
- 🔑 secretos cifrados con Ansible Vault
- 🕵️ vigilancia con auditd + rkhunter
- 📦 actualizaciones de seguridad automáticas
O, dicho de otro modo:
defensa en profundidad, no
«ojalá nadie escanee este VPS». 😄
📊 Monitorización: Prometheus + Grafana
La monitorización está totalmente automatizada con:
Prometheus 📈,
Grafana 📊,
Node Exporter,
mysqld_exporter
y métricas de PHP-FPM.
El playbook importa y configura los dashboards automáticamente,
entre ellos:
- 📈 Node Exporter Full
- 🗄️ MySQL Overview
- ⚡ métricas de PHP-FPM
Porque si vas a sobredimensionar un homelab,
qué menos que tener gráficas bonitas que muestren exactamente cuánto lo has sobredimensionado. 🙂
💾 Copia de seguridad y restauración
El repositorio incluye scripts reales de copia de seguridad y restauración,
no solo buenas intenciones y una carpeta llamada
backup_final_v2_REAL. 😅
Las copias de seguridad cubren:
- 🗄️ volcados de MariaDB
- 📂 archivos de la aplicación Nextcloud
- ☁️ datos de usuario
- 🔄 restauración automatizada
Tras una restauración, volver a ejecutar el playbook garantiza que toda la configuración y
los ajustes de la aplicación vuelvan automáticamente al estado esperado.
🚀 Primeros pasos
El repositorio está pensado para una instalación limpia de AlmaLinux 9.
La puesta en marcha es sencilla a propósito:
- ⚙️ Configura tu inventario y las variables de host
- 🔐 Cifra tu vault con Ansible Vault
- 📦 Instala las colecciones de Ansible necesarias
- 🚀 Ejecuta el playbook
El despliegue es totalmente idempotente, así que los cambios futuros
(actualizaciones de imágenes, retoques del cortafuegos o apps adicionales)
se despliegan simplemente volviendo a ejecutar el playbook.
📥 Descarga
El repositorio completo está disponible como archivo ZIP.
Descomprímelo, rellena tus host_vars,
cifra tu vault y ya puedes desplegar:
unzip www_k3s.zip
cd www_k3s
ansible-galaxy collection install -r requirements.yml
ansible-vault encrypt inventory/host_vars/<host>/vault.yml
ansible-playbook nextcloud-k3s.yml --limit <host> --ask-vault-pass¿Preguntas, problemas o sugerencias? 💬
Déjalos en los comentarios.
Pequeña nota: todavía no he decidido del todo cómo quiero publicar y mantener
el código como es debido a través de GitLab, así que de momento el estado actual se ofrece como un simple
archivo ZIP 📦. A largo plazo puede que lo mueva todo a GitHub o a otro repositorio público,
pero eso sigue siendo un debate de infraestructura abierto entre yo, mi tiempo libre y varias
listas de TODO sin terminar. 😄




