Déploiement d’un site avec Rsync

Pour faire suite à l’article sur l’hébergement d’un site CakePHP sur OVH , nous allons aborder une méthode plus robuste que le FTP pour déployer notre site : la synchronisation des fichiers avec Rsync.

1. Présentation de Rsync

Rsync permet très simplement de synchroniser deux répertoires situés à des emplacements différents, sur la même machine ou un serveur distant. Fréquemment employé dans le monde UNIX pour les sauvegardes de fichiers, cet utilitaire peut également être utilisé comme outil de déploiement. Il propose entre autres avantages de ne copier que les modifications effectuées depuis la dernière synchronisation et de réduire ainsi considérablement le temps de copie des fichiers. De plus comme tout est automatisé, il n’y a plus de risque d’oublier un fichier lors de l’upload FTP et de se retrouver ainsi avec un site cassé, ce dont on ne se rendrait de plus pas forcément compte immédiatement.

OVH propose cette fonctionnalité à partir des hébergement de la gamme Plan, ceux-ci offrant la connexion SSH nécessaire à la copie sécurisée des fichiers. Le principe consiste à exécuter une ligne de commande depuis le dossier de notre application CakePHP. Rsync va alors construire la liste des fichiers modifiés, se connecter au serveur et transmettre les modifications.

2. Mise en place du script

La première chose à faire est d’installer rsync sur votre poste. Sur Linux ou Mac OS X il est normalement pré-installé, pour Windows une version appelée cwRsync est disponible sur le site d’ITeF!x (en anglais). Je n’ai personnellement pas testé la version Windows, à noter qu’il faudra aussi installer SSH, disponible pour Windows sur le site SSHWindows (en anglais).

Nous créons ensuite un script qui contient l’appel à rsync :

1
2
3
# ./deploiement.sh
#!/bin/bash
rsync -avz -e ssh . "loginftp@ftp.domaine.com:/home.xx.yy/loginftp/dossier-eventuel" --exclude-from 'exclude.rsync'

Les paramètres sont les suivants :

  1. avz indique à rsync d’utiliser le mode archive pour parcourir le répertoire récursivement, préserver les permissions, compresser les données, etc.
  2. -e ssh spécifie le mode de connexion au serveur
  3. . indique de démarrer la copie au répertoire courant, la racine de notre site dans laquelle nous avons enregistré le script
  4. loginftp@ftp.domaine.com:/home.xx.yy/loginftp/www représente le chemin distant où copier les données.
    1. loginftp : nécessaire pour SSH, rsync vous demandera votre mot de passe lors de la connexion (c’est le même que celui de votre compte FTP).
    2. home.xx.yy : répertoire où sont stockées vos données sur le serveur, il faut le remplacer par celui de votre compte. On peut le connaître en tapant ‘pwd’ à l’invite de commande une fois connecté en SSH. Sous Windows, il est conseillé d’utiliser le client SSH PuTTY (en anglais)
    3. dossier-eventuel : peut être remplacé par n’importe quel répertoire, par exemple si vous déployez sur un sous-domaine ou si vous utilisez cette méthode pour mettre à jour la version de cake que vous aviez installée à la racine de votre compte.
  5. --exclude-from 'exclude.rsync' indique le fichier contenant la liste des fichiers et répertoirs à ne pas uploader, comme la configuration de la base de données (sauf si vous utilisez la méthode de double-configuration), un éventuel fichier .htaccess modifié pour votre serveur local, le dossier /tmp, etc

Voici un exemple de contenu d’un fichier exclude.rsync (simple fichier texte créé à la racine du site, comme le script de déploiement)

1
2
3
4
5
6
7
# exclude.rsync
.svn
/tmp
.htaccess
deploiement.sh
exclude.rsync
/www/img/upload

On ignore ici les images uploadées en local lors des tests dans le dossier www/img/upload, ainsi que les dossiers .svn créés par le gestionnaire de source Subversion dont un exemple d’utilisation avec CakePHP fera l’objet d’un prochain article. À noter qu’on utilise le chemin relatif ‘.svn’ pour ignorer tous les chemins contenant cette chaîne, alors qu’on utilise ‘/tmp’ pour indiquer que c’est le répertoire tmp à la racine du site. Sans cette distinction, un répertoire contenant la chaîne ‘tmp’ serait également ignoré.

