¿Por qué necesitás backups propios?
Aunque tu proveedor haga backups, no es suficiente depender solo de ellos. La regla 3-2-1: 3 copias, en 2 medios distintos, 1 fuera del sitio.
Nota: Los comandos de instalación de herramientas varían según el OS.
rsync,tarycronestán disponibles en todas las distribuciones Linux. Los ejemplos de instalación cubren Ubuntu/Debian y Rocky Linux/RHEL.
Estructura del sistema de backups
Creá el directorio de backups:
mkdir -p /backups/{archivos,bases-de-datos}
chmod 700 /backups
Script de backup completo
nano /usr/local/bin/backup-servidor.sh
#!/bin/bash
# ─── CONFIGURACIÓN ─────────────────────────────────────────────────────────
BACKUP_DIR="/backups"
SITIO_DIR="/var/www/tusitioweb.com"
DB_NAME="nombre_base_de_datos"
DB_USER="usuario_db"
DB_PASS="contraseña_db"
RETENER_DIAS=7
FECHA=$(date +%Y-%m-%d_%H-%M)
LOG="/var/log/backup-servidor.log"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG"
}
# ─── BACKUP DE ARCHIVOS ────────────────────────────────────────────────────
log "Iniciando backup de archivos..."
ARCHIVO_DEST="$BACKUP_DIR/archivos/sitio_$FECHA.tar.gz"
tar -czf "$ARCHIVO_DEST" "$SITIO_DIR" 2>>"$LOG"
log "OK: $ARCHIVO_DEST ($(du -sh $ARCHIVO_DEST | cut -f1))"
# ─── BACKUP DE BASE DE DATOS MySQL ────────────────────────────────────────
log "Iniciando backup de MySQL..."
DB_DEST="$BACKUP_DIR/bases-de-datos/${DB_NAME}_$FECHA.sql.gz"
mysqldump -u "$DB_USER" -p"$DB_PASS" --single-transaction --routines --triggers \
"$DB_NAME" | gzip > "$DB_DEST" 2>>"$LOG"
log "OK: $DB_DEST ($(du -sh $DB_DEST | cut -f1))"
# ─── ROTACIÓN DE BACKUPS ANTIGUOS ─────────────────────────────────────────
log "Eliminando backups de más de $RETENER_DIAS días..."
find "$BACKUP_DIR" -type f -mtime +$RETENER_DIAS -delete
log "Backup finalizado."
Dale permisos de ejecución:
chmod +x /usr/local/bin/backup-servidor.sh
Backup de PostgreSQL
Reemplazá la sección de base de datos por:
PGPASSWORD="$DB_PASS" pg_dump -U "$DB_USER" "$DB_NAME" | gzip > "$DB_DEST"
Probar el script
bash /usr/local/bin/backup-servidor.sh
ls -lh /backups/archivos/
ls -lh /backups/bases-de-datos/
Automatizar con cron
crontab -e
Todos los días a las 3 AM:
0 3 * * * /usr/local/bin/backup-servidor.sh
Cada 6 horas:
0 */6 * * * /usr/local/bin/backup-servidor.sh
Enviar backups a un servidor remoto
La copia local no protege contra fallas de disco. Enviá los backups a un lugar externo.
Opción A: rsync a otro servidor
rsync -avz --delete /backups/ usuario@IP_SERVIDOR_REMOTO:/backups/sitio/
Cron después del backup:
0 4 * * * rsync -avz /backups/ usuario@IP_REMOTO:/backups/sitio/ >> /var/log/backup-rsync.log 2>&1
Opción B: rclone a Object Storage (S3-compatible)
rclone tiene un instalador universal que funciona en todas las distribuciones:
curl https://rclone.org/install.sh | sudo bash
rclone config
rclone sync /backups/ remote:mi-bucket-backups/
Verificar que los backups funcionan
La regla más importante: verificá que podés restaurarlos.
# Verificar integridad
gzip -t /backups/bases-de-datos/nombre_db_2026-04-09.sql.gz
echo $? # Debería ser 0
# Restaurar en un entorno de prueba
gunzip -c /backups/bases-de-datos/nombre_db.sql.gz | mysql -u usuario -p db_test
Monitorear el estado
tail -f /var/log/backup-servidor.log
Los planes VPS de Host Crafter incluyen backups automáticos diarios. Si necesitás mayor frecuencia, consultanos.