Backup en la Nube con Rclone
Tags: backup, linux, rclone
Published: 2020-06-10 01:31:55

Hace unos días el cloud server de un cliente literalmente desapareció, llevándose consigo la aplicación entera, incluida la base de datos. El estrés se fue por las nubes, pero fue todavía peor cuando me di cuenta que el último backup tenia más de 90 días 😱.

Siempre recomiendo a mis clientes la contratación de algún servicio de hosting que incluya backups automáticos, pero eso no siempre sucede. Si desarrollas proyectos freelance para clientes medianos o pequeños sabrás que los recursos muchas veces son limitados, que el servidor de producción sirve aplicación y base de datos, y que el único ambiente de staging es la PC que usas para desarrollar.

Solía pensar que la responsabilidad no recaía sobre mi si algo llegara a ocurrir, pero al tener esta experiencia me dí cuenta que no podía simplemente desentenderme del problema y decirle al cliente que toda su información se había perdido, tenia que poder ofrecerle algún tipo de solución. Por ello decidí armarme un flow de backup simple, rápido, y replicable fácilmente en otros servidores Linux para implementar en este tipo de proyectos.

Al final la historia con mi cliente terminó bien, ya que con ayuda del soporte técnico fue posible recuperar la información y volver a dejar el server operativo, pero el estrés del momento me llevo a pensar en esta solución casera de backup que te mostraré a continuación.
<br>
## Backup de Información en la Nube

Las herramientas que vamos a usar son:

