Symfony en environnement de Développement avec Vagrant

9 minutes
web symfony environnement

Comment installer Symfony sur son ordinateur ? Comment installer un environnement de développement facilement pour Symfony ? Quel est le meilleur environnement ?

Pour utiliser Symfony en local, il faut un serveur web (Apache ou Nginx), une base de donnée (MySQL, MariaDB, PostgreSQL ou MongoDB), PHP 7 et toutes les extensions.

Il y a toujours Wamp, Mamp et autres, mais c'est buggé, et vraiment pas pratique. En plus cette méthode est ancienne (ouai je sais, ça fout un coup de vieux 😉).
Il y a aussi la VM Linux, mais c'est très gourmand, c'est lent et ça prend du temps à installer.
Et si vous êtes comme moi, installer tous les packages en local ça m'embêtes...

Bon Séb, tu nous lâches ta solution ?

Voilà j'ai laché l'idée...
Pour ceux qui connaissent, vous pouvez passer à la partie d'après.
Sinon, je vais vous présenter tous ces outils.

Ces deux outils sont disponible sur Linux, MacOs et Windows.

Si la VM est une bière, alors Vagrant est son verre. 🍺
Vagrant est un wrapper, une couche supérieur à VirtualBox ou VMWare.
Il va permettre de créer, et gérer des VMs.
Elle seront plus légères et facilement configurables.
Un Vagrant File permet de définir les configurations et de les échanger facilement avec un autre développeur.
Cet environnement préconfiguré s'appelle une Vagrant Box.
Vagrant c'est à mi chemin entre une VM et Docker.

Personnellement j'ai pas mal devéloppé dessus. C'est plus rapide et moins gourmand qu'une vrai VM.

Laravel Homestead est une surcouche Vagrant et une Vagrant Box préconfiguré contenant tout un tas d'outils.
C'est la boîte à outils parfaite (ou presque 😉).
Cette Box contient entre autre Ubuntu, plusieurs versions de PHP (avec Xdebug et compagnie), Nginx, MySQL, PostgreSQL, Composer, MailHog, Node (avec Yarn, Bower, Grunt et Gulp), Redis, ngrok, ...
Tout ce qu'il faut pour bien développer !

L'installation n'est pas bien complexe, mais un peu longue.
Je vais vous montrer la version avec VirtualBox.
Libre à vous de faire différement si besoin.

Trois outils de base ont besoin d'être installé :

Vérifiez que tout est bien installé :

$ vboxmanage --version
$ vagrant --version
$ git --version

Ensuite il faut télécharger la box Laravel/Homestead pour Virtualbox :

$ vagrant box add laravel/homestead

Ça prend du temps, c'est assez lourd. Elle prend plus de 2Go quand même.

Puis on récupère la configuration Vagrant pour Laravel/Homestead :

$ git clone https://github.com/laravel/homestead.git ~/development

Vous pouvez remplacez le répertoire final par ce que vous voulez.
La version sur le master n'est pas toujours stable, alors jetez un coup d'oeil sur la liste des releases pour récupérer la version qui vous convient :

$ git checkout v8.2.0

Et vous pouvez lancer le fichier init.sh ou init.bat sur Windows pour générer le fichier de configuration Homestead.yaml

$ bash init.sh

Le fichier Homestead.yaml permet de configurer rapidement la box.
C'est une surcouche au fichier Vagrantfile.
Il faut que vous le modifiez en fonction de vos besoin.
Une fois modifié, vous pourrez lancer un vagrant up pour lancer la box.

Voici le fichier par défaut :

---
ip: "192.168.10.10"
memory: 2048
cpus: 1
provider: virtualbox

authorize: ~/.ssh/id_rsa.pub

keys:
    - ~/.ssh/id_rsa

folders:
    - map: ~/code
      to: /home/vagrant/code

sites:
    - map: homestead.test
      to: /home/vagrant/code/public

databases:
    - homestead

# ports:
#     - send: 50000
#       to: 5000
#     - send: 7777
#       to: 777
#       protocol: udp

