Héberger sur un mutualisé via SSH (Infomaniak)

Voir la vidéo
Description Sommaire

Dans ce nouveau chapitre nous allons voir comment héberger notre application Laravel sur un hébergement mutualisé qui supporte SSH. Ici je vais utiliser l'offre d'hébergement Infomaniak mais vous pouvez reproduire ce que l'on va faire sur n'importe quel hébergeur qui vous laisse un accès ssh sur le serveur.

00:00 Introduction
01:50 Génération de la clef SSH
05:45 Mise en place du dépôt git
07:19 Clonage des sources
08:39 Configuration de l'hébergement
14:16 Automatiser avec Make

Résumé

Avant d'attaquer voila un petit résumé de ce que l'on va faire

  1. Créer une clef SSH spécifique à l'hébergeur
  2. Créer un alias SSH et ajouter notre clef publique
  3. Mettre en place un dépôt git distant pour versionner le projet
  4. Mettre les sources en lignes et préparer la configuration de base
  5. Configurer l'hébergeur pour pointer le domaine vers le bon dossier
  6. Créer une recette Make pour automatiser le déploiement de nouvelles mises à jour.

Création de la clef SSH

La première étape va se dérouler sur notre machine et nous allons générer une clef spécifique à cet hébergeur.

ssh-keygen -t ed25519 -f ~/.ssh/infomaniak

Côté Infomaniak, nous allons créer un nouvel utilisateur SSH en allant dans la partie FTP/SSH. Pour simplifier la connexion SSH nous allons, sur notre machine, créer un alias en modifiant le fichier de configuration ~/.ssh/config

Host infomaniak
    HostName x0000.ftp.infomaniak.com
    User x0000_tutoriel
    IdentityFile ~/.ssh/infomaniak
    IdentitiesOnly yes

Cela nous permettra de nous connecter plus facilement à ce serveur en tapant simplement la commande

ssh infomaniak

Afin de ne pas avoir à rentrer le mot de passe de l'hébergeur à chaque connexion nous allons copier la clef publique générée au début à l'aide de la commande ssh-copy-id.

ssh-copy-id -i ~/.ssh/infomaniak.pub infomaniak

Je peux maintenant me connecter au serveur sans avoir besoin de taper le mot de passe de mon hébergeur.

Création du dépôt git

Cette étape est facultative et vous pouvez héberger le dépôt git de votre projet sur des plateformes externes mais il est peut être intéressant de le faire soi-même pour garder un contrôle sur le projet. Dans ce cas là, sur le serveur, nous allons créer un dossier et initialiser le dépôt.

mkdir -p ~/git/monsite.fr
cd ~/git/monsite.fr
git init --bare --initial-branch=main

Sur notre projet, en local, nous allons ajouter ce nouveau dépôt en utilisant l'alias SSH créé à l'étape précédente.

git remote add origin ssh://infomaniak:/home/clients/XXXXX/git/monsite.fr
git push -u origin main

Vous pouvez maintenant pousser vos changement fait avec git sur le serveur afin de ne pas perdre vos modification. Ce dépôt va aussi nous permettre de synchroniser le déploiement.

Clonage du projet en ligne

Maintenant que notre dépôt est configuré nous allons pouvoir créer un clone de notre projet en ligne. Pour m'organiser je met les sites dans un dossier sites mais vous êtes libre de suivre la convention que vous préférez.

cd ~/sites
git clone ../git/monsite.fr

Si vous avez choisis d'héberger votre versioning sur un service tiers vous devrez adapter la commande git clone.
Ensuite vous pouvez générer un fichier .env en copiant le fichier d'exemple.

cp .env.example .env
composer install
php artisan key:generate

Configuration de l'hébergement

Maintenant que nos sources sont en ligne il va falloir configurer l'hébergeur afin de lui dire comment résoudre notre nom de domaines. Pour infomaniak cela se passe dans la partie Mes sites > Gestion des sites > Ajouter un site. Sélectionnez l'option "Continuez sans installer d'outil". Ensuite vous pouvez sélectionner le domaine (ou le sous-domaine) à associer à ce nouveau site et cliquer sur continuer pour finaliser la création du site.

