Déployer son application Symfony en Production
Par jaycreation le mercredi, juillet 14 2010, 12:26 - php - Lien permanent
Symfony c’est super !
Mais ça complexifie un peu les choses.
Quand il s’agit de mettre l’application en production c’est même carrément énervant !
Une fois que votre application est développée, il faut la mettre sur un serveur de prod.
Et malheureusement, il ne suffit pas de copier les fichiers et de dupliquer la base de données.
Voici les principales étapes pour migrer votre application Symfony
Customiser les messages d’erreurs - Les données - La Sandbox - Chez le client
Customiser les messages d’erreurs
La gestion des erreurs est un des points forts de Symfony. Mais l’internaute ne DOIT pas les voir.
On va donc le renvoyer en cas d’erreur vers une belle page d’erreur personnalisée.
Pour l’erreur 404, « page not found » c’est très simple
Dans le fichier settings de votre application /apps/front/config/setting.yml
Il faut tout simplement rajouter ces deux directives
all:
error_404_module: home
error_404_action: error404
Vous pouvez mettre le nom de module et le nom d’action de votre choix.
Ensuite quand une erreur 404 se produira, c’est votre page qui sera affichée, vous pourrez donc dans votre action ajouter une petite ligne pour vous envoyer un mail ou un log.
Pour l’erreur 505, « une exception à été générée » c’est un peu plus compliqué.
Pour personnaliser cette page vous devez placer un fichier « error.html.php » dans le répertoire « apps/front/config/error » (créez le au besoin). Et c’est tout.
Mais du coup voilà, nous ne sommes pas dans une application.
Cette page n’est pas incluse dans votre layout et on ne peut non plus utiliser les classes Symfony.
La page d’erreur 500 est donc complètement statique.
Les données
L’application fonctionne, oui mais les données n’existent pas.
Si vous souhaitez installer les données par défaut, il vous suffira de créer la base de données chez le client (en s’assurant que le nom soit bien le bon) et de lancer la commande build-all dans le dossier du nouveau projet.
Si vous avez déjà inséré des données pour le client, il vous faut sauvegarder votre base de données. (mais c’est certainement déjà fait)
Le moyen le plus simple est d’utiliser MySQL Administrator.
Une fois l’application installée et connectée a votre base de données locale, lancez un backup uniquement sur le contenu.
Pour cela, allez créez un « projet », puis allez dans l’onglet « Advanced Options » et sélectionnez les check box comme sur la copie d’écran :

Enregistrez le fichier .sql, puis éditez-le dans un éditeur de texte.
Nettoyer tous les inserts inutiles. Dans le cas de certains plugins ils peuvent même être problématiques.
Copiez le sql nettoyé dans le dossier data/sql/ de votre application. (à créer s’il n’existe pas encore.)
La Sandbox
Faites une copie complète de votre projet, et placez là dans votre trunk .
Nous allons travailler sur cette copie.
Nettoyez les dossiers et fichiers dans votre application (les images de tests, les dossiers CVS, SVN, etc…)
Symfony fonctionne avec une bibliothèque qui se trouve à l’extérieur de votre projet. (dans le dossier « vendors » si vous avez installé via svn.) Pour livrer l’application il faudra donc rapatrier ces fichiers
Une fois votre application finalisée et le nettoyage fait, Symfony propose une ligne de commande pour rapatrier les dossiers nécessaires à son fonctionnement :
symfony freeze \addresseVersMonDossierDeSymfonyEx : symfony freeze \wamp\www\vendor\symfonyPuis : symfony ccCette commande copie les fichiers nécessaires et passe les adresses en relatives dans les fichiers de configuration.
Votre dossier est désormais autonome.
Il reste encore quelques fichiers à modifier pour passer l’application en mode « production »
symfony clear-controllersCette commande supprime tous les accès de développement. On s’assure ainsi qu’il n’y ai pas de possibilités dérobées pour accéder à l’application.
Ensuite une commande sur les droits d’accès au dossier (chmod)
symfony fix-permsCette commande corrige les droits non corrects aux dossiers log/ et cache/Attention, elle ne suffit pas à régler tous les droits d’accès nécessaires
Vous pouvez donc déplacer les dossiers vers le répertoire de destination, via ftp par exemple, ou zipper le dossier du projet et l’envoyer à votre destinataire.
Chez le client
Vérifier la configuration serveur du client
Pour tester si un serveur est correctement configuré pour accueil symfony, sensio, l’éditeur de symfony à prévu un script de test.
> Télécharger le script de détection de configuration serveur Symfony
Copiez le dans le dossier web de votre projet.
Testez le ensuite avec votre navigateur.
Le script vous affichera les informations valides ou non.
Configuration Apache
Au minimum, Symfony requière deux modules apache pour fonctionner :
- mod_rewrite
- php5_module
Ces modules sont rarement activés sur les hébergements mutualisés.
Pensez également à activer les modules requis par vos plugins et vos développements
httpd.conf
Il faut modifier la directive suivante comme suit dans httpd.conf, se trouvant normalement sous /etc/httpd/conf
AllowOverride all
Il faut aussi créer un virtual host qui pointe vers le répertoire logista/web de l’application. Un exemple est donné ci-dessous :
<VirtualHost *:80>
ServerName logista
DocumentRoot "/usr/local/share/monProjet/web"
<Directory "/usr/local/share/monProjet/web">
AllowOverride All
Allow from All
</Directory>
</VirtualHost>Une autre solution est de rediriger vers le dossier WEB via un .htaccess
Modules PHP nécessaires
Pour éviter les problèmes, voici les modules PHP que j’active systématiquement
- php_gd2
- php_pdo
- php_pdo_mysql
- php_mcrypt
- php_xsl
- php_mysql
Comme pour les modules apache, certain plugin vont demander d’activer d’autres modules.
Ne les oubliez pas !
Déploiement
Tout d’abord nous allons configurer l’accès à la BDD de production.
Si vous avez accès à la ligne de commande :
symfony configure:database "mysql:host=localhost;dbname=prod_dbname" prod_user prod_passSinon vous devrez modifier le ficher database.yml dans le dossier config/ du projet.
Vous pouvez lancer ensuite les commandes
symfony project:permissions
symfony propel:build-model
symfony propel:build-forms
symfony propel:build-filters
symfony propel:build-sql
symfony propel:insert-sql --no-confirmation
symfony propel:data-load
symfony plugin:publish-assets
symfony ccUn moyen plus simple est de tout rassembler dans un fichier .bat et lancer toutes les commandes en une seule fois. Cela risque de moins effrayer votre client.
Importation des données
Reste à insérer les données de votre dernier .sql
sous linux lancez la commande.
mysql –u root –p logista < data/sql/monFichier.sql
Création indexes
Il faut ensuite lancer la commande symfony suivante pour créer les indexs des contenus intégrés
php symfony create-index --env=prod admin
Configuration de Démarrage
Pour configurer le serveur smtp d’envoi des emails, il faut modifier les lignes suivantes du fichier /apps/logista/config/app.yml
mail: host: smtp.monDomaine.tdl port: 25Il faut ensuite lancer la commande suivante pour supprimer le cache
php symfony cc
Votre application devrait enfin fonctionner !
Commentaires
Je suis en train d’essayer de déployer mon appli SF …sans succès pour le moment :(
Mais toutes les démarches pré-citées me semblent bien fastidieuses… la tâche ” symfony project:deploy” n’est elle pas plus simple ?