, ,

Déployer votre app Symfony sur Heroku

Commandes de bases

Voici les commandes de base afin de déployer votre APP Symfony sur Heroku :

$ git add .
$ composer install --no-dev --optimize-autoloader
$ git commit -m "initial commit"
$ heroku create
$ heroku config:set SYMFONY_ENV=prod
$ git push heroku master
$ heroku open

Si tout se passe bien, l’app sera fonctionnelle et affichée dans votre navigateur.

Les probabilités d’erreurs sont tout de même élevées. Débutons par configurer notre log convenablement et ensuite, nous verrons quelques combinaisons de problème et solutions possibles.

Configuration des LOGS

Afin d’avoir accès au LOG de votre application en temps réel, directement dans votre terminal, quelques modification doivent être apportés à votre fichier config_prod.yml.

monolog:
  handlers:
    nested:
      type: stream
      path: "php://stderr"
      level: debug

Une fois la modification poussée sur Heroku,

$git add .
$git commit -m "Updated LOG setting for Heroku"
$ git push heroku master

Vous pouvez lancer la commande suivante qui vous permettra de voir les logs défilés dans votre terminal :

$ heroku logs --tail

Vous pourrez ainsi voir les erreurs directement dans votre terminal :

Note

2016-02-17T15:40:39.527049+00:00 app[web.1]: [2016-02-17 15:40:39]
request.CRITICAL: Uncaught
PHP Exception Symfony\Component\Debug\Exception\FatalThrowableError:
« Fatal error: Call to undefined function FOS\UserBundle\Util\mb_convert_case() »

Problèmes rencontrés

Type de projet mal détecté

Avertissement

remote: -----> 
   Warning: Multiple default buildpacks reported the ability 
   to handle this app.
   The first buildpack in the list below will be used.
   remote: Detected buildpacks: Node.js, PHP

Solution

Définir le type de projet avec la command buildpacks:set :

$ heroku buildpacks:set heroku/php

Erreur lors de la configuration de votre application Heroku

Fatal error: Class not found

Note

remote: PHP Fatal error: Uncaught Symfony\Component\Debug\Exception\FatalThrowableError: Fatal error: Class ‘Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle’ not found in /tmp/build_8745efadea59e27a866383c617a2d4ed/app/AppKernel.php:32

Solution

Lorsqu’une dépendance n’est pas installée correctement suite à la commande composer install (lancée automatiquement par Heroku). Vous aurez l’erreur Class not found. Prenez le temps de vérifier le bundle problématique. Vérifier que le bundle apparaît bien dans votre fichier composer.json et composer.lock. Vérifier aussi les dépendances chargées dans votre fichier AppKernel.php.

Autre piste de solution

If you get a « class not found » error during this step, you may need to run export SYMFONY_ENV=prod before running this command so that the post-install-cmd scripts run in the prod environment.

Call to undefined function mb_convert_case

Problème

L’extension mbstring n’est pas chargée.

Note

2016-02-17T15:40:39.527049+00:00 app[web.1]: [2016-02-17 15:40:39] request.CRITICAL: Uncaught PHP Exception Symfony\Component\Debug\Exception\FatalThrowableError: « Fatal error: Call to undefined function FOS\UserBundle\Util\mb_convert_case() »

 

Solution

Dans le cas de l’erreur précédente, Symfony ne trouve pas l’extension mbstring (support utf8). La solution est simple. Ajouter la ligne « ext-mbstring »: « * » dans la section require de votre fichier composer.json :

"require": {
  "ext-mbstring": "*"
}

Finalement, pousser le code sur Heroku :

$ git add .
$ git commit -m "Updated composer.json dependency"
$ composer install --no-dev --optimize-autoloader
$ git push heroku master

–no-dev –optimize-autoloader

Il est conseillé de lancer composer avec les options –no-dev –optimize-autoloader :

 $ composer install --no-dev --optimize-autoloader
  • The --optimize-autoloader flag improves Composer’s autoloader performance significantly by building a « class map ».
  • The --no-dev flag ensures that development packages are not installed in the production environment.

Application Symfony déployée avec succès

Lorsque tout fonctionne bien, on vous affichera un beau message de succès :

