Ce site tourne sur un VPS Infomaniak à 3 CHF par mois. C’est l’offre la moins chère qu’on peut trouver, hébergée en Suisse — le pays le plus cher du monde. 2 GB de RAM, un CPU virtuel, 20 GB de disque. Le téléphone dans votre poche est plus puissant.

Et pourtant : 445 plongées, déjà quelques dizaines de photos et bientôt plus, un bestiaire de 157 espèces marines, des profils de plongée en SVG, une recherche côté client, des notifications push, des easter eggs, et Lighthouse qui donne 100/100/100/100.

Pourquoi ça marche

Le site fait 20 MB (HTML+CSS) et le reste c’est des images, dont celles de mes logbooks (ça fait 284MB en tout au moment où j’écris ce log). Il tient entièrement dans le page cache de Linux (et même les photos pour l’instant) — le kernel garde tout en RAM sans qu’on lui demande. Nginx sert des fichiers statiques pré-compressés en Brotli (15 à 20% plus petit que gzip). TCP est tunné avec BBR, fast open, et une fenêtre initiale de 30 segments. Le premier octet arrive vite, et le reste suit sans perdre de temps.

Il n’y a aucun processus serveur qui tourne en permanence à part nginx. Le petit serveur de notifications push codé en Go dort 99.9% du temps grâce au socket activation systemd — il ne se réveille que quand quelqu’un s’abonne ou qu’il y a quelque chose à envoyer. Hugo build le site en moins de 30 secondes. Le résultat c’est un dossier de fichiers HTML, CSS et WebP. Pas de rendu côté serveur, pas de queries SQL, pas de cache applicatif à invalider. Le kernel fait le cache tout seul, et il le fait mieux que n’importe quel framework.

C’est juste pour mettre une image. C’est le RAN-lab en 2015, c’était bien le bordel, et ce qu’on voit c’est des eNodeB, enfin je crois
C’est juste pour mettre une image. C’est le RAN-lab en 2015, c’était bien le bordel, et ce qu’on voit c’est des eNodeB, enfin je crois

Tout est du texte dans des repos git

L’idée de base c’est que tout est du texte. Du markdown, du YAML, et Hugo qui transforme ça en HTML statique. Pas de CMS. Pas de base de données. Pas d’interface admin. Bon d’accord, je me rends bien compte qu’il faut être un peu geek pour comprendre tout ça. Mais le résultat c’est que ça tourne vraiment pico-bello et que c’est extrêmement léger.

Il y a trois repos git :

  • b3no-site — le site lui-même : thème, config Hugo, scripts, templates
  • b3no-photos — les photos arrivent, un hook post-receive resize, encode en WebP, extrait l’EXIF, génère les pages Hugo, build et déploie
  • b3no-log — les textes arrivent (comme celui-ci), un hook copie et rebuild

Je push depuis un iPad dans Working Copy, le serveur fait le reste. Pas besoin d’ouvrir un terminal, pas besoin d’interface web à la WordPress. Juste un git push. C’est du déploiement continu, sauf que c’est des photos de nudibranches et des notes à la con comme celle-là.

Les configs aussi sont versionnées

Le repo du site contient toute la config système : nginx, fail2ban, sysctl, crontabs, swap, sudoers. Chaque fichier a un commentaire en première ligne avec la commande exacte pour le déployer. C’est pas aussi élégant que les repos de contenu — c’est des copies manuelles avec sudo cp — mais c’est versionné et documenté. Si le serveur brûle, un git clone et un script de restauration suffisent pour tout reconstruire.

Le backup c’est trois git bundle plus les quelques fichiers qui vivent en dehors des repos. Le tout fait 720 MB dans un tar.gz.

Le fork du thème

Le site utilise un thème Hugo qui s’appelle Abyss. C’est un fork de PaperMod, un thème créé par Aditya Telange. Merci à lui — PaperMod c’est propre, rapide, bien foutu.

Au début j’ai fait comme tout le monde : installer PaperMod et overrider des templates. Mais les overrides se sont empilés — le carnet de plongée, le bestiaire, le mode Abyss avec ses particules bioluminescentes (ouai bon c’est pas bio, on est sur une machine linux, c’est silicoluminescent), les view transitions entre les pages, la page 404 sous-marine. À un moment, le dossier des overrides avait plus de templates que le thème lui-même. Forker, c’était juste accepter la réalité : ce site s’est retrouvé avec un peu plus de trucs à dire, alors j’ai décidé de forker. Et donc le thème s’appelle Abyss, y’a rien à dire, c’est explicite.

3 francs par mois

C’est peut-être ça la leçon. On n’a pas besoin de plus. Pas besoin de Kubernetes, pas besoin de “Content Delivery Network” et toutes ces merdes facturées un bras par ces caques de Cloudflare ou similaires, pas besoin de 47 microservices. Un VPS à 3 balles, du texte dans des repos git, un générateur de site statique, et un kernel Linux qui fait son boulot. Le reste c’est du flan. Enfin, en tout cas pour faire ce genre de site qui propose ce genre de contenu. On en reparlera quand j’aurai tout poussé dans un container. Mais c’est pas au programme.

Finalement, le seul truc qui pourrait nécessiter un upgrade du serveur, c’est si je veux vraiment uploader toute ma bibliothèque Lightroom. Et c’est pas demain la veille.