Application full-stack de planification d'itinéraires vélo (API ASP.NET Core + frontend React) avec routage, POI, export GPX et synchronisation cloud.
- Démo live: https://bike.arnaudwissart.fr
- Historique des changements: CHANGELOG.md
- Conception full-stack cohérente: frontend React/Vite + API .NET 10, avec contrat HTTP canonique
/api/v1/*. - API Minimal API versionnée et testée, avec endpoints de routage, boucle, POI, cloud sync, feedback et exports.
- Sécurité applicative concrète: CORS d'origines autorisées, origin guard, cookies HttpOnly, rate limiting par politique, headers de sécurité.
- Gestion d'un moteur externe lourd (Valhalla) avec readiness, endpoint de statut et mise à jour déclenchable.
- Intégrations externes côté backend uniquement: Valhalla, Overpass, Google Drive, OneDrive.
- Qualité logicielle automatisée par CI: restore/build/test, lint/format, E2E Playwright, audits vulnérabilités.
- Déploiement manuel reproductible via GitHub Actions (
workflow_dispatch) sur runnerself-hostedLinux avec Docker Compose.
flowchart LR
UI["Frontend Web<br/>React + Vite + TypeScript"] --> API["API ASP.NET Core (.NET 10)<br/>/api/v1/*"]
API --> VAL["Valhalla<br/>Routing / Loop"]
API --> OVP["Overpass API<br/>POI autour d'itinéraire"]
API --> GDR["Google Drive API"]
API --> ODR["Microsoft Graph / OneDrive"]
Schéma détaillé: docs/ARCHITECTURE.md
- Backend: ASP.NET Core
net10.0, Minimal APIs, FluentValidation, Serilog, architectureDomain / Application / Infrastructure. - Frontend: React
19.2.8, TypeScript5.9.x, Vite8.2.0, Mantine8.3.18, Cesium1.144.0, i18next. - Tests: xUnit (
BikeVoyager.UnitTests,BikeVoyager.ApiTests), Vitest (frontend), Playwright E2E. - AppHost local: .NET Aspire (
Aspire.AppHost.Sdk 13.4.6,Aspire.Hosting.Redis 13.4.6). - Conteneurs: Dockerfiles backend/frontend avec bases épinglées (
dotnet/sdk:10.0.302,dotnet/aspnet:10.0.10,node:24.19.0-alpine,nginx:1.31.3-alpine) + stack Composefront/api/valhalla/valhalla-bootstrap. - Moteur de routage: image Valhalla épinglée par digest SHA256 dans
deploy/home.compose.ymletinfra/valhalla.compose.yml.
Prérequis:
- .NET SDK
10.0.302ou patch compatible dans la même bande (CI:actions/setup-dotnet@v6) - Node.js
24.19.0+ npm (CI:actions/setup-node@v7, fichier.nvmrc) - Docker + Docker Compose (nécessaires pour Valhalla)
- PowerShell (
pwsh) pour les scriptsscripts/dev-*
Installation:
git clone https://github.com/arnaud-wissart-lab/BikeVoyager.git
cd BikeVoyager
dotnet restore BikeVoyager.sln
npm --prefix frontend ciLancement local (backend + frontend, et Valhalla si données disponibles):
./scripts/dev-upArrêt:
./scripts/dev-downOption AppHost (.NET Aspire):
dotnet run --project backend/src/BikeVoyager.AppHost/BikeVoyager.AppHost.csprojBackend (unitaires + API):
dotnet test backend/tests/BikeVoyager.UnitTests/BikeVoyager.UnitTests.csproj
dotnet test backend/tests/BikeVoyager.ApiTests/BikeVoyager.ApiTests.csprojFrontend (unitaires / intégration):
npm --prefix frontend run testE2E (Playwright):
npx --prefix frontend playwright install --with-deps chromium
npm --prefix frontend run e2eCommandes agrégées:
./scripts/dev-test
./scripts/dev-audit # Unix/Git Bash
./scripts/dev-audit.ps1 # PowerShell WindowsPipeline CI référence: .github/workflows/ci.yml
Les versions de référence sont ancrées dans global.json, .nvmrc, frontend/package.json, frontend/package-lock.json, les fichiers .csproj et les images Docker épinglées. Avant de proposer un alignement, vérifier les versions déclarées et verrouillées, puis distinguer les correctifs de sécurité des montées majeures fonctionnelles.
Commandes de contrôle recommandées:
dotnet list BikeVoyager.sln package --vulnerable --include-transitive
dotnet list BikeVoyager.sln package --outdated --include-transitive
npm --prefix frontend audit --omit=dev
npm --prefix frontend audit
npm --prefix frontend outdatedPolitique minimale:
- appliquer en priorité les correctifs de sécurité et les versions patch/mineures compatibles ;
- garder Node aligné sur
.nvmrc(24.19.0) etfrontend/package.json(24.x) ; - garder les types Node sur la ligne
24.x; - ne pas monter Mantine, i18next, React i18next ou une image Docker majeure sans validation dédiée ;
- après tout alignement, exécuter
./scripts/dev-test,./scripts/dev-auditou./scripts/dev-audit.ps1sous PowerShell Windows,npm --prefix frontend run lint,npm --prefix frontend run buildet les E2E si le frontend ou le lockfile change.
Protections API appliquées:
- Versioning canonique:
/api/v1/*(docs/API.md). - Session anonyme: cookie chiffré/signé via Data Protection (
HttpOnly,SameSite=Lax,Path=/api,Securesi HTTPS). - Cookies cloud OAuth côté API:
bv_cloud_pending_sid,bv_cloud_auth_sid(HttpOnly,Path=/api). - Origin guard sur les routes
/api/*+ enforcement des origines selonApiSecurity:AllowedOrigins. - Rate limiting global + politiques dédiées
compute-heavy,export,feedback. - Hors
Development:HSTS, redirection HTTPS,X-Content-Type-Options,Referrer-Policy,X-Frame-Options,Permissions-Policy.
Variables d'environnement courantes (placeholders):
# Cloud OAuth (API)
CloudSync__GoogleDrive__ClientId=__GOOGLE_CLIENT_ID__
CloudSync__GoogleDrive__ClientSecret=__GOOGLE_CLIENT_SECRET__
CloudSync__OneDrive__ClientId=__ONEDRIVE_CLIENT_ID__
CloudSync__OneDrive__ClientSecret=__ONEDRIVE_CLIENT_SECRET__
# Feedback (deploy/home.env)
FEEDBACK__ENABLED=true
FEEDBACK__SENDEREMAIL=contact@EXAMPLE.TLD
FEEDBACK__SENDERNAME=BikeVoyager
FEEDBACK__RECIPIENTEMAIL=contact@EXAMPLE.TLD
FEEDBACK__SUBJECTPREFIX=[BikeVoyager]
FEEDBACK__SMTP__HOST=smtp-relay.brevo.com
FEEDBACK__SMTP__PORT=587
FEEDBACK__SMTP__USESSL=true
FEEDBACK__SMTP__USERNAME=__BREVO_SMTP_LOGIN__
FEEDBACK__SMTP__PASSWORD=__BREVO_SMTP_KEY__
# Origines autorisées (exemple)
ApiSecurity__AllowedOrigins__0=https://bike.EXAMPLE.TLD
ApiSecurity__AllowedOrigins__1=http://localhost:5173Guides détaillés:
Projet sous licence MIT. Voir LICENSE.



