
rsync ci aiuta quando dobbiamo trasferire molti file da un server ad un altro, o anche da una directory all’altra. Sebbene oggi con “continuous deployment” e “continuous delivery” ci siano strumenti automatizzati per lo spostamento o installazione dei file di un progetto, a volte qualche operazione viene eseguita manualmente anche senza l’utilizzo di git.
Quasi tutti i progetti web coinvolgono tre ambienti principali in cui avvengono le tre fasi principali di sviluppo software:
- Ambiente di sviluppo – generalmente un computer desktop/laptop o un server accessibile ad uno o più sviluppatori
- Ambiente di test/staging – generalmente in cloud, con le stesse caratteristiche dell’ambiente di produzione, protetto o non direttamente accessibile/indicizzato dai motori di ricerca
- Ambiente di produzione – ambiente definitivo dove risiede ed è pubblicamente accessibile il progetto, generalmente associato al dominio principale
Cos’è rsync?
rsync è un sistema di sincronizzazione di file molto utile ed affidabile. rsync si usa per sincronizzare file tra directory locali o remote.
rsync funziona su ogni tipo di sistema basato su Unix, quindi certamente Linux e Mac OS
rsync risolve egregiamente alcuni classici problemi di sincronizzazione:
- Velocità – il trasferimento di file diretto via rete è certamente più veloce del “vecchio” passaggio utilizzando FTP. (Server1 -> Download FTP in locale … Upload FTP -> Server2)
- Utilità – è possibile eseguire la migrazione completa con una singola riga di comando.
- Permessi su file e directory – con l’utilizzo dell’opzione corretta da riga di comando (a) rsync mantiene dopo il trasferimento i medesimi permessi su file e directory in modo da evitare problemi di tipo “permission denied”.
- File nascosti – rsync considererà anche i file nascosti come ad esempio il file .htaccess che con altri metodi potrebbero essere trascurati.
Di che cosa c’è bisogno per usare rsync?
- Accessi SSH, in entrambi gli host in caso di trasferimento remoto
- rsync installato, in entrambi gli host in caso di trasferimento remoto
- Conoscenza di come navigare un file system Unix.
Il comando rsync in generale si usa in questo modo:rsync [opzioni] [sorgente] [destinazione]
In particolare, per la migrazione di un sito web usando rsync, le seguenti opzioni sono fondamentali:
- a : archive mode, mantiene permessi e timestamp di file e directory
- z : compresses data during transfer, effettua una compressione durante il trasferimento
in modo da rendere più veloce l’operazione e consumare meno banda - v : verbose mode, mostra l’andamento del trasferimento ed informazioni in caso di errore
- r : recursive, considera ricorsivamente tutti i file e directory all’interno di una determinata directory.
Tutte queste opzioni possono essere combinate insieme: “-azvr“.
Esempio di trasferimento locale usando rsync:
Supponiamo di avere una directory “dev.dominio.it” e di essere pronti per il suo trasferiemnto in un’altra directory “dominio.it”. Supponiamo anche che entrambe le directory si trovino nella directory “/var/www/” (directory abbastanza comune in molti web server Linux).
In questo caso è possibile utilizzare sia i path assoluti in questo modo:rsync -azvr /var/www/dev.dominio.it /var/www/dominio.it
oppure utilizzare i path relativi se ci si trova all’interno della directory /var/www/dev.dominio.itrsync -azvr . ../dominio.it
in questo secondo caso la directory sorgente è la directory corrente (.) mentre la directory di destinazione è la directory dominio.it contenuta nella directory genitore di quella corrente (..)
Esempio di trasferimento remoto usando rsync:
La “bellezza” di rsync sta nel fatto che il trasferimento remoto funziona esatttamente allo stesso modo di quello locale. L’unica accortezza necessaria è effettuare il login sull’host remoto.
Trasferimento da locale a remoto con rsync:
rsync -azvr /var/www/dev.dominio.it user@host:/var/www/dominio.it
Dove user è il nome utente per effettuare il login sull’host remoto e host è il nome o l’indirizzo IP dell’host remoto.rsync -azvr /var/www/dev.dominio.it pippo@www.miodominio.it:/var/www/dominio.it
Trasferimento da remoto a locale con rsync:
rsync -azvr user@host:/var/www/dominio.it /var/www/dev.dominio.it
(path assoluto)rsync -azvr user@host:/var/www/dominio.it .
(path relativo se la directory corrente è dev.dominio.it)
rsync gestisce le esclusioni, quindi è possibile trasferire tutto tranne alcuni file che non vogliamo che siano trasferiti.
Si pensi ad esempio ai file di configurazione che contengono i dati per l’accesso al database (probabilmente diversi in ambiente di sviluppo) o configurazioni particolari per l’ambiente di produzione che con il trasferimento sarebbero sovrascritti.
Basta utilizzare l’opzione –exclude per escludere file o directory che non si vogliono trasferire.
Si possono utilizzare più opzioni –exclude nella stessa riga di comando.rsync -azvr --exclude "config.php" --exclude "directoryDaEscludere" --exclude ".htaccess" --exclude "robots.txt" . /var/www/dominio.it
In questo caso stiamo sincronizzando tutto dalla directory corrente alla directory /var/www/dominio.it
tranne i file .htaccess, config.php, robots.txt e la directory directorydaEscludere.
Vediamo altre opzioni interessanti che si possono utilizzare con rsync.
-u | –update
Questa opzione può essere molto utile perché evita l’aggiornamento di file che nella destinazione risultano avere una data di modifica più recente di quella dei file di origine corrispondenti.
Si può utilizzare nel caso in cui anche i file presenti nella destinazione siano stati modificati (sincronizzazione bidirezionale).
-e | –rsh <comando>
Permette di specificare quale shell utilizzare per l’accesso remoto.
-c | –checksum
Utilizza per la verifica di un codice di controllo più grande di quello utilizzato di default.
In questo modo le operazioni di controllo sorgente-destinazione sono più accurate ma più lente.
–delete
ATTENZIONE, utilizzare con cautela e molta attenzione.
L’opzione infatti permette di cancellare i file nella destinazione che non si trovano nella sorgente. E’
un’opzione pericolosa da usare con cautela, ma che può aiutare a mantenere “pulito” il server
di destinazione, dal quale in questo modo sarebbero rimossi file obsoleti.
Senza utilizzare questa opzione infatti si copia dalla sorgente alla destinazione, ma i file già presenti nella destinazione e non presenti nella sorgente non vengono toccati (rimossi o modificati).
Visto il rischio insito nell’uso di questa opzione, la cancellazione dei file non presenti nella sorgente
avviene solo nel caso in cui la directory sia specificatamente indicate nella sorgente.
-n | –dry-run
Consente di simulare il comando senza che venga realmente eseguito, utile in fase di test.
Per maggiori informazioni si può consultare la man page di rsync (man rsync)
Consiglio anche questa pagina come riferimento: http://wwwcdf.pd.infn.it/AppuntiLinux/trasferimento_e_sincronizzazione_di_dati_attraverso_la_rete.htm