Déployer un projet Laravel sur Heroku

Heroku est une plateforme PaaS qui abstrait la gestion d’un serveur et de l’infrastructure qui va avec, ce qui permet donc de déployer très rapidement un projet. Ils offrent un plan gratuit qui est suffisant pour tester un site sans trop se tracasser !

Heroku permet d’héberger tout type de projets et notamment des projets PHP, Node.js, Ruby, python… Nous allons déployer un projet Laravel qui nécessite une base de donnée, nous utiliserons ici PostgreSQL, Laravel permettant de passer très facilement d’une BDD à une autre.

TL;DR à la fin

Avant de commencer

Les pré-requis sur votre machine pour déployer un projet PHP sont :

  • PHP
  • Le gestionnaire de dépendances Composer
  • git

Créez un compte sur Heroku si ce n’est pas déjà fait, puis installez la Heroku CLI et connectez vous en entrant dans votre terminal heroku login

Si vous n’avez pas de projet concret à déployer, clonez ce repo de test

Déployer votre code

Vous avez fini de coder, vous avez commité vos modifications, il est temps de déployer votre application.

Commençons par générer le conteneur côté heroku :

heroku create

Heroku ajoutera un remote nommé heroku à votre repo local et générera un petit nom pour votre application, si d’aventure vous voulez spécifier un nom il suffit pour cela de rajouter l’option --app :

heroku create --app panda-roux-mignon

Prochaine étape, pousser le code à l’aide de git :

git push heroku master

Ceci mettra votre code sur heroku et installera les dépendances de votre composer.json

Mettre votre conteneur à l’échelle

La puissance d’Heroku vient de la possibilité de dimensionner à la demande votre conteneur, par exemple, votre super site est mentionné dans le journal de 20H, et cas classique, noyé sous les visites, votre site ne réponds plus sous la masse de demande, le cas classique aurait été de migrer vers un serveur avec plus de RAM, utiliser les caches de façon plus aggressives ou autres solutions coûteuses en temps et en argent.

Sur Heroku, il suffit d’une commande pour faire face à la recrudescence de visites ! Puis de revenir en arrière avec une deuxième commande !

C’est ce qu’Heroku appelle les dynos, des conteneurs Linux déployables à la demande.

Ceci étant dit, sur le plan gratuit, vous êtes limité au minimum, par exemple un seul dyno web, et ce dyno web s’éteint s’il n’est pas utilisé, ce qui explique la lenteur du premier accès à un site sur heroku avec un plan gratuit, les suivants étant beaucoup plus rapides.

Back to business, nous allons dimensionner note dyno web pour que le site soit accessible :

heroku ps:scale web=1

Puis pour le visualiser heroku open (ou accéder à l’URL qui vous a été fournie lors de la création du conteneur).

Vous aurez dépendamment du projet soir une page d’accueil soit une jolie page d’erreur !

Définissez le dossier servi par le serveur web

Heroku propose un mécanisme de configuration du serveur via un fichier qui est exécuté au lancement du dyno. Ce fichier se nomme Procfile (/!\ attention à la syntaxe !) et doit se trouve à la racine de votre projet.

Pour un projet laravel son contenu doit être :

web: vendor/bin/heroku-php-apache2 public/

Ajouter une base de donnée PostgreSql

Une base de donnée est considérée comme un add-on à votre conteneur web et s’installe de la façon suivante :

heroku addons:create heroku-postgresql:hobby-dev

La base de donnée à été crée et liée à votre dyno web, pour connaître les informations de connexion :

heroku config

ce qui vous donnera un résultat de ce type

DATABASE_URL:  postgres://erkzefgphjmkyx:c734186548093ef987ed83f01ef3d7885cdbafc1fc0379713809281c3bb0e60f@ec2-184-73-167-43.compute-1.amazonaws.com:5432/d8rtr5dppc4hd1

Configuration des variables d’environement

A partir de là pour renseigner les infos de connexion à la BDD auprès de votre application, plusieurs options s’offrent à vous, nous allons opter pour l’option qui n’implique pas de modification du code source de l’application.

