Hoy quiero compartir tres script rápidos para gestión de respaldo local y remoto mediante tareas CRON
, porque no siempre se requieren cosas demasiado complicadas para lidiar con problemas sencillos.
La arquitectura del sistema es simple. Tenemos un servidor. Muy probablemente al limite de capacidad, porque uno es tacaño y no contrata mas gigas y por lo mismo, es tacaño y no contrata un sistema de respaldo automatizado. También tenemos un equipo local con mucha capacidad, porque ahora las computadoras vienen con Teras para regalar. De preferencia, una computadora con Linux.
Desarrollo
Asumo que el sistema de servidor se encuentra en internet, por lo que no están contempladas muchas maromas. Lo que haremos ahora se puede replicar en una arquitectura de túnel inverso (el servidor se conecta a un cliente que esta tras NAT mediante un túnel inverso) o mediante una VPN (no de las que usan para saltarse restricciones de navegación, sino una red privada virtual, una red virtual en la que cliente y servidor conviven y se comunican sobre una red real, generalmente por internet), por lo que en el servidor, se deberá tener instalado como mínimo, un servidor SSH y los paquetes de ZIP
y UNZIP
.
Sistema de bajo presupuesto de respaldos para servidores
La idea es permitir que un servidor web tenga respaldos regulares de tal manera que se puedan restaurar en caso de emergencias. Aunque este diseño aplica a un servidor web del stack LAMP
, puede modificarse fácilmente para cualquier otra estructura deseada.
Servidor
Vamos a preparar primero el servidor.
Tras confirmar que los paquetes de SSH y ZIP están instalados, debemos crear un script que se encargue de respaldar las bases de datos. Ademas, se deben poseer privilegios de administrador para realizar este proceso.
#!/bin/bash
# Credenciales
user="usuario"
password="contraseña"
host="localhost"
db_name="basedatos"
# Otras opciones
backup_path="/root/respaldo"
date=$(date +"%d-%b-%Y")
# Permisos de archivo
umask 177
# Dump Base de datos
mysqldump --user=$user --password=$password --host=$host --all-databases> $backup_path/$db_name-$date.sql
#Comprimir el archivo
tar -czvf $backup_path/$db_name-$date.sql.tar.gz $backup_path/$db_name-$date.sql
rm $backup_path/$db_name-$date.sql
# Borrando registros con mas de 7 dias de antigüedad
find $backup_path/* -mtime +7 -exec rm {} \;
Este script permite guardar un volcado de la base de datos completa a un archivo cuyo nombre tiene el formato de día, mes y año y comprime utilizando tar. También permite borrar archivos mas antiguos de 7 días de antigüedad.
Para utilizarlo, se deberán cambiar las credenciales y rutas según la necesidad.
user | Nombre de usuario en la base de datos. De preferencia root |
password | Contraseña de la base de datos. De preferencia root |
host | localhost |
db_name | el nombre de la base de datos para guardar en el archivo de volcado |
backup_path | La ruta donde se guardará el archivo |
Asignamos permisos de ejecución con chmod 777 respaldodb.sh
y una vez hecho esto, debemos crear una entrada en CRON, para lo cual usamos el comando
crontab -e
Crearemos una tarea que ejecutará el script respaldodb.sh
todos los días a las 12 de la noche. Si necesitas ayuda, te presento Crontab Guru, una web que te ayudara a entender como hacer mejor las tareas programadas de CRON
00 12 * * * respaldodb.sh
Si tienes algún problema con tu servidor MySQL, visita esta entrada, tal vez te ayude en caso de que el servicio no inicie tras un apagado súbito.
También necesitamos el respaldo de los archivos dentro del directorio /var/www/
que dependiendo de la instalación, suele contener todos los virtualhost de Apache2 o NGINX
#!/bin/bash
# Obtener la fecha actual
fecha=$(date +"%d-%m-%Y")
# Crear el nombre del directorio
nombre_directorio="/root/respaldo/midominio-$fecha"
# Crear el directorio
mkdir $nombre_directorio
# Comprimir cada carpeta en un archivo ZIP independiente
for carpeta in /var/www/*/
do
nombre_carpeta=$(basename "$carpeta")
zip -r "$nombre_directorio/$nombre_carpeta.zip" "$carpeta"
done
# Borrando registros con mas de 7 dias de antiguedad
find /root/respaldo/* -mtime +7 -exec rm {} \;
Este script permite hacer respaldo de cada subdirectorio del /var/www/ comprimido en zip y también elimina los ficheros que tengan mas de 7 días de antigüedad. Para utilizarlo, hay que cambiar las variables según la necesidad
nombre_directorio | El directorio donde se desea guardar el respaldo. De preferencia el mismo donde se guardan las bases de datos volcadas en el script anterior. (/root/respaldo/) |
carpeta | El directorio donde se guardan los archivos a respaldar (/var/www/) |
De la misma forma, se agrega la entrada al crontab y se guarda.
00 12 * * * respaldofile.sh
Cliente
El cliente es por lo general un computador personal con mucho tiempo y espacio libre para realizar el respaldo.
Lo mas importante es que el servidor este al alcance del cliente y basta con una línea de comando con sftp
. Eso si, se recomienda mucho y muy fuerte que la comunicacion sea mediante claves privadas. No es recomendable utilizar contraseñas. En este ejercicio se considerara que se usan claves privadas
Abrimos crontab -e y editamos
30 12 * * * sftp -r root@midominio.com:/root/respaldo/* /home/misusuario/respaldo/
Esto permitirá ejecutar todos los días a las 12 de la noche, el proceso que copiara los archivos generados en el servidor, al cliente local.
Conclusiones
A veces basta con cosas sencillas. Al final, lo mas importante de rescatar son los archivos y la base de datos pues lo demás se puede volver a configurar. Estaré haciendo pruebas por algunos días con estos script para ver que tan fiables son, pero creo que basta para tener un buen conjunto de respaldos regulares.
Este conjunto de script dependen mucho de si se tiene total control sobre el cliente y el servidor. ¿Debería hacer algo para cuando solo se tiene un servidor ftp normal en un hosting compartido?
Correcciones
Tal vez no he investigado apropiadamente, pero descargar con una lineal de comandos mediante sftp es un poco extraño. para nuestro propósito basta con agregar el parámetro -r
para que descargue recursivamente dentro de las carpetas y al parecer en el modo de Automatic retrieval no tiene los mismos beneficios del modo interactivo. Es bastante curioso como funciona este programa, pero es mas curioso ver que no hay mucha información fácilmente localizable sobre su funcionamiento. Adjunto el enlace a la pagina donde encontré información mas completa y explicada a continuación.
Una respuesta a “Tutorial: Sistema de bajo presupuesto de respaldo para servidores”
[…] por lo general es gratuito y diario. En caso de contar con una VPS, recomiendo hacer unos cuantos scripts para tener un respaldo local, no es demasiado complicado y puede ahorrar muchos dolores de cabeza, por supuesto, un poco de spam […]