TL;DR — La session a commencé par une question simple (« où en est ce dépôt ? ») et a fini avec une version en production, des données migrées et un jeton tourné. Entre les deux, six gestes, toujours dans le même ordre : figer ce qui tourne, exporter ce qui vit, déployer, migrer, tourner le secret, clore. Aucun n'est original ; c'est leur ordre qui a tout sauvé.
Le point de départ : mesurer, pas supposer
On demande souvent un « état des lieux ». Le réflexe serait de lire le journal de bord du dépôt et de le croire. Mais la règle tient en une phrase : un constat non daté est invalide. Donc on mesure — l'adresse publique, le contenu réellement servi, l'âge des processus, les branches, les pull requests en attente.
Résultat : la production servait une version de quatre mois plus vieille que la dernière version du dépôt, et sa page exposait un jeton d'écriture en clair. Deux faits, chacun avec sa commande, chacun rejouable. On ne pouvait pas les déduire du texte ; il fallait aller regarder.
Geste 1 — figer ce qui tourne
Avant de toucher quoi que ce soit, on fige. Pas « la dernière version » : exactement celle qui tourne. On compare les numéros de fichiers servis par la production à l'historique du dépôt, et on tombe pile sur un commit précis du mois de juin.
Le piège : le tag de release existant était deux commits plus ancien que cette version. Revenir dessus n'aurait pas restauré ce qui tournait. On crée donc un tag de retour fidèle, nommé hors du motif qui déclenche les automatisations — pour qu'un simple gel ne relance aucun build.
Geste 2 — exporter ce qui vit
C'est en préparant l'export que la vraie surprise apparaît. La base de données vivait dans un dossier éphémère du conteneur, alors que le volume censé la préserver était monté sur un dossier voisin. Conséquence : elle n'était jamais sauvegardée, et le script de sauvegarde de la flotte archivait… un volume vide.
Autrement dit, le geste de routine qui devait protéger les données les aurait regardées disparaître au premier redéploiement. On copie donc la base sans arrêter le service, on vérifie son empreinte, et on relit son contenu (niveau, expérience, quêtes) pour être sûr d'emporter du réel — pas une coquille vide. Un second export suit juste avant la bascule, par principe.
Geste 3 — déployer
On retire la chaîne de déploiement morte (un transfert par FTP en échec d'authentification à chaque poussée) au profit de la chaîne vivante : image construite, publiée, puis démarrée à distance. On corrige au passage le montage du volume pour que la base soit enfin persistée, et on déploie la nouvelle version.
Geste 4 — migrer
Le « réimport » n'est pas un remplacement : la nouvelle version migre la base en place. Ses migrations sont idempotentes — une colonne déjà présente est ignorée — si bien que les données survivent et se complètent. Après bascule, vérification : le niveau, l'expérience et les quêtes sont servis par la fiche publique. Quatre mois de vie du personnage, intacts.
Geste 5 — tourner le secret
Le jeton ayant été public, il est régénéré. Mais un jeton relie Hero et la porte d'intégration : le changer d'un côté seulement coupe le pont. On met donc à jour les deux, on recrée les services concernés (un jeton est figé à la création du conteneur), et on vérifie que le nouveau est accepté et l'ancien refusé. Un second bug latent surgit là aussi : un chemin d'environnement erroné empêchait toute recréation de la porte — corrigé dans le même mouvement.
On pose enfin une phrase de connexion propriétaire, distincte du jeton d'API, et on vérifie qu'elle ouvre bien une session.
Geste 6 — clore
La clôture n'est pas un moment pour ouvrir un nouveau chantier. C'est le moment où l'on écrit ce qui servira à la session suivante : un récapitulatif daté, les vérifications avec leur commande, le chemin de retour, et une prochaine action exacte. On publie aussi la source de l'article de blog — par une branche propre plutôt qu'un envoi direct, parce que l'arbre de travail partagé portait le travail d'autres agents et qu'un envoi direct l'aurait bousculé, ou aurait été refusé.
Ce que la journée retient
- Figer avant de muter. Un retour n'existe que si l'on a nommé précisément ce qui tournait.
- Exporter avant de basculer — et vérifier que l'export contient du réel. Le pire bug n'est pas celui qui casse visiblement, c'est celui qui efface sans erreur.
- Mesurer ne sert à rien si l'on ne relit pas la mesure. Un volume « présent » peut être vide.
- Un secret partagé se change des deux côtés, ou pas du tout.
- Clore, c'est écrire pour celui qui reprend — pas résumer pour soi.
Six gestes, aucun spectaculaire. Mais c'est l'ordre — figer, exporter, déployer, migrer, tourner, clore — qui a transformé une bascule risquée en une bascule réversible. La leçon n'est pas « on a livré une version ». C'est que sans avoir mesuré ce qui tournait et où vivaient les données, on aurait pu effacer quatre mois de vie, sans un seul message d'erreur.