Backup automatico di files e database con rsnapshot

In questo articolo vediamo come configurare un sistema automatico di backup con rsnapshot.

Principi base di rsnapshot

Rsnapshot è un un software in grado di realizzare snapshot del disco, cioè è in grado di memorizzare delle istantanee. Fa un massiccio utilizzo di hard link in modo da risparmiare molto spazio su disco, in pratica il file viene memorizzato una sola volta e se lo snapshot successivo contiene ancora il medesimo file non modificato non viene richiesta ulteriore memoria sul disco.

Grazie agli hard link però vi ritroverete ogni snapshot come una differente directory che contiene l’istantanea del disco esattamente come quando è stato fatto, questo significa che il ripristino di un backup sarà semplice quanto copiare una directory!

Configurazione dei dischi di backup

Potrete configurare il disco di backup come preferite, nell’ottica di questa serie di articoli sul NAS definitico con Debian e Nextcloud andremo a configurare il disco di backup con LVM.

Ipotizziamo che il disco destinato al backup sia /dev/sdc

Cancelliamo tutto il contenuto del disco con

wipefs -a /dev/sdc

A questo punto partizioniamo il volume con

cfdisk /dev/sdc

Selezionando come schema del partizionamento GPT creiamo un’unica partizione che copra l’intero disco e selezioniamo come tipo Linux LVM.

A questo punto creiamo con il disco un physical volume con

pvcreate /dev/sdc1

e aggiungiamolo al gruppo dei dischi HDD per il backup

vgcreate HDD /dev/sdc1

creiamo il logical volume autobackup

lvcreate -l 100%FREE -n autobackup HDD /dev/sdc1

creiamo il file system senza riservare spazio per root

mkfs.ext4 -m 0 /dev/HDD/autobackup

creiamo la directory di mount

mkdir /mnt/autobackup

e aggiungiamo la seguente riga in /etc/fstab

/dev/mapper/HDD-autobackup /mnt/autobackup ext4 defaults,nofail 0 1

montiamo i dispositivi in fstab con

mount -a

Verifichiamo che il dispositivo sia effettivamente montato con

mount | grep /mnt

infatti, se avremo fatto un errore e il dispositivo non è correttamente montato effettueremo il backup sul disco principale esaurendo rapidamente tutto lo spazio disponibile.

Configurazione di rsnapshot

Prima di iniziare la configurazione di rsnapshot è necessario fare una particolare premessa, altrimenti si andrà incontro a numerosi errori difficili da risolvere. Nel file di configurazione di rsnapshot gli spazi non sono validi per separare le variabili di configurazione è necessario utilizzare le tabulazioni.

Modifichiamo il file di configurazione /etc/rsnapshot.conf

Modifichiamo la snapshot_root come segue

snapshot_root	/mnt/autobackup/rsnapshot/

Poi andiamo sotto dove sono specificati gli intervalli di backup. Commentiamo tutta la parte dove è definito il backup di tipo alpha, beta, gamma e delta e inseriamo subito prima

#retain	hourly	24
retain	daily	7
retain	weekly	4
retain	monthly	12

In questo modo rsnapshot terrà un backup al giorno per l’ultima settimana, uno a settimana per l’ultima settimana e un backup al mese nell’ultimo anno.

In fondo nella parte riguardante i BACKUP POINTS commentate tutto quello che è stato scritto di default e aggiungete i punti di backup da tenere. Inoltre settiamo uno script aggiuntivo (che andremo a creare in seguito) per effettuare il backup del database mysql.

backup	/home/		localhost/
backup	/etc/		localhost/
backup	/usr/local/	localhost/
backup	/root/		localhost/
backup	/var/www/	localhost/
backup	/mnt/data/	localhost/
backup_script	/usr/local/bin/rs-mysql	localhost/mysqldump/

Configurazione di script aggiuntivi

Creiamo un file /usr/local/bin/rs-mysql contenente

#!/bin/bash
/usr/bin/mysqldump --single-transaction "d_nextcloud" > "nextcloud.sql"
gzip nextcloud.sql
/bin/chmod 600 nextcloud.sql.gz

nel caso abbiate settato la password di root dovrete aggiungere in cima al file

export MYSQL_PWD=password

e aggiungere l’opzione -p a mysqldump

Ovviamente diamo i permessi di esecuzione per root (e impediamo la lettura ad altri utenti visto che lo script ha una password memorizzata)

