Laravel 8

Créer un blog – le déploiement

Nous nous somme intéressés dans le précédent article au RGPD et on a ajouté une case à cocher pour le consentement volontaire de l’utilisateur lors de l’enregistrement ou de la prise de contact, les deux moments où il donne des données personnelles. Ça répondait à une question dans un commentaire. Il y a eu aussi la question du déploiement que je n’ai jamais vraiment traité ici.

Pour déployer une application construite avec Laravel il faut un serveur pour la recevoir : mutualisé ou privé. Les cas de figure peuvent être très variés. Il existe des outils d’automatisation comme Deployer.

Dans cet article je vais traiter principalement le cas du déploiement sur un serveur mutualisé équipé de CPanel, tout simplement parce que c’est celui que je connais le mieux. Mais je parlerai aussi des autres possibilités.

Un serveur prêt pour Laravel

Il faut que le serveur sur lequel on veut déployer notre application possède toutes les caractéristiques nécessaires. Si vous avez votre propre serveur il faut installer une stack LEMP ou LAMP. En général Linux est déjà préinstallé mais il faut ensuite ajouter Nginx (dans ce cas procédez bien à la configuration préconisée dans la documentation) ou Apache, MySQL et PHP. Sur une serveur mutualisé vous avez déjà tout ça servi sur un plateau mais aussi des contraintes;

Il est aussi pratiquement indispensable de disposer du SSH, sur votre propre serveur vous pouvez l’ajouter, sur un mutualisé vérifiez qu’il est disponible, sinon changez d’hébergeur.

Concernant PHP la version doit être au minimum 7.3 pour Laravel 8 et il faut toutes ces extensions :

  • BCMath
  • Ctype
  • Fileinfo
  • JSON
  • Mbstring
  • OpenSSL
  • PDO
  • Tokenizer
  • XML

Vous aurez également besoin de Composer. A nouveau si vous êtes sur un mutualisé vérifiez qu’il est disponible. Si ce n’est pas le cas ce n’est pas très grave parce que vous pouvez utiliser une version PHAR.

Pour information j’utilise comme hébergeur o2switch depuis plusieurs années sans soucis. Il a un bon rapport qualité-prix et offre tout ce qui est nécessaire avec une offre illimitée.

La configuration

On a donc notre application qui fonctionne bien en local avec une certaine configuration. Mais on va avoir une autre configuration sur le serveur. Je vous conseille de créer un second fichier .env que vous pouvez appeler par exemple .env_production :

On va simplifier avec ce contenu :

APP_NAME="Mon Blog"
APP_ENV=production
APP_KEY=base64:ZCGjzVuIuorqGQVE5c/l1zHzEA+i4Uwx4FfW6ZuUGzo=
APP_DEBUG=false
APP_URL=https://monblog.sillo.org

LOG_CHANNEL=stack
LOG_LEVEL=debug

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=monblog
DB_USERNAME=***
DB_PASSWORD=***

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

MAIL_MAILER=sendmail
MAIL_FROM_ADDRESS=admin@monblog.sillo.org
MAIL_FROM_NAME=Administrateur

La variable d’environnement est assignée à production. On supprime le mode DEBUG. On change l’url en mettant la définitive. On met à jour les données pour la base MySQL. On renseigne les éléments pour l’envoi des emails.

On envoie les fichiers

On va maintenant envoyer tous les fichiers nécessaires de notre application sur le serveur. Pour le faire il y a plusieurs solutions. Certains créent un dépôt Github, BitBucket ou autre et ensuite utilisent le SSH pour faire un clone sur le serveur. Personnellement je me contente de tout envoyer en FTP. Il n’y a pas tant de fichiers que ça et ça va assez vite. Mais il faut commencer par créer un dossier sur le serveur, avec CPanel on a un lien :

On ouvre ainsi le gestionnaire de fichier et on ajoute le dossier :

J’ai un dossier racine sites et ensuite je crée un dossier pour chaque site. Vous pouvez avoir un mutualisé avec juste le dossier public_html qui ne vous permet pas grand chose. Là aussi je vous conseille de changer d’hébergeur.

Maintenant qu’on a le dossier on envoie en FTP tout le paquet (sauf test, node_modules et vendor). Dans la racine vous ne gardez que ce qui va servir : .env_production, composer.json et artisan.

Je travaille avec Windows et pour toute ma gestion de fichiers, que ce soit en local ou distant, j’utilise Multi Commander. Il sait tout faire et il le fait bien. Le transfert dure en gros une minute, ce qui est raisonnable.

Sur le serveur vous changer le nom de .env_production pour .env.

Maintenant on a tout sur le serveur !

Installation

Il nous faut maintenant générer le dossier vendor avec toutes les librairies nécessaires et aussi générer les fichiers pour le chargement des classes. Ici c’est Composer qui va nous servir. Si vous n’en disposez pas sur le serveur allez chercher la version PHAR et envoyez la sur le serveur.

