Un venerdì sera alle 22:00 il server web primario di un ente sanitario pubblico va in crash per un guasto hardware. Il filesystem è corrotto. Il DBA di turno chiede l’ultimo backup valido. L’amministratore controlla e scopre che l’ultima copia completa risale a tre giorni prima. I log delle transazioni intermedie sono andati persi. Per evitare questo scenario, ho standardizzato un sistema di rsync backup automatico linux su tutti i server che gestisco. Rsync trasferisce solo i blocchi di dati modificati, riducendo il traffico di rete del 90% rispetto a scp e tagliando la finestra di backup da ore a minuti. In questa guida ti mostro come configurare la sincronizzazione, scrivere uno script robusto con logging e notifiche, e automatizzare tutto con cron.
Rsync in 60 secondi: cos’è e quando usarlo vs scp/tar
Rsync è un tool di sincronizzazione file che utilizza un algoritmo di checksum per determinare le differenze tra sorgente e destinazione. Se hai un file di log da 1 GB e aggiungi 10 MB di righe, rsync copia solo quei 10 MB. Scp, al contrario, copia l’intero file da zero. Tar crea archivi monolitici che occupano spazio e richiedono tempo per estrarre un singolo file durante un ripristino d’emergenza.
Usa rsync quando devi mantenere directory sincronizzate, creare backup incrementali o migrare dati tra server. Usa scp solo per trasferimenti puntuali di singoli file piccoli. Usa tar per archiviare vecchi dati a lungo termine da spostare su nastro o object storage.
Sintassi base e opzioni essenziali (-a, -v, -z, –delete, –exclude)
La sintassi di rsync segue lo schema rsync [opzioni] sorgente destinazione. Lo slash finale nei percorsi è critico: /source/ copia il contenuto della cartella, /source copia la cartella stessa.
Le opzioni che uso nel 99% dei casi sono:
-a(archive): preserva permessi, proprietari, gruppi, symlink e timestamp. È la base di ogni backup affidabile.-v(verbose): mostra i file trasferiti.-z(compress): comprime i dati durante il trasferimento. Riduce la banda consumata sui collegamenti lenti.--delete: elimina i file nella destinazione che non esistono più nella sorgente. Crea un mirror esatto.--exclude: salta i file o le directory che corrispondono al pattern.
Ecco come escludere i file di log e le directory temporanee:
rsync -avz --exclude='*.log' --exclude='tmp/' /source/ /dest/
Prima di eseguire qualsiasi comando in produzione, usa il dry run con l’opzione -n. Simula il trasferimento senza scrivere nulla:
rsync -avzn /source/ /dest/ # dry run
Backup locale: sincronizzare directory
Il backup locale è il punto di partenza per testare la sintassi. Supponi di voler sincronizzare i dati da un disco primario a un disco di backup montato sullo stesso server:
rsync -avz /source/ /destination/
Se vuoi che la destinazione sia una copia esatta della sorgente, inclusa la cancellazione dei file rimossi, aggiungi --delete:
rsync -avz --delete /source/ /destination/
Fai attenzione con --delete. Se inverti sorgente e destinazione per sbaglio, cancelli i tuoi dati originali. Testa sempre con -n prima.
Backup remoto via SSH: configurazione e autenticazione
Sincronizzare directory tra server remoti è il caso d’uso più comune. Rsync utilizza SSH come trasporto predefinito, garantendo la cifratura dei dati in transito.
rsync -avz -e ssh /var/www/ utente@backup-server:/backup/www/
L’opzione -e ssh è ridondante nelle versioni recenti ma utile per specificare porte non standard o chiavi SSH personalizzate: -e 'ssh -p 2222 -i /home/utente/.ssh/id_rsa_backup'.
Per automatizzare il processo con cron, devi configurare l’autenticazione a chiave pubblica tra i server. Senza questa configurazione, il job cron si bloccherà chiedendo la password. [Leggi anche: SSH Senza Password Linux: Guida Completa all’Autenticazione a Chiave Pubblica]
Script di backup completo con logging e notifica email
Un backup notturno deve lasciare traccia del suo esito. Ho scritto uno script che esegue il sync, registra l’output in un file di log e invia un’email in caso di errore.
#!/bin/bash
SOURCE_DIR="/var/www/"
DEST_USER="utente"
DEST_HOST="backup-server"
DEST_DIR="/backup/www/"
LOG_FILE="/var/log/rsync_backup_$(date +%Y%m%d).log"
EMAIL_ADMIN="admin@tuodominio.it"
rsync -avz --delete -e ssh $SOURCE_DIR ${DEST_USER}@${DEST_HOST}:${DEST_DIR} > $LOG_FILE 2>&1
if [ $? -ne 0 ]; then
mail -s "ERRORE BACKUP RSYNC su $(hostname)" $EMAIL_ADMIN < $LOG_FILE
fi
Salva lo script in /opt/scripts/backup_rsync.sh, rendilo eseguibile con chmod +x e testalo manualmente prima di inserirlo in cron.
Automatizzare con cron: esempi pratici
Cron esegue i comandi a intervalli fissi. Per lanciare il backup ogni notte alle 02:00, modifica il crontab dell’utente root con crontab -e e aggiungi:
0 2 * * * /opt/scripts/backup_rsync.sh
Se preferisci un backup più frequente dei dati critici, ogni 4 ore:
0 */4 * * * /opt/scripts/backup_rsync.sh
Assicurati che la variabile PATH nello script o nel crontab includa i percorsi dei binari di rsync e ssh. Cron ha un ambiente molto ristretto rispetto alla tua shell interattiva.
Rsync incrementale vs completo: quando usare cosa
Rsync è intrinsecamente incrementale a livello di blocco. Trasferisce solo le parti modificate dei file. Tuttavia, spesso hai bisogno di mantenere snapshot storici (backup incrementali basati su cartelle datate) senza sprecare spazio.
L’opzione --link-dest risolve questo problema. Crea una nuova directory per il backup corrente e crea hard link per i file identici al backup precedente. I file modificati vengono copiati realmente.
YESTERDAY=$(date -d "yesterday" +"%Y-%m-%d")
rsync -avz --delete --link-dest=/backup/www/$YESTERDAY /var/www/ utente@backup-server:/backup/www/$(date +"%Y-%m-%d")/
Questa strategia offre il meglio di entrambi i mondi: ripristino rapido da cartelle datate e consumo di disco limitato ai soli dati cambiati.
Gestire gli errori: exit codes e notifiche Telegram
Uno script di backup silenzioso è un rischio. Se fallisce e nessuno se ne accorge, non hai un backup. Rsync restituisce exit codes specifici che puoi intercettare. Il codice 0 indica successo, 24 indica un trasferimento parziale (file scomparsi durante il sync, tipico dei log in rotazione), 23 indica un errore di permessi.
Per le infrastrutture moderne, le notifiche email finiscono spesso nel rumore di fondo. Le notifiche Telegram sono più immediate. Crea un bot su Telegram tramite BotFather, ottieni il token e il chat_id, poi aggiungi questa funzione al tuo script:
send_telegram() {
MESSAGE=$1
TOKEN="IL_TUO_TOKEN_BOT"
CHAT_ID="IL_TUO_CHAT_ID"
curl -s -X POST "https://api.telegram.org/bot${TOKEN}/sendMessage" -d chat_id=${CHAT_ID} -d text="${MESSAGE}" > /dev/null
}
if [ $? -ne 0 ] && [ $? -ne 24 ]; then
send_telegram "ERRORE CRITICO BACKUP RSYNC su $(hostname). Exit code: $?"
fi
Ignorare l’exit code 24 è una scelta operativa. I file di log in rotazione scompaiono spesso durante il trasferimento. Se il tuo backup include directory di log attivi, il codice 24 è fisiologico.
Conclusioni
Un backup non esiste finché non hai testato il ripristino. Rsync ti dà gli strumenti per sincronizzare i dati in modo efficiente, ridurre la banda e creare snapshot incrementali. Configura l’autenticazione SSH senza password, costruisci uno script con logging e notifiche Telegram, e automatizza con cron. Controlla i log regolarmente e testa il ripristino di un singolo file almeno una volta al mese. Quando il disco primario fallirà, la differenza tra un’interruzione di 10 minuti e una catastrofe di 3 giorni dipenderà solo da come hai configurato il tuo rsync backup automatico linux.