remote: Heroku deploy detected
        creating default Procfile for "web" dyno
remote: -----> Preparing runtime environment...
remote: -----> Checking for additional extensions to install...
remote: -----> Discovering process types
remote: Procfile declares types -> web
remote: -----> Compressing...
remote: Done: 88.6M
remote: -----> Launching...
remote: Released v4
remote: https://quiet-tor2-70424.herokuapp.com/ deployed to Heroku
remote: Verifying deploy... done.

To https://git.heroku.com/qt-tor-70414.git
6977765..43afdc0 master -> master

Configuration de la base de données Postgres

Installer le add-on Postgres

Voici les étapes afin de créer une nouvelle base de données gratuite Postgres.

Installer le add-on Postgres avec l’interface web ou par la ligne de commande :

À partir du Web :

À partir du terminal :

$ heroku addons:create heroku-postgresql:hobby-dev
$ heroku pg:wait
$ heroku config -s | grep HEROKU_POSTGRESQL

Modifier les configurations de votre app Symfony

Une fois le add-on Postgres installé, on vous fournira toutes les informations afin de vous connecter à la nouvelle base de données. Ajouter ces informations de connexion dans votre fichier parameters.yml de votre application Symfony :

parameters:

database.driver: pdo_ pgsql
database.host: 127.0.0.1
database.port: 3306

Utiliser les variables d’environnement

Par contre, si vous désirez définir des variables d’environnement afin de vous connecter à la base de données (solution recommandée), vous devrez utiliser config:set afin de définir des variables d’environnement qui seront utilisée dans un fichier parameters.php

Dans votre terminal :

$ heroku config:set SYMFONY_BD_HOST=ec2-107-21.compute-1.amazonaws.com
$ heroku config:set SYMFONY_BD_NAME=g45dgg334rg74tb2
$ heroku config:set SYMFONY_BD_USER=sad43fvv5vvefx
$ heroku config:set SYMFONY_BD_PORT=5432
$ heroku config:set SYMFONY_BD_PASS=ddd3fw4ffBI
$ heroku config:set SYMFONY_BD_DRIVER=pdo_pgsql
Contenu du fichier parameters.php
$container->setParameter('database.driver', getenv('SYMFONY_BD_DRIVER'));
$container->setParameter('database.host', getenv('SYMFONY_BD_HOST'));
$container->setParameter('database.port', getenv('SYMFONY_BD_PORT'));
$container->setParameter('database.name', getenv('SYMFONY_BD_NAME'));
$container->setParameter('database.user', getenv('SYMFONY_BD_USER'));
$container->setParameter('database.password', getenv('SYMFONY_BD_PASS'));

Initialiser la base de données

Finalement, il faut créer le shéma de la base de données et y insérer vos fixtures. Il est possible d’exécuter la console Symfony à l’aide du heroku toolbelt et de la commande heroku run :

$ heroku run php app/console doctrine:schema:create
$ heroku run php app/console doctrine:schema:update --force
$ heroku run php app/console doctrine:fixtures:load

Connexion à Postgres avec pgAdmin3

Vous désirez vous connecter à la base de données et l’administrer à distance, vous pouvez installer le logiciel gratuit pgAdmin III :

Sur Ubuntu, on lance :

$sudo apt-get install pgadmin3

no commands defined in the « doctrine:fixtures » namespace

Puisque Symfony est configuré avec un environnement de production, les dépendances de développement ne seront pas installés. Si vous avez l’erreur suivante, une solution est de déplacer la dépendance DoctrineFixturesBundle vers le tableau $bundles = array() de votre fichier AppKernel.php

There are no commands defined in the « doctrine:fixtures » namespace.

if (in_array($this->getEnvironment(), array('prod'))) {
  $bundles[] = new Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle();
}

Paramètre le lancement de votre serveur Web avec un procfile

Il est possible de configurer le lancement de votre serveur web grâce à un procfile. Voici quelques exemples :

procfile pour un projet PHP :

web: vendor/bin/heroku-php-nginx

procfile pour un projet Node :

web: node app.js

https://devcenter.heroku.com/articles/procfile

Références

Facebook Comments

0 réponses

Laisser un commentaire

Rejoindre la discussion?
N’hésitez pas à contribuer !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.