~sergio
ARTIGOSBackups 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:
- Crea un usuario.
- Crea un bucket.
- Marca como privado o bucket.
- Na sección «Access» do bucket, en «Users» agrega o usuario creado previamente.
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/fooE 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