~sergio

ARTIGOS

Backups con Restic contra MinIO

24-08-2023

O obxectivo é montar un sistema de backups para os nosos equipos. Usarase MinIO para o almacenamento e Restic para facer os backups.

MinIO

Primeiro necesítase crear un usuario para MinIO:

useradd -r minio

Ahora crea o directorio para almacenar os datos do MinIO:

mkdir /srv/minio && chown minio:minio /srv/minio

E logo xa podemos lanzar o contenedor docker para MinIO. Ten en conta que esta maneira non é moi recomendable para producción pola falta de réplica dos datos, no meu caso teño un raid en espello e confío por ahí. Para entornos de producción é recomendable facer o Deploy MinIO: Multi-Node Multi-Drive .

export minioUID=$(grep minio /etc/passwd | cut -d: -f3)
export minioGID=$(grep minio /etc/group | cut -d: -f3)

docker run -d \
  -p 9009:9000 \
  -p 9010:9010 \
  --user ${minioUID}:${minioGID} \
  --name minio \
  -e "MINIO_ROOT_USER=admin" \
  -e "MINIO_ROOT_PASSWORD=sup3rp4ssw0rd!!!" \
  -v /srv/minio/data:/data \
  --restart=unless-stopped \
  minio/minio server /data --console-address ":9010"

Así xa deberíamos ter en http://127.0.0.1:9010 a web para acceder ó panel de administración do MinIO coas credenciales que se lle pasaron como variables de entorno ó contenedor Docker.

Accedendo ó panel de administración do MinIO co usuario admin:

Accedendo ahora á web do MinIO co usuario que se acaba de crear, en «Access Keys» crealle unha key nova e anotaa, usaráse con restic.

Así xa teremos todo listo para comezar co restic.

Restic

Primeiro instala restic no sistema. Por exemplo, en arch:

sudo pacman -S restic

Ahora inicia unha shell sin logs para que non queden almacenadas as keys do minio (en bash: unset HISTFILE ou en fish: fish --private) e nela setea as variables de entorno coas keys xeneradas no minio e a IP do servidor:

export AWS_ACCESS_KEY_ID=asdfadf123
export AWS_SECRET_ACCESS_KEY=9i12asdf9i812lkjasdf
export RESTIC_REPOSITORY="s3:http://192.168.0.127:9009/nome-do-bucket"

Ahora inicializa o «bucket» para gardar as snapshots do restic. Pediráche unha clave para as propias snapshots:

restic init

Para poder logo executar un script desde cron para facer os backups, esta clave gardámola nun arquivo no home do usuario desde o que vaiamos usar o restic.

echo "cl4v3d0r3st1c" > $HOME/.restic && chmod 600 $HOME/.restic

Xa podes facer backups:

restic backup ~/Documentos

E listar os snapshots dos backups feitos:

restic snapshots

Tamén montalo nun directorio local:

mkdir /tmp/foo && restic mount /tmp/foo
E acceder ós datos:
ls -l /tmp/foo/snapshots/latest/home/$USER/Documentos/

E, por suposto, restaurar un snapshot determinado (polo seu ID):

mkdir /tmp/bar && restic restore 1bab0cdf --target /tmp/bar

E esto sería o básico para ter backups usando restic e minio.

Extra

Os pasos anteriores serían para facer un backup na rede local, xa que no se chegou a publicar o minio en internet. Eu para min para facer copias estando fora da rede donde está o minio, preferín facelo usando un tunel SSH. A continuación pego o script que uso desde cron para facer as copias do meu directorio ~/Documentos:

#!/bin/bash

export AWS_ACCESS_KEY_ID=asdfadf123
export AWS_SECRET_ACCESS_KEY=9i12asdf9i812lkjasdf

#tunel
#  -f    Requests ssh to go to background just before command execution.
#  -N    Do not execute a remote command.
#  -T    Disable pseudo-tty allocation.
ssh -fNT -i .ssh/nas -L10001:127.0.0.1:9009 sergio@tr4ck.net

#backup
sleep 2
/usr/bin/restic \
     -r s3:http://localhost:10001/nome-do-bucket\
     backup \
     /home/sergio/Documentos \
     --password-file=/home/sergio/.restic

# matase o tunel ssh
pid=$(ps aux | grep '\-L10001:127\.0\.0\.1:9009' | awk '{print $2}')
kill -9 $pid
            

Fíxate que o parámetro «-r» do restic indica un bucket en localhost xa que ó facer o tunel estaría así «mapeado». Ten en conta tamén que accede ó ssh usando certificados, aforrando así ter que poñer contraseñas.

E o script teñoo no cron así:

0,20,40 * * * * /home/sergio/bin/rbackup