League Of Data Base Un système en production
Retrouver le jeu tel qu’il était.
League of Legends change à chaque patch : ses champions, ses objets, leurs chiffres. J’ai construit League Of Data Base pour retrouver ces valeurs telles qu’elles étaient, patch par patch et dans sa langue. Puis je l’ai entièrement réécrit, sans perdre un compte.
- 403 patchs consultables, du 0.151.2 au 16.20.1 Historique public de l’application, relevé le 13/10/2026
- 21 langues, celles que publie Riot Page « À propos » de l’application, relevé le 13/10/2026
- 12 260 écarts entre les deux versions, tous classés avant la bascule Rapport de parité public, 26/09/2026
- Besoin
- Retrouver les valeurs exactes d’un ancien patch de League of Legends, dans sa langue.
- Ma part
- Tout, seul : la conception, le développement et l’exploitation, puis la réécriture complète et sa bascule en production.
- Rôle
- Concepteur, développeur et exploitant
- Période
- Dépôt actuel depuis août 2025, réécrit en 2026
- Équipe
- Seul
- Statut
- En ligne
- Liens publics
Ce n’était pas la même Ahri
Une même fiche, deux patchs : son titre, ses valeurs et même son passif ont changé.
| Patch 3.6.14 le plus ancien des patchs 3.x | Patch 16.20.1 le patch actuel, au 13/10/2026 | |
|---|---|---|
| Titre | Renard à neuf queues | Renarde à neuf queues |
| Points de vie | 380 | 590 |
| Attaque | 50 | 53 |
| Armure | 11 | 21 |
| Mana | 230 | 418 |
| Passif, Vol essentiel | À 9 charges, le sort suivant a un effet de Sort vampirique de 35 %. | Ahri récupère des PV après 9 sbires ou monstres tués, et davantage après une élimination. |
| Ultime, recharge | 110 / 95 / 80 s | 140 / 120 / 100 s |
Remonter le temps d’un clic
Chaque patch a sa propre adresse, et chaque fiche se termine par ses six patchs précédents : un clic, et la même fiche s’ouvre telle qu’elle était.
Comparaison faite pour cette page ; dans l’application, chaque patch a sa propre fiche. La vitesse d’attaque n’est pas comparée : au patch 3.6.14, le panneau l’affiche à 0.
Tout un état du jeu
Le patch fixe aussi le contenu : les champions, les apparences et les textes de chaque fiche.
Les apparences de l’époque
Au patch 3.6.14, Ahri en a trois. La liste suit le patch ; les illustrations, elles, sont celles d’aujourd’hui.
Les fiches à explorer
Des fiches d’aujourd’hui, au patch 16.20.1 : Ahri, ses capacités et ses apparences, puis un objet et les runes.
Autour de l’encyclopédie
Des fonctions construites et en ligne. Aucun chiffre d’usage n’est publié.
-
Des builds partagés
Un éditeur pour composer un build d’objets étape par étape, puis le partager par un lien. Les builds se votent, un profil public les rassemble.
-
Les tendances
Les fiches les plus consultées du site : une mesure de l’attention, pas des statistiques de parties.
-
Une API publique
Une API REST en JSON pour les profils publics, les builds partagés et les tendances, avec une offre gratuite.
-
Gratuit, sans publicité
Le site vit de dons volontaires et s’installe comme une application web.
Ce que les données ne disent pas
Riot publie ses données telles quelles. Sur des centaines de versions, il manque des fichiers, des langues, des champs ; certains objets existent deux fois. Chaque piège est devenu une règle et un test.
-
Des runes absentes avant le 7.22.1
Réponse : Un jeu vide est enregistré : la page reste propre, jamais en erreur.
-
Des langues absentes de nombreuses versions
Réponse : La fiche se replie sur l’anglais, la seule langue présente partout.
-
Des objets en double pour LoL Classic
Réponse : Une édition à part entière, liée à son jumeau.
-
Des illustrations et des vidéos sans version
Réponse : Un avertissement le dit sous chaque capacité.
-
Une erreur passagère chez Riot
Réponse : Elle n’est jamais enregistrée comme une absence.
Changer de moteur sans perdre personne
La première version a livré le produit, mais elle ne pouvait pas devenir une application de bureau ou Android, et son état restait sur le disque d’un seul serveur. J’ai tout réécrit en .NET et Angular : deux langages au lieu de trois.
Avant de basculer, j’ai comparé les deux versions sur 75 couples (version, langue) : 12 260 écarts, tous classés. Le jour de la bascule, chacun s’est reconnecté une fois ; comptes, builds, favoris, clés d’API et anciens liens ont suivi.
-
Le dépôt actuel
Symfony, Go et Vue : trois langages.
-
Symfony
-
Go
-
Vue
-
-
Dix décisions écrites
.NET 10 et Angular 22 : deux langages au lieu de trois, une seule API.
-
Parité vérifiée
75 couples (version, langue) comparés : 12 260 écarts, tous classés.
-
Bascule en production
Version 3.0.0 : comptes, builds, favoris et clés d’API intacts.
-
.NET
-
Angular
-
En production
Conserver les patchs, préparer les suivants et servir les fiches sans tout recalculer.
La bonne réponse, sans tout recalculer
Le cache répond aux demandes répétées. Les rendus et les téléchargements ont chacun leur budget.
- Une page demandée Navigateur ou robot
- Cache de pages
nginx Patch actuelArchives
- La page est servie Sans nouveau rendu
Absente du cache
- Rendre la page
Angular SSR Rendus simultanés limités
- Lire le catalogue
-
API .NET
Catalogue conservé
Une copie rejoint le cache
Préparer les nouveaux patchsEn arrière-plan, avant la première visite
- RiotData Dragon
- IngestionDonnées puis images
- Prêt à consulterPromu une fois complet
Une copie ailleurs, un retour vérifiable
La chaîne prévoit une sauvegarde chaque nuit et une restauration réelle chaque mois.
- PostgreSQLLes données du projetAccès en lecture
- pg_dumpUne copie de la base
- resticChiffrer et dédupliquer
- Stockage S3Objets verrouillésCopie hors du serveur
Rejouer la sauvegarde
- Restaurer pour de vraiDans un PostgreSQL temporaire
- Garder une traceJournal des passes et alertes
Construire une fois, livrer la même version
Les images validées en test passent en production avec la même empreinte, après une promotion manuelle.
GitHub Actions
Docker
- Construire API, web, nginx
- Valider en test Contrôles et déploiement
- Promouvoir en production Les mêmes images
Voir ce qui est consulté
Umami suit les pages et les usages du catalogue, sans cookie ; la recherche libre n’est pas transmise.
- Une fiche ouvertePage, langue, patch
- Un usage mesuréRecherche, partage
- UmamiUn tableau privé
Sous le capot
Trois décisions, chacune avec sa trace dans le code public.
-
Chaque piège des données devient une règle code
- Contrainte
- Riot publie ses données telles quelles : fichiers manquants, langues absentes, objets en double.
- Choix
- Chaque piège devient une règle et un test ; une absence définitive est enregistrée, une erreur passagère jamais.
- Effet
- 403 patchs lisibles, même incomplets.
src/LoDb.Ingestion/Egress/EgressFetcher.cs· C#var status = response.StatusCode; response.Dispose(); return status is HttpStatusCode.Forbidden or HttpStatusCode.NotFound ? new FetchOutcome.Absent((int)status) : throw new EgressTransientException($"Upstream answered {(int)status}.", status); -
Deux caches : le patch du jour et les archives code
- Contrainte
- Une visite des archives ne doit pas chasser le patch actuel du cache.
- Choix
- Deux caches séparés, un rendu par adresse et des rendus simultanés bornés.
- Effet
- Les archives sans ralentir le patch du jour.
docker/nginx/sites/site.conf· nginx# The latest patch's pages (snippets/page-cache.conf) … proxy_cache_path /var/cache/nginx/pages levels=1:2 use_temp_path=off keys_zone=lodb_pages:${LODB_PAGE_CACHE_KEYS_SIZE} …; # The past patches' pages (snippets/archive-cache.conf) … a sweep of every # patch cannot evict the latest patch's pages. proxy_cache_path /var/cache/nginx/archive levels=1:2 use_temp_path=off keys_zone=lodb_archive:${LODB_ARCHIVE_CACHE_KEYS_SIZE} …; -
Comparer les deux moteurs avant de basculer code
- Contrainte
- Changer tout le moteur sans perdre un compte ni un lien.
- Choix
- Comparer les deux versions sur 75 couples (version, langue) avant de basculer.
- Effet
- 12 260 écarts classés, aucun défaut neuf.
docs/reecriture/rapports/parite-lot-1.md· Markdown**Résultat** : 12 260 écarts, tous classés. Aucun n'est un défaut de la nouvelle stack. Trois règles couvrent 328 défauts de l'ancienne stack que la nouvelle corrige volontairement ; trois règles couvrent 11 932 écarts attendus, tous dus au stockage paresseux de l'ancienne stack.
Ce que j’en retiens
League Of Data Base est en ligne : 403 patchs, 21 langues, et depuis le 4 octobre 2026 un moteur entièrement neuf, sans qu’un compte ni un ancien lien ne se perde.
Sources et méthode : chiffres, dates, méthode et crédits
Ampleur. 403 patchs, du 0.151.2 au 16.20.1, comptés sur l’historique public de l’application ; 21 langues et un projet « conçu et maintenu par un développeur seul », d’après sa page À propos. Relevés le 13/10/2026. Le périmètre est celui des versions et des langues publiées dans Data Dragon, la source de données de Riot ; aucune date n’y est attachée aux patchs.
Ahri. Valeurs de base au niveau 1, titre, passif et recharge de l’ultime relevés dans les fiches publiques des patchs 3.6.14 et 16.20.1, le 13/10/2026. Les captures viennent de la production v3.0.0, les 12 et 13 octobre 2026, sans compte connecté ni retouche. Les illustrations et les vidéos de Riot ne sont pas versionnées : elles ne prouvent rien d’historique, et l’application le signale.
Réécriture. Dix décisions d’architecture acceptées le 24/09/2026, rapport de parité du 26/09/2026 (75 couples version et langue, 12 260 écarts tous classés, 328 défauts de l’ancienne version corrigés volontairement), note publique de la version 3.0.0 du 04/10/2026. Permaliens figés à la révision publique du 12/10/2026. Le README et la description du dépôt décrivent encore la période de bascule.
Exploitation. Caches, ingestion, mesure, sauvegardes et livraison sont décrits dans le dépôt public, à la même révision. Les fréquences des sauvegardes sont celles du dispositif qu’il décrit. Aucun chiffre d’audience n’est publié : le tableau Umami est privé.
Nom. League Of Data Base, le nom que porte l’application.
Riot Games. Les données et les illustrations du jeu proviennent de Riot Games. Projet indépendant, sans affiliation à Riot Games.
Sous le capot. Extraits du dépôt public, à la révision auditée 1c9b447, relus le 15/10/2026.