Transférer des fichiers entre deux serveurs avec rsync

Pour transférer un répertoire entre deux serveurs Linux, utilisez généralement rsync -a --info=progress2 source/ utilisateur@serveur:/destination/. Rsync passe par SSH, préserve les attributs des fichiers et ne retransmet ensuite que les données modifiées.

rsync est particulièrement adapté aux migrations de serveurs, aux déploiements, aux sauvegardes et aux synchronisations volumineuses. Contrairement à une simple copie, il compare la source et la destination. Lors des exécutions suivantes, il évite donc de retransférer inutilement les fichiers inchangés.

Distingo, le livret à 2%

Installer rsync sur les deux serveurs

rsync doit être installé sur la machine qui lance la commande et sur le serveur distant. Sous Debian, Ubuntu et leurs dérivées, utilisez :

sudo apt update
sudo apt install rsync

Sous Fedora, Rocky Linux ou AlmaLinux :

sudo dnf install rsync

Vérifiez ensuite la version installée :

rsync --version

Comprendre la syntaxe de rsync

La syntaxe générale d’un transfert vers un serveur distant est la suivante :

rsync OPTIONS SOURCE UTILISATEUR@SERVEUR:DESTINATION

Par exemple, cette commande copie le contenu de /home/matt/videos/ vers le serveur distant :

rsync -a --info=progress2 /home/matt/videos/ matt@serveur-b.example:/home/matt/videos/Langage du code : JavaScript (javascript)
  • -a active le mode archive et préserve la plupart des attributs utiles ;
  • --info=progress2 affiche la progression globale du transfert ;
  • /home/matt/videos/ représente le répertoire source ;
  • matt@serveur-b.example désigne le compte SSH et le serveur distant ;
  • le dernier chemin indique le répertoire de destination.
Kinsta: Premium Managed WordPress hosting

La barre oblique finale change le résultat

Avec rsync, la barre oblique placée à la fin du chemin source n’est pas décorative. Elle modifie ce qui sera copié.

Copier le contenu du répertoire

rsync -a /home/matt/videos/ matt@serveur-b.example:/srv/media/Langage du code : JavaScript (javascript)

Cette commande copie le contenu de videos dans /srv/media/.

Copier le répertoire lui-même

rsync -a /home/matt/videos matt@serveur-b.example:/srv/media/Langage du code : JavaScript (javascript)

Cette fois, rsync crée le répertoire /srv/media/videos/. Cette petite barre oblique a déjà causé davantage de répertoires imbriqués que bien des scripts mal écrits.

Simuler le transfert avant de copier

Avant une migration importante, ajoutez --dry-run. Rsync affiche alors les opérations prévues sans modifier la destination.

rsync -a --dry-run --itemize-changes /home/matt/videos/ matt@serveur-b.example:/srv/media/Langage du code : JavaScript (javascript)

--itemize-changes indique précisément quels fichiers ou attributs diffèrent. Une fois le résultat contrôlé, retirez simplement --dry-run.

WPEngine: Premium Managed WooCommerce hosting

Afficher une progression globale

L’option historique --progress affiche la progression de chaque fichier. Pour un répertoire contenant des milliers de fichiers, la sortie devient vite bavarde.

Préférez généralement :

rsync -a --info=progress2 /source/ utilisateur@serveur:/destination/Langage du code : JavaScript (javascript)

Pour obtenir également des statistiques finales :

rsync -a --info=progress2 --stats /source/ utilisateur@serveur:/destination/Langage du code : JavaScript (javascript)

Reprendre un transfert interrompu

Pour de gros fichiers ou une liaison instable, conservez les fichiers partiellement transférés dans un répertoire temporaire :

rsync -a \
    --info=progress2 \
    --partial-dir=.rsync-partial \
    /source/ \
    utilisateur@serveur:/destination/Langage du code : JavaScript (javascript)

Si la connexion tombe, relancez la même commande. Rsync réutilisera les données déjà reçues lorsque cela est possible.

L’option courte -P combine --partial et --progress. Elle reste pratique, mais --partial-dir évite de laisser des fichiers incomplets au milieu des fichiers valides.

