Déployer une application Symfony sur Koyeb — Vous avez dit base de données ?

Guillaume Loulier
5 min readSep 29, 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.

Dans cet article, nous verrons comment brancher une application sur une base de données PostgreSQL en utilisant le réseau interne de Koyeb ainsi que les scripts Composer afin d’automatiser les migrations liés à la base de données.

Sommaire

Pré-requis

Préparer la base de données

En partant du postulat que vous avez suivi les premiers tutoriels (et donc, que vous avez une application déjà déployée ou prête pour l’être), nous allons directement préparer la base de données PostgreSQL, pour ce faire, dirigeons-nous sur le dashboard en ligne:

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

Une fois connecté, voici la page d’accueil

Bien, cliquons sur Deploy my First App et configurons le tout:

Pour commencer, il nous faut spécifier l’image Postgres, ici, j’utilise volontairement la version 9.6 sous environnement Alpine, je sélectionne l’instance de type Nano (largement suffisante à ce stade), voyons la suite:

La seconde partie ne change pas beaucoup des précédents tutoriels, à ceci près que nous devons exposer un port TCP et non HTTP (notamment pour que nos applications puissent se connecter), je rajoute deux variables d’environnement permettant de définir un mot de passe et un utilisateur dédié.

Lançons le tout et voyons si tout se passe bien:

Bien, l’instance démarre bien et semble prête, vérifions les logs afin de détecter d’éventuelles erreurs (onglet Runtime Logs):

Bien, tout semble en place, veuillez noter que je ne configure pas d’avantage l’instance, si besoin, l’usage d’une image personnalisée est à privilégier.

Préparer l’application

Ici, j’utiliserais le déploiement via Github afin d’accélérer le processus de déploiement.

Du côté de l’application, nous allons utiliser les secrets afin de stocker l’URL de connexion à la base de données, pour ce faire, ouvrons un terminal et lançons la commande suivante:

php bin/console secrets:set DATABASE_URL

J’utilise ici la variable définie dans le fichier .env en local, pour la valeur, voici la valeur soumise:

postgresql://_username_:_password_@pgsqlk:5432/sf_koyeb?serverVersion=9.6&charset=utf8

L’important ici est la partie après les identifiants, Koyeb effectuant une résolution en interne via un service de mesh, nous pouvons donner le nom du service sans se soucier de l’IP, plus d’informations sont disponibles sur la documentation liée.

Avant d’aller plus loin, mettons à jour le composer.json afin d’automatiser la création de la base de données, pour ce faire, modifions la partie scripts:

"scripts": {
"auto-scripts": {
"cache:clear": "symfony-cmd",
"assets:install %PUBLIC_DIR%": "symfony-cmd",
"requirements-checker": "script",
"doctrine:database:create --if-not-exists": "symfony-cmd"
},
"post-install-cmd": [
"@auto-scripts"
],
"post-update-cmd": [
"@auto-scripts"
]
},

Je rajoute donc la commande Doctrine permettant de créer la base de données, grâce au secret défini plus tôt (et une fois que le projet sera construit via Buildpack), Symfony va pouvoir lancer la commande et résoudre la base de données.

Une fois le secret défini, vous pouvez versionner les nouveaux fichiers (sauf le fichier config/dev/secret/dev.decript.private.php qui ne DOIT pas être envoyé dans le repository) et pousser le tout sur votre repository.

Déployer l’application

Une fois le repository à jour, nous pouvons préparer le service du côté de Koyeb afin de rendre l’application disponible, pour accélérer le processus, je vous redirige vers le tutoriel déjà disponible, si tout se déroule comme prévu, voici la sortie que vous devriez obtenir:

La base de données étant créées, rajoutons une entité afin de pouvoir générer une migration:

Une fois l’entité rajoutée (et une base de données disponible en local, pour les tests, SQLite suffit), générons une migration via:

php bin/console doctrine:migration:diff

Voici le fichier généré:

Maintenant que tout est en place, mettons à jour le fichier composer.json afin d’exécuter la migration lors du déploiement:

"scripts": {
"auto-scripts": {
"cache:clear": "symfony-cmd",
"assets:install %PUBLIC_DIR%": "symfony-cmd",
"requirements-checker": "script",
"doctrine:database:create --if-not-exists": "symfony-cmd",
"doctrine:migrations:migrate --no-interaction": "symfony-cmd"
},
"post-install-cmd": [
"@auto-scripts"
],
"post-update-cmd": [
"@auto-scripts"
]
},

Une fois le commit créé et le repository à jour, Koyeb effectuera le déploiement automatiquement, si tout se déroule normalement, voici la sortie que vous devriez avoir:

Maintenant que la base de données est disponible et que la migration a été jouée, voyons si l’application est disponible:

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.

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!)