# blackfire:
#     - id: foo
#       token: bar
#       client-id: foo
#       client-token: bar

# zray:
#  If you've already freely registered Z-Ray, you can place the token here.
#     - email: foo@bar.com
#       token: foo
#  Don't forget to ensure that you have 'zray: "true"' for your site.

C'est facilement compréhensible je trouve.

  • ip définit l'IP de la VM
  • memory et cpus allouent les ressources nécessaires (RAM et CPU)
  • provider c'est le gestionnaire de VM (virtualbox, vmware_fusion, vmware_workstation, parallels ou hyperv)
  • authorize et keys correspondent au chemin pour la clé publique et la clé privée pour accèder à la VM en SSH
  • folders pour le mapping des répertoires. Il est fortement recommandé de mapper un répertoire par projet plutôt qu'un répertoire pour tous les projets
  • sites permet de créer un fichier de configuration NginX
  • databases définit le nom de la base de donnée
  • ports pour modifier le mapping des ports. Si on veut que le port 80 soit redirigé vers 8080 par exemple
  • blackfire spécifie la configuration pour BlackFire
  • zray pareil pour Z-Ray

À ces Propriétés de bases, il y en a d'autres plus ou moins utiles :

  • verify_host_key effectue une vérification stricte de la clé SSH de l'hôte
  • networks configure l'interface réseau de la box
  • default_ssh_port pour changer le port par défaut pour SSH
  • copy copie fichiers et répertoires de l'hôte from vers la box to
  • variables définie des variables d'environnement (ex: APP_ENV)
  • couchdb déclenche l'installation de CouchDB
  • elasticsearch avec un numéro de version, installe d'Elasticsearch
  • mariadb déclenche l'installation de MariaDB
  • minio installe Minio
  • mongodb déclenche l'installation de MongoDB
  • mysql8 installe MySQL 8
  • neo4j déclenche l'installation de Neo4j
  • influxdb installe InfluxDB et Grafana
  • chronograf déclenche l'installation de Chronograf
  • backup créer automatiquement un backup lors de la commande vagrant destroy

La propriété folders accepte une clé type pour spécifier le protocole de partage de fichier en réseau à utiliser nfs ou smb.
Si vous êtes sur Mac ou Windows, je vous conseille fortement NFS pour des soucis de performances (voir section Astuces).

La propriété sites accepte une clé type également.
Elle oriente la configuration Nginx pour le type de site et sa structure propre.
Symfony 2 et Symfony 4 n'ont pas du tout la même structure ni le même fichier d'entré pour le rewrite URL.
Les types disponibles sont : apache, apigility, expressive, laravel (par défaut), proxy, silverstripe, statamic, symfony2, symfony4, et zf.
On peut également ajouter la clé load_balancer à true si on veut activer le load balancing avec Nginx. Le port d'écoute HTTP sera 8111 et 8112 pour le HTTPS.

Les commandes de bases sont intuitives :

$ vagrant help                             # permet d'afficher l'aide
$ vagrant up                                # lance la box
$ vagrant up --provision              # lance la box en rechargeant le fichier Homestead.yaml
$ vagrant reload --provision        # relance la box en rechargeant le fichier Homestead.yaml
$ vagrant halt                              # arrête la box
$ vagrant destroy                        # arrête et supprime tout trace de la machine vagrant
$ vagrant status                          # affiche le status de la box
$ vagrant plugin                          # permet d'installer, supprimer et mettre à jour des plugins vagrant
$ vagrant ssh                              # connexion à la box en SSH
$ vagrant suspend                      # suspend la box
$ vagrant resume                        # reprend la box après un `vagrant suspend`

Avantages :

  • L'ordinateur reste "propre" : pas besoin d'installer une tonne d'outils sur sa machine
  • Persistance : il s'agit d'une VM, donc toute modification est persisté. Attention à ne pas en abuser, lors des mises à jours de la box c'est supprimé !
  • Partage de l'environnement possible entre plusieurs développeurs
  • Beaucoup d'outils installés et préconfigurés, ce qui est un gros gain de temps
  • Rajouter un projet est très rapide, il suffit de deux lignes de configuration en plus et c'est bouclé
  • On peut aller très loin dans la configuration avec les backups, le fichier after.sh qui permet de lancer un script sur la box une fois qu'elle est lancé (composer install, cache clear, insertion d'un dump, etc...), le réseau, etc...