Copiez cette chaîne dans un éditeur de texte, et découpez-la selon le format qui suit :

postgres://{DB_USERNAME}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_DATABASE}

Normalement, pour un projet Laravel, ces infos sont renseignés dans un fichier .env, nous allons ici les placer directement en tant que variable d’environement, deux solutions pour cela, la première est en ligne de commande, la seconde via l’interface d’administration de l’application sur le dashboard d’heroku, en vosu rendant sur l’onglet settings, puis en cliquant sur le bouton Reveal Config Vars.

Pour l’option ligne de commande :

heroku config:set {nom de la variable}={valeur}

Exemple pour activer les erreurs sur votre application :

heroku config:set APP_DEBUG=true

Vous devrez donc définir les variable suivantes : DB_CONNECTION avec pour valeur pgsql, et les valeurs DB_USERNAME, {DB_PASSWORD}, DB_HOST, DB_PORT, DB_DATABASE en prenant lesq valeurs à partir selon le schema suivant postgres://{DB_USERNAME}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_DATABASE}

Allez, comme je suis gentil, ce petit programme vous aidera à extraire les infos et construire la chaîne que vous n’aurez plus qu’à copier et coller ! Ne me remerciez pas ! helper.php

<?php
$db = readline('Collez la chaîne de connexion à votre BDD : ');
$url = parse_url($db);

$host = $url["host"];
$username = $url["user"];
$password = $url["pass"];
$database = substr($url["path"], 1);
$port = $url["port"];

echo "\n------------------\n";
echo "heroku config:set DB_USERNAME={$username} DB_PASSWORD={$password} DB_HOST={$host} DB_PORT={$port} DB_DATABASE={$database}";
echo "\n------------------\n";

Copiez ce script et enregistrez le dans un fichier helper.php puis dans votre terminal tapez php helper.php, il vous sera demandé de coller la valeur DATABASE_URL récupérable via la commande heroku config ou via le dashboard de l’app sur heroku. Vous aurez en retour une ligne complète à copier-coller dans le dossier de votre app et boom : le fichier .env est configuré.

Dernier point, il faut générer une clé pour l’application, pour cela dans votre terminal en étant dans le dossier de votre projet :

php artisan key:generate --show

Cette commande permet de générer une clé sans modifier votre fichier .env local ! Vous pouvez maintenant coller cette valeur dans le dashboard de votre app avec comme nom de clé APP_KEY, sinon pour les aficionados du terminal une commande deux en un. Il faut specifie le type de SGBD :

heroku config:set DB_CONNECTION=pgsql
heroku config:set APP_KEY=`php artisan key:generate --show`

Migration de la base de donnée

Pour vous connecter en ssh à votre instance, rien de plus simple :

heroku run bash

puis effectuez la migration :

php artisan migrate

Ou encore plus rapide deux-en-un, vous pouvez executer des commandes directement :

heroku run php artisan migrate

Et voilà !

Si vous avez des données par défaut que vous avez défini dans un seed

heroku run php artisan db:seed

Plus qu’à tester l’appli pour vérifier que tout s’est bien passé avec heroku open

TL;DR

heroku create # création de l'app sur heroku
git push heroku master # push du code local
heroku ps:scale web=1 # dimensionnement à un dyno
echo 'web: vendor/bin/heroku-php-apache2 public/' > Procfile # création du fichier Procfile et définition du dossier public pour le serveur web
heroku addons:create heroku-postgresql:hobby-dev # ajout d'une bdd postgresql
heroku config # on choppe l'url de la bdd
# et on définit les identifiants
heroku config:set APP_DEBUG=true 
heroku config:set DB_USERNAME=xxx 
heroku config:set DB_PASSWORD=xxx
heroku config:set DB_HOST=xxx
heroku config:set DB_PORT=xxx
heroku config:set DB_DATABASE=xxx
heroku config:set APP_KEY=`php artisan key:generate --show` # clé de chiffrement pour l'appli
heroku run php artisan migrate # migration
heroku run php artisan db:seed # seeding
heroku open # on ouvre l'appli pour vérifier que tout va bien
Written on April 12, 2017