* El comando [zip](https://www.geeksforgeeks.org/zip-command-in-linux-with-examples/) de Linux
* [mysqldump](https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html), [pg_dump](https://www.postgresql.org/docs/12/app-pgdump.html) o el comando necesario para hacer un backup de la base de datos
* [crontab](https://www.geeksforgeeks.org/crontab-in-linux-with-examples/)
* [Rclone](https://rclone.org/)

Conceptualmente la idea es muy sencilla: 

* Crear un script bash que se encargue de comprimir los archivos y carpetas que queramos resguardar
* Hacer una copia del archivo en la nube
* Crear una tarea programada que ejecute todo esto de manera automática

[*Rclone*](https://rclone.org/) es la herramienta principal que vamos a usar en nuestro backup, ya que nos permitirá hacer una copia del archivo en algún servicio en la nube. Soporta servicios gratuitos de almacenamiento de archivos como Dropbox y Google Drive, y servicios de pago como Amazon S3 y Google Cloud Storage, entre otros.
<br>
### 1 - Instalando y Configurando Rclone

En primer lugar vamos a instalar Rclone para tenerlo disponible cuando armemos el script bash. Te recomiendo instalarlo primero en tu equipo local, ya que para configurar los servicios de almacenamiento es necesario un navegador, y si solo tienes acceso a tu servidor por SSH te será difícil de finalizar la configuración. Luego podrás copiar la configuración de tu PC al server remoto fácilmente. 

Instalar Rclone es muy sencillo, tanto como ejecutar el siguiente comando en la consola:

```bash
$ curl [https://rclone.org/install.sh](https://rclone.org/install.sh) | sudo bash
```

Si por algún motivo el software no se instala, en la documentación tenes los pasos para [instalar desde el binario](https://rclone.org/install/#linux-installation-from-precompiled-binary) 😉. 

Y si estás en Windows podes bajar el instalador desde la [página de descargas](https://rclone.org/downloads/).
<br>
Una vez instalado Rclone vamos a configurar el servicio de almacenamiento:

```bash
$ rclone config
```

Acá tienes las guías para configurar [Dropbox](https://rclone.org/dropbox/) y [Google Drive](https://rclone.org/drive/), y podes consultar el resto de los servicios en [este enlace](https://rclone.org/docs/).
<br>
Ahora que ya tenemos *Rclone* instalado y configurado, vamos a buscar donde podemos encontrar el archivo de configuración, que luego deberemos copiar en nuestro servidor:

```bash
$ rclone config file
Configuration file is stored at:
/Users/MyUser/.config/rclone/rclone.conf
```
<br>
Ahora solo resta repetir el proceso de instalación de *Rclone* en el servidor remoto. Una vez instalado, ejecutamos el comando `rclone config file` para conocer en que directorio debemos pegar el archivo de configuración de nuestra PC local, y subimos el archivo `.conf` a esa carpeta con algún cliente FTP o de la manera que creas conveniente.
<br>
### 2 - Creando el Script de Backup

En primer lugar vamos a crear un directorio donde guardaremos nuestro script, y más adelante el archivo de backup:

```bash
$ mkdir ~/backup/
$ touch backup.script
```
<br>
El contenido del archivo de script es muy subjetivo, ya que dependerá de los archivos y carpetas que desees resguardar.

```bash
# Backup de la base de datos
mysqldump -u my_user -pmy_password my_db > /home/my_user/backup/my_db.sql
# Me ubico en la carpeta backup y borro último archivo de backup
cd /home/my_user/backup
rm /home/my_user/backup/*.zip
# Comienzo a crear el nuevo archivo de backup, zipeando archivos y carpetas con el comando zip
zip -ur "backup-$(date +"%Y-%m-%d").zip" /etc/apache2/apache2.conf
zip -ur "backup-$(date +"%Y-%m-%d").zip" /etc/apache2/sites-availables
zip -ur "backup-$(date +"%Y-%m-%d").zip" /home/my_user/my_site/mediafiles
# Copio el archivo de backup al servicio de almacenamiento en la nube
rclone copy backup-*.zip remote:my_site/
```
<br>
El script anterior está basado en un script real que utilizo en un servidor de producción. Hago un backup de la base de datos *MySQL*, luego genero el archivo comprimido `backup-aaaa-mm-dd.zip` (donde *aaaa-mm-dd* corresponde a la fecha de creación del archivo) al cual agrego el archivo de configuración de *apache* y los *virtual hosts*, comprimo la carpeta *mediafiles* que contiene los archivos subidos por los usuarios, y por último le digo a *rclone* que copie el archivo de backup dentro de la carpeta *my_site* del servicio que hemos declarado como `remote`.

Rclone tiene muchas más funcionalidades incorporadas que podes ver en la [documentación](https://rclone.org/commands/).
<br>
Por último le damos permisos de ejecución al script, y lo ejecutamos para probar su funcionamiento:

```python
$ chmod +x [backup-script.sh](http://backup-script.sh/)
$ source backup.script
```
<br>
Si todo va bien solo resta configurar *crontab* para que la tarea de backup se ejecute automáticamente.
<br>
### 3 - Backup Automático

Para que el backup se ejecute de manera automática vamos a crear una tarea con *crontab*. 

Por si no lo sabes, *crontab* es el comando que nos ofrece el entorno Linux para administrar las tareas programadas. Básicamente es un archivo de texto donde agregaremos una nueva linea indicando la programación de nuestra tarea.

La sintaxis de *crontab* tiene los siguientes parámetros, con los que podemos jugar para asignar la programación que deseamos:

```bash
m = minuto (0-60)
h = hora (0-23)
dom = día del mes (1-31)
mon = mes (1-12)
dow = día de la semana (1-7)
command = comando a ejecutar
```
<br>
Para agregar nuestra tarea debemos ejecutar crontab con el parámetro `-e` (edición):

```bash
$ crontab -e
```
<br>
A continuación te dejo algunos ejemplos para te vayas dando una idea de como programar las tareas en *crontab*:

```bash
m h dom mon dow command
# Cada viernes a las 4:00
0 4 * * 5 /home/my_user/backup/backup.script
# El día 10 de cada mes a las 15:30
30 15 10 * * /home/my_user/backup/backup.script
# Todos los días a las 20:00
0 20 * * * /home/my_user/backup/backup.script
```
<br>
Para finalizar guardamos el archivo y eso es todo! La tarea programada debería ejecutar el script automáticamente. Solo tendremos que controlar que los backups se estén guardando en la nube.

Con estos pocos pasos ya tenemos configurado un backup automático que se guardará en la nube, y que es sencillo de implementar y replicar en otro server.

<br><br>

---

Nuevamente gracias por haber llegado hasta acá y leído este post. Espero que te sirva y lo puedas aplicar. 

Me gustaría conocer tus historias de terror y como las resolviste. Si tenes algo para contarme no dudes en dejarme un comment, o mandarme un twit a [@luciano_dev](https://twitter.com/luciano_dev).

Si te gusta mi contenido me ayudarías mucho difundiéndolo con tus amigos o en tu feed de Twitter, y si te gustaría que escriba sobre algo en particular dejame un comment. Espero tu feedback para ir mejorando con cada nuevo post ❤️.