Vendredi soir, l'équipe rafraîchit la staging : rsync prod → staging avec --delete pour refléter la prod exacte. Lundi matin, la staging est correcte — mais la production affiche des fichiers manquants. Un cron mal commenté a inversé la direction : staging vers prod. rsync a effacé la prod pour matcher une staging partiellement vide.
rsync est l'outil de prédilection pour miroirs rapides et déploiements file-based. Il est aussi symétrique dans sa dangerosité : les mêmes flags qui synchronisent proprement peuvent détruire des années de fichiers en une commande. Le trailing slash, --delete, la direction SRC→DST et les exclusions ne sont pas des détails — ce sont les lignes entre un refresh sain et un incident P1.
Trailing slash : la règle à tatouer
rsync -av prod:/var/www/ staging:/var/www/
# copie le CONTENU de /var/www/
rsync -av prod:/var/www staging:/var/www/
# crée staging:/var/www/www — imbrication nested
Avec le slash final sur la source, rsync copie le contenu du répertoire. Sans slash, il copie le dossier lui-même dans la destination. L'erreur www/www est un classique des refresh staging.
Documentez la convention dans chaque script : commentaire # SRC=prod:/var/www/ DST=staging:/var/www/ avec flèches explicites.
--dry-run et --delete
Toujours -n ou --dry-run avant toute sync avec --delete. Puis --itemize-changes pour audit lisible. Toute ligne *deleting dans la sortie = pause obligatoire, relecture direction, backup daté.
--delete supprime sur la destination ce qui n'existe plus sur la source. Acceptable seulement après dry-run validé, backup destination daté, direction écrite noir sur blanc, review à deux paires d'yeux.
Jamais --delete sur cron sans monitoring exit code et alerte mail si non-zéro.
Direction, flock et backup-dir
| Besoin | Pattern sûr |
|---|---|
| Refresh staging | prod → staging, delete staging only |
| Miroir DR | prod → DR, checksum -c périodique |
| Deploy | artefact CI, pas rsync prod entier |
flock sur cron évite deux sync overlap. --backup --backup-dir=dated/ avant delete massif — sauve une copie horodatée des fichiers supprimés.
Variable RSYNC_RSH=ssh explicite ; harmonisez version rsync GNU vs BSD entre serveurs avant automatisation.
Exclusions et pièges
Fichier --exclude-from versionné git : .env, storage/sessions, uploads, caches runtime, node_modules. Ne synchronisez jamais cache vers prod ni secrets vers staging non sanitizé.
--delete-excluded est ultra dangereux — évitez sauf cas expert documenté.
rsync propage aussi le ransomware : un miroir rsync seul n'est pas une stratégie backup. Associez restic ou Borg immuable pour l'historique ; rsync pour la vitesse de miroir.
Monitoring et formation
Alias rsync-safe='rsync -av --dry-run --itemize-changes' pour toute l'équipe d'exploitation. Retirer dry-run = acte conscient signé.
Post-sync : script diff nombre de fichiers source/destination. Cron mail sur exit non-zéro — échec silencieux classique vendredi nuit.
Onboarding 30 min : quiz trailing slash, lecture post-mortem direction inversée. Deux crons directions opposées = perte de données à terme — revue architecture obligatoire.
Coupler versioning
Rsync vitesse, restic historique — source vérité restore documentée.
Deux cron rsync directions opposées = perte data eventual — revue architecture sync bidirectionnel.
Suivi opérationnel
Formation rsync onboarding exploitation — 30 min évite incident weekend. Exercice trailing slash quiz. Cron mail on rsync non-zero exit — silent fail classic Friday night. Documentez les écarts entre promesse hébergeur et mesure terrain dans la revue trimestrielle.
Poursuite trimestrielle
Formation rsync onboarding exploitation — 30 min évite incident weekend. Exercice trailing slash quiz. Cron mail on rsync non-zero exit — silent fail classic Friday night. Documentez les écarts entre promesse hébergeur et mesure terrain dans la revue trimestrielle.
Flags rsync GNU vs BSD différents — harmoniser versions avant cron automatisé.
Tenez runbook daté, métriques avant/après, revue post-incident — la discipline cumulative évite la panique du vendredi soir.
Tenez runbook daté, métriques avant/après, revue post-incident — la discipline cumulative évite la panique du vendredi soir.
Décider et avancer sans angle mort
- Alias rsync-safe avec --dry-run — retirer dry-run = acte conscient signé.
- Trailing slash tatoué — SRC avec
/copie contenu ; sans/crée imbrication nested. - Direction SRC → DST en commentaire — chaque script cron ; flock anti overlap.
- Excludes versionnés git — .env, sessions, uploads ; jamais --delete-excluded sans review.
- Pairer rsync miroir + backup versionné immuable — rsync seul propage ransomware.
Déploiement et DR : guides, annuaire, comparateur.
Questions fréquentes
Que change le slash final sur la source ?
Avec / : rsync copie le contenu du répertoire. Sans / : sous-répertoire imbriqué — erreur classique staging/www/www.
Quand --delete est-il acceptable ?
Après dry-run validé, backup daté, direction SRC→DST écrite, review à deux paires d'yeux. Jamais sur cron sans monitoring exit code.
Faut-il exclure cache et node_modules ?
Oui via --exclude-from versionné. Ne synchronisez pas cache runtime vers prod ni .env ni sessions.
rsync remplace-t-il une sauvegarde versionnée ?
Non : rsync propage aussi le ransomware. Associez backup immuable (restic, Borg) au miroir rsync.
Ajoutez --dry-run par défaut dans vos alias rsync — l'enlever doit être un acte conscient.
