Comment j'ai déployé ce blog

Comment j'ai déployé ce blog
Photo by Anthony Hortin / Unsplash

Simple, et en même temps je voulais commencer quelque part. Cet article ne sera ni le plus technique, ni le plus engagé de mes posts, mais au moins il posera l’œuf de la poule.

Ce site utilise Ghost comme moteur, il est opensource et conçu pour ne faire que du blog, c'est du Node.js et en fait, ça marche.

L'infrastructure

Récemment pas mal d'influenceurs se sont souvenus de l'existence des VPS, ces serveurs privés permettant un usage assez similaire au bare metal. Une offre chez OVH à moins de 5 euros/mois nous offre 4vCores 8Go de RAM et 75Go de SSD, avec une bande passante de 400Mbit/s. Largement suffisant pour servir des pages d'en moyenne quelques centaines kilo-octets.

A titre de comparaison, une instance équivalente DEV1-L chez Scaleway coûte 33.58€/mois (0.042€/heure). Oui, je sais ce n'est pas pour les mêmes usages, et c'est bien pour cela qu'ici je me tourne vers un VPS classique, avec ses sauvegardes toutes les 24h.

Coté système on partira sur un Ubuntu dans sa version 24.04, une long-term support qui m'évitera de passer beaucoup de temps a mettre a jour, réparer, redéployer...

Coté réseau on prendra bien soin de garder le support d'IPv6.

En terme de sécurité, peu de chose a dire, fail2ban classique, authentification par clés SSH, pas de connexion en root et évidemment pas d'écoute publique des bases de données.

L'installation

J'ai hésité à faire de ce poste un tuto ou simplement un retour d'expérience. Du coup je fais n'importe quoi et peut être que ça n'aura aucun sens on verra.

Alors, évidemment une fois connecté à votre serveur en SSH, la première étape est de s'assurer que tout est a jour, et de faire votre hardening.

Installez nginx & un serveur MySQL :

sudo apt-get install nginx mysql-server

Vous avez ensuite plusieurs possibilités quant à MySQL: soit créer un mot de passe a l'utilisateur root afin de laisser ghost créer un utilisateur et une base de données dédiée au serveur, soit créer vous-même un utilisateur et sa base. En tant que fainéant, j'ai choisis l'étape où je laisse ghost faire sa magie :

sudo mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH 'mysql_native_password' BY 'LE MOT MAGIQUE';
FLUSH PRIVILEGES;
exit

Pour l'étape suivante, en général on est content d'être sous Ubuntu, parce qu'installer Node.js c'est chiant, mais heureusement la documentation officielle de ghost est plutôt sympathique a cet endroit :

# Download and import the Nodesource GPG key
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg

# Create deb repository
NODE_MAJOR=22 # Use a supported version
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list

# Run update and install
sudo apt-get update
sudo apt-get install nodejs -y

C'est donc ici qu'on finit par installer notre paquet ghost-cli :

sudo npm install ghost-cli@latest -g

Le déploiement

Pour déployer un blog ghost, j'ai crée un répertoire /var/www/seemyping/ en changeant sa propriété a l'utilisateur qui exploitera l'application :

sudo mkdir /var/www/seemyping
sudo chown user:user /var/www/seemyping
sudo chmod 775 /var/www/seemyping
cd /var/www/seemyping

une fois dans le répertoire, c'est "simple" : ghost install

Mon conseil ici, c'est bien sûr d'avoir fait toutes les entrées DNS nécessaires avant, donc un @ A XX.XX.XX.XX & @ AAAA aaaa:bbbb:cccc:: sans oublier un www CNAME seemyping.xyz. puis suivez les instructions et.. voilà.

Les tweaks

Alors évidemment, ça ne marche pas toujours hyper bien. Si vous avez suivi les étapes dans cet ordre, probablement le www.domain.tld ne sera pas inclus dans le certificat que ghost demande à Let'sEncrypt. Vos mails ne fonctionneront probablement pas non plus, rendant la connexion a l'interface d'administration impossible étant donné que le 2FA par email est obligatoire. Alors voici quelques tweaks :

L'envoi d'email se configure dans config.production.json :

  "mail": {
    "transport": "SMTP",
    "options": {
      "host": "ssl0.ovh.net",
      "port": 465,
      "auth": {
        "user": "ghost@seemyping.xyz",
        "pass": "silvousplait"
      }
    }
  },

Si vous avez un nom de domaine chez OVH vous avez probablement une adresse email offerte avec sur Zimbra, dont vous pouvez exploiter les serveurs SMTP pour envoyer vos mails depuis Ghost.

Pour le www voici la solution que j'ai appliqué, je sais pas si c'est la plus efficace mais ca marche :

ghost config url https://www.seemyping.xyz
ghost setup nginx ssl
ghost config url https://seemyping.xyz

# editer la configuration nginx pour remplacer le bloc location /
return 301 https://seemyping.xyz$request_uri;

#On verifie la config
sudo nginx -t
sudo nginx -s reload

Conclusion

L'avantage de ce fonctionnement c'est notamment de pouvoir héberger plusieurs blogs ghost sur le même VPS, les ressources le permettant largement. Par exemple sur ce serveur tourne également builttoperceive.com, un super blog d'architecture que je vous invite chaleureusement a consulter.

L'installation est plutôt simple, maintenant nous verrons dans le temps si c'est aussi stable que ça le semble. Côté exploitation, je suis assez satisfait du peu de consommation de réseau que coûte ghost.

Oh et, l'IA n'a pas participé de près ou de loin a l'écriture de ce post, et ne participera pas aux prochains.