Kinsta: Premium Managed WordPress hosting

Utiliser un port SSH personnalisé

Si le serveur distant écoute sur un autre port que le port 22, transmettez la commande SSH avec l’option -e :

rsync -a \
    --info=progress2 \
    -e "ssh -p 59222" \
    /source/ \
    admin@serveur-b.example:/destination/Langage du code : JavaScript (javascript)

Vous pouvez également préciser une clé SSH particulière :

rsync -a \
    --info=progress2 \
    -e "ssh -p 59222 -i ~/.ssh/rsync_ed25519" \
    /source/ \
    admin@serveur-b.example:/destination/Langage du code : JavaScript (javascript)

Éviter la saisie répétée du mot de passe

Pour automatiser le transfert, utilisez une clé SSH plutôt qu’un mot de passe enregistré dans un script.

Créez une clé dédiée sur le serveur source :

ssh-keygen -t ed25519 -f ~/.ssh/rsync_ed25519 -C "rsync server transfer"Langage du code : JavaScript (javascript)

Copiez ensuite la clé publique vers le serveur de destination :

ssh-copy-id -i ~/.ssh/rsync_ed25519.pub utilisateur@serveur-b.exampleLangage du code : JavaScript (javascript)

Avec un port personnalisé :

ssh-copy-id -i ~/.ssh/rsync_ed25519.pub -p 59222 utilisateur@serveur-b.exampleLangage du code : JavaScript (javascript)

Testez toujours la connexion SSH avant de lancer rsync :

ssh -i ~/.ssh/rsync_ed25519 utilisateur@serveur-b.exampleLangage du code : JavaScript (javascript)

Pour une automatisation sensible, créez un compte distant dédié. Limitez aussi ses droits au répertoire nécessaire. Évitez d’utiliser root lorsque les permissions ne l’exigent pas.

Exclure certains fichiers et répertoires

L’option --exclude ignore les fichiers inutiles pendant le transfert :

rsync -a \
    --info=progress2 \
    --exclude='.git/' \
    --exclude='node_modules/' \
    --exclude='cache/' \
    --exclude='*.log' \
    /var/www/site/ \
    deploy@serveur-b.example:/var/www/site/Langage du code : JavaScript (javascript)

Pour une longue liste, créez un fichier rsync-excludes.txt :

.git/
node_modules/
cache/
*.log
.env

Puis utilisez :

rsync -a \
    --info=progress2 \
    --exclude-from='rsync-excludes.txt' \
    /var/www/site/ \
    deploy@serveur-b.example:/var/www/site/Langage du code : JavaScript (javascript)

Attention toutefois au fichier .env. Son exclusion peut être souhaitable pour un déploiement, mais pas nécessairement pour une migration complète et sécurisée.

Créer un miroir exact avec –delete

Par défaut, rsync ajoute et met à jour les fichiers, mais il ne supprime pas les fichiers supplémentaires présents sur la destination.

Pour transformer la destination en miroir exact de la source, utilisez --delete :

rsync -a \
    --delete \
    --info=progress2 \
    /source/ \
    utilisateur@serveur:/destination/Langage du code : JavaScript (javascript)

Cette option supprime sur la destination les fichiers absents de la source. Une inversion des chemins peut donc devenir très créative, mais pas dans le bon sens.

Simulez systématiquement la commande avant sa première exécution :

rsync -a \
    --delete \
    --dry-run \
    --itemize-changes \
    /source/ \
    utilisateur@serveur:/destination/Langage du code : JavaScript (javascript)

Préserver les ACL, attributs étendus et liens physiques

Le mode archive -a préserve la plupart des métadonnées courantes. Cependant, il n’inclut pas les ACL, les attributs étendus ni les liens physiques.

Pour une migration système plus fidèle, utilisez selon vos besoins :

rsync -aHAX \
    --numeric-ids \
    --info=progress2 \
    /source/ \
    root@serveur-b.example:/destination/Langage du code : JavaScript (javascript)
  • -H préserve les liens physiques ;
  • -A préserve les ACL ;
  • -X préserve les attributs étendus ;
  • --numeric-ids conserve les identifiants numériques des utilisateurs et groupes.

