Hébergement d'une application Symfony chez o2switch

Sur cette page nous allons voir comment héberger une application Symfony sur un hébergement web o2switch et répondre aux questions courantes.

Il est bien évidemment possible de déployer une application conçu avec le Framework Symfony sur l'offre unique o2switch. L'hébergement est bien compatible avec Symfony.

Ce guide est à compléter avec les recommandations de déploiement de Symfony.

L'une des premières choses à configurer lorsque vous déployez une application Symfony est le nom de domaine. Une erreur fréquente consiste à configurer le nom de domaine au mauvais endroit, dans le mauvais dossier de votre hébergement.

En effet, si l'on suit la structure recommandé d'une application Symfony, le point d'entrée de l'application se situe généralement dans le dossier /public de votre application. Le domaine doit donc pointer dans ce dossier /public et non à la racine de votre projet.

Cette configuration là se fait avec l'outil domaine configurés dans cPanel, il faut bien faire attention à modifier la racine du document, ce qui sera pré-rempli par défaut sera incorrect.

Configuration d'un domaine pour une application Symfony

Exemple de configuration d'un nom de domaine pour une application Symfony

Dans la plupart des cas, la version et la configuration par défaut de l'hébergement devrait convenir pour l'hébergement d'une application Symfony récente.

Néanmoins, vous pouvez utiliser l'outil sélectionner une version de PHP pour :

  • choisir la version de PHP que vous souhaitez utiliser,
  • choisir les modules PHP qui sont chargés,
  • modifier le php.ini

Si vous avez besoin d'une configuration spécifique, sûr mesure, c'est donc possible de faire cela avec l'outil de sélection de version de PHP de l'hébergement.

Dans le premier onglet de l'outil de sélection de PHP, il est possible de choisir la version de PHP que vous souhaitez utiliser et cocher les modules qui doivent être chargés dans PHP.

Modification de la version de PHP et choix des modules PHP

Sélection de la version de PHP et des modules PHP

Dans le deuxième onglet du sélecteur de version de PHP, vous pouvez modifier la configuration PHP. La majorité des réglages sont changeables, si quelque chose n'est pas présent, vous pouvez demander au support de l'ajouter pour vous (dans la limite du possible).

Modification de la configuration PHP de l'hébergement

Modification de la configuration php.ini (Note: la capture est tronquée, il y a bien plus de choix en réalité)

Sur votre espace d'hébergement, il est possible de créer des bases de données MySQL et des bases de données Postgresql. Dans la mesure du possible, on recommande plutôt l'usage de bases de données MySQL qui est mieux supporté par cPanel. La version de PostgreSQL proposé est malheureusement assez ancienne.

Dans les deux cas, il faut :

  • Créer une nouvelle bases de données, à l'aide des outils bases de données MySQL (ou PostgreSQL) de l'hébergement
  • Créer un utilisateur pour la base de données, toujours avec les mêmes outils
  • Donner les droits à l'utilisateurs sur la base de données

Ce processus là est expliqué en détails dans ce guide.

