Backup retention policies¶
Last updated: 2026-07-12
Documento canónico de cuánto tiempo se conserva cada cosa. Si un día necesitas restaurar de hace 3 semanas y no encuentras, mira aquí primero.
Backups VM/LXC (PBS)¶
Definidos a nivel de cluster (pvesh get /cluster/backup), ejecutados desde pvescheduler. Storage destino: pbs: → PBS en 192.168.0.186 (datastore main). (El NFS terramaster en .237 es storage aparte y ningún job de backup lo usa.)
| Job | Schedule | Targets | Keep policy |
|---|---|---|---|
backup-lxc-terra |
01:00 daily | LXC 123 (cf), 155 (wg) | last=7, weekly=4, monthly=3 |
backup-node2-terra |
02:00 daily | LXC 200 (n8n) | last=7, weekly=4, monthly=3 |
backup-vm-terra |
03:00 daily | VM 208 (media), 171 (ha) | last=7, weekly=4, monthly=3 |
backup-wp-pulse-281 |
02:00 daily | LXC 281 (wp-pulse DR; excluye /srv/wp-pulse/sites, re-pullable) |
last=7, weekly=4, monthly=3 |
Vera (04:30) |
04:30 daily | LXC 100 (Vera/clawdbot) | last=7, weekly=4, monthly=3 |
edge caddy/rp (05:00) |
05:00 daily | LXC 270 (caddy), 271 (caddy), 280 (rp) | last=7, weekly=4, monthly=3 |
misc CTs (05:30) |
05:30 daily | LXC 102, 110, 172, 251 | last=7, weekly=4, monthly=3 |
Retención uniforme: los 7 jobs (lado PVE) usan
keep-last=7, keep-weekly=4, keep-monthly=3.Ajuste 2026-07-17 — datastore
mainal 86%: el datastore llegó a 558/650 GB (86%, alertapbs_datastore_main_highfiring) sobre el pool ZFSzfs-haya apretado (84% CAP, 74% frag). Causa: acumulación normal de backups en un volumen capado a 650 GB (refquota) dentro de un pool pequeño. Fix (no se subió el umbral, se atacó la causa): el prune-job del PBSmain-prunese bajó akeep-daily=5, keep-weekly=3, keep-monthly=3— más agresivo que la política PVE por-job (7/4/3), así que gobierna la retención efectiva del datastore. Luego prune (eliminó 31 snapshots) + GC. El prune dejó 138.8 GB de chunks pendientes que el GC diario reclama tras la gracia de 24 h → datastore ~62 %; el pool bajó a 82 %. Palanca de fondo pendiente: el pool (854 GB) es pequeño para lo que respalda — si vuelve a apretar, la solución real es más disco o mover el datastore fuera dezfs-ha. Comandos:proxmox-backup-manager prune-job update main-prune --keep-daily 5 --keep-weekly 3 --keep-monthly 3→... prune-job run main-prune→... garbage-collection start main.LXC 186 (PBS mismo) NO tiene backup — es el destino. Si muere, redesplegar desde cero apuntando a la storage del datastore preexistente.
mailnotification: failureen TODOS los jobs (2026-07-12): solo notifican por mail cuando algo falla. Estado se ve en morning report o víapvesh get /nodes/proxmox/tasks --type vzdump(los jobs viven en pmx-50).Hueco de CT100 cerrado (2026-07-12): LXC 100 (Vera/clawdbot) ya tiene su propio job a las 04:30. Antes quedaba fuera de cobertura. También entraron en cobertura los edge caddy/rp (270/271/280, job 05:00) y los CTs misc (102/110/172/251, job 05:30).
Guests decomisados (ya no existen ni se respaldan): LXC 253 (era clawdbot → migrado a CT100) y LXC 249 (beszel, retirado).
PBS verify-jobs: configurados en PBS UI, corren semanalmente. Verifican integridad de chunks. Si fallan, quedan visibles en la PBS UI (no hay regla Prometheus dedicada hoy; las alertas PBS activas son pbs_datastore_main_high/critical).
Replicación PVE (zfs-send incremental)¶
Definida en /etc/pve/replication.cfg. Schedule */15 (cada 15 min). NO es backup — es snapshot incremental para failover rápido. Solo guarda último snapshot común.
| Source | Target | Guests |
|---|---|---|
| proxmox2 → proxmox | LXC 123, 155 | replica every 15 min |
| proxmox → proxmox2 | VM 171 (HA) | replica every 15 min |
VM 208 NO replica (12 GB RAM, 140 GB disk → demasiado pesado para replicar cada 15 min en Celeron N5095).
Loki — logs¶
Config /home/monxas/appdata/loki-config/loki-config.yaml. Compactor con retention enabled.
- Retention: 30 días (
limits_config.retention_period: 720h). - Reject samples >7d old:
reject_old_samples_max_age: 168h(rechaza ingesta de logs viejos). - Compaction interval: 10 min.
- Delete API: habilitada (
deletion_mode: filter-and-delete). Procedimiento de delete request enproxmox_issues.md#15.
Prometheus — métricas¶
Config /home/monxas/appdata/prometheus/prometheus.yml.
- Retention: 30d / 5GB (lo que toque primero).
journald — local en hosts¶
/etc/systemd/journald.conf en proxmox-50, proxmox2-51, VM 208.
- Vacuum semanal:
journalctl --vacuum-time=14ddesdehomelab-cleanupweekly cron.
Docker logs¶
/etc/docker/daemon.json en VM 208 con log-opts:
- max-size: 10m
- max-file: 3
= máx 30MB por container antes de rotar. Suficiente para una semana de actividad normal.
logrotate — varlogs¶
/etc/logrotate.d/* y limpieza extra en weekly cron homelab-cleanup:
- Logs rotados (*.gz, *.N) >30d → borrados.
Detalles en log-rotation-config.md.
vzdump logs¶
/var/log/vzdump/*.log. Cleanup automático en weekly homelab-cleanup:
- Borra logs de VMs/LXCs que ya no existen en el cluster.
- No hay límite por edad (los activos se conservan).
n8n alert log (in-memory + sqlite)¶
Beszel Alert Direct Webhook (LXC 200) guarda últimas 200 entradas en staticData.alertLog del workflow. Se sobrescribe FIFO. Legacy — el flujo central de alertas es ahora Alertmanager (ver alerting-flow.md); beszel fue decomisado.
Healthchecks pings¶
/home/monxas/appdata/healthchecks en VM 208. Retention según plan self-hosted: por defecto 100 últimos pings + log retención 90d.
Monitor de frescura de backups (backup-freshness.sh)¶
/usr/local/sbin/backup-freshness.sh en pmx (proxmox-50), cron diario 09:00. Verifica que cada guest crítico tiene un backup en PBS más reciente que 48h; si algo está viejo o ausente alerta a Telegram vía el bot de Vera (CT100). Críticos (🔴): 100, 208, 270, 271, 280. Detalles en alerting-flow.md.
Lo que NO se guarda en ningún sitio¶
- Compose files post-edit en producción sin commit: si editas
compose.yamlen disco y no commiteas astacksrepo, no hay backup. Esto es por diseño — git es la fuente de verdad. - Configs runtime no versionadas:
/home/monxas/appdata/promtail/config.yml,/home/monxas/appdata/loki-config/loki-config.yaml,/home/monxas/appdata/prometheus/prometheus.yml. Si VM 208 muere, hay que reconstruir esos ficheros (vienen incluidos en el backup PBS, así que ESTÁN cubiertos vía vzdump). - secrets.local.md: en disco, no en git. Backup vía vzdump de VM 208.
Lo que potencialmente debería tener backup off-site (no implementado)¶
- Terramaster (PBS chunks): single-point-of-failure. Si se rompe el NAS, pierdes los 30+ días de PBS history. Mitigación pendiente: copia off-site del NAS (rclone/borg mensual a disco USB externo). Aún NO implementada. Anotado en
tech-debt.mdcuando se decida.