Samedi, un peu avant treize heures, Roblab s’est éteint et n’est pas revenu. L’alimentation a lâché, et je n’avais rien sous la main pour la remplacer. Pas de fumée, pas de bruit, juste une machine qui ne démarre plus.
En mai, j’ai décrit ce serveur dans un article d’architecture qui se terminait sur une idée : l’infrastructure doit être ennuyeuse, invisible. Elle l’était, au point que j’avais oublié tout ce qui reposait dessus.
L’inventaire
La première question, c’est « qu’est-ce que j’ai perdu ? ». La réponse : a priori rien. Une alimentation qui meurt n’emporte pas les disques avec elle. Les données sont sur un RAID 1, il y a une copie chaque nuit sur le NAS, et le script qui reconstruit la machine est sur GitHub. Sur le papier, tout ça est solide.
La deuxième question m’a pris plus de temps : « qu’est-ce qui ne marche plus ? ». Là, la liste est longue. Le DNS de la maison, parce que le serveur bloquait les pubs pour tout le réseau. Le gestionnaire de mots de passe, qui tourne en lecture seule sur le cache des clients. Les modèles de langage, que tous mes appareils allaient chercher sur Roblab via un tunnel SSH. Les automatisations, les notifications, les photos.
Et puis le blog, et avec lui tous les sous-domaines qui passaient par le même tunnel Cloudflare : la radio, les sessions, les statistiques. Une seule machine dans le salon, et sept adresses publiques qui renvoient une erreur.
Ce qui tenait par un fil
Ce blog est fait avec Quartz, et c’est un site statique : des fichiers HTML, rien à exécuter côté serveur, pas de base de données. En mai, je m’en félicitais, parce qu’il n’y avait aucune surface d’attaque.
Pourtant, je le servais depuis mon salon. Le contenu partait d’Obsidian, Roblab faisait le build, et Caddy servait le dossier public/ derrière un tunnel. Quelque chose qui n’avait besoin d’aucun serveur dépendait entièrement du mien. Le point faible était une pièce à quarante euros, et ce n’était pas de la sécurité.
Ce qui tenait tout seul
Je me suis remis au travail avec une machine. Pas celle qui tourne d’habitude sur Roblab : celle-là était dans le noir avec le reste. Une autre, depuis le téléphone puis depuis le PC.
Elle a commencé par chercher ce qui existait encore. Le contenu du blog était sur GitHub : 443 notes, à jour au 10 octobre. Le framework, lui, semblait être resté sur le serveur. Elle a donc écrit un script qui récupère Quartz, y injecte le contenu et fait le build, et elle l’a testé : le site entier sortait sans erreur. Il sortait aussi sans mon thème, avec le Quartz par défaut, propre et anonyme.
On a trouvé la suite par hasard. Pour que Cloudflare puisse lire le dépôt, il faut lui ouvrir l’accès sur GitHub, et le sélecteur de dépôts en a affiché deux : le contenu, et juste en dessous robotariis-quartz-engine. C’était mon fork de Quartz, avec la couleur parchemin, le lecteur de la Saga, tout ce que j’avais oublié avoir poussé un jour. Le moteur existait, je ne m’en souvenais plus.
Il était privé, donc illisible pour le build. Je l’ai passé en public. C’est un fork d’un projet sous licence MIT, et il ne contient que de la mise en page. Avant de le rendre public, on a vérifié l’historique : ni clé, ni token, ni une seule note de contenu. Le contenu reste privé dans son propre dépôt, et seul le moteur est visible.
Ensuite, deux enregistrements DNS à basculer : le domaine principal et www ont arrêté de pointer vers le tunnel et pointent maintenant vers Cloudflare Pages. Le site est revenu, avec son vrai visage. Il était un peu moins de quatorze heures.
Ce qui change
Le blog ne passe plus par Roblab, et je ne le remettrai pas dessus quand la nouvelle alimentation sera branchée. Désormais, chaque push sur le dépôt déclenche un build et le site est à jour deux minutes plus tard. J’écris toujours dans Obsidian, dans un coffre qui est aussi un clone du dépôt. Publier, c’est maintenant un commit.
Le reste attend la pièce de rechange. La radio, les sessions et les statistiques ont vraiment besoin d’un processus qui tourne, et ils reviendront avec le serveur. Je n’ai pas cherché à tout sortir de la maison. J’ai seulement sorti ce qui n’avait jamais eu de raison d’y être.
Le principe
Une panne fait le tri que je n’avais jamais fait. D’un côté, ce qui a besoin d’une machine pour exister. De l’autre, ce qui avait seulement besoin d’un endroit où être posé. Le blog était dans la deuxième catégorie et je l’avais rangé dans la première, parce que c’était pratique et que l’infrastructure ennuyeuse ne pose pas de questions.
Le RAID protégeait les octets, et le NAS protégeait le RAID. Rien ne protégeait contre le fait d’avoir mis au même endroit des choses qui n’avaient rien à faire ensemble. Ne pas stocker la chose, fournir de quoi la reconstruire : c’était écrit en tête de cette section depuis le début. Il m’a fallu une alimentation morte pour l’appliquer à ma propre maison.
Cet article a été écrit par une machine qui ne tournait pas sur Roblab, pour une fois. — O.B.