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:

Una nota: il flag ‘—allow-non-empty’, aggiunto alla fine della terza riga, permetterebbe di montare il file system su directory non vuote. Se montiamo il drive su una directory con dentro anche un solo file, con questo flag si sovrascriverà e non vedremo più il file ma il nuovo file system. Ciò solo fino a quando il fs sarà montato, una volta smontato il file ricomparirà.

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.

Ora che ho il file di backup nella mia directory devo copiarlo nel cloud drive. Il comando da lanciare è il seguente:

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

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

Attenzione, potreste trovarvi con un messaggio di errore quando, dopo un crontab, provate ad accedere al drive, relativo a permessi negati. Lanciando crontab come root (sudo crontab -e) il proprietario del file (che vedete con ls -l) di configurazione ritorna root. Anche tentando di lanciare "rclone ls msonedrive" da root non riuscirete. La soluzione è di rendere proprietario di nuovo lo user da cui lanciate rclone e, per rendere definitivo il processo, dare i permessi allo user.

sudo chown pi /home/pi/.config/rclone/rclone.conf

sudo chmod 660 /home/pi/.config/rclone/rclone.conf

ovviamente con il percorso vostro specifico!

Questo è tutto.