chmod 700 /usr/local/bin/rs-mysql

Inoltre creiamo un ulteriore file per la manutenzione ordinaria

/usr/local/bin/rs-daily 
#!/bin/bash
sudo -u www-data php /var/www/nextcloud/occ maintenance:mode --on
/usr/bin/rsnapshot daily
sudo -u www-data php /var/www/nextcloud/occ maintenance:mode --off

e aggiungiamo i permessi di esecuzione con

chmod +x /usr/local/bin/rs-daily

Configurazione crontab

Configuriamo cron per eseguire i backup con crontab -e

0 6 * * * /usr/local/bin/rs-daily > /dev/null
0 3 * * 1 /usr/bin/rsnapshot weekly
0 0 1 * * /usr/bin/rsnapshot monthly

In questo modo verrà eseguito ogni giorno il backup giornaliero alle 6 si mattina, ogni lunedì alle 3 di notte il backup settimanale e ogni primo del mese all’1 un backup mensile.

L’unico backup eseguito offline è quello giornaliero, infatti la rotazione dei backup settimanali e mensili avviene solamente sui backup giornalieri. Potrete modificare a piacimento gli orari di esecuzione, sarebbe meglio eseguire il backup giornaliero per ultimo per avere un giorno in più di backup sulla rotazione.

Comunque il backup settimanale e mensile è davvero veloce ad essere eseguito (si tratta solamente di spostare hard link), mentre il più lento è il giornaliero che deve eseguire un intero rsync e il dump del database, comunque è consigliabile lasciare un minimo di tempo (almeno 5 minuti) tra un backup e il successivo per evitare conflitti temporali.

Il backup del backup offline

È inoltre importante ogni tanto (quando ci si ricorda almeno), eseguire un backup del backup su un supporto offline. Infatti questo backup automatico è sempre accessibile dal dispositivo, inoltre il disco di backup è interno al NAS stesso.

È una buona precauzione creare un promemoria e copiare il backup eseguito, magari tramite rsync su un hard drive esterno (da tenere lontano dal nas), oppure su un dispositivo remoto.

In questo modo avremo una salvaguardia anche spaziale dei nostri dati, infatti un backup interno sempre disponibile non ci rende immuni da furti del NAS, incendi nella stanza o altre calamità naturali, ma anche più semplicemente di una nostra disattenzione e un danno causato da un rm di troppo.

Per come eseguire questo ultimo punto sta a voi (anche in funzione di quanto capiente è il dispositivo esterno), se volete mantenere lo storico o semplicemente l’ultimo snapshot.

Io attualmente sto utilizzando rsync per copiare il backup su un disco USB esterno, per farlo utilizzo rsync con

rsync -aAxH --delete /mnt/autobackup/rsnapshot/ /mnt/usb/rsnapshot/

Dove /mnt/usb/rsnapshot/ è la directory nel disco esterno montato in /mnt/usb/. L’attributo -H serve a mantenere gli hard link intatti e non sprecare il lavoro di risparmio di spazio prodotto da rsnapshot.

Ripristino del backup

Nel caso dobbiate ripristinare il backup la procedura è piuttosto semplice. Per prima cosa stoppate apache2. Per quanto riguarda i dati è sufficiente dare un

rsync -aAx --delete /directory/backup /directory/da/ripristinare

Solitamente è sufficiente ripristinare solamente la directory dei dati e quella di Nextcloud.

Mentre per quanto riguarda il database collegatevi da root ad ssh lanciando mysql (o mysql -p se avete configurato la password di mysql).

Cancellate il database e ricreatelo con

DROP DATABASE d_nextcloud;
CREATE DATABASE d_nextcloud;

A questo punto ripristinate il backup dal file sql che troverete compresso in /mnt/autobackup/daily.x/localhost/mysqldump/nextcloud.sql.gz. Copiatelo nella vostra home ed estraetelo con

gzip -d nextcloud.sql.gz

A questo punto ripristinatelo con

mysql d_nextcloud < nextcloud.sql

Ora potete riavviare il webserver e avrete il backup ripristinato.

Con questo articolo si chiude la serie “Il NAS definitivo con Debian e Nextcloud” ad eccezione di una piccola postilla futura con la quale accennerò alla manutenzione ordinaria di Nextcloud per gestire gli aggiornamenti tramite shell ssh.

Vi ringrazio per la lettura e la passione dimostrata!