Déployer une application Laravel sur un VPS

Image à la une Guide déployer Laravel sur Ubuntu
Image à la une Guide déployer Laravel sur Ubuntu

Votre application Laravel tourne très bien en local, elle est belle et optimisée et c’est enfin l’heure de la passer en production ? Alors vous êtes au bon endroit.

Dans ce guide je vais détailler pas à pas les étapes pour déployer une application Laravel sur un VPS (Serveur Virtuel Privé) Ubuntu.

Ma configuration :

  • Laravel : 8.44
  • Ubuntu : 20.10 (Groovy)

Pré-requis :

  • Un VPS (Pris chez OVH pour ma part)
  • Un accès SSH au serveur
  • Option : Un projet utilisant git

1 – Préparation du serveur

Nous allons dans un premier temps préparer le serveur sur lequel nous allons déployer l’application. Connectez-vous en SSH à votre serveur puis mettez à jour les paquets :

sudo apt-get update
sudo apt-get upgrade

A – Installation de NGINX

Nous allons ensuite installer NGINX

sudo apt install nginx

Si votre système vous le demande appuyez sur “Y” et “enter” pour confirmer l’installation.
Vérifions ensuite les paramètres du pare-feu :

sudo ufw app list

Vous devriez avoir cet output :

Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH

Nous allons activer un pare-feu resctrictif qui permettra tout de même de renvoyer le traffic du port 80 vers NGINX :

sudo ufw allow 'Nginx HTTP'
[...]
#Output :
Rules updated
Rules updated (v6)

Vous pouvez vérifier le fonctionnement du pare-feu en utilisant :

sudo ufw status

Vous devriez avoir cet output :

Status: active

To Action From
-- ------ ----
Nginx HTTP ALLOW Anywhere
Nginx HTTP (v6) ALLOW Anywhere (v6)

Pensez également à autoriser la connection SSH :

sudo ufw allow ssh

Et si vous souhaitez utiliser un certificat HTTPS (Ce qui me semble évident) pensez également à activer le https avec :

sudo ufw allow https

Si vous avez “Status : inactive” à la place c’est qu’il faut simplement activer le pare-feu avec :

sudo ufw enable

Une fois que c’est bon vous pouvez vérifier que votre serveur est opérationnel en vous rendant sur l’adresse IP de votre serveur précédée de http:// ou bien sur un nom de domaine qui pointe vers votre serveur.

Capture d’écran de la page par défaut de NGINX

Si vous ne savez pas comment faire pointer un nom de domaine sur votre serveur rendez-vous sur notre guide dédié.

B – Installation MySQL

Nous allons maintenant installer MySQl pour gérer nos bases de données :

sudo apt install mysql-server

Si votre système vous le demande appuyez sur “Y” et “enter” pour confirmer l’installation.
Lorsque l’installation est terminée nous allons lancer le script de configuration de MySQL :

sudo mysql_secure_installation

Il vous est demandé si vous souhaitez activer “VALIDATE PASSWORD COMPONENT”, c’est une sécurité en plus qui empéche d’utiliser des mots de passes que le système juge trop simple.

Output :

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Je vais pour ma part l’activer, vous êtes libres ou non de le faire. Si vous souhaitez l’actvier tapez “Y” puis “enter” il vous demandera ensuite le niveau de sécurité que vous souhaitez utiliser, je vais choisir “Low” soit “0”; sinon faites juste “enter”.
Vous choisissez ensuite le mot de passe du compte administrateur de MySQL (Root) et le confirmer.

S’en suit une série de questions de sécurité, je vous laisse choisir les paramètres qui vous conviennent, voici ce que j’ai mis :

  • Remove anonymous users : Yes
  • Disallow root login remotely : Yes
  • Remove test database and access to it : Yes
  • Reload privileges tables now : Yes

Une fois l’installation terminée vous pouvez accéder à MySQL en utilisant :

sudo mysql

Output :

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.25-0ubuntu0.20.10.1 (Ubuntu)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

Pour sortir de Mysql tapez “quit

Mysql est maintenant prêt et opérationnel.

C – Installation de PHP

NGINX fonctionne différement d’Apache avec PHP, c’est pourquoi nous avons besoin d’installer des dépendances spéciales, pour faire ceci :

sudo apt install php-fpm php-mysql php7.4-xml php7.4-mbstring

Si votre système vous le demande appuyez sur “Y” et “enter” pour confirmer l’installation.

D – Configuration de NGINX pour utiliser PHP

Le fonctionnement de NGINX est similaire à Apache dans le fait qu’il utilise des blocs serveurs; ces blocs sont l’équivalent des VHOST d’Apache.
Nous allons configurer un bloc serveur pour un nom de domaine.
Sous Ubuntu NGINX vient pré-installé avec un bloc serveur activé, c’est ce dernier qui renvoie la page “Welcome to nginx!”.
Il est configuré pour aller chercher le contenu du dossier /var/www/html
Plutôt que de modifier ce bloc serveur nous allons en créer un autre afin de permettre la création de plusieurs blocs en parallèle plutôt qu’un seul GROS bloc serveur. (C’est plus propre).

