Déployer une application Symfony sur Koyeb — Buildpack

Guillaume Loulier
6 min readSep 22, 2021

Dans ce guide, nous verrons comment déployer une application Symfony sur Koyeb, une plateforme d’hébergement et de déploiement typé serverless, cette dernière proposant toute une série de fonctionnalités comme le TLS automatique, la mise à l’échelle et bien d’autres.

Koyeb n’étant pas encore disponible publiquement, n’hésitez pas à demander l’accès à l’équipe en vous inscrivant sur la plateforme.

Cet article est un complément de l’article déjà publié, nous aborderons ici les subtilités amenés par l’usage de Buildpack et son intégration dans Koyeb amenée récemment.

Sommaire

Pré-requis

Etapes

Créer l’application Symfony

Pour commencer simplement, commençons par créer une application Symfony via la CLI:

symfony create — full sf_koyeb

Une fois l’application créée, lançons-la en local pour vérifier que tout fonctionne:

symfony serve

En ouvrant le navigateur sur http://127.0.0.1:8000, la page suivante devrait s’afficher:

Préparer l’environnement Docker

L’usage de Buildpack nécessite une mise à jour de la configuration disponible via composer.json afin de simplifier le déploiement, en effet, le builder Koyeb agit comme une surchage de celui d’Heroku et nous devons (pour le moment), nous adapter à ce dernier.

Pour commencer, Koyeb recommande de spécifier une version PHP, ici, je supprime la version patch définie dans le bloc require:

"php": ">=7.2"

Concernant PHP, je me base sur les recommandations Koyeb, personnellement, je pense que spécifier la version patch de PHP ne fait pas de mal (surtout si vous suivez une roadmap précise) mais les BC breaks étant assez rare sur PHP, définir uniquement une version mineure ne fait pas de mal.

Mettons ensuite les dépendances (pour via le bloc require-dev) à jour:

"symfony/web-link": "5.3.*",
"symfony/debug-bundle": "5.3.*",
"symfony/web-profiler-bundle": "5.3.*",
"symfony/maker-bundle": "^1.0",
"symfony/phpunit-bridge": "^5.3",
"symfony/stopwatch": "5.3.*",
"symfony/yaml": "5.3.*",

Cette modification n’est utile que si vous déployez l’application en restant en environnement de dev, en effet, le builder Heroku définit une commande Composer lancée automatiquement qu’il n’est pas possible de surcharger.

Une dernière modification consiste à définir le Procfile:

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

Ce fichier (utilisé par le builder Heroku) permet de définir le dossier utilisé par le processus Apache (défini par défaut) pour répondre à une requête.

Avant d’aller plus loin, mettons en place un fichier nommé project.toml permettant de spécifier la procédure à suivre ainsi que les fichiers à ignorer pour Buildpack (ce fichier est l’équivalent du .dockerignore):

[build]
exclude = [
'/.cloud',
'/var',
'/vendor',
'/tests',
'/.env.test'
]

Par convention, je mets le fichier dans le dossier .cloud/buildpack, veuillez aussi notez que je n’ignore pas le fichier .env car l’application reste en environnement de dev, lors du passage en production, nous pourrons l’enlever.

Maintenant que la configuration est à jour, lançons le processus de build:

pack build -B koyeb/builder __tag__ — descriptor .cloud/buildpack/project.toml

Si tout se passe bien, vous devriez obtenir une sortie similaire:

Stocker l’image

Pour pouvoir utiliser l’image sur Koyeb, nous devons la stocker sur un registry, pour ce faire, j’utilise le Hub Docker afin de simplifier le processus:

docker push __tag__

Maintenant que l’image est publiée, voyons comment l’utiliser sur Koyeb afin de rendre public notre application.

L’image utilisée ici pour l’exemple est disponible sur le hub Docker

Déployer

Afin de ne pas surcharger ce tutoriel, j’utiliserais le dashboard en ligne, la CLI est bien entendu disponible si besoin, le dashboard est accessible en visitant:

https://app.koyeb.com/auth/signin

Une fois connecté, voici la page d’accueil

En cliquant sur Deploy my first app, vous devriez arriver sur l’interface suivante:

L’usage de Buildpack revient à déloyer via une image Docker, un prochain tutoriel présentera le déploiement via Github

Pour ce tutoriel, j’utiliserais l’instance de type Nano, une application Symfony ne demande pas de grosses ressources et même en production, il vaut mieux viser la plus petite instance et s’adapter à la charge (simple avis personnel ici, chaque projet nécessite une infrastructure adaptée).

Le point important ici est l’usage de Docker, précision indispensable (un énorme merci à Edouard de l’équipe Koyeb pour m’avoir aidé sur ce point 🙏), le nom de l’image ne doit comporter AUCUN espace, faites bien attention si vous copiez le nom depuis le Hub Docker.

Le second point concerne l’usage de Docker Hub, par défaut, ce dernier est considéré comme un registry public, si vous avez besoin de récupérer une image privée, il faudra soumettre votre username ainsi que le token d’API (disponible sur votre compte Docker Hub), ici, je définis l’image comme publique pour éviter cette étape.

Pour les informations qui suivent:

La région PAR (Paris) est la seule disponible à l’écriture de cet article donc je ne peux pas juger des autres, sur l’option du nombre d’instance, une seule instance semble suffisante (à noter que l’option peut être changée n’importe quand), sur le port, j’exposerais le port 8080, en effet, Buildpack expose un port aléatoire et permet de le fixer avec la variable d’environnement PORT, à noter que les variables d’environnement peuvent venir d’un secret si nécessaire, Koyeb s’occupera du routing en interne.

Reste à choisir un nom, ici, j’utilise 3 lettres (la contrainte minimale) afin de simplifier le tri, une fois les options soumises, voyons si le service se lance:

Bien, le tout semble se dérouler au mieux, voyons les informations liées à ce service via sa page dédiée (disponible au clic sur son nom):

Par défaut, Koyeb va exposer votre service via un combo domaine / URL maison (les domaines personnalisés sont déjà sur la roadmap au moment de l’écriture de cet article), vous pouvez aussi obtenir les informations clés tel que l’instance, l’état du service et les derniers déploiements.

Pour finaliser ce tutoriel, cliquons sur l’URL publique et voyons si l’application répond:

Bien, tout semble se passer au mieux (veuillez noter que Buildpack utilise un dossier personnalisé pour stocker le projet), à noter que n’ayant pas défini de route pour l’accueil, la page par défaut de Symfony répond mais votre application devrait renvoyer le tout correctement.

Ce tutoriel arrive à son terme, pour simplifier le processus, je n’ai volontairement pas fait mention de la base de données, des artefacts front ou des services tiers, je reviendrais sur ces cas d’usages dans des articles dédiés prochainement.

Si vous souhaitez en savoir plus sur Koyeb, la documentation ainsi que le site officiel sont vos prochaines destinations, merci encore pour la lecture et très bonne journée à tous 👋

--

--

Guillaume Loulier

PHP developer @SensioLabs, Symfony addict (3, 4, 5 & 6 certified!)