"Hace un tiempo tuve problemas con Google Drivee usando el escritorio Gnome en ubuntu 24.04 (Linux). Esto me recordó algo clave: la nube pública al fin y al cabo es almacenar y gestionar nuestros recursos personales en el ordenador de otro. Así que me propuse crear mi propia infraestructura de almacenamiento, buscando autonomía, economía y estabilidad"
Solución completa de almacenamiento distribuido desplegada con Infrastructure as Code en un cluster Kubernetes K3s con:
- ✅ Alta disponibilidad y tolerancia a fallos
- ✅ Escalabilidad horizontal automatizada (Cluster-Autoscaler + HPA + Cloud-init)
- ✅ Stack de monitoreo completo (Prometheus, Grafana, Loki, FluentBit)
- ✅ Seguridad robusta con Tailscale VPN
- ✅ Despliegue automatizado
| Categoría | Tecnología | Propósito |
|---|---|---|
| 🏗️ IaC | Terraform | Provisioning de infraestructura en Hetzner Cloud |
| 🔧 Automatización | Ansible | Configuración, despliegue y seguridad |
| 🚀 Orquestación | Kubernetes (K3s) | Gestión de contenedores y servicios |
| 🔒 Networking | Tailscale VPN | Red privada segura mesh network |
| 💾 Storage | SeaweedFS | Almacenamiento distribuido compatible S3 |
| ☁️ Colaboración | ownCloud Infinite Scale (OCIS) | Plataforma de colaboración empresarial |
| 📊 Monitoreo | Prometheus + Grafana + Loki | Observabilidad completa |
- 📈 Autoescalado Inteligente: Cluster Autoscaler + HPA (Horizontal Pod Autoscaler)
- ☁️ Inicialización Automática: Cloud-init para nodos worker dinámicos
- 🌐 Gestión de Certificados: cert-manager con Let's Encrypt
- 🔐 Seguridad Robusta: SSH hardening, UFW firewall, fail2ban
- 📊 Observabilidad: Métricas, logs y alertas centralizadas
- Soberanía de datos sin dependencia de proveedores externos
- Colaboración segura con ownCloud Infinite Scale
- Escalabilidad automática según demanda
- Monitoreo proactivo de la infraestructura
- Entorno de desarrollo con almacenamiento S3 compatible
- CI/CD pipelines con storage distribuido
- Laboratorio de Kubernetes para aprendizaje
- Backup automático de proyectos y datos
- Alternativa a Google Drive/Dropbox con control total
- Media server con almacenamiento distribuido
- Backup familiar con alta disponibilidad
- Aprendizaje de tecnologías cloud-native
┌─────────────────────────────────────────────────────────────┐
│ Hetzner Cloud Infrastructure │
│ (Terraform Managed) │
├─────────────────────────────────────────────────────────────┤
│ Tailscale VPN Network │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ Master │ │ Worker │ │ Auto-scaled │ │
│ │ Node │ │ Nodes │ │ Workers │ │
│ │ │ │ │ │ (Hetzner Cloud) │ │
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
┌─────────────────────┐
│ Applications │
├─────────────────────┤
│ • SeaweedFS (S3) │
│ • OCIS │
│ • Prometheus │
│ • Grafana │
│ • Loki │
│ • cert-manager │
└─────────────────────┘
- Provisioning de infraestructura en Hetzner Cloud
- Gestión de estado centralizada y versionada
- Creación automática de servidores, redes y SSH keys
- Outputs para integración con Ansible
- Escalado automático de nodos worker
- Integración nativa con Hetzner Cloud API
- Optimización de costos eliminando nodos no utilizados
- Configuración declarativa via Kubernetes manifests
- Escalado de pods basado en métricas
- Soporte para CPU, memoria y métricas personalizadas
- Integración con metrics-server y Prometheus
- Configuración por aplicación con targets específicos
- Inicialización automática de instancias en Hetzner Cloud
- Scripts de configuración ejecutados al boot
- Instalación de Tailscale y unión a la red VPN
- Configuración de K3s agent con parámetros específicos
- Metadata de Hetzner para provider-id y etiquetas
- Terraform 1.0+
- Ansible 2.15+
- Python 3.8+
- kubectl (para gestión del cluster)
- Cuentas activas en:
git clone https://github.com/ignaciopadron/project_digitech_distributed-storage_ha_iac.git
cd project_digitech_distributed-storage_ha_iac# Variables de Terraform
export HCLOUD_TOKEN="tu-hetzner-cloud-token"
export TF_VAR_hcloud_token="$HCLOUD_TOKEN"
# Variables de Ansible
cp ansible/group_vars/all/vault.yml.example ansible/group_vars/all/vault.yml
ansible-vault edit ansible/group_vars/all/vault.ymlcd terraform
terraform init
terraform plan
terraform apply# Flujo recomendado usando Makefile
make config # Configurar servidores y desplegar K3s
make secrets # Crear secretos de Kubernetes
make deploy-apps # Desplegar aplicacionesproject_digitech_distributed-storage_ha_iac/
├── terraform/ # 🏗️ Infraestructura como código
│ ├── main.tf # Configuración principal de Hetzner Cloud
│ ├── variables.tf # Variables de Terraform
│ ├── outputs.tf # Outputs para Ansible
│ └── inventory.tpl # Template de inventario
├── ansible/ # 🔧 Automatización con Ansible
│ ├── roles/ # Roles organizados por función
│ │ ├── 01-common/ # Configuración básica del sistema
│ │ ├── 02-security/ # SSH, firewall, fail2ban
│ │ ├── 03-docker/ # Instalación de Docker
│ │ ├── 04-network/ # Configuración de Tailscale
│ │ └── 05-k3s-cluster/ # Despliegue de K3s
│ ├── group_vars/ # Variables globales
│ ├── templates/ # Plantillas de configuración
│ ├── playbook.yml # Playbook principal
│ └── k8s-secrets-setup.yml # Gestión de secretos
├── k8s/ # 📦 Manifiestos de Kubernetes
│ ├── scaling/ # Configuración de autoescalado
│ ├── seaweedfs/ # Almacenamiento distribuido
│ ├── stack-observabilidad/ # Monitoreo (Prometheus, Grafana, Loki)
│ └── service/ # Servicios e ingress
├── scripts/ # 🛠️ Scripts de utilidad
└── Makefile # 🎯 Comandos de automatización
Configura las variables en terraform/terraform.tfvars:
# Hetzner Cloud
hcloud_token = "tu-hetzner-cloud-token"
server_type = "cx22"
location = "fsn1"
ssh_key_name = "tu-clave-ssh"
# Configuración del cluster
node_count = 3Las variables sensibles se almacenan en ansible/group_vars/all/vault.yml (encriptado):
# Tokens de API
hcloud_token: "tu-hetzner-cloud-token"
tailscale_auth_key: "tskey-auth-tu-clave"
k3s_token: "tu-k3s-token-secreto"
# Credenciales de aplicaciones
grafana_admin_password: "TU_PASSWORD_GRAFANA_SEGURO"
ocis_admin_password: "TU_PASSWORD_OCIS_SEGURO"
seaweedfs_s3_secret_key: "TU_SECRET_KEY_S3_SEGURO"El proyecto utiliza Tailscale para crear una red privada segura entre todos los nodos:
- Puerto SSH: 2211 (personalizado)
- API K8s: 6443 (accesible externamente)
- Monitoreo: Grafana (3000), Prometheus (9090)
| Aplicación | Puerto | Descripción |
|---|---|---|
| Grafana | 3000 | Dashboard de monitoreo |
| Prometheus | 9090 | Métricas del sistema |
| Loki | 3100 | Agregación de logs |
| OCIS | 9200 | Colaboración (ownCloud) |
| SeaweedFS | 8888 | Almacenamiento S3 |
- 🏗️ Terraform State: Gestión segura del estado de infraestructura
- 🔐 SSH Hardening: Puerto personalizado, solo claves públicas
- 🛡️ Firewall UFW: Configuración restrictiva
- 🚫 Fail2ban: Protección contra ataques de fuerza bruta
- 🔒 Ansible Vault: Encriptación de secretos
- 🌐 Tailscale VPN: Red privada entre nodos
- 📜 cert-manager: Certificados SSL automáticos
# Administración
- 2211 (SSH)
- 80/443 (HTTP/HTTPS)
# Kubernetes
- 6443 (API Server)
- 10250 (Kubelet)
- 2379/2380 (etcd - solo HA)
# Monitoreo
- 3000 (Grafana)
- 9090 (Prometheus)
- 3100 (Loki)
# Aplicaciones
- 9200 (OCIS)
- 8888 (SeaweedFS)El cluster incluye un sistema completo de autoescalado en dos niveles:
- Escalado automático de nodos worker basado en demanda de recursos
- Integración nativa con Hetzner Cloud API
- Creación/destrucción dinámica de servidores según carga
- Configuración via cloud-init con Tailscale y K3s preconfigurado
- Etiquetas automáticas para identificación y balanceado
- Escalado automático de pods basado en métricas de CPU/memoria
- Configuración personalizable por aplicación
- Integración con Prometheus metrics
- Respuesta rápida a picos de carga
- Inicialización automática de nuevos nodos
- Instalación y configuración de Tailscale
- Unión automática al cluster K3s
- Configuración de etiquetas y roles específicos
- Script optimizado para Hetzner Cloud metadata
Flujo de Autoescalado:
Alta Demanda → HPA escala pods → Recursos insuficientes →
Cluster Autoscaler crea nodo → Cloud-init configura nodo →
Nodo se une al cluster → Pods se programan en nuevo nodo
# Infraestructura con Terraform
cd terraform
terraform plan # Planificar cambios
terraform apply # Aplicar infraestructura
terraform destroy # Destruir infraestructura
# Gestión del cluster con Ansible
make config # Configurar y desplegar K3s
make secrets # Crear secretos de K8s
make deploy-apps # Desplegar aplicaciones
make validate # Validar configuración
# Desarrollo y debug
make debug-config # Ejecutar en modo verbose
make check-syntax # Verificar sintaxis
make ping-hosts # Verificar conectividad
make clean # Limpiar archivos temporales
# Kubernetes
export KUBECONFIG=$PWD/kubeconfig
kubectl get nodes
kubectl get pods --all-namespaces- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add some AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abre un Pull Request
Este proyecto está bajo la Licencia MIT. Ver el archivo LICENSE para más detalles.
Ignacio Padrón - System Administrator & DevOps Engineer
- 🌐 Website: ignaciopadron.es
- 💼 LinkedIn: ignaciopadron
- 📧 Email: [email protected]
- 🐙 GitHub: @ignaciopadron
Si este proyecto te ha ayudado o te parece interesante:
- ⭐ Dale una estrella en GitHub
- 🔄 Compártelo con otros desarrolladores
- 💬 Déjanos feedback en los issues
- 🤝 Contribuye con mejoras
¡Tu apoyo motiva a seguir desarrollando soluciones open source! 🚀