Dans ce guide, nous allons créer un nouveau serveur Cloud hébergé par Infomaniak et managé via Laravel Forge afin de le provisionner avec les composants nécessaires pour faire tourner un serveur web complet (nginx, mysql & PHP).
- Choix OS & version
- Configuration accès SSH
- Monter le volume pour le stockage des données
- Ouvrir les ports TCP
- Laravel Forge : Installation des composants d'un serveur web moderne
- Options complémentaires
Depuis votre compte Infomaniak, commandez un nouveau "Serveur Cloud" et choisissez le système d'exploitation Ubuntu dans sa dernière version LTS (22.04 au moment de la rédaction). Attention, si vous souhaitez installer une version de PHP inférieure à 8.1
, choisissez Ubuntu 20.04.
Lors de l'installation du serveur via l'interface d'Infomaniak, vous pouvez choisir la clef SSH existante qui convient depuis le trousseau Infomaniak ou y ajouter votre clef publique si c'est votre première installation.
Ensuite, dès que le serveur est démarré, un accès SSH est disponible avec l'utilisateur ubuntu
:
ssh ubuntu@<ip-v4>
N'oubliez pas de remplacer <ip-v4>
par l'IP du serveur dans la commande ci-dessus. Lorsque c'est demandé, ajouter le fingerprint à la liste des known hosts (répondre "yes"). Si votre clef SSH était bien renseignée pendant la création de l'instance, vous voilà connecté au serveur.
Basé sur le Guide de Support Infomaniak, adapté suite à quelques recherches ainsi qu'un échange avec le service du support technique.
Contrairement à ce que la documentation Infomaniak prétend, le disque proposant l'espace de stockage n'est pas forcément le volume /dev/vdb
. Pour connaître les volumes disponibles sur votre offre cloud, utilisez la commande lsblk
:
ubuntu@**-******:~$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 61.9M 1 loop /snap/core20/1434
loop1 7:1 0 79.9M 1 loop /snap/lxd/22923
loop2 7:2 0 44.7M 1 loop /snap/snapd/15534
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 19.9G 0 part /
├─sda14 8:14 0 4M 0 part
└─sda15 8:15 0 106M 0 part /boot/efi
sdb 8:16 0 100G 0 disk
sr0 11:0 1 596K 0 rom
Le résultat nous informe que le volume du système d'exploitation est /dev/sda
et le volume de stockage de 100go (dans cet exemple) non-monté est /dev/sdb
. Il semblerait donc que les fiches de support d'Infomaniak ne sont pas tout à fait à jour, la différence entre des disques /dev/sda
et /dev/vda
étant une histoire de Full virtualization vs Paravirtualization ou autrement dit, tout un autre choix de Driver disque.
Commençons par installer les outils de formatage XFS :
sudo apt install xfsprogs
Ensuite, formatons le volume de stockage /dev/sdb
(au lieu de /dev/vdb
) avec la commande corrigée suivante :
sudo mkfs.xfs -f /dev/sdb
Si tout se passe bien, l'exécution se termine sans erreurs avec le message Discarding blocks...Done.
. On peut à présent monter le disque sur un point accessible via le système de fichiers.
Comme indiqué dans la documentation Infomaniak, il faut veiller à ne pas perdre votre accès SSH existant en montant le volume sur /home
, "écrasant" l'existant. Pour rappel, votre configuration SSH (clef publique) se situe dans ce dossier /home
, nous allons donc procéder au montage du volume en deux étapes afin de préserver (copier) les données actuelles.
- On crée un dossier temporaire :
sudo mkdir /mnt/home
; - On monte le volume (corrigé) sur le dossier temporaire :
sudo mount /dev/sdb /mnt/home
; - On copie le contenu du dossier original "/home" à la racine du volume en conservant les droits, owner, group, etc. :
sudo rsync -rlptgoDHAX /home/ /mnt/home/
; - On démonte le volume du dossier temporaire :
sudo umount /mnt/home
; - On monte le volume (corrigé) sur le dossier "/home" :
sudo mount /dev/sdb /home
; - on supprime le dossier temporaire :
sudo rmdir /mnt/home
.
Afin de vérifier si tout s'est bien déroulé, la commande df -h
devrait afficher quelque chose de similaire :
ubuntu@**-******:~$ df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 594M 988K 593M 1% /run
/dev/sda1 20G 1.4G 18G 8% /
tmpfs 2.9G 0 2.9G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/sda15 105M 5.3M 100M 5% /boot/efi
tmpfs 594M 4.0K 594M 1% /run/user/1000
/dev/sdb 100G 746M 100G 1% /home
Nous avons bien le volume /dev/sdb
, d'une capacité de 100 Go, monté sur /home
.
Attention: un mount n'est pas persistant, nous pouvons cependant ajouter le montage automatique du volume au redémarrage. La documentation Ubuntu indique la démarche à suivre en modifiant le fichier /etc/fstab
.
Il est recommandé de créer un back-up de ce fichier avant de commencer, une erreur dans ce dernier pouvant causer des problèmes lors du boot :
sudo cp /etc/fstab /etc/fstab.old
Ensuite, repérons l'UUID du disque /dev/sdb
qu'on souhaite "automonter" :
ubuntu@**-******:~$ lsblk -o NAME,FSTYPE,UUID
NAME FSTYPE UUID
loop0 squashfs
loop1 squashfs
loop2 squashfs
sda
├─sda1 ext4 1a67fd73-1e60-42fa-bd13-0ab96c265e3d
├─sda14
└─sda15 vfat C4F3-00F6
sdb xfs 662162b4-3d4b-4572-bc66-97d5b6de097a
sr0 iso9660 2022-06-27-08-24-56-00
Cet output nous indique deux informations importantes sur la ligne sdb
qui serviront pour la configuration de l'automount :
- Le filesystem (FSTYPE) :
xfs
- L'identifiant unique du disque (UUID) :
662162b4-3d4b-4572-bc66-97d5b6de097a
(dans le cadre de cet exemple)
Ouvrons le fichier /etc/fstab
:
sudo nano /etc/fstab
À la fin du fichier, ajoutez une nouvelle ligne complétée comme suit :
UUID=<uuid> /home <filesystem> defaults 0 0
Dans le cas de cet exemple, la ligne ajoutée ressemble à :
UUID=662162b4-3d4b-4572-bc66-97d5b6de097a /home xfs defaults 0 0
Sauvegardez le fichier et redémarrons le serveur pour vérifier si tout a bien fonctionné. Vous pouvez redémarrer le serveur via l'interface Infomaniak ou via la ligne de commande. Ensuite, reconnectez-vous en SSH comme expliqué plus haut et affichez les disques montés :
ubuntu@**-******:~$ df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 594M 984K 593M 1% /run
/dev/sda1 20G 2.0G 18G 10% /
tmpfs 2.9G 0 2.9G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/sdb 100G 746M 100G 1% /home
/dev/sda15 105M 5.3M 100M 5% /boot/efi
tmpfs 594M 4.0K 594M 1% /run/user/1000
Notre volume /dev/sdb
de 100 Go est bien présent et monté sur /home
. Parfait !
Par défaut, les serveurs Cloud Infomaniak ont des règles de Firewall qui empêchent les connexions entrantes sur tous les ports, excepté le port 22 pour votre connexion SSH.
Typiquement, un serveur web écoute les ports TCP 80 (HTTP) et 443 (HTTPS via TLS/SSL), pour pouvoir traiter les requêtes entrantes. Ces ports étant fermés par défaut, il faut ajouter une règle de Firewall pour les ouvrir, sinon vous risquez de tourner en bourique en vous demandant pourquoi votre site renvoie une erreur "ERR_EMPTY_RESPONSE" ou encore un code d'erreur 522 (oui, c'est du vécu).
Rendez-vous dans l'administration de votre serveur Infomaniak, dans la partie "Régler le firewall" :
- Cliquez sur le bouton
Ajouter une règle
; - Sous "Ports à ouvrir", choisissez
Sélection manuelle
; - Laissez le type à
TCP
et l'optionPorts séparés par des virgules
; - Dans le champ d'entrée des ports, indiquez
80,443
; - Laissez "Source d'IP" à
Toutes
; - Validez.
Le serveur est désormais prêt à être utilisé. Vous pouvez installer les composants de votre choix pour configurer le serveur à votre guise. Dans le cadre de ce guide, nous allons exploiter Laravel Forge pour facilement et rapidement mettre sur pied un serveur web avec nginx
, mysql
et php
.
Depuis le dashboard de votre compte Forge :
- Commencez par ajouter votre serveur en cliquant sur le bouton
Create server
; - Choisissez
Custom VPS
; - Sélectionnez le Server OS
Ubuntu 22.04 LTS
(ou la version que vous choisie lors de la création du serveur Infomaniak) ; - En fonction des besoins de votre projet, sélectionnez le type de configuration qui vous convient. Dans cet exemple, nous allons garder l'option par défaut, soit
App Server
. Ce dernier contient tout le nécessaire pour une application PHP moderne. - Nommez le serveur (conseil : utilisez le même nom que celui choisi dans l'interface Infomaniak) ;
- Sous IP Address, indiquez l'adresse IPv4 indiquée dans l'interface Infomaniak et utilisée lors de votre connexion SSH ;
- Laissez Private IP Address vide et SSH Port à
22
; - Choisissez la version de PHP qu'il vous faut (
8.1
à l'heure où nous écrivons ces lignes). Notez que s'il vous faut une version plus ancienne de PHP, il est nécessaire d'installer votre serveur en Ubuntu 20.04. - Choisissez le système de base de données de votre choix. Dans notre cas, nous allons laisser
MySQL (8.0)
. Vous pouvez également laisser Database Name àforge
, de toute manière nous allons créer de nouvelles bases de données spécifiques pour nos différents projets hébergés sur ce serveur. - C'est parti, cliquez sur
Create Server
!
Laravel Forge vous affiche dès lors une fenêtre vous indiquant la démarche à suivre pour lancer le provisionnement du serveur. Commencez par sauvegarder les credentials indiqués (Sudo Password et Database Password), ne les perdez surtout pas (conseil : gardez ces informations de façon sécurisée dans un gestionnaire de mot de passes).
Comme indiqué, Laravel Forge s'attend à pouvoir lancer le provisionnement depuis l'utilisateur root, or nous avons utilisé le user ubuntu jusqu'à maintenant. Nous allons arranger ça, mais pour commencer, accédez à votre instance Infomaniak en SSH avec ssh ubuntu@<ip-v4>
.
L'utilisateur root existe bel et bien (vous pouvez vous en assurer en listant les users existants via nano /etc/passwd
), nous allons juste changer son mot de passe afin de pouvoir y accéder :
sudo passwd root
Indiquez le nouveau mot de passe souhaité (deux fois) et sauvegardez-le également dans votre gestionnaire de mots de passe.
Passez sur cet utilisateur pour pouvoir continuer l'installation de Laravel Forge :
su root
Lancez enfin le provisionnement de Laravel Forge via un copier/coller du code indiqué dans l'interface de Forge directement dans votre terminal SSH où vous êtes connecté en root (Attention, copiez bien la commande indiquée dans Forge, l'exemple ci-dessous n'est pas complet) :
root@**-******:/home# wget -O forge.sh "https://forge.laravel.com/servers/<...>"; bash forge.sh
Cerise sur le gâteau, vous pouvez suivre en live tout le processus de provisionnement, vous donnant une idée du temps que vous gagnez grâce à Laravel Forge. Cette étape prend quelques minutes et, en fonction des composants à installer, peut vous demander de valider l'une ou l'autre option via le terminal (par exemple pendant l'installation de Nginx, où il suffit de valider avec <Ok>
en appuyant sur la touche Enter
).
En fin de compte, l'interface de Laravel Forge vous redirige vers la page d'accueil de gestion de votre serveur. Depuis cette interface, vous pouvez désormais ajouter des sites et configurer les options qui vous intéressent comme bon vous semble. À partir de cette étape, référez-vous à la documentation Laravel Forge si c'est votre première aventure chez eux.
À partir de maintenant, vous ne devriez plus trop utiliser les users ubuntu
et root
, car Forge a créé votre nouvel utilisateur principal pour accéder et travailler sur vos sites hébergés via SSH, à savoir :
ssh forge@<ip-v4>
Si vous choisissez d'isoler un site lors de sa création dans l'interface Laravel Forge, vous allez par la même occasion créer un nouvel utilisateur qui vous permettra d'accéder directement à son dossier confiné (au lieu du dossier par défaut géré par l'utilisateur forge
) :
ssh monsuperprojet@<ip-v4>
Et voilà !
Selon les besoins de votre application, il y a potentiellement d'autres composants à ajouter sur votre serveur. Les configurations ci-dessous correspondent à des cas fréquents rencontrés sur les projets produits chez Whitecube.
Laravel Forge propose un serveur de type "Meilisearch", cependant cette configuration nécessite un serveur dédié pour votre moteur de recherche. Pour des projets de taille normale, on préfère souvent installer Meilisearch sur le même serveur que l'application, que ce soit pour diminuer les coûts ou par simplification de l'infrastructure. Cette section du guide couvre par conséquent l'installation manuelle de Meilisearch sur un serveur déjà provisionné par Forge. Texte adapté du gist de Tighten (en anglais).
Meilisearch peut être installé via apt
, cependant nous allons préférer la méthode utilisant curl
dans ce cas-ci :
- Connectez-vous en SSH au serveur et rendez-vous à la racine
home
en tant queroot
:cd /home && su root
- Téléchargez la dernière version stable de Meilisearch (latest stable release) :
curl -L https://install.meilisearch.com | sh
- Modifiez la propriété et les permissions du dossier téléchargé :
chmod 755 ./meilisearch && chown root:root ./meilisearch
- Déplacez le dossier et ses fichiers exécutables dans le répertoire accessible par le système :
sudo mv ./meilisearch /usr/bin/
Au lieu de lancer Meilisearch manuellement depuis la ligne de commande, on va laisser Forge configurer un Daemon pour que le process soit relancé automatiquement à chaque redémarrage serveur :
- Rendez-vous dans la page de détail du serveur via l'interface de Laravel Forge
- Dans la navigation du serveur, cliquez sur "Daemons"
- Configurez un nouveau Daemon en complétant le formulaire proposé :
- Command :
meilisearch --master-key=<key> --env=production --http-addr 127.0.0.1:7700 --db-path ./home/forge/meilifiles
(remplacez<key>
par un mot de passe aléatoire à sauvegarder en toute sécurité) - Directory : vide
- User :
forge
- Number of Processes :
1
- Command :
- Sauvegardez en cliquant sur "Create".
Pour être sûr que tout ce Daemon tourne convenablement, vous pouvez cliquer sur "Show Daemon Log" (via les options cachées derrière le bouton ...
à la fin de la ligne du Daemon). Vous devriez y voir un Output similaire à ceci :
888b d888 d8b 888 d8b 888
8888b d8888 Y8P 888 Y8P 888
88888b.d88888 888 888
888Y88888P888 .d88b. 888 888 888 .d8888b .d88b. 8888b. 888d888 .d8888b 88888b.
888 Y888P 888 d8P Y8b 888 888 888 88K d8P Y8b "88b 888P" d88P" 888 "88b
888 Y8P 888 88888888 888 888 888 "Y8888b. 88888888 .d888888 888 888 888 888
888 " 888 Y8b. 888 888 888 X88 Y8b. 888 888 888 Y88b. 888 888
888 888 "Y8888 888 888 888 88888P' "Y8888 "Y888888 888 "Y8888P 888 888
Database path: "./home/forge/meilifiles"
Server listening on: "http://127.0.0.1:7700"
Environment: "production"
...
Par conséquent, les informations de connexion à fournir dans le .env
de votre application Laravel sont les suivantes :
SCOUT_DRIVER=meilisearch
MEILISEARCH_HOST=http://127.0.0.1:7700
MEILISEARCH_KEY=<masterkey>
N'oubliez pas de remplacer masterkey
par la clef sauvegardée à l'étape 3 ci-dessus.