Skip to content

Instantly share code, notes, and snippets.

@toonvandenbos
Last active February 6, 2024 13:01
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save toonvandenbos/46448d6f39355633d2532d951c4c5ba5 to your computer and use it in GitHub Desktop.
Save toonvandenbos/46448d6f39355633d2532d951c4c5ba5 to your computer and use it in GitHub Desktop.
Installer un serveur Cloud Infomaniak

Serveur Cloud Infomaniak + Laravel Forge = 🤖🤍

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).

  1. Choix OS & version
  2. Configuration accès SSH
  3. Monter le volume pour le stockage des données
  4. Ouvrir les ports TCP
  5. Laravel Forge : Installation des composants d'un serveur web moderne
  6. Options complémentaires

Choix OS & version

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.

Configuration accès SSH

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.

Monter le volume pour le stockage des données

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.

Formater le (bon) volume de stockage

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.

Montage du volume de stockage

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.

  1. On crée un dossier temporaire : sudo mkdir /mnt/home ;
  2. On monte le volume (corrigé) sur le dossier temporaire : sudo mount /dev/sdb /mnt/home ;
  3. 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/ ;
  4. On démonte le volume du dossier temporaire : sudo umount /mnt/home ;
  5. On monte le volume (corrigé) sur le dossier "/home" : sudo mount /dev/sdb /home ;
  6. 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 !

Ouvrir les ports TCP

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" :

  1. Cliquez sur le bouton Ajouter une règle ;
  2. Sous "Ports à ouvrir", choisissez Sélection manuelle ;
  3. Laissez le type à TCP et l'option Ports séparés par des virgules ;
  4. Dans le champ d'entrée des ports, indiquez 80,443 ;
  5. Laissez "Source d'IP" à Toutes ;
  6. 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.

Laravel Forge : Installation des composants d'un serveur web moderne

Depuis le dashboard de votre compte Forge :

  1. Commencez par ajouter votre serveur en cliquant sur le bouton Create server ;
  2. Choisissez Custom VPS ;
  3. Sélectionnez le Server OS Ubuntu 22.04 LTS (ou la version que vous choisie lors de la création du serveur Infomaniak) ;
  4. 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.
  5. Nommez le serveur (conseil : utilisez le même nom que celui choisi dans l'interface Infomaniak) ;
  6. Sous IP Address, indiquez l'adresse IPv4 indiquée dans l'interface Infomaniak et utilisée lors de votre connexion SSH ;
  7. Laissez Private IP Address vide et SSH Port à 22 ;
  8. 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.
  9. 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.
  10. 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à !

Options complémentaires

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.

Installer & configurer Meilisearch

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 :

  1. Connectez-vous en SSH au serveur et rendez-vous à la racine home en tant que root : cd /home && su root
  2. Téléchargez la dernière version stable de Meilisearch (latest stable release) : curl -L https://install.meilisearch.com | sh
  3. Modifiez la propriété et les permissions du dossier téléchargé : chmod 755 ./meilisearch && chown root:root ./meilisearch
  4. 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 :

  1. Rendez-vous dans la page de détail du serveur via l'interface de Laravel Forge
  2. Dans la navigation du serveur, cliquez sur "Daemons"
  3. 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
  4. 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment