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/sd
c
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!
Degna conclusione di una serie di guide molto utili e chiare che non mancherò di mettere in pratica nel momento in cui mi costruirò il NAS (penso verso fine anno, quando intendo aggiornare anche il pc fisso).