UnRAID: Script copia de seguridad a disco USB
Hoy os voy a explicar cómo genero yo mis copias de seguridad de mis datos en UNRAID.
No tengo otro disco o recurso en red, sino que utilizo un disco USB de 8TB.
Las soluciones que encuentran en las APPS de UnRaid, están más enfocadas a recursos de red, y dejan los discos USB en un segundo plano. O al menos en las que he probado (luckyBackup o AppData Backup/Restore), no he sabido implementarlo.
Así que he preparado un script bash para hacer esta tarea. Os digo lo que tiene que hacer:
- Montar y desmontar el disco USB, en un proceso de testeo del montaje. No lo quiero montado por varias razones, una porque no quiero usarlo mas que en el proceso de copia, y porque no me interesa por seguridad que esté accesible.
- Debe dejar un log de todo el proceso
- Ese log lo enviará por email
- Borrar rastros en el sistema del proceso
- Crearemos una programación periódica
- Usaré las herramientas que ya trae UnRAID por defecto
Lo primero que haremos es configurar el envío de emails. Usaremos SSMTP:
Configurar SSMTP para envío emails en script UNRAID
Creamos primero una copia de seguridad del fichero de configuración:
1 |
root@UNRAID:~# cp /etc/ssmtp/ssmtp.conf /etc/ssmtp/ssmtp.conf.old |
Yo voy a usar una cuenta GMAIL que tengo para estos menesteres. Tengo el doble factor de autenticación activado, así que para la configuración, creo una contraseña para una APP en la configuración de mi cuenta GMAIL. Os dejo como configurarlo:
https://support.google.com/accounts/answer/185833?hl=es
Importante, la contraseña que genera GOOGLE es con espacios, para configurarla en el fichero ssmtp.conf, debéis quitar los espacios al introducirla.
Editar el fichero y dejarlo de la siguiente forma:
1 2 3 4 5 6 7 8 9 10 11 |
root@UNRAID:~# cat /etc/ssmtp/ssmtp.conf # Generated settings: root=xxxxxxx@gmail.com rewriteDomain=gmail.com mailhub=smtp.gmail.com:587 hostname=UNRAID UseTLS=YES UseSTARTTLS=YES AuthUser=xxxxxxxx@gmail.com AuthPass=passwordsinespacios FromLineOverride=YES |
Y lo validamos de la siguiente forma:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
root@UNRAID:~# echo "Hola" | ssmtp emailprueba@gmail.com -v [<-] 220 smtp.gmail.com ESMTP p16sm3390302wmq.20 - gsmtp [->] EHLO UNRAID [<-] 250 SMTPUTF8 [->] STARTTLS [<-] 220 2.0.0 Ready to start TLS [->] EHLO UNRAID [<-] 250 SMTPUTF8 [->] AUTH LOGIN [<-] 334 VXNlcm5hbWU6 [->] bmVndWJveGVyQGPPvvjinmNvbQ== [<-] 334 UGFzc3dvcmQ6 [<-] 235 2.7.0 Accepted [->] MAIL FROM:<xxxxxxxx@gmail.com> [<-] 250 2.1.0 OK p16sm3390302wmq.20 - gsmtp [->] RCPT TO:<xxxxxxxx@gmail.com> [<-] 250 2.1.5 OK p16sm3390302wmq.20 - gsmtp [->] DATA [<-] 354 Go ahead p16sm3390302wmq.20 - gsmtp [->] Received: by UNRAID (sSMTP sendmail emulation); Thu, 20 Jan 2022 21:33:56 +0100 [->] From: "Console and webGui login account" <xxxxxxxx@gmail.com> [->] Date: Thu, 20 Jan 2022 21:33:56 +0100 [->] Hola [->] [->] . [<-] 250 2.0.0 OK 1642710837 p16sm3390302wmq.20 - gsmtp [->] QUIT [<-] 221 2.0.0 closing connection p16sm3390302wmq.20 - gsmtp |
Una vez que ya tenemos la validación de que podemos enviar emails con ssmtp, ahora sabremos cual es el UUID del disco USB.
Averiguar UUID de disco USB
Una de las cosas que he visto, es que hay veces que mi disco USB se monta en diferente letra si toco el ARRAY, por ejemplo. Así que usaré el UUID del disco para montarlo, ya que no cambia. Sacaremos el listado:
1 2 3 4 5 6 7 8 9 10 11 |
root@UNRAID:~# fdisk -l Disk /dev/sda: 7.28 TiB, 8001562869760 bytes, 15628052480 sectors Disk model: My Book 25EE Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disklabel type: gpt Disk identifier: FBD59AE4-C99D-45CA-A655-392BD3F8EF46 Device Start End Sectors Size Type /dev/sda1 256 15628048064 15628047809 7.3T Linux filesystem |
Y sacamos el UUID:
1 2 |
root@UNRAID:~# blkid /dev/sda1 /dev/sda1: LABEL="1.42.6-24922" UUID="93e1b1b0-5ac7-4839-beac-5ed38842de50" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="8a9269cd-e5e9-4f0b-b1d4-9faf982fc86b" |
Os enseño el script que he utilizado, habría que ampliarlo por cada carpeta que queráis hacer backup.
Script copia de seguridad en UnRAID a USB
El script es:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
#!/bin/bash ### EL BLOG DE NEGU ### Este script permite montar disco USB, copia por RSync, envío email y desmontar disco USB ### Requerimiento -- arrayStarted=true y disco montado echo "$(date) - Comienza el backup a disco USB de 8TB" echo "$(date) - Comienza sincronizacion" >> /boot/logs/cronlogs/Backup.log # Montamos disco USB mount UUID="93e1b1b0-5ac7-4839-beac-5ed38842de50" /mnt/disks/usb/ # Esperamos 10 segundos a que se monte echo "$(date) - Disco se esta montando" sleep 10s # Comprobamos que existe un fichero para validar el montaje, creado por mi en la raid del disco if [ -f /mnt/disks/usb/test.txt ]; then echo "$(date) - Disco montado, existe el fichero text.txt" # Configuracion log a Email echo To: xxxxxxx@gmail.com >> /boot/logs/cronlogs/Backup.log echo From: xxxxxxx@gmail.com >> /boot/logs/cronlogs/Backup.log echo Subject: Backup RSync a USB en UNRAID >> /boot/logs/cronlogs/Backup.log echo >> /boot/logs/cronlogs/Backup.log # Backup Share Photo echo "$(date) - Copiando ficheros nuevo share PHOTO" echo "$(date) - Copiando ficheros nuevo share PHOTO" >> /boot/logs/cronlogs/Backup.log rsync -azPv /mnt/user/photo/ /mnt/disks/usb/photo/ --log-file=/boot/logs/cronlogs/Backup.log # Termina copiado echo "$(date) - Ficheros copiados" >> /boot/logs/cronlogs/Backup.log # Desmontar disco USB umount /mnt/disks/usb/ echo "$(date) - Disco se esta desmontando" >> /boot/logs/cronlogs/Backup.log sleep 10s # Logs y envio email # Envio log ssmtp xxxxxxx@gmail.com < /boot/logs/cronlogs/Backup.log # Eliminamos log rm /boot/logs/cronlogs/Backup.log exit 0 else echo "$(date) - El disco USB no se ha podido montar" # Configuracion log a Email echo To: xxxxxxx@gmail.com >> /boot/logs/cronlogs/Backup.log echo From: xxxxxxx@gmail.com >> /boot/logs/cronlogs/Backup.log echo Subject: Fallo Backup RSync a USB en UNRAID >> /boot/logs/cronlogs/Backup.log echo >> /boot/logs/cronlogs/Backup.log # Logs y envio email # Envio log ssmtp xxxxxxx@gmail.com < /boot/logs/cronlogs/Backup.log # Eliminamos log rm /boot/logs/cronlogs/Backup.log exit fi |
Lo colocáis en un fichero SH y le das permisos de ejecución con chmod. Lo probáis manualmente:
1 2 3 4 5 6 7 8 9 |
root@UNRAID:~# ./backup.sh Thu Jan 20 22:01:58 CET 2022 - Comienza el backup a disco USB de 8TB Thu Jan 20 22:01:58 CET 2022 - Disco se esta montando Thu Jan 20 22:02:08 CET 2022 - Disco montado, existe el fichero text.txt Thu Jan 20 22:02:09 CET 2022 - Copiando ficheros nuevo share PHOTO sending incremental file list sent 37,263,785 bytes received 175,028 bytes 85,967.42 bytes/sec total size is 957,503,180,865 speedup is 25,575.15 |
Automatización script copia de seguridad con Crontab
Para programar la copia de seguridad usaré Crontab, editamos con:
1 |
crontab -e |
La secuencia es:
1 |
* * * * * /rutascript/script.sh |
Y los asteriscos representan de izquierda a derecha:
1 2 3 4 5 |
Minutos: de 0 a 59. Horas: de 0 a 23. Día del mes: de 1 a 31. Mes: de 1 a 12. Día de la semana: de 0 a 6, siendo 0 el domingo. |
Para UNRAID he editado /var/spool/cron/crontabs/root y agregada la linea para que se ejecute todos los días:
1 2 |
# Copia de seguridad 30 2 * * 0-6 /bin/sh /boot/logs/cronlogs/backup-carpetas.sh 1> /dev/null |
Backup de carpetas APPDATA, DOMAIN, SYSTEM e ISOS
Podéis agregar esto al script para hacer backup de containers y máquinas virtuales. Yo lo separo en otro script para hacerlo una vez a la semana:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# PARAR CONTAINERS DOCKER Y MAQUINAS VIRTUALES echo "$(date) - Parando Containers y MVs" >> /boot/logs/cronlogs/Backup.log docker stop $(docker ps -a -q) virsh shutdown maquina1 virsh shutdown maquina2 # SINCRONIZAR FICHEROS echo "$(date) - Copiando APPDATA" >> /boot/logs/cronlogs/Backup.log rsync -azPv /mnt/user/appdata/ /mnt/disks/usb/appdata/ --log-file=/boot/logs/cronlogs/Backup.log echo "$(date) - Copiando DOMAINS" >> /boot/logs/cronlogs/Backup.log rsync -azPv /mnt/user/domains/ /mnt/disks/usb/domains/ --log-file=/boot/logs/cronlogs/Backup.log echo "$(date) - Copiando SYSTEM" >> /boot/logs/cronlogs/Backup.log rsync -azPv /mnt/user/system/ /mnt/disks/usb/system/ --log-file=/boot/logs/cronlogs/Backup.log echo "$(date) - Copiando ISOS" >> /boot/logs/cronlogs/Backup.log rsync -azPv /mnt/user/isos/ /mnt/disks/usb/isos/ --log-file=/boot/logs/cronlogs/Backup.log # ARRANCAR CONTAINERS DOCKER Y MAQUINAS VIRTUALES echo "$(date) - Arrancado Containers y MVs" >> /boot/logs/cronlogs/Backup.log docker start $(docker ps -a -q) virsh start maquina1 virsh start maquina2 |
Te ha gustado la entrada SGUENOS EN TWITTER O INVITANOS A UN CAFE?