Backup da Raspberry a cloud drive
Una funzione utile per il backup del Raspi è quella di salvare i dati su uno spazio cloud, esempio Google Drive o Microsoft OneDrive.Per questo c’è un programma molto utile, RCLONE.
Vado oltre l’installazione per la quale trovate tonnellate di istruzioni e spiego qui come utilizzarlo.
Innanzitutto la differenza tra Copy e Sync. Ci sono ovviamente tante altre istruzioni e tanti “flag” da impiegare ma per lo scopo di cui parlo qui mi riferisco a questi due comandi in particolare.
Come si può immaginare Copy copia dal locale al remoto un file o una cartella senza preoccuparsi di cosa è scritto nel remoto oltre a quanto stiamo copiando. Sync invece sincronizza (rende uguale) due cartelle, una locale e una remota.
Lanciando il comando sync da locale per, esempio, la cartella Test, questa cartella sarà replicata integralmente sul remoto. Quindi se abbiamo cancellato un file da Test sul locale e questo file era presente su remoto, sync cancellerà anche il file su remoto. Attenzione che sync, lanciato da locale non copierà il vecchio file ancora presente sul remoto, proprio perché il comando parte da locale.
Un errore che può succedere a tutti è quello di sincronizzare una cartella locale con remoto senza specificare la cartella esatta oppure semplicemente pensando che il comando troverà la cartella automaticamente. Ci troveremmo così tutto il disco remoto cancellato e la sola cartella sincronizzata da locale presente!
Fortunatamente rclone ha un flag “molto utilissimo”: si aggiunge alla fine della riga di comando “—dry-run”. Vedremo scritto cosa farà rclone, realmente, solo una volta lanciato il comando senza il flag, e potremo così evitare errori seri.
Partiamo da dopo l’installazione di rclone. Creiamo una directory su cui sarà montato il drive:
mkdir msonedrive
una volta creata la directory possiamo montare il drive su questa:
rclone --vfs-cache-mode writes mount msonedrive: /home/pi/msonedrive/
Quello che vedete dopo mount è il nome che abbiamo assegnato in rclone config al nostro drive. In questo mio esempio i nomi coincidono ma non sono la stessa cosa.
Una volta montato il drive possiamo vedere cosa c’è dentro:
rclone ls msonedrive
per vedere i file
rclone lsd msonedrive
per vedere le directory. Verranno elencate le cartelle ed i file che abbiamo sul cloud drive.Ovviamente dovremmo montare il filesystem ad ogni boot ma per automatizzare il tutto possiamo creare un .desktopfile.
Mettiamo dentro le seguenti istruzioni:
Inciso per la clonazione della SD card con programma tramite terminal (es. Rpiclone): facendo la copia della SD card con rpi-clone, mi sono accorto che la directory/home/pi/msonedrive era scomparsa al boot della SD clonata.
Ho risolto aggiungendo all’Exec queste istruzioni:
sh -c “mkdir -p /home/pi/msonedrive ; sleep 1 ; rclone --vfs-cache-mode writes mount msonedrive: /home/pi/msonedrive/“
creo la directory mancante se non esiste (-p), aspetto un secondo e monto il file system su questa.A questo punto mettiamo questo desktop file nella seguente directory:
~/.config/autostart/<file appena creato>.desktop
Ad ogni avvio avremo il nostro drive automontato sulla directory scelta.
Ora vediamo il comando che, nel mio esempio, serve per creare il file di backup da automatizzare. Si tratta di un backup del dbase mongodb:
sudo mongodump --db <nostro database> --out /home/pi/<dir dove memorizzare backup>
Un crontab mi lancerà il backup ogni notte alla 1.
rclone copy /home/pi/rclonedir/ msonedrive: "mia dir di appoggio"
Alla fine la mia copia di backup salvata sulla directory locale sarà copiata anche sulla mia directory di appoggio del cloud drive.
Vediamo ora come automatizzare il tutto.
Creiamo uno script in bash che esegua i comandi necessari e mettiamolo poi in crontab. Quello che segue è il mio (unendo più esempi che ho trovato):
#!/bin/bash
# RClone Config file
RCLONE_CONFIG=/home/pi/.config/rclone/rclone.conf
export RCLONE_CONFIG
if pidof -o %PPID -x “rclone-clone.sh”; then
exit 1
fi
rclone copy /home/pi/rclonedir/ msonedrive:"mia dir di appoggio"
exit
# RClone Config file
RCLONE_CONFIG=/home/pi/.config/rclone/rclone.conf
export RCLONE_CONFIG
if pidof -o %PPID -x “rclone-clone.sh”; then
exit 1
fi
rclone copy /home/pi/rclonedir/ msonedrive:"mia dir di appoggio"
exit
La prima riga è la solita necessaria per eseguire lo script da comando.
Le tre righe successive sono necessarie a crontab, senza non funziona. Crontab non conosce la posizione delle variabili d’ambiente richieste dell’istruzione “rclone copy........”. Per questo motivo bisogna indicare nello script il percorso dove trovare il file .conf che serve al programma.
Mettiamo nella variabile RCLONE_CONFIG il percorso dove si trova il file di configurazione ed esportiamo questa variabile perché possa essere utilizzata da altri script o da altre shell che lo script aprirà.
Per trovare il percorso specifico di ogni OS (qui Debian Buster) basta dare sul terminale:
rclone config file.
Vedremo scritto il percorso completo.
Ritornando allo script bash, troviamo dopo un’istruzione condizionale:
if pidof -o %PPID -x “rclone-clone.sh”
Si tratta di un controllo che ho visto consigliato spesso ma che forse nel caso di un’istanza singola lanciata una volta al giorno è superfluo.
Verifica che non ci sia un’altra istanza (cercando il relativo PID) di rclone-clone.sh attiva. Il flag ‘-x’ serve per includere anche i PID degli script, come è questo. Il flag ‘-o’ (in abbinamento a pidof significa ‘omit’) serve a non includere nella ricerca lo stesso script che viene lanciato (non considera il parent PID creato dal lancio stesso dello script).
Se trova un’altra istanza dello script, esce, altrimenti esegue la copia desiderata sul cloud drive.
Metto lo script in esecuzione in crontab, 10 minuti dopo il backup, con l’eventuale scrittura in un file degli errori che potrebbero verificarsi
sudo chown pi /home/pi/.config/rclone/rclone.conf
sudo chmod 660 /home/pi/.config/rclone/rclone.conf
sudo chmod 660 /home/pi/.config/rclone/rclone.conf
ovviamente con il percorso vostro specifico!
Questo è tutto.