Texto de bienvenida de crontab

Tutorial: Sistema de bajo presupuesto de respaldo para servidores

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.

userNombre de usuario en la base de datos. De preferencia root
passwordContraseña de la base de datos. De preferencia root
hostlocalhost
db_nameel nombre de la base de datos para guardar en el archivo de volcado
backup_pathLa 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

https://crontab.guru/

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_directorioEl 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/)
carpetaEl 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.

https://www.computerhope.com/unix/sftp.htm

Publicado por

Drk0027

Soy Drk0027, un desarrollador web con diversas capacidades como Administración de servidores web, Gestión de sitios web WordPress, Creación de plantillas HTML+CSS responsivo y otros. Puedes hablar conmigo en mi perfil de Telegram o seguir mis proyectos en mi canal https://t.me/drk0072

Un comentario en «Tutorial: Sistema de bajo presupuesto de respaldo para servidores»

Deja un comentario

Interlan