N’ajoutez pas ces options mécaniquement. Elles augmentent le travail nécessaire et supposent que les systèmes de fichiers source et destination prennent en charge ces métadonnées.

Faut-il utiliser la compression avec -z ?

L’option -z compresse les données pendant leur transfert. Elle peut aider sur une connexion lente ou coûteuse lorsque les fichiers se compressent bien.

rsync -az --info=progress2 /source/ utilisateur@serveur:/destination/Langage du code : JavaScript (javascript)

En revanche, elle apporte souvent peu de bénéfices sur un réseau local rapide ou avec des fichiers déjà compressés : vidéos, images JPEG, archives ZIP, sauvegardes compressées ou fichiers WebP. Dans ce cas, elle consomme surtout du processeur des deux côtés.

Limiter le débit du transfert

Pour éviter qu’une migration ne monopolise toute la bande passante, utilisez --bwlimit. La valeur s’exprime en Kio par seconde.

rsync -a \
    --bwlimit=20000 \
    --info=progress2 \
    /source/ \
    utilisateur@serveur:/destination/Langage du code : JavaScript (javascript)

Ici, le transfert est limité à environ 20 Mio/s.

Maintenir le transfert après la fermeture du terminal

Lorsque vous lancez rsync depuis une session SSH ouverte sur le serveur source, les données passent directement du serveur source au serveur distant. Elles ne transitent pas par votre ordinateur.

Cependant, la fermeture brutale de votre session SSH peut arrêter la commande. Pour une migration longue, lancez-la dans tmux.

sudo apt install tmux
tmux new -s migrationLangage du code : JavaScript (javascript)

Lancez ensuite votre commande rsync. Pour détacher la session, utilisez Ctrl+B, puis D.

Vous pourrez fermer votre terminal, puis retrouver la session plus tard :

tmux attach -t migration

Vérifier le résultat après le transfert

Une seconde exécution en simulation permet de repérer les différences restantes :

rsync -a \
    --dry-run \
    --itemize-changes \
    /source/ \
    utilisateur@serveur:/destination/Langage du code : JavaScript (javascript)

Si rsync ne liste aucun changement, les tailles, dates et attributs contrôlés correspondent.

Pour une vérification plus stricte du contenu, ajoutez --checksum :

rsync -ac \
    --dry-run \
    --itemize-changes \
    /source/ \
    utilisateur@serveur:/destination/Langage du code : JavaScript (javascript)

--checksum oblige les deux serveurs à lire les fichiers afin de calculer leurs empreintes. Cette vérification peut donc être très lente sur plusieurs téraoctets. Elle n’est généralement pas nécessaire à chaque synchronisation.

Copier seulement les fichiers absents avec –ignore-existing

L’option --ignore-existing reste utile dans un cas précis : ajouter uniquement les fichiers qui n’existent pas encore sur la destination.

rsync -a \
    --ignore-existing \
    --info=progress2 \
    /source/ \
    utilisateur@serveur:/destination/Langage du code : JavaScript (javascript)

Elle ne remplace pas une synchronisation normale. Un fichier existant, mais incomplet ou obsolète, sera ignoré. Utilisez-la donc seulement lorsque vous souhaitez explicitement préserver tous les fichiers déjà présents.

Exemple complet pour migrer les fichiers d’un site

Voici une commande prudente pour transférer les fichiers d’un site WordPress vers un nouveau serveur :

rsync -a \
    --info=progress2 \
    --stats \
    --partial-dir=.rsync-partial \
    --exclude='wp-content/cache/' \
    --exclude='wp-content/upgrade/' \
    --exclude='*.log' \
    -e "ssh -i ~/.ssh/migration_ed25519" \
    /var/www/example.com/public_html/ \
    deploy@nouveau-serveur.example:/var/www/example.com/public_html/Langage du code : JavaScript (javascript)

