1
0
Fork
You've already forked serveur
0
forked from cartes/serveur
Le serveur de plans, de transport en commun et de tuiles de https://cartes.app
  • TypeScript 55.1%
  • Lua 28.7%
  • JavaScript 14%
  • Erlang 2%
  • Shell 0.2%
Find a file
2026年01月23日 15:34:38 +01:00
ansible C'est bon on est en prod 2025年10月03日 15:45:41 +02:00
archive Quelque chose appelait encore updateTiles, donc j'archive 2025年11月20日 10:16:58 +01:00
atproto fix: gérer les erreurs et déconnexions WebSocket avec reconnexion automatique 2025年10月28日 18:27:46 +01:00
data La migration de /gtfs à /serveur avait bien plus d'implications 2024年11月20日 10:42:21 +01:00
essais-services Les JSON renvoyés par quelques services d'itinéraire 2024年01月05日 17:50:10 +01:00
routes Import en moins 2025年12月08日 17:28:01 +01:00
systemd-services Le bon systemctl 2025年09月22日 16:49:48 +02:00
tilemaker handle " m" in height tag 2026年01月17日 17:01:39 +01:00
update Changement de zone : pénurie en par-1 2026年01月05日 10:18:00 +01:00
.env-dev Add azalys GTFS, add docs to make it work for GrandLyon 2024年07月09日 16:32:52 +02:00
.gitignore Nouvelle table dans gitignore 2025年11月04日 11:02:13 +01:00
.prettierrc.yaml Premier service de GTFS 2023年12月15日 14:52:40 +01:00
ansible.cfg Tmps ansible écoulé 2025年08月13日 11:12:03 +02:00
buildAgencyAreas.js Pas de réseaux nationaux 2025年12月17日 16:35:24 +01:00
buildAgencySlug.ts Log en moins 2025年12月04日 18:31:15 +01:00
buildAgencySymbolicMap.ts Fin des id null, on les met à 1 dès le buildConfig 2025年12月02日 15:56:48 +01:00
buildConfig.ts Exception au filtre sur les GTFS périmés 2026年01月23日 15:34:38 +01:00
buildMotisConfig.ts Le port utilisé sur le serveur maintenant que ça marche 2025年11月13日 15:32:18 +01:00
bun.lock On teste bun avec une adaptation de node-GTFS pour la lib native sqlite bun 2025年10月28日 14:32:58 +01:00
cache.ts Cache compat pour node 2025年10月28日 14:56:47 +01:00
config-test.json MAJ jeux qui marchent pas 2025年10月28日 16:55:39 +01:00
config.yaml Add azalys GTFS, add docs to make it work for GrandLyon 2024年07月09日 16:32:52 +02:00
datasetFilter.ts Moins de logs 2025年12月17日 10:56:11 +01:00
deno.json Migration de deno.json dans la racine 2025年10月09日 17:30:24 +02:00
deno.lock à "u" plutôt 2025年12月02日 16:11:27 +01:00
detectRouteTrainType.ts Réparation et optimisation du calcul sncfTrainType 2025年11月26日 15:57:53 +01:00
enrichAgencyMeta.js Ambiguité sur la DB pendant la MAJ 2025年12月04日 18:31:15 +01:00
experiments.js Expérimentations et séparation du code 2024年02月29日 22:30:33 +01:00
generateShapes.js Expérimentations et séparation du code 2024年02月29日 22:30:33 +01:00
geojson.js On inclut des geojson générés quand pas de shapes 2024年03月12日 14:38:41 +01:00
gtfs-rt.ts Petit script Deno pour décoder un flux GTFS-RT 2025年08月21日 11:13:59 +02:00
gtfsLogFunction.ts Log moins violent de node-gtfs pour mieux débugguer 2025年12月17日 10:51:45 +01:00
gtfsUtils.ts Fin des id null, on les met à 1 dès le buildConfig 2025年12月02日 15:56:48 +01:00
input.yaml Un autre jeu impossible 2026年01月05日 10:11:55 +01:00
inventory.ini fix: vérifier la réussite du changement de taille du volume à 500 GO 2025年09月23日 11:41:51 +02:00
loadPrefixTable.ts Ajout du slug et areaName à l'objet global agencyAreas 2025年11月18日 17:07:23 +01:00
package-lock.json On gère les arrêts éloignés de même nom sans parent_station 2025年11月25日 17:48:41 +01:00
package.json Merge pull request 'plans-novembre' ( #104 ) from plans-novembre into master 2025年12月03日 15:04:06 +01:00
placeMap.js Attrapage des erreurs de la génération d'aperçu maplibre 2025年01月28日 19:12:47 +01:00
Procfile Init 2023年12月15日 14:23:51 +01:00
pulumiTest.ts Tests de l'API scaleway 2025年07月22日 12:44:07 +02:00
readConfig.ts Déplacement 2/x 2025年02月17日 12:15:38 +01:00
README.md remove old files for cycleHighways.pmtiles calculation + update readme 2026年01月06日 22:44:50 +01:00
run-update.ts TEMP on itère sur le plan de Rennes 2025年11月13日 18:34:21 +01:00
script.js Premier service de GTFS 2023年12月15日 14:52:40 +01:00
server.ts agencyAttributes renvoie le areaName 2025年12月08日 17:28:01 +01:00
services.yaml Oubli du serveice brouter 2025年10月03日 11:24:57 +02:00
sncfStopToType.ts Réparation et optimisation du calcul sncfTrainType 2025年11月26日 15:57:53 +01:00
test-photon.ts noDecompress dans le script deno test 2025年11月14日 15:49:47 +01:00
tiles.js Changements de noms de fonction et tuiles europe 2025年07月16日 11:47:50 +02:00
timetableAnalysis.js Optimisations de buildAgencySymbolicMap par Claude 2025年11月25日 19:25:41 +01:00
unused.scaleway.ts On itère sur la création d'instances 2025年07月22日 16:09:44 +02:00
update.ts Fin de l'optin 2025年12月17日 10:58:34 +01:00
updateDashboardRoute.ts Réécriture en Deno de writeUpdate 2025年10月03日 11:05:50 +02:00
utils.js Mise de côté des GTFS du futur comme Rennes 2025年12月16日 17:01:47 +01:00

Le serveur Cartes.app

Contrairement à ce que son nom indique pour l'instant, ce dépôt va beaucoup plus loin que de ne gérer que les GTFS.

Serveur de tuiles

Update décembre 2025 : désormais des tuiles couvrant la planète entière sont générées chaque samedi. Les infos sur la génération des tuiles, et comment contribuer aux tuiles et aux styles, sont dans cartes/web#1183

Le plan, c'est de ne générer pour l'instant que les PMTiles (Protomaps) de la France hexagonale, et de compléter le reste du monde avec un autre serveur de tuiles PMTiles.

Donc :

  • ne générer que la France de notre côté, on veut du openmaptiles pour être standard
  • utiliser un proxy maison (sur cartesapp/cartes/...CartesProtocol) qui redirige soit sur notre pmtiles pour 90% des requêtes, soit un pmtiles mondial
  • inclure un land.pmtiles depuis cette source car les mers ne sont plus includes dans les tuiles de la France !
  • mon serveur (ses 16go de RAM ?) plante sur tilemaker du france.osm.pbf... Normal, et l'option --store rend la chose hyper trop lente...
  • donc on calcule les tuiles en local pour l'instant et on upload via scp

Télécharger et compiler tilemaker, voir leur install.md

wget https://download.geofabrik.de/europe/france-latest.osm.pbf
tilemaker --input france-latest.osm.pbf --output france.mbtiles
wget https://github.com/protomaps/go-pmtiles/releases/download/v1.20.0/go-pmtiles_1.20.0_Linux_x86_64.tar.gz
mkdir pmtiles
tar -xvf go-pmtiles_1.20.0_Linux_x86_64.tar.gz -C pmtiles
./pmtiles/pmtiles convert france.mbtiles france.pmtiles
scp -r tilemaker/france.pmtiles root@51.159.173.121:/root/serveur/data/pmtiles/france.pmtiles
ogr2ogr -t_srs EPSG:4326 land.json land-polygons-split-4326/land_polygons.shp
tippecanoe -zg --projection=EPSG:4326 -o land.pmtiles -l land land.json

landcover.pmtiles depuis https://github.com/wipfli/h3-landcover/

MAJ : j'ai trouvé un moyen de générer un périmètre plus grand autour de la France.

wget https://osm.download.movisda.io/grid/N50E000-10-202408071900.osm.pbf &
wget https://osm.download.movisda.io/grid/N40E010-10-202408071900.osm.pbf &
wget https://osm.download.movisda.io/grid/N40E000-10-202408071900.osm.pbf &
wget https://osm.download.movisda.io/grid/N50E010-10-202408071900.osm.pbf &

Puis les transformer en MBTiles, la seule méthode que j'ai trouvée est le --merge de tilemaker.

tilemaker --input N50E010-10-202407310700.osm.pbf --output hexagone-plus.mbtiles --config ~/serveur/tilemaker/resources/config-openmaptiles.json --process ~/serveur/tilemaker/resources/process-openmaptiles.lua
tilemaker --input NN50E000-10-202407310700.osm.pbf --output hexagone-plus.mbtiles --config ~/serveur/tilemaker/resources/config-openmaptiles.json --process ~/serveur/tilemaker/resources/process-openmaptiles.lua --merge
# pareil pour les 2 autres

Aussi, mieux vaut télécharger le pmtiles de Panoramax plutôt que de taper sur leur serveurs. Pour le reste du monde, on n'a pas besoin d'une fréquence de MAJ élevée.

wget https://panoramax.openstreetmap.fr/pmtiles/planet.pmtiles

Réseaux express vélo

Ils ne sont pas encore structurés par la communauté OSM en un seul tag national, voir cette discussion. Il est nécessaire de les identifier un par un via la valeur de leur tag cycle_network (et d'enlever les state=proposed)

Les itinéraires vélo étant désormais tous dans la couche de données route des tuiles planet.pmtiles, la sélection des Réseaux express vélo se fait désormais dans le fichier gérant les couches de rendu spécifiques cycleHighwayLayers.ts.

À vous d'ajouter les réseaux de votre ville pour qu'ils s'affichent sur la carte comme une infrastructure de premier niveau. C'est un changement relativement discret qui fait pourtant toute la différence en matière de planification des transports. On voit notamment qu'à date de décembre 2024, Rennes pêche énormément par le manque de REV dans la ville coeur alors que ses accès depuis la métropole sont plutôt bons.

image

⚠️ Attention ! Ce n'est pas parce qu'une boucle vélo ou une relation OSM est classifiée "REV" que ç'en est un ! CF le commentaire sur Bordeaux près du filtre cycleHighwayFilter dans cycleHighwayLayers.ts. Classer REV une voie qui n'en est pas, c'est dangereux pour les cyclistes.

API des horaires et lignes de bus en France (standard GTFS)

On utilise node-gtfs pour parser et servir les bons JSON pour répondre aux besoins de Cartes.app.

Ce dépôt est aussi celui où on va lister et récupérer les GTFS qui nous intéressent avec un script Deno. Il est donc la source des données pour cartesapp/motis, qui lui gère le routage.

Couverture

Au départ, je suis parti sur une couverture de l'ouest de la France. La plus belle région du pays mérite ça :p. Ensuite, à l'occasion de la conférence OSM 2024 à Lyon, l'AURA et Lyon ont été ajoutés. D'autres contributeurs ont ensuite ajouté Strasbourg, Metz, Blois, etc.

Nouveau : une page donne l'état des lieux de la couverture nationale.

Vous êtes développeur ou bidouilleur et vous aimeriez que votre territoire y soit ? Allons-y !

C'est assez simple : il faut ajouter une ligne dans le fichier input.yaml. Vous y trouverez en début de fichier une petite documentation.

À noter, nous n'avons pas encore de branches déployées automatiquement pour chaque PR. Il faudra donc mettre en ligne sur master et attendre le déploiement pour ensuite tester les transports en commun sur votre territoire, et ça passe forcément par @laem, pingez-moi dans les PR. Comme vous pouvez le voir plus bas dans #déploiement, j'ai tenté de déployer tout ça sur un SaaS, mais c'est trop compliqué pour l'instant... Quand on aura le temps, il faudra automatiser tout ça et trouver un moyen de déployer ce serveur de façon plus décentralisée.

Lancer le calcul sur votre machine avec les instructions suivantes est possible, mais le pré-calcul des itinéraires marche et vélo (modules PPR et OSRM de Motis), nécessaire pour tester les calculs de transport en commun (pour aller jusqu'à la station de bus il faut marcher ou prendre le vélo), prend beaucoup de temps et nécessite 32 Go de RAM. Si vous voulez tester, pinguez-moi je vous mettrai à dispo un fichier à télécharger.

Faire tourner ce serveur en local

Nous avons deux serveurs : le server.ts principal qui sert les données en lecture, et le serveur update.ts qui vient les mettre à jour et relancer le serveur de lecture, pour éviter de le faire tomber s'il tombe lui-même lors des longues mises à jour journalières. Enfin nocturnes.

Toutes les étapes sont résumées dans update.ts.

Donc quand le serveur tourne, charger /update avec la clef de sécurité en variable d'environnement va relancer le téléchargement, l'intégration dans Motis et le calcul des plans de transport !

D'abord lancer le téléchargement des fichiers GTFS et la création de la configuration node-GTFS.

Ça nécessite d'installer node via nvm, pm2, Deno et cartesapp/motis.

Le dossier cartesapp/motis doit être installé à côté de ce dossier GTFS.

Déploiement

Actuellement, j'ai un serveur Scaleway qui me coûte 80€/mois pour faire tourner cartesapp/serveur et cartesapp/motis. C'est assez simple à gérer : je développe en local et je fais des git pull quand nécessaire (changement de code) puis un pm2 delete 0 && PORT=3001 pm2 start "npm run start" ou je tape l'URL /update pour lancer une MAJ des réseaux de transport si ce n'est que ça, et le résultat peut être suivi via pm2 logs --raw --lines 50.

Vous moquez pas, on vise l'efficacité pour innover côté UI avant d'atteindre le graal du devops justifié par des millions d'utilisateurs ;)

Pour garantir une fraicheur régulière, j'ai un micro-script sur Deno Deploy qui comporte juste ce code :

Deno.cron("Update GTFS for node-GTFS and Motis","0 */6 * * *", () => {
fetch('https://motis.cartes.app/gtfs/update')
});

C'est une solution temporaire qui me va bien, mais qui devra évidemment être améliorée !

Au 11 juillet 2024, avec les réseaux Bretagne + PdlL + Lyon + Aura + quelques autres petits, on est sur un temps de téléchargement des GTFS + intégration à node-GTFS + création des plans de transport en commun + parsing Motis d'environ 10 minutes. Ça me semble tolérable, mais il y a des tas d'améliorations possibles :

  • on va retélécharger des GTFS et les recalculer 2x par jour même s'ils n'ont pas changé ! C'est bête, mais ça marche. Pour améliorer ça, il faudra s'assurer de supprimer de la BDD node-GTFS les entrées d'un réseau qui a changé, c'est pas trivial. Je ne sais pas comment Motis le gère...
  • Motis ingère les GTFS à une vitesse 10 x celle de node-GTFS, je leur en ai fait une issue
  • j'ai un peu optimisé notre création de plans de transport (ce qui passe par une création de shapes GTFS symboliques pour pallier à la médiocrité des shapes des AOM) mais on peut aller plus loin

Déployer sur un Saas

J'ai d'abord testé Scalingo. Ça marche, mais à chaque déploiement il faut repeupler la DB, et ça commence à prendre beaucoup de temps. Les PaaS sont donc limitantes, et plus chères qu'un simple VPS.

Clairement, le VPS ne tiendra pas à terme, mais pour commencer c'est bien.

J'ai voulu déployer de dépôt en edge computing. Turso.tech permettrait de stocker la DB, et Deno de déployer le serveur. Mais Deno ne peut pas encore faire tourner node-gtfs, du à des incompatibilités de packages. Faudrait changer beaucoup node-GTFS pour le faire marcher.

Deuxième problème, node-GTFS utilise better-sqlite3, et c'est donc une API différente de ce qu'utilisent Turso ou encore Fly.io. Il faudrait l'adapter pour accepter d'autres ORM, en gros.

Dernier point : node-GTFS ne fait pas le café, juste une API de recherche dans les GTFS. Ainsi il doit être couplé à Motis. Ce dernier pourrait remplacer node-GTFS, mais on en est loin je crois à ce stade et la documentation est lacunaire.

Ainsi, héberger node-GTFS et Motis sur le même serveur VPS est intéressant. Surtout que la sécurisation de ce serveur, on s'en fout, il n'y a rien de confidentiel.

Resterait donc à fusionner laem/motis et laem/serveur, pour mettre en commun le dépôt et surtout la gestion des GTFS à télécharger et mettre à jour avec un CRON.

Ensuite, trouver un moyen de déployer plusieurs serveurs pour scaler, ou retester l'expérience PaaS ou Edge, mais on verra ça quand on aura du succès.

Pour lancer :

PORT=3001 pm2 start "npm run start"

Puis lancez la création de la DB par node-GTFS. Prend plusieurs minutes pour juste l'ouest de la France (config au moment où j'écris ces lignes).

localhost:3001/fetch

Regardez si ça marche

pm2 monit

La disponibilité des différents services est disponible ici

BRouter

git clone https://codeberg.org/cartes/brouter.git sudo vim /etc/systemd/system/brouter.service

[Unit]
Description=BRouter
[Service]
ExecStart=java -cp /home/ubuntu/brouter/brouter.jar btools.server.RouteServer "/home/ubuntu/brouter/segments4" "/home/ubuntu/brouter/profiles2" "customprofiles" 3003 1 0.0.0.0
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target

sudo systemctl daemon-reload journalctl -u brouter.service -b -e -f sudo service brouter restart