Problema
En muchos homelabs la combinación de máquinas virtuales, contenedores Docker y almacenamiento ZFS genera una superficie de riesgo difícil de proteger. El síntoma típico es la pérdida parcial de datos tras una caída de energía, una actualización fallida de una VM o una corrupción de pool ZFS. Los administradores terminan con backups esporádicos, copias en discos externos sin versionado y sin un plan claro de recuperación ante desastres. La falta de una arquitectura de backup coherente también dificulta la migración de servicios entre nodos o la restauración rápida después de un fallo del hardware.
Causa
- Separación física insuficiente – Cuando el servidor de Proxmox y el de TrueNAS comparten la misma fuente de energía o la misma red sin redundancia, una única falla afecta a ambos.
- Ausencia de snapshots programados – ZFS permite snapshots instantáneos, pero sin cron jobs o herramientas de gestión los snapshots se quedan en el tiempo y consumen espacio sin control.
- Backup de VM sin consistencia de aplicación – Copiar discos de una VM mientras está en ejecución genera imágenes corruptas, sobre todo con bases de datos o contenedores que mantienen estado.
- Replicación unidireccional – Un solo túnel WireGuard hacia un sitio remoto no garantiza que los datos críticos estén disponibles si el túnel falla o el nodo remoto se queda sin espacio.
- UPS mal dimensionado o sin monitorización – Un UPS que no cubre la carga total o que no está integrado con el software de backup impide que los jobs finalicen correctamente durante un apagón.
Solución
Una estrategia robusta se basa en tres capas: snapshots locales, replicación remota y backup de aplicación consistente. El flujo recomendado es:
-
Snapshots ZFS automáticos
- Configura
cronosystemd-timersen TrueNAS para crear snapshots cada 15 minutos en los pools críticos (media,nextcloud). - Usa políticas de retención que mantengan los últimos 24 h, los últimos 7 d y los últimos 30 d.
- Configura
-
Replicación ZFS a sitio remoto
- Establece un túnel WireGuard site‑to‑site con claves pre‑shared.
- En el nodo remoto (puede ser un laptop con TrueNAS CORE) ejecuta
zfs send | sshpara replicar los snapshots. - Habilita
zfs receive -Fpara sobrescribir de forma segura y mantiene una copia de seguridad completa fuera del sitio.
-
Backup de VMs con Proxmox Backup Server (PBS)
- Despliega PBS como VM o contenedor en el mismo host que Proxmox.
- Configura los jobs de backup en modo “snapshot” para que Proxmox pause el disco virtual, tome el snapshot y lo envíe a PBS sin interrumpir los servicios.
- Activa la compresión
LZ4y la verificación de integridad (--checksum).
-
Backup de contenedores Docker
- Usa
WUD(What’s Up Docker) odocker commitdentro de un cron para exportar imágenes y volúmenes a un dataset ZFS dedicado. - Después del export, dispara un snapshot del dataset para versionar el estado.
- Usa
-
Integración con UPS
- Conecta tanto el nodo Proxmox como el TrueNAS al mismo UPS y habilita
nut(Network UPS Tools). - Configura alertas en
unboundynginx-proxy-managerpara que, al recibir señal de batería, los jobs de backup se completen y el host se apague ordenadamente.
- Conecta tanto el nodo Proxmox como el TrueNAS al mismo UPS y habilita
-
Monitoreo y alertas
- Añade
Uptime KumaoPrometheuscon exporters para PBS, ZFS y WireGuard. - Configura notificaciones por Telegram cuando un snapshot falle o la replicación se detenga.
- Añade
Alternativas
- Si el presupuesto no permite un segundo nodo TrueNAS, usa
rsync.netcomo destino de replicación ZFS. - En entornos sin WireGuard,
OpenVPNoIPsecpueden servir, siempre que el túnel sea persistente y tenga MTU ajustado para evitar fragmentación dezfs send.
Cuándo aplicar esta solución
- Síntomas: pérdida de datos tras apagones, restauraciones que fallan, espacio de disco consumido sin control, falta de copias fuera del sitio.
- Entorno: homelabs con Proxmox (VMs), TrueNAS (ZFS), Docker y servicios críticos (Nextcloud, Plex, bases de datos).
- No aplica: instalaciones sin ZFS (por ejemplo, ext4) o donde no hay acceso a un segundo nodo físico o virtual para replicación. En esos casos, la solución se reduce a backups locales y copias en la nube.
Código
# 1. Cron job para snapshots cada 15 minutos
*/15 * * * * root zfs snapshot -r tank/media@$(date +\%Y-\%m-\%dT\%H-%M-%S)
# 2. Replicación incremental a sitio remoto (ejecutar cada hora)
0 * * * * root /usr/local/bin/zfs-replicate.sh
# 3. Script de replicación (zfs-replicate.sh)
#!/bin/bash
SRC_POOL="tank/media"
DST_HOST="backup.remote"
DST_POOL="backup/media"
SSH_OPTS="-i /root/.ssh/wg_key -o StrictHostKeyChecking=no"
# Obtener último snapshot enviado
LAST_SENT=$(ssh $SSH_OPTS $DST_HOST "zfs list -t snapshot -H -o name -s creation -r $DST_POOL | tail -1")
if [[ -z $LAST_SENT ]]; then
SEND_OPTS="-R"
else
SEND_OPTS="-i $LAST_SENT"
fi
zfs send $SEND_OPTS $SRC_POOL@$(date +\%Y-\%m-\%dT\%H-%M-%S) | \
ssh $SSH_OPTS $DST_HOST "zfs receive -F $DST_POOL"
Verificación
- Snapshot – Ejecuta
zfs list -t snapshot -r tank/mediay verifica que aparecen los snapshots con la marca de tiempo esperada. - Replicación – En el nodo remoto, corre
zfs list -t snapshot -r backup/mediay comprueba que el último snapshot coincide con el origen. - PBS – En la UI de Proxmox, revisa el historial de backups; los jobs deben mostrarse como “Success”.
- UPS – Simula un corte de energía con
nut(upsc ups@localhost) y confirma que los servicios se apagan ordenadamente y que los jobs pendientes se completan. - Alertas – Genera una falla intencional (por ejemplo, elimina un snapshot) y verifica que llega la notificación a Telegram.
Notas adicionales
- Ajusta el
compressionde ZFS alz4para minimizar el impacto de los snapshots en el rendimiento. - Cuando uses
zfs send -R, el primer envío copia todo el dataset; después,-ienvía solo los cambios, ahorrando ancho de banda. - Mantén la clave SSH de WireGuard en un
vault(por ejemplo,Vaultwarden) y rota cada 90 días. - Si el pool de medios crece rápidamente, considera habilitar
dedup=onsolo en datasets de archivos estáticos (imágenes, backups). - Documenta la arquitectura en un repositorio Git; así cualquier cambio de configuración queda versionado y auditado.