Une fois le site créé vous devrez faire plusieurs :

  • Modifier la version de PHP pour correspondre au besoin de Laravel (version 8.1 minimum) et activer des extensions supplémentaires si nécessaire.
  • Installer le certificat SSL avec Let's encrypt (en un clic)
  • Aller dans les Paramètres avancés pour modifier le dossier du site et pointer vers le dossier public de Laravel /sites/monsite.fr/public.
  • Dans les Paramètres avancés puis dans l'onglet Apache vous pourrez activer la compression des fichiers mais aussi gérer des variables d'environnement que vous souhaitez ajouter à votre application Laravel

Si vous souhaitez utiliser une base de données MySQL vous pouvez aussi en créer depuis votre espace d'administration. Je vous conseille de créer un utilisateur en même temps pour limiter l'accès à cette base de données seulement. Une fois la base de données créé vous pourrez modifier le fichier d'environnement pour reporter les informations de connexion et lancer la migration via la commande php artisan migrate.

Côté code source vous pouvez en profiter pour modifier votre .htaccess du dossier public pour ajouter la redirection https et la redirection www si vous le souhaitez.

# Force https
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTM_HOST}%{REQUEST_URI} [L,R=301]

# Force no www
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] 
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

A partir de cette étape votre site devrait fonctionner et être visible lorsque vous tapez votre nom de domaine.

Automatiser avec Make

Nous allons maintenant attaquer la partie automatisation car notre objectif est de pouvoir déployer une nouvelle version du site en une simple commande. Nous allons ici opter pour une solution facile à mettre en place à l'aide de Make mais il est possible de faire plus propre (mais aussi plus complexe) avec Ansistrano par exemple.

.PHONY: deploy install

deploy: public/build/manifest.json
    rsync -avz public/build infomaniak:~/sites/monsite.fr/public
    ssh infomaniak 'cd ~/sites/monsite.fr && git pull origin main && make install'

install: vendor/autoload.php .env public/storage
    php artisan cache:clear
    php artisan migrate

.env:
    cp .env.example
    php artisan key:generate

public/storage:
    php artisan storage:link

vendor/autoload.php: composer.lock
    composer install
    touch vendor/autoload.php

public/build/manifest.json: package.json
    pnpm i
    pnpm run build

La seul particularité de cette recette est que l'on construit les assets front-end en local car le serveur ne dispose pas de NodeJS ce qui oblige une synchronisation via rsync.

Maintenant, lorsque vous souhaitez pousser une nouvelle version du site il vous suffit d'utiliser la commande make deploy après avoir versionnés vos changements.

Il est possible d'approchez le problème différemment en utilisant les hooks de git mais de mon côté je préfère avoir la main sur le déploiement pour choisir spécifiquement quand je veux déployer. Je vous laisse adapter la technique en fonction de vos besoins.

Configuration supplémentaire

En plus de la configuration que l'on vient de faire il y a des éléments que vous pouvez configurer en plus suivant la situation.

Envoi d'email

Pour gérer l'envoi des emails depuis votre serveur 2 solutions s'offrent à vous. Vous pouvez utiliser MAIL_MAILER=sendmail vu que l'exécutable est disponible sur le serveur. Si vous avez pris la formule avec email vous pouvez aussi créer un compte email et utiliser la configuration SMTP pour vos envois.

Files d'attente

Pour gérer les files d'attentes il n'est pas possible de laisser une tâche tourner en fond et il faudra plutôt se reposer sur une tâche récurrente.

php /home/clients/XXXXX/sites/monsite.fr/artisan queue:work --stop-when-empty

Infomaniak ne permettent pas d'exécuter une commande via les tâches planifiées mais on peut simplement appeler une URL. Vous pouvez sur votre application créer une URL spéciale pour exécuter la commande artisan en la protégeant par un mot de passe avec une authentification basique.

use Illuminate\Support\Facades\Artisan;

Route::get('/queue', function (string $user) {
    $exitCode = Artisan::call('queue:work --stop-when-empty');

    // ...
})->middleware('auth.basic');
Publié
Technologies utilisées
Auteur :
Grafikart
Partager