Si vous avez un CPanel complet vous devez avoir une console :

Si ce n’est pas le cas alors il vous faut une application comme Putty.

On peut lancer composer install :

On laisse Composer travailler…

Remarquez que je n’ai pas utilisé composer install –no-dev, ce qui serait pourtant logique puisqu’on n’a a priori pas besoin des librairies de développement. Sauf que je vais faire ensuite la population qui nécessite la présence de faker. Donc pour le moment j’installe tout, je supprimerai ces librairies ensuite.

Quand c’est fini vous avez le dossier vendor et composer.lock :

La base de données

Dans CPanel on a l’accès à la gestion des bases de données et à phpMyAdmin :

On ouvre le gestionnaire des bases pour créer la nouvelle :

Il faut créer un utilisateur (ou en choisir un déjà existant) :

Et finalement ajouter l’utilisateur à la base :

On lui donne tous les privilèges :

Il faut maintenant mettre ajour .env pour déclarer le nom de la base, l’utilisateur et le mot de passe. Vous avez normalement un éditeur dans le gestionnaire de fichiers du CPanel.

On retourne maintenant dans la console pour faire les migrations et la population. On nous prévient que l’application est en production mais on n’a pas peur :

On peut vérifier avec phpMyAdmin que ça a bien été créé :

Le domaine

On a tout mais pour le moment on n’a accès à rien. Il nous faut un domaine. Pour l’exemple je vais créer un sous-domaine. Dans le CPanel on a accès à cette fonctionnalité :

Je crée le sous-domaine et je le fais pointer sur le dossier public :

Maintenant avec l’url monblog.sillo.org on a le blog ! Mais il manque les images. En effet comme on avait créé un lien symbolique en local le dossier storage existe dans public mais est maintenant relié à rien du tout. Si vous lancez la commande :

php artisan storage:link

On va vous dire que le lien existe déjà parce que le dossier existe. Alors il faut commencer par supprimer le dossier et ensuite lancer la commande.

On va faire juste une dernière touche avec la sécurité. Normalement dans le CPanel vous avez un accès à Lets Encrypt :

On va générer le certificat pour le blog.

Maintenant on peut taper https://monblog.sillo.org ! Vous pouvez le vérifier en ligne !

Optimisation

On peut supprimer les librairies du développement qui ne nous sont plus utiles :

composer install --no-dev

Pour accélérer le site on peut mettre en cache la configuration :

php artisan config:cache

Et les routes :

php artisan route:cache

Et la petite touche finale pour régénérer la clé de cryptage :

php artisan key:generate

Conclusion

On a vu dans cet article comment déployer le blog sur un serveur mutualisé. Ce n’est pas bien compliqué mais il faut être assez méthodique.

 

 

Print Friendly, PDF & Email

