Pulsa ESC para cerrar

Curso WordpressCurso Wordpress

Respaldos automáticos de cPanel con tope de espacio en disco

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 ruta ea-php83 en 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 prueba que 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.