Déployer votre projet Symfony en production via rsync

applications-other Vous venez de boucler votre projet symfony en local et êtes impatients de le tester sur votre hébergement réel. Personnellement cette opération ne m’enchante jamais car les lettres FTP sonnent comme une évidence, or jamais un client FTP ne m’aura convaincu surtout quand un jour on a pu goûter au rsync.

Ce petit logiciel libre permet en effet d’exporter très efficacement (rien à avoir avec le FTP) une arborescence vers une destination locale ou distante (utilise le ssh dans ce cas là) mais surtout ne copie que les éléments qui auront été modifiés (!). Évidemment, une fois votre première version en prod, vous aurez des modifications à faire, et il est toujours délicat de se rappeler les fichiers que l’on a modifiés. Cette problématique disparait avec rsync!

Et comme à son habitude, Symfony fait bien les choses car il intègre par défaut une option de déploiement basé sur cette technologie. Pour l’utiliser, il suffit de disposer de rsync sur les serveurs source et final. En général il suffit d’un:

apt-get install rsync

Ensuite, éditez votre fichier config/properties.ini comme ceci, en remplaçant les paramètres selon vos informations:

[preprod]
  host=192.168.10.202                   #ip du serveur de destination
  port=22                               #port utilisé pour la connexion ssh, 22 est le port par défaut
  user=root                             #utilisateur qui se connectera au serveur de destination
  dir=/var/www/vhosts/monsite/httpdocs  #dossier qui recevera le projet symfony sur le serveur de destination
  type=rsync                            #le type de deploiement
  pass=                                 #indique qu'il y a un mot de passe (il faudra le taper lors de la connexion)

Un autre fichier config/rsync_exclude.txt permet d’exclure certains fichiers ou groupe de fichiers

.svn
/web/uploads/*
/cache/*
/log/*
/web/*_dev.php
.DS_Store
.cache
.project
.settings
/web/*Plugin

Personnellement, une fois le projet déployé une fois, j’y ajoute également config/ProjectConfiguration.class.php contenant le lien vers votre installation de symfony, qui diffère parfois entre dev et prod.
Concernant la règle /web/*Plugin qui regroupe les dossiers web des plugins, le problème vient des liens symboliques qui doivent être changés si le chemin de l’installation de symfony n’est pas identique en dev et en prod. Je les exclus donc du rsync et les republie après le rsync sur le serveur de prod via la ligne:

php symfony plugin:publish-assets

Voilà, c’est fini, il suffit maintenant de lancer la commande suivante à la racine de votre projet:

php symfony project:deploy preprod

preprod étant le nom que vous lui aurez donné le fichier ini. Cette commande ne fait qu’une simulation du transfert, pas d’inquiétude. Si tout se passe bien, vous pouvez lancer la commande finale:

php symfony project:deploy preprod --go

Et vous assistez alors à la copie quasi instantanée de votre projet.

Tags: , ,

A propos de l'auteur

Développeur web spécialisé Symfony, il est avant tout passionné de web tout simplement. Il aime les défis et farfouiller dans le code de Symfony ou Doctrine. Fondateur du blog, il exerce chez Autrement.

Vous avez aimé ce billet? Faites le savoir!

  • Delicious
  • Twitter
  • Technorati Favorites
  • FriendFeed
  • Google Bookmarks
  • Share

7 Réponses

  1. Micka 9 avril 2009 à 15 h 04 min #

    ça m’a l’air super pratique rsync, un bon moyen d’éviter les problèmes d’update et de fichiers que l’on écrase malencontreusement.

  2. Tim 11 avril 2009 à 13 h 58 min #

    Et également très rapide à exécuter une fois qu’on a fait la première conf. Bien plus rapide que d’ouvrir un FTP en tout cas ;)

  3. Seb 8 juillet 2009 à 19 h 06 min #

    Juste une petite question concernant rsync, si je refais un deploy alors que je l’avais déjà préalablement déployé, il va écraser tout mes anciens fichiers et ajouter les nouveau sur mon serveur ?

    Merci.

  4. Tim 9 juillet 2009 à 8 h 42 min #

    Il n’écrasera que les fichiers qui ont été modifiés. Et effectivement ajoutera les nouveaux. Mais ceux qui n’ont subit aucune modification ne seront pas affectés.

  5. Seb 9 juillet 2009 à 16 h 23 min #

    Ok, merci ! :)

  6. bat 25 mai 2010 à 22 h 15 min #

    Quels avantages vois-tu par rapport à un déploiement avec SVN ?

  7. nino 16 septembre 2011 à 10 h 29 min #

    Bonjour,

    tout d’abord merci pour cet article très intéressant.

    j’aurais une simple question : est-ce que le déploiement via rsync supprime les fichiers sur le serveur de destination qui ne sont plus présents en local ?

    Car j’ai eu le problème en local avec symfony 1.4. J’avais des fichiers modèles qui trainaient suite à des tests et cela provoquait des dysfonctionnements. J’ai compris ensuite l’utilité de la commande doctrine:clean-models.

    Je me posais donc la question pour le déploiement car l’objectif est d’avoir exactement les mêmes fichiers en local et sur la prod.

    merci d’avance et bonne journée.

    Nino


Laisser un message