
cPanel trae respaldos automáticos, pero vienen desactivados en muchos servidores nuevos. Lo descubrí revisando un servidor después de un incidente: no había ni una sola copia. Esta entrada muestra cómo dejarlos andando y cómo ponerles un tope de espacio para que nunca llenen el disco.
Antes de empezar
- Necesitas un VPS o servidor dedicado con cPanel/WHM y acceso root (desde WHM → Terminal basta).
- Los scripts se probaron en AlmaLinux 10 con cPanel 138, PHP 8.3 de EasyApache (
/opt/cpanel/ea-php83) y WP-CLI instalado en/usr/local/bin/wp. Si tu servidor usa otra versión de PHP, cambia la rutaea-php83en el script. - Pruébalos primero en un horario tranquilo y lee lo que hace cada uno antes de ejecutarlo. Se comparten tal cual, sin garantía: adáptalos a tu servidor.
1. Activar y configurar los respaldos
En WHM → Backup → Backup Configuration: activa los respaldos, tipo Compressed, elige los días (por ejemplo domingo, martes, jueves y sábado) y la retención. Una combinación razonable es 3 diarios, 2 semanales y 1 mensual: cubre la última semana y hasta un mes atrás.
También se puede hacer por terminal y revisar lo que quedó:
whmapi1 backup_config_set backup_daily_retention=3 backup_weekly_retention=2 backup_monthly_retention=1 | grep -E "result|reason"
whmapi1 backup_config_get | grep -E "backupenable|backup_daily_retention|backup_weekly_retention|backup_monthly_retention"
Los respaldos quedan en /backup/AAAA-MM-DD/, /backup/weekly/ y /backup/monthly/, con un accounts/USUARIO.tar.gz por cuenta (archivos, bases de datos y correos).
No bajes los semanales ni el mensual para ahorrar espacio: una intrusión puede pasar semanas sin detectarse, y en ese caso solo te salva un respaldo antiguo y limpio.
2. Ponerles un tope: limitar-respaldos.sh
El script suma lo que ocupan todos los respaldos y, si superan MAX_GB (25 GB por defecto), borra los más antiguos hasta quedar bajo el límite.
- Nunca borra el respaldo más reciente.
- No hace nada si hay un respaldo en curso.
- Tiene un modo
pruebaque muestra qué borraría sin borrar nada. - Anota todo en
/var/log/limitar-respaldos.log.
Instalación
Entra a WHM → Terminal (como root) y pega este bloque completo. El siguiente código crea el archivo /root/limitar-respaldos.sh, le da permisos y comprueba que quedó bien escrito:
cat > /root/limitar-respaldos.sh <<'EOF'
#!/bin/bash
# Mantiene los respaldos de /backup bajo un maximo de espacio: si se supera, borra los mas antiguos.
# Nunca borra el respaldo mas reciente. No actua si hay un respaldo en curso.
# Uso: /root/limitar-respaldos.sh aplica el limite (lo corre el cron cada dia)
# /root/limitar-respaldos.sh prueba muestra que borraria, sin borrar nada
MAX_GB=25
DIR=/backup
LOG=/var/log/limitar-respaldos.log
LIM=${LIM_BYTES:-$((MAX_GB*1024*1024*1024))}
PRUEBA=0; [ "$1" = "prueba" ] && PRUEBA=1
h(){ numfmt --to=iec --suffix=B "$1"; }
msg(){ echo "$1"; [ $PRUEBA = 0 ] && echo "$(date '+%F %T') $1" >> "$LOG"; }
if pgrep -f "cpbackup|pkgacct|bin/backup" >/dev/null 2>&1; then msg "Hay un respaldo en curso: no se hace nada"; exit 0; fi
# respaldos con fecha en /backup, /backup/weekly y /backup/monthly, del mas antiguo al mas nuevo
mapfile -t L < <(for d in "$DIR"/20??-??-?? "$DIR"/weekly/20??-??-?? "$DIR"/monthly/20??-??-??; do [ -d "$d" ] && echo "$(basename "$d") $d"; done | sort | awk '{print $2}')
[ ${#L[@]} -eq 0 ] && { msg "No hay respaldos en $DIR"; exit 0; }
T=$(du -sbc "${L[@]}" 2>/dev/null | tail -1 | cut -f1)
msg "Respaldos: ${#L[@]}, total $(h $T), limite $(h $LIM)"
i=0
while [ "$T" -gt "$LIM" ] && [ $(( ${#L[@]} - i )) -gt 1 ]; do
d="${L[$i]}"; s=$(du -sb "$d" | cut -f1)
if [ $PRUEBA = 1 ]; then
echo "Borraria: $d ($(h $s))"
else
rm -rf --one-file-system "$d" && msg "Borrado: $d ($(h $s))"
fi
T=$((T-s)); i=$((i+1))
done
if [ $i -eq 0 ]; then msg "Bajo el limite: no hay nada que borrar"; else msg "Quedan $(( ${#L[@]} - i )) respaldos, total $(h $T)"; fi
EOF
chmod 700 /root/limitar-respaldos.sh && bash -n /root/limitar-respaldos.sh && echo SCRIPT_OK
Si al final aparece SCRIPT_OK, el script está listo. Si no aparece, el bloque se pegó incompleto o con comillas cambiadas: vuelve a pegarlo.
Ajusta MAX_GB según el disco de tu servidor y prográmalo para que corra solo todos los días, después de los respaldos de la madrugada (la hora del cron es la del servidor, normalmente UTC):
(crontab -l 2>/dev/null; echo "15 7 * * * /root/limitar-respaldos.sh >/dev/null 2>&1") | crontab - && crontab -l | grep limitar
Cómo usarlo
/root/limitar-respaldos.sh prueba # qué borraría, sin borrar nada
/root/limitar-respaldos.sh # aplica el límite (normalmente lo hace el cron)
tail -20 /var/log/limitar-respaldos.log # qué hizo los días anteriores
Cómo leer el resultado
- «Respaldos: 6, total 16GB, limite 25GB» y «Bajo el limite: no hay nada que borrar»: todo en orden.
- «Borrado: /backup/AAAA-MM-DD (2.9GB)»: eliminó un respaldo antiguo para mantenerse bajo el límite; es lo esperado.
- «Hay un respaldo en curso»: lo intentará al día siguiente.
Restaurar
Para restaurar una cuenta completa: WHM → Backup → Backup Restoration → «Restore by Account», eliges la cuenta y la fecha. Para recuperar un solo archivo sin tocar el resto, extráelo a una carpeta temporal:
mkdir -p /root/restaurar && cd /root/restaurar
tar -xzf /backup/AAAA-MM-DD/accounts/USUARIO.tar.gz USUARIO/homedir/public_html/RUTA/DEL/ARCHIVO
Luego copias el archivo a su lugar, le devuelves el dueño (chown USUARIO: archivo) y borras /root/restaurar.
Estos respaldos están en el mismo disco que los sitios: si el servidor se pierde, se pierden con él. En la próxima entrada vemos cómo tener además una copia cifrada en Google Drive.





