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

  1. 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.
  2. 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.
  3. 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.
  4. 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

  1. Formatear cada disco con ext4 y montar en /mnt/diskX.
  2. Definir punto de unión, por ejemplo /mnt/media.
  3. 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/fstab para que persista tras reinicio.

3. Exposición segura de servicios

Cloudflare Tunnel (cfd)

  • Instalar cloudflared dentro de un contenedor LXC dedicado.
  • Definir un túnel con ingress que redirija solo los puertos necesarios (por ejemplo, 80, 443 para Jellyfin y 8080 para 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 tailscale en 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/24 para 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, mergerfs fstab, cloudflared yaml).
  • 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

  1. Almacenamiento

    • Ejecutar df -h /mnt/media y comprobar que los discos aparecen combinados y que la política mostfree está activa (cat /proc/mounts | grep mergerfs).
    • Crear un archivo grande (ej. 5 GB) y observar en qué disco se escribe (lsblk + du -h).
  2. 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.
  3. Backups

    • Ejecutar restic snapshots dentro 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).

Notas adicionales

  • Temperaturas: en hardware reciclado, monitorear con lm-sensors y habilitar ventiladores bajo demanda para evitar sobrecalentamiento.
  • Redundancia mínima: aunque mergerfs no reemplaza a RAID, combinar al menos dos discos y habilitar fsck perió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 ingress a dominios estrictamente necesarios y usar access-control de 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.