Aller au contenu
Sommaire

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.

Le menu « Patch & langue » de League Of Data Base, ouvert sur le patch 3.6.14 en français, au-dessus du catalogue de ses 113 champions.
Choisir un patch et une langue, puis lire le jeu tel qu’il était : ici le 3.6.14, en français.
Choisir un patch et une langue, puis lire le jeu tel qu’il était : ici le 3.6.14, en français.
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

Discutons de ce projet

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é.

Ahri au niveau 1, dans deux patchs
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
Patch 3.6.14
Patch 16.20.1

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.

Le bas de la fiche d’Ahri au patch 3.6.14 : « Dans les patchs précédents » ouvre la même fiche aux patchs 0.154.3, 0.154.2, 0.153.2, 0.152.115, 0.152.108 et 0.152.107.
Au bas de la fiche, les six patchs précédents.
Au bas de la fiche, les six patchs précédents.

Tout un état du jeu

Le patch fixe aussi le contenu : les champions, les apparences et les textes de chaque fiche.

Le catalogue du patch 3.6.14 : 113 champions, dont Ahri, « Renard à neuf queues ».
Patch 3.6.14 : 113 champions.
Le catalogue du patch 16.20.1 : 173 champions, dont Ahri, désormais « Renarde à neuf queues ».
Patch 16.20.1 : 173 champions.

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.

La galerie des trois apparences d’Ahri répertoriées au patch 3.6.14 : Ahri dynastique, Ahri de minuit et Ahri renard du feu.
Les trois apparences répertoriées au patch 3.6.14.
Les trois apparences répertoriées au patch 3.6.14.
Choisir la langue de la fiche d’Ahri au patch 16.20.1

La même fiche, dans sa langue

Les noms et les descriptions viennent des traductions de Riot, au même patch. Quand une langue manque à un ancien patch, la fiche se replie sur l’anglais.

Ahri au patch 16.20.1, en français.
Ahri au patch 16.20.1, en français.
Consulter cette fiche en français
Ahri au patch 16.20.1, en anglais.
Ahri au patch 16.20.1, en anglais.
Consulter cette fiche en anglais
Ahri au patch 16.20.1, en coréen.
Ahri au patch 16.20.1, en coréen.
Consulter cette fiche en coréen

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.

Explorer les fiches du patch 16.20.1
Ahri, ses rôles et ses caractéristiques.
Ahri, ses rôles et ses caractéristiques.
Les effets, les valeurs et les temps de récupération.
Les effets, les valeurs et les temps de récupération.
Les illustrations du jeu, réunies dans une galerie.
Les illustrations du jeu, réunies dans une galerie.
Une apparence ouverte dans la visionneuse de l’application.
Une apparence ouverte dans la visionneuse de l’application.
La Coiffe de Rabadon et sa recette : chaque composant ouvre sa fiche.
La Coiffe de Rabadon et sa recette : chaque composant ouvre sa fiche.
Ouvrir la recette
L’arbre Précision et ses runes ; les sorts d’invocateur ont aussi leurs fiches.
L’arbre Précision et ses runes ; les sorts d’invocateur ont aussi leurs fiches.

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.

Au patch 3.6.14, le titre est celui du patch, l’illustration celle d’aujourd’hui.
Au patch 3.6.14, le titre est celui du patch, l’illustration celle d’aujourd’hui.
  • 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.

Un train dont on remplace le moteur pendant que les voyageurs restent assis. Un train dont on remplace le moteur pendant que les voyageurs restent assis.
  1. Le dépôt actuel

    Symfony, Go et Vue : trois langages.

    • Symfony
    • Go
    • Vue
  2. Dix décisions écrites

    .NET 10 et Angular 22 : deux langages au lieu de trois, une seule API.

  3. Parité vérifiée

    75 couples (version, langue) comparés : 12 260 écarts, tous classés.

  4. 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.

  1. Une page demandée Navigateur ou robot
  2. Cache de pages Patch actuelArchives
  3. La page est servie Sans nouveau rendu

Absente du cache

  1. Rendre la page Rendus simultanés limités
  2. Lire le catalogue

Une copie rejoint le cache

Préparer les nouveaux patchsEn arrière-plan, avant la première visite

  1. RiotData Dragon
  2. IngestionDonnées puis images
  3. Prêt à consulterPromu une fois complet
Les anciens patchs ont leur propre cache : une visite des archives laisse sa place au patch actuel.

Une copie ailleurs, un retour vérifiable

La chaîne prévoit une sauvegarde chaque nuit et une restauration réelle chaque mois.

  1. PostgreSQLLes données du projetAccès en lecture
  2. pg_dumpUne copie de la base
  3. resticChiffrer et dédupliquer
  4. Stockage S3Objets verrouillésCopie hors du serveur

Rejouer la sauvegarde

  • Restaurer pour de vraiDans un PostgreSQL temporaire
  • Garder une traceJournal des passes et alertes
Avant une migration, une copie supplémentaire permet aussi le retour à la version précédente.

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.

  1. Construire API, web, nginx
  2. Valider en test Contrôles et déploiement
  3. Promouvoir en production Les mêmes images
Même empreinte d’un environnement à l’autre.

Voir ce qui est consulté

Umami suit les pages et les usages du catalogue, sans cookie ; la recherche libre n’est pas transmise.

  1. Une fiche ouvertePage, langue, patch
  2. Un usage mesuréRecherche, partage
  3. UmamiUn tableau privé
La mesure d’audience complète les métriques du serveur : les visites et la charge technique se lisent séparément.

Sous le capot

Trois décisions, chacune avec sa trace dans le code public.

  1. 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.
    Les pièges, dans le dépôt
    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);
  2. 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.
    Le routage du cache
    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} …;
  3. 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.
    Le rapport de parité
    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.