Nous allons commencer par créer le répertoire qui recevra notre application Laravel :

sudo mkdir /var/www/votre_domaine

Puis nous attribuons ce dossier à notre utilisateur actuel :

sudo chown $USER:$USER /var/www/votre_domaine

($USER correspond à l’utilisateur qui est actuellement en train d’exécuter la commande)

Ouvrons ensuite un fichier texte correspondant à notre domaine dans le dossier site-available de NGINX :

sudo nano /etc/nginx/sites-available/votre_domaine

Dans ce dernier nous allons mettre la configuration recommandée de Laravel :

server {
    listen 80;
    server_name votre_domaine;
    root /var/www/votre_domaine/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

Source : https://laravel.com/docs/8.x/deployment

Pour valider votre fichier texte et l’enregistrer faites “CTRL + X” puis tapez “Y” et “Enter”

Une fois que le fichier est enregistrer il faut créer un lien symbolique entre la configuration que vous venez de faire et la liste des sites actifs de NGINX, pour ce faire :

sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/

Note : Pour supprimer un lien symbolique il suffit d’utiliser RM, par exemple ‘sudo rm /etc/nginx/site-available/your_domain

Pour vérifier que votre configuration est OK et valide utilisez :

sudo nginx -t

S’il y a des erreurs de syntax nginx vous indiquera où elles se trouvent et vous devrez modifier votre fichier en utilisant à nouveau :

sudo nano /etc/nginx/sites-available/votre_domaine

Lorsque tout est OK vous pouvez relancer NGINX pour qu’il utilise ses nouveaux paramètres :

sudo systemctl reload nginx

Votre nom de domaine / serveur pointe désormais vers le dossier (vide) de votre application Laravel. Vous devriez voir “file not found” en vous y rendant.

Si vous voulez vérifier que tout fonctionne bien vous pouvez créer un fichier PHP (PHP et non HTML car Laravel necessite l’utilisation d’un fichier PHP) dans /var/www/votre_domaine/public en faisant :

mkdir /var/wwww/votre_domaine/public
nano /var/www/votre_domaine/public/index.php

Et en mettant du contenu :

<html>
  <head>
    <title>Salut c'est cool</title>
  </head>
  <body>
    <h1>Nginx pointe bien au bon endroit!</h1>

    <p>Bientôt nous aurons une belle application <strong>LARAVEL</strong> ici.</p>
  </body>
</html>
<?php
phpinfo();

En rechargeant votre navigateur avec comme URL votre domaine vous verrez le nouveau contenu et pourrez vérifier dans le même la configuration de votre PHP.
Il est préférable de ne pas laisser les informations PHP à la vue de tous donc vous pouvez retirer les deux dernière ligne de votre fichier avant de passer à la suite.

E – Création de la base de donnée MYSQL

Nous allons maintenant créer la base de donnée MySQL qui servira à notre Laravel, pour cela connectons-nous à MYSQL :

sudo mysql

Puis créons notre BDD :

mysql> CREATE DATABASE exemple_bdd;

Nous allons maintenant créer un utilisateur dédié et lui donner les droits à cette BDD.

Utilisez la commande suivante pour créer un nouvel utilisateur nommé laravel avec le mot de passe laravel_mdp, mais vous devez remplacer cette valeur par un mot de passe sécurisé de votre choix. 
Pensez à bien conserver ces informations elles seront nécessaires lors du déploiement de Laravel.

mysql> CREATE USER 'laravel'@'%' IDENTIFIED WITH mysql_native_password BY 'laravel_mdp';

Puis nous donnons accès à la BDD crée à cet utilisateur :

mysql> GRANT ALL ON exemple_bdd.* TO 'laravel'@'%';

Une fois que c’est OK nous quittons mysql :

mysql> quit

Pour tester l’accès à la base de donnée avec ces informations :

mysql -u laravel -p

Puis saisissez le mot de passe choisi et tapez ensuite

mysql> SHOW DATABASES;

Vous devriez avoir :

+--------------------+
| Database           |
+--------------------+
| information_schema |
| exemple_bdd        |
+--------------------+
2 rows in set (0.01 sec)

Vous pouvez ensuite quitter mysql

mysql> quit

F – Installation de Composer

Pour installer Composer utilisez simplement :

sudo apt install composer

Puis testez son installation en utilisant :

composer

Output :

Capture de l’output par défaut de Composer lorsqu’il est bien installé

G – (Facultatif) Installation de NVM pour utiliser NodeJS & NPM avec Laravel mix

J’utilise NVM qui permet de télécharger et d’utiliser plusieurs versions de NodeJS et NPM simultanément.

Si vous n’en avez pas besoin vous pouvez simplement installer NodeJS (et NPM) en utilisant :

sudo apt install nodejs

Sinon utilisez :

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash

Puis pour vérifier la présence de NVM faites

nvm

Si vous obtenez :

Command 'nvm' not found, but there are 13 similar ones.

Utilisez : source ~/.bashrc ou bien déconnectez-vous de votre session (logout).

Une fois que vous avez NVM d’installé, installez nodeJS avec :

nvm install node

Ceci installera la dernière version de nodeJS et l’utilisera par défaut, vous pouvez vous en assurer en utilisant :

node -v

2 – Installation de l’application Laravel

A – Fichiers et dépendances

Nous allons maintenant mettre en place votre application Laravel sur le serveur, je vais pour ma part utiliser git mais vous êtes libre de faire comme vous le souhaitez.
L’objectif étant d’avoir les fichiers de votre projet Laravel dans le dossier créé précédemment /var/ww/votre_domaine

Avec git je fais :

git clone adresse-de-votre-repository.git /var/www/votre_domaine

Si vous avez créé le dossier public précédemment, précédez cette commande de :

rm -rf /var/www/votre_domaine/public

Lorsque votre clonage sera terminé, placez-vous dans le dossier de votre application :

cd /var/www/votre_domaine

Puis installez les dépendances avec :

composer install

Composer va alors installer toute une liste de dépendances dont Laravel a besoin pour fonctionner.

Nous allons également installer les dépendances de nodeJS avec :

npm install

B – Mise en place du .env

Maintenant créons notre fichier d’environnement (.env).

nano .env

Nous allons partir du .env d’exemple de Laravel :

APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost

LOG_CHANNEL=stack
LOG_LEVEL=debug

DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=exemple_bdd
DB_USERNAME=laravel
DB_PASSWORD=laravel_mdp

BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120

MEMCACHED_HOST=memcached

REDIS_HOST=redis
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_MAILER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=null
MAIL_FROM_NAME="${APP_NAME}"

AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=

PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1

MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

Ces paramètres sont propres à votre application, pensez bien à utiliser la base de données que nous avons créé, et je vous suggère dans un premier temps de laisser APP_DEBUG=true pour vérifier que tout fonctionne bien. Attendez d’être sûr que tout est OK pour le passer à False.

Il faut maintenant donner les droits aux dossier de l’application à NGINX, pour réaliser ceci :

sudo chown -R $USER:www-data storage
sudo chown -R $USER:www-data bootstrap/cache

Une fois que ces commandes ont été réalisées, vous pouvez construire vos assets (Si besoin) avec :

npm run prod

Il se peut qu’il vous manque certaines dépendances de nodeJS notamment pour le traitement des images. Si vous obtenez l’erreur :

[webpack-cli] Error: spawn /var/www/votre_domaine/node_modules/gifsicle/vendor/gifsicle ENOENT

Vous pouvez utiliser :

npm rebuild gifsicle optipng-bin jpegtran-bin

Pour installer les dépendances manquantes.

Pensez à migrer vos bases de données pour les préparer au fonctionnement de votre application :

php artisan migrate

Ensuite nous allons lancer les commandes d’optimisation recommandées par Laravel à savoir :

composer install --optimize-autoloader --no-dev
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan optimize

Voici ces commandes en une seule ligne, plus simple à utiliser :

php artisan config:cache && php artisan route:cache && php artisan view:cache && php artisan optimize

Les commandes inverses si jamais vous souhaitez vider le cache de l’application :

php artisan config:clear
php artisan route:clear
php artisan cache:clear

Et voici également ces commandes en une ligne :

php artisan config:clear && php artisan route:clear && php artisan cache:clear

Et si vous utiliser du stockage :

php artisan storage:link

Commandes supplémentaires :

sudo apt-get install php7.4-gd

C – (Facultatif) Installation de Meilisearch :

Se déplacer dans un dossier “normal”

cd ~

Installer Meilisearch

curl -L https://install.meilisearch.com | sh

Déplacer Meilisearch avec les binaires

sudo mv ./meilisearch /usr/bin/

Pour lancer Meilisearch en même temps que le serveur il faut le créer en tant que service

sudo nano /etc/systemd/system/meilisearch.service

Insérer le contenu suivant dans le fichier créé :

[Unit]
Description=MeiliSearch
After=systemd-user-sessions.service

[Service]
Type=simple
ExecStart=/usr/bin/meilisearch --http-addr 127.0.0.1:7700 --env production --master-key Y0urVery-S3cureAp1K3y

[Install]
WantedBy=default.target

Ensuite il faut activer le service :

systemctl enable meilisearch

Puis pour le démarrer tout de suite :

systemctl start meilisearch

On peut vérifier que le processus fonctionne bien avec :

systemctl status meilisearch

Vous pouvez ensuite mettre en place vos certificats SSL (https), pour faire ça rendez-vous sur notre guide dédié !

0 Shares:
Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

You May Also Like