Effectuez d’abord une première copie pendant que le site fonctionne. Ensuite, placez temporairement le site en maintenance, transférez séparément la base de données, puis relancez la même commande. Cette seconde passe ne copiera que les changements intervenus depuis la première.

Rsync ne remplace pas une exportation cohérente de la base MySQL ou MariaDB. Copier directement les fichiers internes du serveur SQL pendant son fonctionnement peut produire une sauvegarde inutilisable.

Commande rsync recommandée pour la plupart des transferts

Dans la majorité des cas, cette base suffit :

rsync -a \
    --info=progress2 \
    --stats \
    --partial-dir=.rsync-partial \
    /source/ \
    utilisateur@serveur:/destination/Langage du code : JavaScript (javascript)

Ajoutez ensuite seulement les options dont vous avez réellement besoin :

  • --dry-run pour simuler ;
  • --delete pour créer un miroir exact ;
  • --exclude pour ignorer certains fichiers ;
  • -e "ssh -p PORT" pour changer le port SSH ;
  • -z pour compresser sur une liaison lente ;
  • -HAX pour préserver davantage de métadonnées ;
  • --checksum pour une comparaison approfondie.

Petit exemple fictif

Allez, juste pour le fun, voici un transfert initié avec rsync entre deux serveurs distants d’à peu près 8 000 kilomètres :

rsync speeds

Bref, rsync, ça dépote et c’est une commande extrêmement pratique à l’usage.

Besoin de migrer un site ou un serveur sans interruption ?

Une migration fiable ne consiste pas seulement à copier des fichiers. Il faut synchroniser les données, préserver les permissions, transférer les bases, préparer le DNS et prévoir un retour arrière.

  • migration de sites WordPress et WooCommerce ;
  • transfert entre hébergements ou serveurs dédiés ;
  • synchronisation progressive avec rsync et SSH ;
  • configuration des permissions, services et sauvegardes ;
  • validation technique avant la bascule DNS.

Présentez-moi votre projet de migration pour définir une procédure adaptée à votre infrastructure.

Questions fréquentes sur rsync

Les fichiers passent-ils par mon ordinateur ?

Non, lorsque vous ouvrez une session SSH sur le serveur A puis lancez rsync vers le serveur B. Le transfert s’effectue directement entre les deux serveurs. Votre ordinateur contrôle seulement la session distante.

Rsync utilise-t-il SSH ?

Oui, les transferts distants utilisant la syntaxe utilisateur@serveur:/chemin/ passent généralement par SSH. Le trafic bénéficie donc du chiffrement et de l’authentification SSH.

Rsync copie-t-il les fichiers cachés ?

Oui, lorsque vous transmettez un répertoire avec une syntaxe comme /source/. Évitez les motifs tels que *.*, car le shell peut exclure les fichiers cachés et les fichiers sans extension.

Peut-on reprendre un transfert interrompu ?

Oui. Relancer la même commande évite déjà de retransférer les fichiers terminés. L’option --partial-dir=.rsync-partial conserve aussi les données partielles afin d’optimiser la reprise des gros fichiers.

Quelle différence entre rsync et scp ?

scp convient aux copies ponctuelles simples. rsync devient plus intéressant pour les répertoires volumineux, les transferts répétés, les exclusions, les reprises et les synchronisations incrémentales.

Rsync est-il un outil de sauvegarde ?

Rsync peut alimenter une sauvegarde, mais une simple synchronisation n’offre ni historique ni protection contre les suppressions accidentelles. Une véritable stratégie de sauvegarde conserve plusieurs versions, une copie hors site et une procédure de restauration testée.

Pour aller plus loin

Sources

Demandez à l'IA son opinion
Gravatar for Matt Biscay

Je suis Matt Biscay, développeur WordPress & WooCommerce certifié chez Codeable, administrateur système et enseignant.

J’aide les entreprises à créer, optimiser et fiabiliser leurs sites WordPress avec une approche technique propre : performance, sécurité, maintenance, développement sur mesure et résolution de problèmes complexes.

Sur Skyminds, je partage des tutoriels WordPress, WooCommerce, Linux et administration système, avec des solutions testées sur des cas réels et pensées pour durer.

