Déploiement de projets Laravel en production sur des serveurs cloud
Introduction au déploiement en production
Félicitations ! Vous avez développé une application Laravel fonctionnelle sur votre machine locale. Mais le véritable objectif de toute application web est d'être accessible au monde entier. C'est là qu'intervient le déploiement en production. Le déploiement est le processus consistant à transférer votre application de votre environnement de développement local vers un serveur distant, accessible via Internet, afin que les utilisateurs puissent l'utiliser.
Dans le cadre de ce cours avancé, nous nous concentrerons sur le déploiement sur des serveurs cloud. Ces serveurs offrent flexibilité, scalabilité et un contrôle fin sur l'environnement, mais nécessitent une compréhension des concepts sous-jacents.
Pourquoi le déploiement est-il crucial ?
- Accessibilité mondiale : Votre application devient disponible 24/7 pour tous les utilisateurs connectés à Internet.
- Performance et fiabilité : Les serveurs de production sont optimisés pour la performance et sont conçus pour être robustes, gérant les pics de trafic et minimisant les temps d'arrêt.
- Sécurité : Un environnement de production correctement configuré inclut des mesures de sécurité essentielles pour protéger vos données et celles de vos utilisateurs.
- Mises à jour et maintenance : Un processus de déploiement bien établi facilite les mises à jour et la maintenance continue de votre application sans perturber l'expérience utilisateur.
Ce chapitre vous guidera à travers les étapes et les considérations clés pour déployer votre projet Laravel sur un serveur cloud, depuis la configuration initiale du serveur jusqu'aux meilleures pratiques pour un déploiement fluide et sécurisé.
Prérequis et outils essentiels
Avant de plonger dans le vif du sujet, assurez-vous de maîtriser les concepts et outils suivants :
- Bases de Laravel : Compréhension de la structure de projet, de la gestion des dépendances (Composer), des migrations de base de données, et de la configuration des variables d'environnement (
.env). - Connaissances Linux de base : Savoir naviguer dans le terminal, manipuler des fichiers, gérer les permissions, et utiliser des commandes comme
ssh,ls,cd,cp,mv,nanoouvim. - Git : Maîtrise des commandes Git pour le contrôle de version (
clone,pull,push,branch). C'est le moyen privilégié pour transférer votre code. - Accès SSH : Compréhension du fonctionnement de SSH pour se connecter à un serveur distant de manière sécurisée.
- Concepts de base des serveurs web : Connaissance du rôle d'un serveur web (Nginx ou Apache) et d'un processeur PHP (PHP-FPM).
- Fournisseur de services Cloud : Avoir un compte chez un fournisseur comme DigitalOcean, Vultr, Linode, AWS EC2, Google Cloud Compute Engine, ou Azure VM. Nous nous baserons sur un serveur Ubuntu 22.04 LTS générique.
Choisir son serveur cloud et le configurer
Le premier pas est de choisir votre fournisseur et de provisionner une machine virtuelle (VM) ou un droplet (DigitalOcean). Pour un projet Laravel, un serveur Linux Ubuntu LTS (Long Term Support) est fortement recommandé en raison de sa stabilité et de la richesse de sa documentation.
Provisionnement du serveur
- Sélection du fournisseur : DigitalOcean, Vultr, et Linode sont d'excellents choix pour commencer, offrant un bon équilibre entre prix, performance et simplicité. AWS EC2, GCP Compute Engine et Azure VM sont plus complexes mais offrent une scalabilité et des services intégrés inégalés pour des projets d'envergure.
- Choix de l'OS : Optez pour Ubuntu Server 22.04 LTS (ou la dernière version LTS stable).
- Taille du serveur : Pour une application Laravel modeste, un serveur avec 1 CPU et 2 Go de RAM est généralement suffisant. Adaptez en fonction de vos besoins de trafic et de traitement.
- Authentification SSH : Configurez l'authentification par clé SSH. C'est plus sécurisé que les mots de passe et c'est une pratique standard.
Connexion au serveur via SSH
Une fois votre serveur provisionné, vous recevrez une adresse IP publique. Vous pouvez alors vous connecter via SSH.
ssh root@VOTRE_ADRESSE_IP_SERVEUR
-
root: C'est l'utilisateur par défaut avec les privilèges les plus élevés. Il est recommandé de créer un nouvel utilisateur avec des privilègessudopour les opérations quotidiennes afin d'éviter d'opérer en permanence en tant queroot.# Crée un nouvel utilisateur adduser votre_utilisateur # Ajoute l'utilisateur au groupe sudo usermod -aG sudo votre_utilisateur # Bascule vers le nouvel utilisateur (optionnel, pour tester) su - votre_utilisateur # Copie les clés SSH de root vers le nouvel utilisateur (si vous vous êtes connecté initialement en root) rsync --archive --chown=votre_utilisateur:votre_utilisateur ~/.ssh /home/votre_utilisateurDésormais, vous pourrez vous connecter avec
ssh votre_utilisateur@VOTRE_ADRESSE_IP_SERVEUR.
Configuration initiale du serveur
Mettez à jour votre système et installez les outils de base :
sudo apt update
sudo apt upgrade -y
sudo apt install -y curl unzip git wget software-properties-common
Stack Logiciel pour Laravel (LEMP)
Pour faire fonctionner Laravel en production, nous avons besoin d'une stack logicielle spécifique. La plus courante pour Laravel est LEMP : Linux (OS), Engine X (Web Server), MySQL (Database), PHP (Runtime).
1. Installation de Nginx (Web Server)
Nginx est un serveur web léger et performant, souvent préféré à Apache pour les applications PHP modernes, notamment avec PHP-FPM.
sudo apt install nginx -y
sudo ufw app list # Vérifier les profils disponibles
sudo ufw allow 'Nginx HTTP' # Autoriser le trafic HTTP (port 80)
sudo ufw enable # Activer le pare-feu si ce n'est pas déjà fait
sudo systemctl start nginx # Démarrer Nginx
sudo systemctl enable nginx # Permettre à Nginx de démarrer au boot
Vous devriez pouvoir accéder à l'adresse IP de votre serveur dans un navigateur et voir la page de bienvenue de Nginx.
2. Installation de PHP et PHP-FPM
Laravel est une application PHP, donc nous avons besoin d'un environnement PHP. PHP-FPM (FastCGI Process Manager) est l'interface FastCGI qui permet à Nginx de communiquer efficacement avec PHP.
# Ajout du dépôt Ondrej PHP (pour les versions récentes de PHP)
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
# Installation de PHP 8.2 (ou la version requise par votre projet Laravel) et des extensions courantes
sudo apt install php8.2-fpm php8.2-mysql php8.2-mbstring php8.2-xml php8.2-bcmath php8.2-curl php8.2-zip php8.2-gd php8.2-intl -y
# Redémarrage de PHP-FPM
sudo systemctl restart php8.2-fpm
sudo systemctl enable php8.2-fpm
- Note sur les extensions : Assurez-vous d'installer toutes les extensions PHP nécessaires à votre projet (ex:
php8.2-pgsqlpour PostgreSQL,php8.2-redispour Redis, etc.). Référez-vous à la documentation de Laravel et aux paquets que vous utilisez.
3. Installation de Composer
Composer est le gestionnaire de dépendances de PHP, absolument essentiel pour les projets Laravel.
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
composer --version
4. Installation de MySQL (Base de Données)
Laravel a besoin d'une base de données. MySQL est un choix populaire.
sudo apt install mysql-server -y
sudo mysql_secure_installation # Script de sécurisation de MySQL
Suivez les instructions du script mysql_secure_installation :
VALIDATE PASSWORD COMPONENT: activez-le et choisissez un niveau de sécurité.- Définissez un mot de passe fort pour l'utilisateur
rootde MySQL. - Supprimez les utilisateurs anonymes.
- Désactivez la connexion
rootà distance. - Supprimez la base de données de test et rechargez les tables de privilèges.
Connectez-vous à MySQL pour créer votre base de données et un utilisateur dédié à Laravel :
sudo mysql -u root -p
Entrez le mot de passe root de MySQL.
CREATE DATABASE votre_base_de_donnees;
CREATE USER 'votre_utilisateur_db'@'localhost' IDENTIFIED BY 'votre_mot_de_passe_db';
GRANT ALL PRIVILEGES ON votre_base_de_donnees.* TO 'votre_utilisateur_db'@'localhost';
FLUSH PRIVILEGES;
EXIT;
- Remplacez
votre_base_de_donnees,votre_utilisateur_db, etvotre_mot_de_passe_dbpar des valeurs appropriées et sécurisées.
Déploiement du projet Laravel
Maintenant que notre serveur est configuré, nous pouvons y déposer notre projet Laravel. Il existe plusieurs stratégies de déploiement, de la plus simple (mais moins robuste) à la plus automatisée (et recommandée pour la production).
Stratégie 1 : Déploiement Manuel par Git (Recommandé pour débuter)
Cette méthode est la plus courante pour un premier déploiement et offre un bon équilibre entre contrôle et efficacité.
1. Cloner le projet depuis Git
Créez un répertoire pour votre projet (conventionnellement /var/www/votre_domaine).
Changez les permissions du répertoire.
sudo mkdir -p /var/www/votre_domaine
sudo chown -R votre_utilisateur:votre_utilisateur /var/www/votre_domaine
cd /var/www/votre_domaine
# Clonez votre dépôt Git
git clone https://github.com/votre_utilisateur/votre_projet_laravel.git .
Le . à la fin permet de cloner directement dans le répertoire courant sans créer de sous-répertoire.
2. Configuration des variables d'environnement (.env)
Copiez le fichier .env.example et éditez le nouveau fichier .env avec les informations de votre base de données et d'autres variables spécifiques à la production.
cp .env.example .env
nano .env # ou vim .env
Assurez-vous que les lignes suivantes sont correctement configurées :
APP_ENV=production
APP_DEBUG=false
APP_URL=https://votre_domaine.com
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=votre_base_de_donnees
DB_USERNAME=votre_utilisateur_db
DB_PASSWORD="votre_mot_de_passe_db"
# Générez une clé d'application si elle n'existe pas
# php artisan key:generate
APP_KEY=base64:YOUR_GENERATED_APP_KEY_HERE
Après avoir modifié et enregistré le fichier, vous devrez générer la clé d'application si ce n'est pas déjà fait :
php artisan key:generate
3. Installation des dépendances Composer
composer install --no-dev --optimize-autoloader
--no-dev: N'installe pas les dépendances de développement, réduisant la taille et la complexité du projet en production.--optimize-autoloader: Optimise l'autoloader de Composer pour des performances accrues.
4. Permissions des répertoires
Laravel a besoin de permissions d'écriture dans les répertoires storage et bootstrap/cache.
sudo chown -R www-data:www-data /var/www/votre_domaine/storage /var/www/votre_domaine/bootstrap/cache
sudo chmod -R 775 /var/www/votre_domaine/storage /var/www/votre_domaine/bootstrap/cache
www-dataest l'utilisateur sous lequel Nginx et PHP-FPM s'exécutent.
5. Exécution des commandes Laravel
php artisan migrate --force # Exécute les migrations de base de données
php artisan storage:link # Crée un lien symbolique pour le stockage public
php artisan config:cache # Cache la configuration de l'application
php artisan route:cache # Cache les définitions de routes
php artisan view:cache # Cache les vues Blade
--forceest nécessaire pourmigrateen production, sinon Laravel demande une confirmation interactive.
6. Configuration de Nginx pour Laravel
C'est une étape cruciale pour indiquer à Nginx comment servir votre application Laravel. Créez un nouveau fichier de configuration de site pour Nginx.
sudo nano /etc/nginx/sites-available/votre_domaine.conf
Collez le contenu suivant, en ajustant votre_domaine.com et le chemin root :
# /etc/nginx/sites-available/votre_domaine.conf
server {
listen 80;
listen [::]:80;
server_name votre_domaine.com www.votre_domaine.com; # Remplacez par votre domaine
root /var/www/votre_domaine/public; # Chemin vers le répertoire public de Laravel
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock; # Assurez-vous que la version de PHP correspond
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# Empêche l'accès direct aux fichiers .env et autres fichiers de configuration sensibles
location ~ /\.env {
deny all;
}
# Bloque l'accès aux répertoires sensibles
location ~ /(vendor|storage|app|bootstrap|routes|resources|tests)/ {
deny all;
}
# Optimisations pour les fichiers statiques (optionnel)
location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
expires 5d;
}
}
- Explication du bloc Nginx :
listen 80;: Écoute sur le port HTTP standard.server_name votre_domaine.com www.votre_domaine.com;: Définit les noms de domaine que ce bloc de serveur gérera.root /var/www/votre_domaine/public;: Extrêmement important ! Indique que la racine de votre site web est le répertoirepublicde Laravel. Cela empêche l'accès direct aux fichiers sensibles.location / { ... }: La configuration pour la gestion des requêtes.try_filesest essentiel pour Laravel, il tente de servir le fichier demandé, puis le répertoire, et enfin, il redirige tout versindex.php, permettant à Laravel de gérer le routage.location ~ \.php$ { ... }: Gère les requêtes PHP en les passant à PHP-FPM via un socket UNIX. Assurez-vous que le chemin du socket (unix:/var/run/php/php8.2-fpm.sock) correspond à votre version de PHP.location ~ /\.env { deny all; }: Bloque l'accès direct au fichier.env, une mesure de sécurité cruciale.
7. Activer la configuration Nginx
Créez un lien symbolique de votre fichier de configuration dans sites-enabled et testez la configuration Nginx avant de redémarrer.
sudo ln -s /etc/nginx/sites-available/votre_domaine.conf /etc/nginx/sites-enabled/
sudo nginx -t # Tester la configuration
sudo systemctl restart nginx
Si nginx -t renvoie test is successful, alors tout est bon.
À ce stade, si vous avez déjà un nom de domaine configuré pour pointer vers l'adresse IP de votre serveur, vous devriez pouvoir accéder à votre application Laravel via votre navigateur.
Stratégie 2 : Déploiement automatisé (CI/CD, Outils de déploiement)
Pour des projets plus importants ou des équipes, les déploiements manuels deviennent fastidieux et sujets aux erreurs. Les solutions automatisées sont alors préférables.
-
CI/CD (Continuous Integration/Continuous Delivery) : Des plateformes comme GitHub Actions, GitLab CI/CD, ou Jenkins peuvent être configurées pour déployer automatiquement votre application chaque fois que vous poussez du code vers une branche spécifique (ex:
mainouproduction).- Principe : Un pipeline est défini qui, après un push Git, exécute des tests, puis se connecte au serveur distant (via SSH), tire la dernière version du code, installe les dépendances, exécute les migrations et purge les caches.
-
Outils de gestion de serveurs et de déploiement (SaaS) :
- Laravel Forge : Développé par Taylor Otwell (créateur de Laravel), Forge est une solution premium qui simplifie énormément la configuration de serveurs Nginx/PHP et le déploiement d'applications Laravel sur des fournisseurs cloud populaires (AWS, DigitalOcean, Linode, etc.). Il gère la configuration du serveur, les déploiements Git, les certificats SSL, les files d'attente, etc.
- Ploi : Une alternative à Forge, offrant des fonctionnalités similaires.
- Envoyer : Un outil de déploiement sans temps d'arrêt, également de Laravel, qui travaille en conjonction avec Forge ou vos propres serveurs pour effectuer des déploiements complexes (avec rollbacks) sans interruption de service.
Ces outils réduisent considérablement la charge de travail et le risque d'erreur, permettant des déploiements fréquents et fiables.
Sécurisation de votre application
La sécurité est primordiale en production. Voici quelques mesures essentielles :
-
HTTPS (SSL/TLS) : Chiffrez le trafic entre vos utilisateurs et votre serveur. Let's Encrypt offre des certificats SSL gratuits.
sudo apt install certbot python3-certbot-nginx -y sudo certbot --nginx -d votre_domaine.com -d www.votre_domaine.comSuivez les instructions. Certbot configurera automatiquement Nginx et un renouvellement automatique.
-
Pare-feu (UFW) : Limitez l'accès aux ports nécessaires (22 pour SSH, 80 pour HTTP, 443 pour HTTPS).
sudo ufw allow OpenSSH sudo ufw allow 'Nginx Full' # Autorise HTTP et HTTPS sudo ufw enable -
Mises à jour régulières : Maintenez votre système d'exploitation, PHP, Nginx et vos dépendances Composer à jour pour bénéficier des derniers correctifs de sécurité.
sudo apt update && sudo apt upgrade -y composer update --no-dev -
Mot de passe forts et clés SSH : N'utilisez jamais de mots de passe simples. Privilégiez l'authentification par clé SSH.
-
Fichier
.env: Ne le versionnez jamais sur Git et assurez-vous qu'il contient des informations sensibles (clés API, mots de passe) non accessibles publiquement.
Tâches d'arrière-plan et files d'attente (Queues)
Laravel propose des fonctionnalités puissantes pour gérer les tâches d'arrière-plan (comme l'envoi d'e-mails, le traitement d'images) via les queues et les tâches planifiées (cron jobs).
Cron Jobs
Pour que les tâches planifiées de Laravel fonctionnent, vous devez configurer un cron job sur votre serveur pour exécuter php artisan schedule:run toutes les minutes.
sudo crontab -e
Ajoutez la ligne suivante à la fin du fichier :
* * * * * cd /var/www/votre_domaine && php artisan schedule:run >> /dev/null 2>&1
- Cela indique à
crond'exécuter la commande toutes les minutes.
Queues (Files d'attente)
Pour les files d'attente de Laravel, vous devrez configurer un gestionnaire de processus (comme Supervisor) pour exécuter le worker des files d'attente en continu.
# Exemple d'installation de Supervisor
sudo apt install supervisor -y
Créez un fichier de configuration pour votre worker Laravel :
sudo nano /etc/supervisor/conf.d/laravel-worker.conf
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/votre_domaine/artisan queue:work --sleep=3 --tries=3 --daemon
autostart=true
autorestart=true
user=www-data # L'utilisateur sous lequel Nginx/PHP-FPM s'exécute
numprocs=1 # Nombre de processus worker à lancer (ajuster selon vos besoins)
redirect_stderr=true
stdout_logfile=/var/www/votre_domaine/storage/logs/supervisor_queue.log
stopwaitsecs=3600
- Après avoir enregistré, informez Supervisor des changements et démarrez le worker :
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*
- Laravel Horizon : Pour les applications utilisant Redis comme pilote de queue, Laravel Horizon offre une interface élégante pour surveiller vos files d'attente, les jobs en attente, réussis, ou échoués. Son installation est une étape supplémentaire mais fortement recommandée pour la gestion des queues.
Conclusion et prochaines étapes
Le déploiement de projets Laravel en production est une compétence essentielle pour tout développeur backend. Nous avons couvert les étapes fondamentales : la configuration d'un serveur cloud avec la stack LEMP, le déploiement manuel via Git, la sécurisation avec HTTPS et le pare-feu, et la gestion des tâches d'arrière-plan.
Points clés à retenir :
- Sécurité d'abord : Toujours privilégier HTTPS, des mots de passe forts, l'authentification par clé SSH, et des permissions de fichiers strictes.
- Automatisation : Pour des déploiements fréquents, explorez les outils CI/CD (GitHub Actions, GitLab CI/CD) ou les plateformes dédiées comme Laravel Forge/Envoyer.
- Monitoring : Mettez en place des outils de surveillance pour suivre la performance de votre application et détecter les problèmes rapidement.
- Sauvegardes : Planifiez des sauvegardes régulières de votre base de données et de vos fichiers.
- Documentation : Documentez votre processus de déploiement, surtout si vous travaillez en équipe.
Le déploiement est un processus continu. Chaque application est unique et peut nécessiter des ajustements spécifiques. La pratique régulière et l'exploration des différentes options vous permettront de devenir un expert en déploiement de Laravel. Continuez à apprendre et à expérimenter !