Backup automatico cartelle di posta in IMAP (Linux server)

06 Novembre 2017

Alcune settimane fa ho cambiato server e ho dovuto migrare tutte le caselle di posta elettronica dei miei domini; questo processo, oltre che essere abbastanza noioso, mi ha fatto andare in paranoia al pensiero di poter perdere i miei archivi e-mail che risalgono al 2007! Essendo una migrazione manuale avevo paura di dimenticare qualche cartella, qualche pagina di e-mail ecc ecc. Se cercate su internet e non siete sistemisti, potrebbe andarvi bene la soluzione proposta dalla maggior parte dei siti, ovvero: creati l'account IMAP con i dati di accesso del nuovo server nel client di posta accanto all'account esistente con i dati da copiare. Seleziona le cartelle e copiale nel nuovo account. Niente di sbagliato; il metodo funziona ma: spesso il client va in errore e interrompe la copia. Bisogna copiare solo poche e-mail per volta altrimenti potrebbe dare errore nella copiatura. È completamente manuale e quindi ad alto rischio di errore umano. Cercavo quindi un metodo il più possibile automatico, affidabile e veloce. Dopo un periodo di test posso dire di averlo trovato.

Premessa


Il metodo proposto è stato creato per funzionare in ambienti Linux, per i quali è necessario avere accesso con privilegi elevati. L'esempio comprende anche l'utilizzo di una Raspberry Pi 3 e di un NAS Synology. L'utilizzo di questi dispositivi è del tutto opzionale, così come l'automazione delle operazioni.

Attenzione! E' consigliato eseguire un backup delle proprie e-mail prima di iniziare la procedura!
Scherzo ovviamente! Non c'è nulla di rischioso nel procedimento che sto per descrivere. Prestate comunque attenzione ai vari passaggi in quanto sono comandi da terminale effettuati dai privilegi elevati.

Sul server di posta


Lato mail server, dove riesiedono il nostro dominio e le nostre caselle IMAP, dobbiamo predisporre uno script che vada a creare un archivio compresso di ogni casella mail di cui ci interessa effettuare il backup. Per farlo, consiglio innanzi tutti di creare una cartella in cui inserire tutti gli archivi che poi andremo a salvare. Per comodità l'ho creata all'interno della cartella in cui sono contenute tutte le caselle di posta attive sul mio dominio, lucascalvi.it e chiamata backup. Potete chiamarla come volete, basta che poi andiate a modificare di conseguenza lo script. Riassumendo, dovreste trovarvi in questa situazione:

/home/username/mail/lucascalvi.it/ backup casella1 casella2 casella3.....casellaN

Per effettuare un backup e creare un archivio compresso contenente la casella e-mail che vogliamo salvare, basta usare il comando:
tar cvfz backup/casella1.tar.gz casella1/ 
In questo esempio viene creato un tar.gz della casella chiamata casella1@miodominio, nel mio caso: casella1@lucascalvi.it.
Per salvare più caselle email, basta inserire il comando inserendo il nome della casella da salvare ed inserirlo in un unico script bash, così da poterlo rendere eseguibile e lanciarlo quando desiderato:
#!/bin/bash
tar cvfz backup/casella1.tar.gz casella1/ 
tar cvfz backup/casella2.tar.gz casella2/ 
tar cvfz backup/casella3.tar.gz casella3/ 
..........................
..........................
tar cvfz backup/casellaN.tar.gz casellaN/ 

Renderlo automatico

Lo script sopra indicato l'ho salvato e chiamato mail-backup.sh; può essere salvato dove vi pare e chiamato come vi pare, l'importante è renderlo eseguibile, per farlo bisogna eseguire:
chmod +x mail-backup.sh
Ora che lo script è eseguibile, possiamo farlo eseguire appunto, quando vogliamo, in maniera automatica, direttamente dal server di posta. Per farlo basta aggiungere questa riga, o del tutto simile, al file crontab:

00 6 * * 1 sh /home/username/.scripts/mail-backup.sh

Questa riga significa che: lo script chiamato mail-backup.sh, salvato nella directory /home/username/.scripts viene eseguito alle ore 6:00 del primo giorno della settimana, Lunedì; si intende ogni Lunedì.

Sul client di backup


In questa seconda parte viene descritto come salvare su un supporto qualsiasi, gli archivi compressi generati sul server e conservarli al sicuro. I passi da seguire possono essere più o meno, dipende da cos'è il vostro client di backup. Un PC, un altro server o una Raspberry Pi, come nel mio caso, collegata ad un NAS della Synology, il solidissimo DS216+.

Procedura standard

