Technologies
stationdoku est un projet fait sur mon temps libre. Voici les briques qui le font tourner, du serveur à ton navigateur.
Le serveur
-
Python
Le langage de tout le serveur : génération des grilles, vérification des réponses, calcul des scores.
-
FastAPI
Sert les pages et l'API que ton navigateur interroge pendant la partie, de façon entièrement asynchrone.
-
Django
Décrit la base de données et ses migrations, et fournit l'interface d'administration.
-
Pydantic
Valide et décrit les données échangées avec ton navigateur.
-
Jinja
Les gabarits des pages HTML, comme celle-ci.
-
PostgreSQL
La base de données : les stations, les grilles du jour et leurs réponses, les parties, les ami·es.
Les ami·es en direct
Quand des ami·es jouent la grille du jour en même temps que toi, un petit serveur à part te le dit en direct, par une connexion WebSocket ouverte tant que la page est visible. Il ne lit aucune base de données et ne connaît pas ton identifiant : seulement un ticket signé par le serveur principal.
-
Rust
Le langage de ce serveur : rapide et sobre, il garde beaucoup de connexions ouvertes avec très peu de mémoire.
-
Tokio
Le moteur asynchrone de Rust, avec Axum par-dessus pour les WebSockets.
-
Redis
Retient qui joue quelle grille en ce moment et prévient le serveur des arrivées et des départs. Rien n'est écrit sur disque : après un redémarrage, les navigateurs se réannoncent.
-
Lua
Les petits scripts exécutés dans Redis, pour qu'une arrivée ou un départ s'enregistre d'un seul coup.
Dans ton navigateur
-
TypeScript
Le code de la grille, du classement et des ami·es, sans framework : un petit script par page.
-
esbuild
Assemble et compresse les scripts et les feuilles de style à chaque mise en ligne.
-
Node.js
Sert seulement à construire les scripts : il ne tourne pas sur le serveur.
-
PWA
stationdoku s'installe comme une application, te prévient quand tu es hors ligne et peut te rappeler de jouer par notification.
Les polices Archivo, Inter et Space Grotesk sont hébergées sur le site, sous licence libre (OFL) : ton navigateur ne contacte aucun service de polices.
Hébergement et mise en ligne
-
OVHcloud
Le site tourne sur une machine OVHcloud, à Paris.
-
Debian
Le système de la machine et des conteneurs.
-
Docker
Chaque brique tourne dans son conteneur. Une nouvelle version démarre à côté de l'ancienne, qui ne s'arrête qu'une fois la relève prête : pas de coupure.
-
Caddy
Reçoit toutes les requêtes, gère le HTTPS et HTTP/3, compresse les réponses et n'écrit pas les adresses IP dans ses journaux.
-
GitHub Actions
À chaque modification, les vérifications et les tests, puis la mise en ligne automatique s'ils passent.
-
Sentry
Signale les erreurs du serveur, sans données personnelles.
-
Umami
La mesure d'audience, sans cookie, qui ne reçoit jamais ton identifiant.
La base de données est sauvegardée toutes les heures.
Outils de développement
-
uv
Installe Python et les dépendances en quelques secondes.
-
Ruff
Vérifie et met en forme le code Python.
-
pytest
Les tests du serveur, rejoués à chaque modification sur une vraie base PostgreSQL.
Le typage est vérifié partout : mypy en mode strict pour Python, tsc pour TypeScript, Clippy pour Rust.
Les données
Les stations, les lignes et leur fréquentation viennent des données ouvertes d'Île-de-France Mobilités (licence ODbL), les contours des arrondissements de Paris Data.
-
Wikidata
Les coordonnées des parcs et des lieux du pouvoir, pour les critères de distance.
Logos : Simple Icons (CC0). Les marques appartiennent à leurs propriétaires.