Inconvénients :

  • Lenteur : je trouve que ça reste lent, même si c'est largement acceptable
  • Pas mal de services installés ne sont pas utilisés
  • On est pas sur le même environnement que la production. Ce qui peut apporter quelques bugs
  • Une box c'est lourd (environ 2Go à télécharger)

Notez qu'il est toujours possible de s'abstraire de Laravel/Homestead et de créer son propre Vagrantfile pour résoudre plusieurs des inconvénients. Et on peut largement s'inspirer de Laravel/Homestead pour faire ça bien !

Ces astuces m'ont été très utiles, alors je les partages avec vous :

Si on veut créer une deuxième box, il faudra changer le nom !
Pour ça, il faut modifier le fichier Homestead.yaml et ajouter la ligne suivante :

name: monNouveauNom

Si comme moi vous utilisez VirtualBox, vous pouvez installer le plugin VirtualBox Guest Additions.
Il s'agit d'un ensemble de drivers et d'applications système conçus améliorer l'intégration le système hôte et invité.
Pour ceux qui n'ont rien compris, sachez juste que c'est mieux de l'installer 😉 :

    $ vagrant plugin install vagrant-vbguest
    $ vagrant provision

Si vous êtes sur Mac ou Windows, je vous conseille fortement d'installer NFS pour tous vos dossiers dans folders.

Pour les utilisateurs Windows : Vous pouvez installer le plugin Vagrant WinNFSd qui ajoute le support NFS à windows (je ne l'ai pas testé)

Pour les utilisateurs d'Ubuntu : Apparement vous devez installer le support NFS (je ne l'ai pas testé non plus) $ apt-get install nfs-kernel-server

Et pour les utilisateurs de Mac, il suffit d'installer vagrant-bindfs :

$ vagrant plugin install vagrant-bindfs

N'oubliez pas d'ajouter le type dans le fichier de configuration Homestead.yaml :

folders:
    - map: ~/www/monProjet
      to: /home/vagrant/www/monProjet
      type: "nfs"

L'option watch de webpack ne va pas fonctionner sur la box. C'est un soucis connu.
Pour corriger ça, il faut activer l'option de polling dans la configuration de Webpack :

module.exports = {
  //...
  watchOptions: {
    poll: true
  }
};

Pour les utilisateurs de Symfony Webpack Encore, il suffit de remplacer la dernière ligne du fichier webpack.config.js :

// Remplacer cette ligne
module.exports = Encore.getWebpackConfig();

// Par celles-ci
let config = Encore.getWebpackConfig();
config.watchOptions = { poll: true, ignored: /node_modules/ };

module.exports = config;

Voici un exemple de fichier Homestead.yaml pour un projet Symfony 4 :

---
ip: "192.168.10.10"
memory: 2048
cpus: 1
provider: virtualbox

authorize: ~/.ssh/id_rsa.pub

keys:
    - ~/.ssh/id_rsa

folders:
    - map: ~/www/monProjet
      to: /home/vagrant/www/monProjet
      type: "nfs"

sites:
    - map: monProjet.local
      to: /home/vagrant/www/monProjet/public
      type: symfony4

databases:
    - symfony

Vagrant est vraiment pratique pour le développement avec ou sans Symfony.
Mais il a tout de même quelques inconvénients.

Utilisez-vous Vagrant pour le développement ? Quelles sont vos astuces ?

N'hésitez-pas à commenter et partager cette article 😉.

Documentation Vagrant
Documentation Laravel/Homestead
NFS sur Ubuntu
Fichier principal de Laraval/Homestead qui permet de mieux comprendre

Image : Entête

Ajouter un commentaire

Article précédent Article suivant