27 commentaires

  • Tom Boszko

    Bonjour ,

    Merci pour ces tutos bien structurés, je suis arrivé jusqu’içi sans trop de casse, j’ai modifié deux ou trois choses par-ci, par-là, et tout fonctionne bien. je déploierais plus tard mon blog, je vais d’abord m’occuper du style, tenter de refondre tout ça.

    Encore grand merci pour ce petit bijou, j’ai appris beaucoup.

  • softcode

    Bonjour bestmomo, j’avais un petit soucis, j’ai un site qui est hebergé dans o2swish il y a de cela 6mois, mon problème c’est au niveau de la traduction, en local tout marche bien j’avais configurer le site en français

    ‘locale’ => ‘fr’,

    , mais depuis que le site est en ligne, je constate que les dates restes toujours en anglais, si vous pouvez m’aider à le configirer en françcais

  • softcode

    Bonjour bestmomo, je vous avez parlé que je venais de mettre mon site laravel sur o2swich, je viens de constater une chose: l’application tourne bien en local avec tous les routes qui marche bien, mais en ligne d’autre route ne marche pas j’ai recois biensure l’erreur suivante : 500 ERREUR SERVEUR

    comment est ce possible mes route marche bien en local mais en ligne seulement quelques une qui fonctionnent, svp j’ai besoin de votre aide! Merci

  • softcode

    Bonjour bestmomo,
    merci pour ce tutoriel, je viens de deployer mon site sur o2swish mais j’a du mal à utiliser les commandes npm du nodejs par exemple si j’essaie de compiler les assets avec cette commande : npm run dev ça m’affiche un message du genre:

    bash: npm : commande introuvable

    comment je peux resoudre ce problème? Merci !

  • Antho

    Hello je tente de déployer mon site sur mon sous-domaine sauf que quan je fais composer install j’ai ce texte : « the process class relies on proc-open, wich is not available on your php installation » et j’ai la confirmation de mon hébergeur c’est désactivé pour question de sécurité donc je peux faire comment mon déploiement ?? Vu que ça ne veut rien exécuter…

  • fabBlab

    Je n’ai pas testé la procédure, mais cela n’a pas l’air très compliqué.

    J’ai vu qu’un de mes hébergeurs mutualisés (alwaysdata) propose même l’installation de Laravel en un clic. Il restera de toute façon à envoyer les fichiers de son application.

    Parmi les répertoires à ne pas envoyer sur le serveur, il y a aussi « node_modules », puisqu’en production on utilise que les fichiers « builds » présents dans « public » et qui sont donc à générer avant envoi.

    Et si on a un hébergeur n’acceptant pas SSH, il doit être possible de tout préparer localement dans un répertoire séparé et d’envoyer le résultat, y compris « vendor ». Cela peut prendre un certain temps…
    Il faudra aussi importer/exporter la base de données manuellement.
    Il semble même possible de changer le nom du répertoire « public » :
    https://stackoverflow.com/questions/67328616/how-to-change-public-folder-to-public-html-in-laravel-8

    J’ai une question plus générale concernant Laravel : comment bien gérer les mises à jour des dépendances ? Car sans mises à jour, une application peut vite se transformer en passoire 🙂
    Existe-t-il des bonnes pratiques ? des points de vigilances ?
    À part évidemment tester en local, avant de lancer les mises à jour en production.

    • bestmomo

      Salut,

      J’ai ajouté node_modules pour les dossiers à ne pas envoyer, merci.

      On peut évidemment tout préparer en local et envoyer aussi le dossier vendor mais attention, il faut que la version de PHP soit la même sur le serveur de production.

      Pour la mise à jour de l’application il y a deux choses à prendre en compte :

      1. * Pour les librairies PHP il faut utiliser composer install
      2. * Pour les librairies Javascript il faut recompiler en local (npm run production) et envoyer en FTP

      Je dois quand même préciser au sujet de Composer. On a en effet deux commandes possibles : update et install.

      La commande update met à jour toutes les dépendances prévues dans composer.json. En plus il crée ou met à jour le fichier composer.lock.

      La commande install se contente de lire le fichier composer.lock pour installer les dépendances prévues dans ce fichier avec leur version.

      Il est déconseillé d’utiliser update sur le serveur de production pour éviter les surprises, une nouvelle version d’un package pourrait créer des dysfonctionnements dans l’application. La bonne façon de procéder est de faire un update en local, de vérifier que tout fonctionne et ensuite on peut envoyer le nouveau composer.lock sur la production et utiliser install.

      Dernier point intéressant : quand on a le code de son application sur Github on reçoit automatiquement une alerte en cas de problème de sécurité sur une librairie.

  • oksam

    Bonjour Best j’essai de deployer le blog sur heroku mais j’ai ce bug, tu as une idée?

    SQLSTATE[HY000] [1045] Access denied for user  »@’ip-10-0-101-35.ec2.internal’ (using password: NO) (SQL: select count(*) as aggregate from `posts` where `active` = 1)

  • klo_big

    Bonjour,

    Tout d’abord je tiens à saluer la qualité de ton travail ainsi que l’effort de mise à jour que tu fais pour nous faire partager tes connaissances sur laravel. C’est l’une des très rares ressources en francais sur le sujet. Donc un grand merci pour tout cela. J’aimerais savoir si dans le cadre des hebergements o2switch, tu avais eu à gerer les questions de tâches cron et de gestion de fils d’attentes notamment pour l’envoi de mails. J’ai crû comprende que c’etait très compliqué de mettre en place ce type de tâche sur un serveur « partagé ».

    • bestmomo

      Bonjour,
      Tout d’abord merci pour les encouragements !
      En ce qui concerne o2switch on peut facilement mettre en place des tâches CRON à partir du CPanel.
      Pour les emails il n’y a pas besoin de passer par la gestion de files d’attente étant donné qu’il y a un serveur dédié pour l’envoi des emails avec une rotation des IP pour éviter d’être blacklisté. C’est expliqué ici. Mais sinon la commande php artisan queue:work devrait fonctionner mais je n’ai jamais essayé.

  • Azo

    Bonsoir BestMomo,

    Un grand merci pour cette série de tuto qui est vraiment top !

    Petite question est-il envisageable d’avoir un tuto sur l’automatisation du déploiement, avec Deployer ou autre d’ailleurs.
    La doc de Deployeur est très succincte et je n’arrive pas à le mettre en place …

    Merci à toi en tout cas !

    • bestmomo

      Salut,

      En ce qui concerne l’automatisation du déploiement je n’en ai aucune expérience, il m’est donc difficile d’en faire un tuto. Je fais toujours mes déploiements sans outil spécifique parce que j’aime bien garder la maîtrise de ce qui se passe. je suppose que ça devient vraiment intéressant pour un gros projet évolutif.

Laisser un commentaire