miércoles, 23 de abril de 2014

Automatizar copias de seguridad de MySQL y hosting web desde un NAS Synology



En el artículo anterior os comenté por que me había decidido por un NAS Synology y la verdad es que no esperaba escribir mucho sobre él, porque ya viene de fábrica haciendo de todo, y hay excelentes guías, blogs, y foros que hablan de ellos. Sin embargo, siempre acabas necesitando que haga algo que nadie ha descrito como se hace, y te toca hacértelo tu mismo (DIY, como dicen los modernos...)

En éste artículo os explicaré como he automatizado copias de seguridad de una página web, tanto de su base dedatos en MySQL como de todos los archivos de la web usando acceso SSH al hosting, y programando las copias cuando queramos, que se mantengan durante el tiempo que queramos y además comprimiendo todo para ahorrar un poco de espacio en disco.


Empezamos con la base de datos, os pongo el script que he usado y ahora os lo explico las particularidades:

#Busca la fecha e introducir la ruta
dt=`date +%y%m%d`
ruta="/volume1/homes/user/copias/bd/"

#Backup de la base de datos
ssh usuariossh@servidorssh "mysqldump --host=servidorsql --user=usuariosql --password=contraseñasql basededatos" > basededatos.sql

#Comprime la base de datos y mueve elfichero al diectorio que queremos
gzip -f basededatos.sql
mv basededatos.sql.gz $ruta$dt-basededatos.sql.gz

#Borra los archivos contenidos en la carpeta con más de 15 días de antiguedad.
find $ruta -mtime +15 -exec rm -rf {} \;

Creo que el código se explica por si sólo. Añadir que no pongo el "#!/bin/bash" al principio porque synology no usa Bash, sino Ash, que al parecer es algo menos completo, pero para lo que nosocupa nos da lo mismo. Me costó horas descubrir que el script no se ejecutaba por la dichosa línea... También os podéis preguntar porque me conecto por SSH al servidor y luego desde allí al servidor SQL. Bien, mi servidor SQL no permite conexiones externas, así que ésta ha sido mi forma de solucionarlo.
Una vez tiene el archivo de la base de datos, lo comprime con gzip y lo mueve a la carpeta que le digamos, poniendo la fecha en el nombre. Cuando un archivo de esa carpeta tiene más de 15 días se elimina automáticamente


A continuación, el script para automatizar la copia de todo lo que hay dentro de la carpeta www (o la que queráis):

##Datos necesarios
dt=`date +%y%m%d`
#Ruta histórico comprimidas
ruta="/volume1/homes/user/copias/datos/comprimidas/"

#Datos ssh
USER="user"
SERVER="server"
#Directorio del servidor a copiar
SOURCE="www"
#Directorio sin comprimir en espejo
TARGET="/volume1/homes/user/copias/datos/ultima"
#Log de la sincronización
LOG="/volume1/homes/user/datos/ultima/backup.log"

#Actualiza la carpeta Target
/usr/syno/bin/rsync -avz --delete --progress -e "ssh" $USER@$SERVER:$SOURCE $TARGET >> $LOG 2>&1


#Comprime la carpeta ultima y al guarda con la fecha de creacion en comprimidas
cd $TARGET
tar -czf $ruta$dt-datos.tar.gz www

#Borra los archivos contenidos en la carpeta con más de 15 días de antiguedad.
find $ruta -mtime +15 -exec rm -rf {} \;

Con éste script lo que hacemos es sincronizar la carpeta target usando Rsync con nuestro servidor. La ventaja de Rsync es que no se descarga todo cada vez; compara los ficheros que tenemos en local con los del servidor y sólo se descarga los nuevos o modificados, y a su vez elimina los del directorio local que ya no estén en el servidor.
Después coje la carpeta sincronizada, la empaqueta en tar y la comprime con gzip, y deja el archivo comprimido en la carpeta que le digamos con la fecha en el nombre. Cuando los archivos de ésta carpeta tienen más de 15 días se eliminan automáticamente.


Una vez tenemos los script, los copiamos a un archivo de texto que creais en el NAS con la extensión ".sh" y no os olvidéis de darles permisos de ejecución. Nos conectamos al DSM vamos al planificador de tareas y le decimos que ejecute los scripts con la periodicidad que queramos; yo lo tengo puesto en diarias para la base de datos y dos días a la semana; lunes y jueves, para los datos.

Falta añadir un detalle, y es que como los scripts se conectan por SSH, nos pedirán contraseña, de modo que dará error y no se ejecutarán. La solución es generar un par de llaves, pública y privada, en el synology y copiar la llave pública al servidor.
Para hacer ésto, podéis seguir éste excelente tutorial, pero la última parte, la de ejecutar "ssh-copy-id" no se puede ejecutar en el Synology así que toca hacer manualmente lo que haría éste comando. 
Nos conectamos por FTP al servidor y creamos una carpeta al mismo nivel que www (no dentro) con nombre: ".ssh". Dentro de ésta carpeta creamos un archivo "authorized_keys"
Luego desde el Synology por ssh copiamos la clave pública a un fichero que podamos ver fácilmente, por ejemplo con:

cp /root/.ssh/id_rsa.pub /volume1/public/id_rsa.pub 

Abrimos el id_rsa.pub que acabamos de copiar y copiamos su contenido en el fichero "authorized_keys" que acabamos de crear en el servidor. A continuación aseguraos de borra el id_rsa.pub del directorio public, y listo, el script se ejecutará sin problemas.

Ah, y el código, por supuesto, no es sólo mío. Tiene fragmentos sacados de varias webs, pero ahora mismo sólo recuerdo ésta a parte de las ya mencionadas. A todos ellos, gracias.

1 comentario: