gigafibre-fsm/services/osrm
louispaulb 96929bed6f feat(dispatch): OSRM road-time matrix for the VRP optimizer (Phase 2)
Replace the haversine straight-line estimate with real road travel times
from a self-hosted OSRM (free/offline — Mapbox Matrix is billable).

- hub: osrmMatrix() calls OSRM /table for the job+home coords (node order
  matches route_solver: jobs then homes), returns a minutes matrix.
  Handles PARTIAL coords — OSRM for geolocated nodes, 0/neutral for the
  rest (matches the solver's own fallback), so a few tech homes without
  coords don't disable OSRM for the geolocated majority. /roster/
  optimize-routes injects body.matrix; graceful fallback to haversine if
  OSRM is unreachable or too few points.
- config: OSRM_URL (default http://osrm:5000).
- services/osrm/README.md: reproducible setup (Québec extract, MLD
  pipeline, osrm-routed on erpnext_erpnext network).

Deployed + verified: OSRM /table hit with the full coord set, no
fallback; optimizer routes on real road times.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 13:48:43 -04:00
..
README.md feat(dispatch): OSRM road-time matrix for the VRP optimizer (Phase 2) 2026-07-02 13:48:43 -04:00

OSRM — moteur de routes (matrice de temps de route réels)

Fournit à l'optimiseur VRP (roster-solver) une matrice de temps de route réels (réseau routier OSM), au lieu du haversine à vol d'oiseau. Le hub (targo-hub, lib/roster.jsosrmMatrix) appelle OSRM /table puis passe la matrice à roster-solver /route. Auto-hébergé → gratuit, offline, sans coût par appel (contrairement à Mapbox Matrix).

  • Image : osrm/osrm-backend (pipeline MLD)
  • Conteneur : osrm sur le réseau erpnext_erpnext, port interne 5000, --restart unless-stopped
  • Données : extrait Québec de Geofabrik, préprocessé dans /opt/osrm/ (host)
  • Config hub : OSRM_URL (défaut http://osrm:5000)

(Re)déploiement / mise à jour de la carte

mkdir -p /opt/osrm && cd /opt/osrm
curl -sL -o quebec-latest.osm.pbf https://download.geofabrik.de/north-america/canada/quebec-latest.osm.pbf
docker pull osrm/osrm-backend
docker run --rm -v /opt/osrm:/data osrm/osrm-backend osrm-extract   -p /opt/car.lua /data/quebec-latest.osm.pbf
docker run --rm -v /opt/osrm:/data osrm/osrm-backend osrm-partition                /data/quebec-latest.osrm
docker run --rm -v /opt/osrm:/data osrm/osrm-backend osrm-customize                /data/quebec-latest.osrm
docker rm -f osrm 2>/dev/null || true
docker run -d --name osrm --network erpnext_erpnext --restart unless-stopped \
  -v /opt/osrm:/data osrm/osrm-backend \
  osrm-routed --algorithm mld --max-table-size 2000 /data/quebec-latest.osrm

Préproc ~10 min pour le Québec (pic RAM ~4,4 Go). Rafraîchir la carte = relancer le bloc (re-télécharge le pbf + re-préprocesse). Vérifier :

docker exec targo-hub node -e 'require("http").get({host:"osrm",port:5000,path:"/table/v1/driving/-74.10,45.05;-74.35,45.12?annotations=duration"},r=>{let d="";r.on("data",c=>d+=c);r.on("end",()=>console.log(d))})'
# → {"code":"Ok","durations":[[0,2160],[2160,0]], ...}  (secondes)

Phase suivante (optionnel)

  • Recalculer la carte périodiquement (cron mensuel) — le réseau routier évolue peu.
  • Si on sort du Québec : extrait plus large (Canada) — plus de RAM/disk au préproc.