Sous Windows, on peut créer un fichier .bat qui contient ces instructions, il faudra juste modifier le paramètre ‘.‘ en ‘/cygdrive/c/site-cakephp‘.

Il ne reste plus sous UNIX et Mac OS X qu’à rendre exécutable le script :

1
2
cd /chemin/vers/le/site
chmod +x deploiement.sh

L’application peut alors être déployée en tapant

1
./deploiement.sh

depuis le répertoire du site. Vous devriez voir rsync construire la liste des fichiers puis transmettre les modifications. La première fois est un peu longue car il doit tout transférer ; vous verrez que les déploiement sont bien plus rapides, de l’ordre de quelques secondes.

Note : pour éviter de taper à chaque fois le mot de passe SSH, il est possible de générer une clé qui sera copiée sur le serveur et votre poste. Je n’ai pas encore testé cette manipulation, il s’agit à priori simplement de :

  1. générer une clé sur votre poste avec la commande ‘ssh-keygen -d
  2. copier le fichier ‘id_ds.pub‘ dans le répertoire ‘.ssh‘ de votre compte et le renommer en ‘authorized_keys‘, ou en recopier le contenu dans le fichier ‘authorized_keys‘ s’il existe déjà

3. Conclusion et autres pistes

Nous avons vu qu’il est très simple de mettre en ligne son site et les futures modifications, sous réserve d’avoir un accès SSH à la machine sur laquelle on déploie. On peut imaginer une extension de cette méthode pour déployer également les changements de la base de données contenus dans des scripts, ou la possibilité de revenir à une version antérieure en archivant la version actuelle à chaque nouveau déploiement.

D’autres outils existent et proposent bien plus de fonctionnalités : - Capistrano (en anglais), très prisé des développeurs Ruby on Rails, peut aussi être utilisé pour déployer un site CakePHP. Il utilise rsync et votre gestionnaire de sources pour récupérer automatiquement la dernière version de l’application - Fredistrano offre une interface graphique très agréable et permet de déployer directement depuis votre gestionnaire de sources

Références

Cet article a été inspiré par une page du wiki de Ruby on Rails, HowtoUseRsyncToDeployYourApplication

Matthieu Sadouni

Commentaires

Hi, check also this:

http://blog.devayd.com/?p=8

this is a handy deployment module for Cake we developed.

Regards, Daniel

Très bonne idée un article sur le déploiement et merci pour ta référence à Fredistrano.

Juste une petite remarque sur la méthode décrite ci-dessus: La synchronisation se fait entre la workingcopy et le serveur de production, ça marche, mais personnellement je pense que faire le rsync entre un export svn et le serveur de prod apporte plusieurs avantages : - on s’assure d’avoir des sources de qualité dans le gestionnaire de sources puisque on sera obligé de commiter avant de pouvoir déployer - si on loggue les numéros de version déployées on sait exactement ce que l’on a en production - on peux déployer une version précise et pas forcément la dernière

enfin c’est le choix que l’on a fait pour Fredistrano

pour info nous travaillons actuellement sur une nouvelle version de Fredistrano qui devrait intégrer les « database migration » ainsi que diverses autres améliorations.

Fred

@daniel : I’ll check it out, thanks for sharing !

@fred: en effet je n’avais pas pensé à ces arguments pour le déploiement depuis une version exportée.

Ça doit être simplement adaptable à l’exemple rsync, il suffit de rajouter une ligne au script qui exporte le projet avant et synchroniser à partir de là, avec un argument pour le numéro de version.

Le déploiement avec gestion des migrations est une super idée !

Depuis quelques semaines, il est possible d’avoir un SVN sur les hébergements mutualisés OVH. http://guides.ovh.net/SVNMutu

Comment combiner cette solution avec ce tutoriel de déploiement ?

Dans ce cas, je rejoins l’avis de fred plus haut de faire un ’svn export’ du projet puis synchroniser avec rsync la copie d’export et le site distant. Pour rendre l’opération plus rapide, il est possible d’exécuter ce script depuis le serveur : on se connecte en ssh et on lance un script qui exporte le code dans un dossier temporaire et synchronise l’export avec le dosier contenant les fichiers de prod.

Comme OVH intègre maintenant svn, si Fredistrano peut être installé sur les hébergements mutualisés je conseille aux intéressés d’y jeter un oeil : http://code.google.com/p/fredistrano/

Participez

Pour insérer une portion de code, utilisez <pre lang="php">...</pre>