Se non avete, o non avete intenzione di usare, una Raspberry Pi e/o un NAS, potete tranquillamente eseguire lo script quando lo ritenete necessario, sul vostro PC e salvare poi le caselle compresse dove meglio credete. Per farlo c'è un semplice comando:
sshpass -p "PASSWORD" scp -r utente@IP_SERVER:/home/username/mail/lucascalvi.it/backup/casella1.tar.gz ~/Download
sshpass è un programma che passa la password al programma che segue, in questo caso scp: programma che consente la copia di file da differenti host. Per la copia utilizza ssh, di cui garantisce anche il livello di sicurezza.
utente@IP_SERVER:DIR_FILE è la sintassi con la quale indichiamo i dati per accedere al server di posta e il relativo file da copiare. nell'esempio, il file casella1.tar.gz presente nella cartella remota /home/username/mail/lucascalvi.it/backup/; viene poi salvata nella cartella Download, destinazione totalmente arbitraria.
Anche in questo caso è possibile creare un file .sh in cui replicare il comando precedente per ogni file di backup che dobbiamo scaricare in locale, ad esempio:
#!/bin/bash
sshpass -p "PASSWORD" scp -r utente@IP_SERVER:/home/username/mail/lucascalvi.it/backup/casella1.tar.gz ~/Download
sshpass -p "PASSWORD" scp -r utente@IP_SERVER:/home/username/mail/lucascalvi.it/backup/casella2.tar.gz ~/Download
sshpass -p "PASSWORD" scp -r utente@IP_SERVER:/home/username/mail/lucascalvi.it/backup/casella3.tar.gz ~/Download
..........................
..........................
sshpass -p "PASSWORD" scp -r utente@IP_SERVER:/home/username/mail/lucascalvi.it/backup/casellaN.tar.gz ~/Download


Procedura "pheega"

Ovviamente la procedura standard è la procedura per i paperini. Se siete veramente toghi, dovete utilizzare questa.
Come detto è necessario l'utilizzo di una Raspberry Pi e di un NAS. Sulla Raspberry Pi verrà lanciato lo script che recupererà gli archivi delle caselle sul server di posta; sul NAS invece verranno fisicamente salvati i backup delle caselle di posta. Vediamo come.

Il NAS della Synology che utilizzo giornalmente possiede una presa USB 3.0 sul retro, nella quale ho collegato il cavo USB/MicroUSB che alimenta la Raspberry Pi. In questo modo, quando il NAS è acceso, anche la Raspberry Pi si accende.
A bordo della Raspberry Pi ho installato Raspbian; ho quindi creato lo script mostrato in precedenza e reso eseguibile, proprio come fatto sul server di posta. Anche qui ho inserito una direttiva nel crontab coerente con quanto impostato nel crontab sul server, come segue:

05 7 * * 1 sh /home/pi/.scripts/fetch-mail-backup.sh

Lo script fetch-mail-backup.sh, situato nella cartella /home/pi/.scripts/, viene eseguito il primo giorno della settimana, Lunedì, alle ore 7:05; questo per dare il tempo al server di posta, di completare la creazione delle cartelle compresse che inizia alle 6:00.
Il NAS invece ha il semplice compito di accendersi ad un orario prestabilito, per permettere alla Raspberry Pi di accendersi e lanciare lo script per recuperare gli archivi. Si imposta semplicemente dall'interfaccia del DSM in:


Dovete inoltre decidere una cartella condivisa sul NAS in cui salvare i dati scaricati dal Raspberry Pi. Questa cartella deve essere specificata nello script e soprattutto montata dalla Raspberry Pi; e qui è necessario un trick.
Almeno nel mio caso, prima di montare la cartella condivisa usando NFS, devo prima avviare il demone rpcbind. Non penso ci siano problemi di questo tipo con altre condivisioni, tipo SMB. Ecco come appare lo script completo con il salvataggio su NAS:
#!/bin/bash
sudo /etc/init.d/rpcbind start
sudo mount IP_NAS:/volume1/BACKUP /mnt/NAS/BACKUP
sshpass -p "PASSWORD" scp -r utente@IP_SERVER:/home/username/mail/lucascalvi.it/backup/casella1.tar.gz /mnt/NAS/BACKUP/email/lucascalvi.it/casella1
sshpass -p "PASSWORD" scp -r utente@IP_SERVER:/home/username/mail/lucascalvi.it/backup/casella2.tar.gz /mnt/NAS/BACKUP/email/lucascalvi.it/casella2
sshpass -p "PASSWORD" scp -r utente@IP_SERVER:/home/username/mail/lucascalvi.it/backup/casella3.tar.gz /mnt/NAS/BACKUP/email/lucascalvi.it/casella3
..........................
..........................
sshpass -p "PASSWORD" scp -r utente@IP_SERVER:/home/username/mail/lucascalvi.it/backup/casellaN.tar.gz /mnt/NAS/BACKUP/email/lucascalvi.it/casellaN
Viene montata la cartella condivisa dal NAS BACKUP su /mnt/NAS/BACKUP, directory creata sulla Raspberry Pi e poi tramite il comando descritto in precedenza, il file tar.gz non viene più salvato nella generica cartella Download, ma in una cartella dedicata ad una specifica casella.


X
THE END