Ensuite il faut mettre à jour le fichier de configuration de votre application, généralement le .env à la racine de votre projet :

  • Le nom de la base de données sera ce que vous avez choisi précédemment
  • Même chose pour l'identifiant/mot de passe
  • Pour l'adresse de la base de données, c'est localhost pour MySQL et 127.0.0.1 pour PostgreSQL (et pas localhost car cela risque de résoudre sur l'ipv6 et causer des problèmes de droits)

Concernant la version de la base de données, pour MySQL nous utilisons actuellement MariaDB 10.3 et pour PostgreSQL la version 9.2. (Peut varier légèrement d'un serveur à l'autre)

# Exemple de configuration pour MySQL
DATABASE_URL="mysql://NOM_UTILISATEUR:MOT_DE_PASSE@127.0.0.1:3306/db_name?serverVersion=mariadb-10.3.28"
 
# Exemple pour Postgresql. Attention à bien utiliser 127.0.0.1 et pas localhost
DATABASE_URL="postgresql://NOM_UTILISATEUR:MOT_DE_PASSE@127.0.0.1:5432/db_name?serverVersion=9&charset=utf8"

Caractères spéciaux dans les mots de passes

Attention aux carractères spéciaux dans les mots de passes que vous pouvez définir dans vos fichiers de configuration. Pour éviter des erreurs chronophages, générez des mots de passes alphanumériques pour vos utilisateurs de bases de données, quitte à les faire un peu plus long.

Il est possible d'accéder en SSH sur un hébergement web o2switch. C'est même possible de plusieurs manières différentes :

  • Avec un client SSH comme Putty ou le client SSH natif sur Linux
  • Ou depuis l'outil Terminal dans cPanel, qui est un client SSH qui s'utilise dans le navigateur web

Si vous souhaitez vous connecter en SSH depuis un client SSH comme Putty, la première étape est d'autoriser la connexion SSH depuis votre adresse IP. Cette autorisation peut être faites directement depuis cPanel et l'outil Whitelist SSH

Mise en whitelist d'une adresse IP pour SSH

Ajout d'une adresse IP dans la liste blanche SSH

Dés que la liste demande de passage en liste blanche est effectuée, vous pouvez vous connecter en SSH en utilisant le même identifiant/mot de passe que cPanel. Il faut utiliser le port par défaut (22) et utiliser le nom du serveur sur lequel se trouve votre compte (communiqué dans le mail bienvenue chez o2switch). Vous pouvez aussi utiliser un de vos nom de domaine à condition qu'il pointe directement sur l'hébergement.

ssh identifiant-cPanel@nom-serveur.o2switch.net

Dans un second temps, il est également possible de configurer une authentification SSH par clés, comme cela est expliqué dans ce guide.

Vous connecter en SSH directement depuis l'outil Terminal de cPanel. Cela peut dépanner, notamment si vous n'avez pas de client SSH comme Putty installé, tout se fait à partir d'un navigateur web.

Outil terminal dans cPanel, shell sans client SSH

Un accès shell sans client SSH depuis cPanel

La plupart des logiciels qui peuvent être utilisés dans l'écosystèmes Symfony sont installés nativement. Certains sont directement inclus dans le PATH, pour d'autres il est parfois nécessaires de faire quelques modifications (c'est le cas de npm, node, yarn).

Il y a quelques cas particuliers :

  • symfony (cli) la commande Symfony n'est pas installé par défaut. Cela peut être installé mais généralement c'est plutôt orienté pour le développement et/ou l'utilisation de Symfony Cloud donc ce n'est pas forcément recommandé d'installer cela sur la production.

Il y a quelques exceptions de logiciels qui ne sont pas installés, ni installable :

La méthode de déploiement recommandé par Symfony est la méthode de déploiement par Git. Il existe plusieurs manières de déployer une application

  • manuellement, en lançant les commandes en SSH, en clonant les données d'un dépôts GIT externe
  • ou de manière automatisé, dans un processus de CI/CD (hors sujet de cet article)

Dans un premier temps, nous allons voir comment déployer cela manuellement. Le sujet du CI/CD sera abordé plus tard ou dans un autre article, la documentation sera mis à jour à ce moment là.

Cette partie peut être complétée avec les recommandation de Symfony.

En résumé, pour déployer une application Symfony il faut :

  • Se connecter en SSH à l'hébergement avec l'une des méthodes expliquées précédemment
  • Se placer dans le dossier qui va contenir l'application (ou directement créer le dossier avec git clone)
  • Récupérer les fichiers de notre projet avec un git clone
  • Installer les dépendances du projet avec Composer. Si vous avez des erreurs, alors essayez en configurant d'abord l'application puis en installant les dépendances.
  • Configurer l'application en créant/modifiant le fichier .env et éventuellement les fichiers du dossier config. Bien s'assurer de ne pas laisser l'application en mode développement.
  • Si l'application à une base de données, il peut être nécessaire de créer les tables de la bases et chargées des données

Dans cette première étape, nous allons récupérer les données avec git clone. On peut utiliser le protocole HTTP ou SSH. Le protocole HTTP est recommandé dans ce cas précis car moins contraignant (pas besoin de liste blanche).

# Dans mon exemple, l'application se trouve dans /home/o2demo/mon-application
cd /home/o2demo/mon-application
git clone https://github.com/symfony/demo.git .
 
# On peut aussi directement créer le dossier lors du git clone
cd /home/o2demo/
git clone https://github.com/symfony/demo.git mon-application
 
# Rien n'empêche d'utiliser le protocole SSH de Git à la place de HTTP
# Dans ce cas, bien penser aux listes blanches SSH pour l'hébergement
cd /home/o2demo/
git clone utilisateur@serveur-distant.fr:xxxxxxx/yyyyyyyyy.git

L'étape suivante consiste à installer les dépendances PHP du projet, avec l'aide de composer.

cd /home/o2demo/mon-application
composer install

Ensuite il est nécessaire de configurer l'application, en mettant à jour le fichier .env qui se situe à la racine du projet.

Normalement ce fichier devrait être le seul à modifier, cependant si toutes les données pratiques n'ont pas été respectées, il peut être nécessaire de modifier des fichiers de configurations qui se trouve dans le dossier config de l'application.

cd /home/o2demo/mon-application
# On peut modifier directement cela en ligne de commande avec VI
vi .env

Si vous n'êtes pas à l'aise avec vi, vous pouvez utiliser le gestionnaire de fichier de cPanel également.

Carractères spéciaux et espaces

Attention aux caractères spéciaux dans le fichiers .env, notamment dans les mots de passes qui peuvent y être défini.

Pour les fichiers du répertoires config, s'il s'agit de fichier .yaml, prenez garde aux espaces. Le nombre d'espace / indentation est important.

Quelques exemples de choses à changer dans ce fichier .env (cela dépend évidemment de votre application) :

# Penser à passer en prod, en mode dev des informations confidentielles peuvent être affichées!
APP_ENV=prod
 
# Si vous utilisez une base de données, c'est à configurer. Dans le cas de MySQL & PostgreSQL, vous avez du les créer précédemment
 
# Exemple avec sqlite
DATABASE_URL=sqlite:///%kernel.project_dir%/data/database.sqlite
# Exemple de configuration pour MySQL
DATABASE_URL="mysql://NOM_UTILISATEUR:MOT_DE_PASSE@127.0.0.1:3306/db_name?serverVersion=mariadb-10.3.28"
# Exemple pour Postgresql. Attention à bien utiliser 127.0.0.1 et pas localhost
DATABASE_URL="postgresql://NOM_UTILISATEUR:MOT_DE_PASSE@127.0.0.1:5432/db_name?serverVersion=9&charset=utf8"
 
# Si vous utilisez des emails, il faut configurer la connexion SMTP
# Attention, des carractères spéciaux comme le "@" ou le "+" doivent être encodés
 
# Par exemple avec https://www.urlencoder.org/ ou https://www.php.net/manual/en/function.urlencode.php
MAILER_DSN=smtp://user:pass@smtp.example.com:port
 
# Exemple concret 
MAILER_DSN=smtp://noreply%40domain.com:mot%20de%20passe@xxxxxxxx.o2switch.net:465?verify_peer=0

Si vous utilisez une base de données, vous aurez certainement besoin de créer les tables (schema) et vous aurez peut être besoin de charger des données.

cd /home/o2tuto/mon-application 
 
# Pas besoin de créer la base de données car c'est déjà fait aux étapes précédentes. Sauf dans le cas de sqlite
php bin/console doctrine:database:create
 
# Création des tables
php bin/console doctrine:schema:create
 
# Si vous utilisez le système de migration 
php bin/console doctrine:migrations:migrate

Enfin, il faut vider et éventuellement précharger le cache.

cd /home/o2tuto/mon-application 
 
php bin/console cache:clear
 
php bin/console cache:warmup

Le composant Messenger peut être mis en place à l'aide d'une tâche cron sur l'hébergement. La tâche cron remplacera aisément Supervisor dans ce cas de figure.

L'idée est de placer la commande php bin/console messenger:consume en tâche planifiée sur cPanel, par exemple toutes les 5 minutes, couplée avec l'option time-limit de messenger afin d'éviter que la commande se lance plusieurs fois en même temps. Si la commande est lancée toutes les 5 minutes (300 secondes), l'option time-limit peut être placée à 295 secondes par exemple.

Ainsi, il y a toujours un processus messenger qui s'occupe des traitements asynchrones et si celui-ci meurt pour une raison X ou Y, il sera relancé sous 5 minutes par l'outil de tâche planifiée de cPanel.

Voici un exemple de commande à placer en cron :

php /home/o2demo/mon-application-sf/bin/console messenger:consume --time-limit=295 --memory-limit=128M async > /home/o2demo/log.txt  2>&1

Évidemment, les chemins seront à ajuster en fonction de votre hébergement (identifiant) ainsi que le dossier dans lequel se trouve le projet. Le nom de la queue messenger devra probablement être changé également (async dans l'exemple).

Exemple de mise en place d'une tache cron pour Messenger

Mise en place de la commande messenger dans l'outil de tâche planifiée de cPanel

  • Dernière modification: il y a 2 ans
  • de o2switch