Découvrez mes services WordPress et WooCommerce.

14 réflexions au sujet de “Transférer des fichiers entre deux serveurs avec rsync”

    • J’ai pris une seedbox pour un mois histoire de tester et d’étudier comment ça fonctionnait, c’est pour ça que je n’ai pas flouté l’IP ;-)

      Répondre
  1. Bonjour,

    si je lance je me connecte sur le serveur A puis je lance Rsync vers le serveur B, qui execute le tache mon Pc, le serveurs A, le serveur B? les données passe t’il par ma machine? puis je éteindre mon pc sans interrompre la tache ?
    est il possible d’avoir alors une journal ou de suivre? ( cas de gros transfert)

    merci

    Répondre
    • Bonjour xalonecorp,

      Si tu fermes le terminal de ton PC (qui se connecte au serveur A pour transférer vers serveur B), alors la tâche sera interrompue. Les données ne transitent pas par ton PC, elles sont transférées directement de A vers B – ton PC est juste le donneur d’ordre.

      Pour pouvoir éteindre ton PC tout en gardant la tâche active, tu as plusieurs solutions:

      A. lancer la tâche avec nohup. Syntaxe :

      nohup COMMANDE &

      B. lancer la tâche avec disown :

      COMMANDE & disown

      ou

      COMMANDE &!

      C. installer screen et suivre le guide :

      screen -d -m bash -c "COMMANDE"

      De serveur à serveur, le transfert n’est limité que par la bande passante des serveurs. Tu peux suivre la vitesse du transfert avec l’argument --progress de rsync.

      Répondre
  2. Bonjour,
    J’ai testé la commande:
    rsync –ignore-existing –progress /home/test/*.* DenisNAS@192.168.1.51:/DENIS
    sur un PC avec Linux Mint et le dossier test dans le dossier personnel home

    sur mon NAS Synology j’ai un dossier DENIS avec un utilisateur DenisNAS pour le service rsync..

    Voici le retour de la commande rsync ci-dessus après avoir saisi le mot de passe de DenisNAS:

    Could not chdir to home directory /var/services/homes/DenisNAS: No such file or directory
    sending incremental file list
    rsync: change_dir « /home/denis/test » failed: No such file or directory (2)
    ERROR: module is read only
    rsync error: syntax or usage error (code 1) at main.c(1131) [Receiver=3.0.9]
    rsync: connection unexpectedly closed (112 bytes received so far) [sender]
    rsync error: error in rsync protocol data stream (code 12) at io.c(235) [sender=3.1.2]

    Avez vous une idée du problème rencontré ?
    Bien Cordialement
    Merci

    Répondre
    • Bonjour Rémy,

      Le problème vient du chemin que vous indiquez sur le NAS. Dans la commande, vous avez à la fin: `/DENIS` mais cela ne correspond pas au véritable chemin de votre dossier utilisateur sur un Synology.

      Le bon chemin devrait commencer par `/volume1`. S’il s’agit du répertoire de l’utilisateur, ce serait `/volume1/homes/DENIS`.

      Dîtes-moi si cela passe mieux,
      Matt

      Répondre
      • Merci pour votre réponse hyper rapide !!!!
        la nouvelle commande:
        rsync –ignore-existing –progress /home/test/*.* DenisNAS@192.168.1.51:/volume1/homes/DENIS

        et le même retour:
        Could not chdir to home directory /var/services/homes/DenisNAS: No such file or directory
        rsync: change_dir « /home/test » failed: No such file or directory (2)
        ERROR: module is read only
        rsync error: syntax or usage error (code 1) at main.c(1131) [Receiver=3.0.9]
        rsync: connection unexpectedly closed (112 bytes received so far) [sender]
        rsync error: error in rsync protocol data stream (code 12) at io.c(235) [sender=3.1.2]

        merci

      • Bonjour Remy,

        Vérifiez dans Panneau de Configuration > Utilisateur > Avancé > Accueil utilisateur que la case Activer le service d’accueil de l’utilisateur soit bien cochée.

Laisser un commentaire