Problema
Muchos entusiastas intentan montar un homelab con presupuesto limitado, reutilizando equipos de escritorio o portátiles antiguos. El reto no es solo encender la máquina; es lograr que el entorno sea estable, silencioso, eficiente en consumo y suficientemente flexible para alojar varios servicios (media, DNS, monitorización, etc.). En la práctica, aparecen fallos recurrentes de rendimiento, pérdida de datos por configuraciones de almacenamiento inadecuadas y dificultades para exponer servicios de forma segura sin abrir puertos innecesarios. El patrón típico es: hardware de consumo → Proxmox VE → mezcla de LXC y VMs → almacenamiento “casero” → acceso remoto fragmentado, y el resultado suele ser una configuración que funciona solo mientras el creador recuerda cada paso.
Causa
-
Limitaciones de hardware
- CPU de bajo número de núcleos y sin VT‑d limita la cantidad de VMs y la capacidad de aislamiento.
- Discos HDD antiguos o SSDs de consumo pueden presentar fallos tempranos y latencias altas, especialmente cuando se usan como pool único.
-
Almacenamiento sin capa de abstracción
- Mergerfs combina varios discos, pero sin una política de distribución adecuada (por ejemplo, “most free space”) se generan desbalances que saturan un disco mientras otros quedan subutilizados.
- Falta de snapshots o replicación hace que cualquier error de configuración se convierta en pérdida de datos.
-
Red y acceso remoto mal orquestados
- Abrir puertos directamente en el router para cada servicio aumenta la superficie de ataque.
- Usar Cloudflare Tunnel y Tailscale sin una arquitectura clara genera rutas conflictivas y problemas de resolución DNS.
-
Documentación insuficiente
- Cuando la única referencia es la memoria del creador, cualquier cambio futuro (añadir un contenedor, cambiar disco) se vuelve propenso a errores.
Solución
1. Arquitectura base
- Proxmox VE como hipervisor único.
- Priorizar LXC containers para servicios ligeros (Pi‑hole, Homarr, monitoring) y reservar VMs solo para aplicaciones que requieren kernel completo o hardware específico (por ejemplo, Jellyfin con transcodificación GPU).
- Crear dos pools de almacenamiento:
- Pool “fast” → SSDs de consumo (sistema operativo, contenedores críticos).
- Pool “bulk” → HDDs combinados con mergerfs para datos de media y backups.
2. Configuración de mergerfs
- Formatear cada disco con ext4 y montar en
/mnt/diskX. - Definir punto de unión, por ejemplo
/mnt/media. - Usar política mostfree para que los archivos se escriban siempre en el disco con mayor espacio libre, evitando saturación.
#!/usr/bin/env bash
# montar discos
for d in /dev/sd[b-c]; do
part=$(lsblk -nr -o NAME "$d" | head -n1)
mkfs.ext4 -F "/dev/$part"
mkdir -p "/mnt/disk${part}"
mount "/dev/$part" "/mnt/disk${part}"
done
# crear unión mergerfs
mkdir -p /mnt/media
mergerfs -o defaults,allow_other,use_ino,category.create=mostfree /mnt/disk*/ /mnt/media
- Añadir la línea anterior a
/etc/fstabpara que persista tras reinicio.
3. Exposición segura de servicios
Cloudflare Tunnel (cfd)
- Instalar
cloudflareddentro de un contenedor LXC dedicado. - Definir un túnel con
ingressque redirija solo los puertos necesarios (por ejemplo,80,443para Jellyfin y8080para Homarr).
cloudflared tunnel create homelab
cat > ~/.cloudflared/config.yml <<'EOF'
tunnel: HOMELAB_TUNNEL_ID
credentials-file: /root/.cloudflared/HOMELAB_TUNNEL_ID.json
ingress:
- hostname: jellyfin.example.com
service: http://10.0.0.101:8096
- hostname: homarr.example.com
service: http://10.0.0.102:8080
- service: http_status:404
EOF
cloudflared tunnel run HOMELAB_TUNNEL_ID
Tailscale para acceso interno
- Instalar
tailscaleen el host Proxmox y en cada contenedor que requiera acceso remoto (por ejemplo, administración de Proxmox, SSH a contenedores). - Usar la opción
--advertise-routes=10.0.0.0/24para que el nodo actúe como router interno, evitando la necesidad de VPN adicional.
4. Documentación reproducible
- Adoptar MkDocs Material (como el autor original) para generar una wiki estática.
- Mantener un repositorio Git con los archivos de configuración (
/etc/pve,mergerfsfstab,cloudflaredyaml). - Cada cambio importante (añadir disco, crear contenedor) debe acompañarse de un commit descriptivo y un pull request interno, aunque sea personal.
5. Copias de seguridad ligeras
- Utilizar Restic dentro de un contenedor LXC para snapshots diarios del pool “fast”.
- Configurar un remote backend (Backblaze B2 o un NAS externo) con cifrado.
- Programar retención: 7 días de backups incrementales + 1 semana completa.
Cuándo aplicar esta solución
- Síntomas: el homelab se vuelve ruidoso, el consumo eléctrico supera lo esperado, o los contenedores empiezan a fallar por falta de espacio en disco.
- Entorno: hardware de consumo (CPU < 8 núcleos, 8‑16 GB RAM), discos mixtos HDD/SSD, necesidad de exponer pocos servicios al exterior.
- No aplica: cuando se dispone de hardware empresarial con RAID hardware, o cuando la carga de trabajo requiere orquestación a gran escala (Kubernetes, OpenShift). En esos casos, la complejidad añadida de mergerfs y túneles puede ser innecesaria.
Código
#!/usr/bin/env bash
# Configuración completa de almacenamiento y túneles
# 1. Montar discos y mergerfs (ver sección anterior)
# 2. Instalar cloudflared y crear túnel
apt-get update && apt-get install -y cloudflared
cloudflared tunnel create homelab
# (config.yml se crea como se muestra arriba)
# 3. Instalar tailscale
curl -fsSL https://tailscale.com/install.sh | sh
tailscale up --advertise-routes=10.0.0.0/24
Verificación
-
Almacenamiento
- Ejecutar
df -h /mnt/mediay comprobar que los discos aparecen combinados y que la políticamostfreeestá activa (cat /proc/mounts | grep mergerfs). - Crear un archivo grande (ej. 5 GB) y observar en qué disco se escribe (
lsblk+du -h).
- Ejecutar
-
Túneles
- Desde una máquina externa, acceder a
https://jellyfin.example.com. El certificado debe ser emitido por Cloudflare y la conexión debe terminar en el contenedor LXC correcto (curl -I https://jellyfin.example.com). - Verificar la ruta de Tailscale con
tailscale status; los nodos deben aparecer como “Active” y la subred anunciada visible.
- Desde una máquina externa, acceder a
-
Backups
- Ejecutar
restic snapshotsdentro del contenedor de backup y confirmar que el snapshot más reciente corresponde al día actual. - Restaurar un archivo de prueba y validar integridad (
restic restore latest --target /tmp/restore-test).
- Ejecutar
Notas adicionales
- Temperaturas: en hardware reciclado, monitorear con
lm-sensorsy habilitar ventiladores bajo demanda para evitar sobrecalentamiento. - Redundancia mínima: aunque mergerfs no reemplaza a RAID, combinar al menos dos discos y habilitar
fsckperiódico reduce el riesgo de pérdida total. - Actualizaciones de Proxmox: probar primero en una VM de prueba antes de aplicar al nodo productivo; los cambios de kernel pueden romper la compatibilidad con algunos dispositivos USB de bajo consumo.
- Seguridad de túneles: limitar los
ingressa dominios estrictamente necesarios y usaraccess-controlde Cloudflare para restringir IPs de origen cuando sea posible. - Escalabilidad: si el número de contenedores supera 30, considerar separar la carga en dos nodos Proxmox y usar Ceph o ZFS como capa de almacenamiento distribuido.