Backups en la nube con Restic

Backups en la nube con Restic

Después de valorar algunas alternativas para la creación de las copias de seguridad de los datos de mis contenedores he encontrado una buena solución en restic.

Que necesito

Todos los datos que necesito para montar los contenedores que uso habitualmente la tengo guardada en la carpeta “~/dockers” con lo que el problema es muy sencillo. Tan solo tengo que hacer una copia de seguridad de esta carpeta en otro dispositivo.

Alternativas

Comencé copiando esta carpeta comprimida al ordenador de sobremesa de forma regular o incluso subiéndola a un canal de Telegram. Empecé incluso a hacer un script para automatizar la tarea pero el otro día tuve una revelación gracias a Atareao y me he decidido a probar Restic Como gestor de la copia de seguridad. Una de las razones de peso ha sido la posibilidad que ofrece Restic de combinarse con Rclone para hacer directamente la copia en la nube.

Que voy a utilizar

  • Restic como gestor de backups
  • Rclone como herramienta para subir el backup a la nube
  • Bash para crear un script con el que automatizar la tarea
  • Cron para programar el script
  • Claude para ayudarme en el proceso.

Instalación de Restic y Rclone

Para linux, la instalación de Restic y Rclone es realmente sencilla

sudo apt update
sudo apt install restic
sudo -v ; curl https://rclone.org/install.sh | sudo bash

El siguiente paso es configurar un remoto para Rclone a partir de una nube mediante el comando rclone config tal y como ya he explicado en otros artículos. En mi caso particular voy a utilizar la nube de Mega que ofrece gratis 50 Gb para configurar el remoto.

sherlockes@uber:~$ rclone config
Current remotes:

Name                 Type
====                 ====
Sherlockes78_GD      drive
Sherlockes_Mega      mega

Configuración del repositorio

El sitio donde se van a guardar las copias de seguridad lo llamaremos “repositorio” y es un directorio donde Restic va a guardar todos los datos necesarios. Para acceder al repositorio será necesaria una contraseña y el primer paso para configurarlo es inicializarlo.

export RESTIC_PASSWORD="tu_contraseña_segura"
restic -r rclone:Sherlockes_Mega:docker_backups init

En este caso estoy usando el remoto de rclone “Sherlockes_Mega” y la carpeta “docker_backups” como ubicación para el repositorio de Restic.

Realizando la copia de seguridad

Crearemos un archivo “backup.sh” al que daremos permisos de ejecución y en el que incluiremos el siguiente contenido:

#!/bin/bash

export RESTIC_PASSWORD="tu_contraseña_segura"
REPO="rclone:Sherlockes_Mega:docker_backups"

restic -r $REPO backup ~/dockers

¿Que más se le puede pedir?

Aunque la copia de seguridad ya funciona hay una serie de aspectos en los que se podría mejorar:

  • Excluir determinado tipo de archivos de la copia
  • Poner la contraseña en un archivo externo al script
  • Ejecución como root para evitar problemas con permisos de archivos
  • Automatizar la tarea

Excluir determinado tipo de archivos

En mi caso, dentro de las carpetas de datos hay archivos “*.mp3” que son de uso temporal y de los que no necesito hacer copia de seguridad. para esto usaremos el argumento “exclude” en el comando de Restic.

restic -r $REPO backup ~/dockers --exclude="*.mp3"

Contraseña en archivo externo

Puesto que todos mis scripts los guardo en un repositorio público de Github no resulta práctico que la contraseña de mi copia de seguridad esté ahí expuesta. Restic ofrece la posibilidad de guardarla en un archivo externo.

En mi caso voy a crear el archivo “.restic-password” que únicamente contiene la contraseña y modificaré el script con lo siguiente:

PASSWORD_FILE="/home/sherlockes/.restic-password"
restic -r $REPO --password-file $PASSWORD_FILE backup ~/dockers --exclude="*.mp3"

Ejecución como root

A la hora de realizar la copia de seguridad he de dado cuenta de que hay determinados archivos a los que mi usuario no tiene acceso por lo que me veo obligado a ejecutar la copia como “root” mediante “sudo” pero es necesario que:

  • Rclone use la configuración de mi usuario al lanzarlo como “root”.
  • No pida la contraseña para poder automatizarlo posteriormente.

Al ejecutarlo con “sudo”, rclone busca la configuración de “root” y no va a encontrar los remotos que hemos creado con nuestro usuario. Para evitar esto vamos a utilizar una variable de entorno mediante la que le vamos a pasar a Restic la ubicación del archivo de configuración de Rclone. Añadiremos lo siguiente:

export RCLONE_CONFIG="/home/sherlockes/.config/rclone/rclone.conf"

Para que la ejecución mediante “sudo” haga uso de las variables de entorno debemos usar el argumento “-E” y para que no nos pida la contraseña al ejecutar restic añadiremos la siguiente línea al archivo “/etc/sudoers” usando el comando `sudo visudo"

sherlockes ALL=(ALL) NOPASSWD:SETENV: /usr/bin/restic

ya con esto sólo nos queda modificar el script para que restic sea lanzado bajo “sudo”

sudo -E restic -r $REPO --password-file $PASSWORD_FILE backup ~/dockers --exclude="*.mp3"

Automatizar la tarea

El último paso es que la tarea se ejecute automáticamente. Yo he escogido el método del “cron” por ser el más sencillo de todos.

  • Ejecutamos crontab -e
  • Añadimos al final @reboot ~/backup.sh > ~/backup.log 2>&1
  • Guardamos mediante Ctrl + x

A partir de esto, cada vez que arranca el servidor se realizar una copia de seguridad de los datos de los contenedores docker que hemos seleccionado.

Script completo

Puedes encontrar este script en mi repositorio de Github.

#!/bin/bash

###################################################################
#Script Name: backup_dockers.sh
#Description: Descripción
#Args: N/A
#Creation/Update: 20250225/20250312
#Author: www.sherblog.es                                             
#Email: sherlockes@gmail.com                               
###################################################################

################################
####       Variables        ####
################################

export RCLONE_CONFIG="/home/sherlockes/.config/rclone/rclone.conf"

REPO="rclone:Sherlockes_Mega:docker_backups"
PASSWORD_FILE="/home/sherlockes/.restic-password"

################################
####    Script principal    ####
################################

# Copiar la carpeta del docker intrubot en RPI
echo "Copiando Intrubot config desde RPI"
rsync -avz --progress --recursive --mkpath pi@192.168.10.210:/home/pi/dockers/intrubot/ /home/sherlockes/dockers/intrubot

# Realizar backup
echo "Iniciando backup de ~/dockers: $(date)"
sudo -E restic -r $REPO --password-file $PASSWORD_FILE backup /home/sherlockes/dockers --exclude="*.mp3" --exclude="*.mp4"

# Política de retención (opcional)
echo "Aplicando política de retención"
sudo -E restic -r $REPO --password-file $PASSWORD_FILE forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune

echo "Backup completado: $(date)"


Enlaces de interés