Accueil/Ressources/Stack Technique Joinsteer : de 0 à 2M+ Annonces

Stack Technique — Architecture Cloud & IA

Joinsteer est une marketplace automobile construite par Alpium Capital. Lancée en 2023, elle traite aujourd'hui plus de 2 millions d'annonces. Cet article détaille les choix techniques, les erreurs, et ce qui fonctionne vraiment en production.

1. Architecture globale

Nous avons choisi une architecture polyrepo plutôt que monorepo. Trois dépôts distincts : l'API, le frontend, et les workers asynchrones. Ce modèle nous offre une autonomie d'équipe et des déploiements indépendants.

Backend : Laravel 11 sur PHP 8.3

Nous avons sélectionné Laravel parce qu'il nous permet d'itérer rapidement. PHP 8.3 offre les typed properties, les attributes, et une performance suffisante. Node.js aurait imposé une gestion complexe d'événements asynchrones. Go aurait été overkill pour une MVP. Laravel nous donne une véritable productivité sans perdre en contrôle.

L'API expose environ 45 endpoints REST. Pas de GraphQL : la complexité des requêtes reste limitée et REST suffit amplement. Nous utilisons Sanctum pour l'authentification OAuth2.

Frontend : Next.js 14 App Router avec rendu serveur

Le rendu serveur était non-négociable pour nous. Chaque listing automobile génère un meta titre, une description, et du structured data unique. Google a crawlé et indexé 400k+ pages en 18 mois grâce à ça. Next.js 14 App Router nous permet des routes dynamiques propres sans complexité supplémentaire.

Les Core Web Vitals cibles : LCP sous 2.5 secondes, CLS sous 0.1, FID sous 100ms. Nous les atteignons avec une architecture image optimisée (formats webp, lazy loading natif).

Infrastructure : Google Cloud Run

Cloud Run fut transformateur pour nous. Conteneurs stateless, scaling de zéro à N en secondes, et paiement à l'usage. Nous n'avons jamais besoin de manager un cluster Kubernetes. Les cold starts initiaux (~1.2 secondes) ont été optimisés à 400ms avec des min-instances configurées intelligemment.

Coût total infrastructure : environ 800 euros par mois pour 2M+ annonces, du scraping, du ML, et 99.7% d'uptime sur 12 mois.

Données : PostgreSQL et Redis

Cloud SQL PostgreSQL. Pourquoi pas MySQL ? Les transactions MVCC de Postgres offrent une isolation meilleure. Les JSON fields natifs simplifient le stockage de métadonnées hétérogènes. Les index GiST accélèrent les recherches géographiques sans plugin externe.

Redis gère le cache et les sessions distribuées. Pas de file d'attente Redis : nous utilisons Cloud Pub/Sub pour l'asynchrone pur (découplage plus fort).

2. Data pipeline & scraping

Nous collectons les annonces de trois sources : constructeurs automobiles, sociétés de LLD/LOA, et marketplaces tierces. Chaque source expose des formats différents (XML, JSON, CSV, PDF). Ingérer 50k annonces par jour impose une normalisation stricte.

Pipeline ETL en serverless

Les scrapes déclenchent Cloud Functions. Elles parsent les données brutes et les publient sur Cloud Pub/Sub. Des workers Cloud Run consomment les messages, normalisent, et insèrent en base. Ce découplage nous permet de scaler indépendamment chaque étape.

Latence totale : un véhicule apparaît en production environ 4 minutes après le scrape initial. Acceptable pour un marché qui change lentement.

Déduplication et matching

Nous avons implémenté du fuzzy matching sur trois clés : VIN, modèle+prix, et plaque d'immatriculation. Le VIN est souverain quand il existe. Pour le reste, un score Levenshtein supprime les doublons. Les faux positifs sont minimes : environ 0.3% d'erreurs de matching sur 50k/jour.

Notre base dédupliquée contient 2.1M annonces uniques (pas 2M brutes). La qualité des données prime sur le volume vanité.

3. SEO programmatique et indexation

Nous générons 100k+ landing pages décorrélées. Chaque page cible une combinaison marque/modèle/ville : "Renault Clio occasion à Lyon", "Peugeot 208 LOA en Île-de-France". Cela crée des centaines de milliers d'URLs uniques alimentant l'index Google.

Structured data et sitemaps

Chaque listing inclut schema.org Vehicle (marque, modèle, prix, kilométrage, carburant). Les pages catégories utilisent FAQPage (30+ questions générées). Les breadcrumbs sont typés BreadcrumbList.

Les sitemaps sont shardés en 8 fichiers de 50k URLs chacun. Google indexe environ 400k pages en 18 mois. Notre taux d'indexation est supérieur à 95%.

Nous avons utilisé Haloscan pour identifier les mots-clés à volume élevé et faible concurrence : "Citroën C1 occasion moins de 10000 euros", "Volkswagen Golf électrique leasing". Ces recherches nous orienter vers les niches génératrices de trafic.

Core Web Vitals en production

Metric LCP (Largest Contentful Paint) : 1.8 secondes en moyenne. CLS (Cumulative Layout Shift) : 0.07. Pas de plugins de third-party bloquants. Fonts sont auto-hosted. Images servent en webp avec fallback jpeg. Pas de JavaScript onéreux en critical rendering path.

4. IA et Machine Learning en production

L'IA n'était pas facultatif. Nous avons intégré trois modèles en production dès mois 8.

Scoring qualité avec Gemini Vision API

Chaque annonce contient 3-5 photos véhicule. Nous envoyons ces images à Gemini Vision pour un scoring qualité. Le modèle évalue : photo floue (oui/non), dommages visibles (oui/non), intérieur propre (1-5). Un score global 0-100 reflète la qualité de la présentation.

Impact : les vendeurs reçoivent un feedback automatisé, améliorant progressivement les photos. Les acheteurs filtrent sur qualité. Coût mensuel : environ 120 euros pour 2M images.

Estimation de prix avec XGBoost

Notre modèle XGBoost a été entraîné sur 500k transactions historiques : marque, modèle, année, kilométrage, localisation, carburant, transmission. L'RMSE atteint 8.2% (erreur absolue moyenne : 2100 euros sur une Renault Clio).

Nous recalibrons le modèle mensuellement. Les prix de marché changent, surtout pour les motorisations électriques. Le modèle capture ces tendances.

Détection d'anomalies kilométriques

Un modèle Isolation Forest détecte les kilométrages suspects. Une Renault Clio 2018 avec 250k km est normal. Avec 25k km ? Anomalie flagrante. Nous flag automatiquement ces annonces pour vérification manuelle.

Taux de faux positifs : 4%. Ces annonces frauduleuses sont rejetées avant publication.

Computer Vision pour classification et détection

Nous classifions automatiquement le type de véhicule (SUV, berline, monospace) en analysant les images. Un modèle détecte les dommages (rayures, enfoncements) sur la carrosserie. Précision : 91% sur la classification, 87% sur la détection de dommages.

Infrastructure : Vertex AI avec GPU T4 pour l'inférence. Coût ML global : ~200 euros mensuels.

5. Infrastructure et DevOps

L'infrastructure est décrite en deux mots : simple et automatisée.

CI/CD : GitHub Actions vers Cloud Run

Chaque push sur main déclenche GitHub Actions. Tests unitaires, linting, build Docker. L'image remonte vers Artifact Registry. Cloud Run déploie la nouvelle version en 60 secondes. Zéro downtime avec rolling deployment.

Nous déployons environ 15 fois par semaine. Pas de peur d'itérer : les rollbacks sont instantanés.

Monitoring et alertes

Cloud Monitoring agrège les logs et métriques. Sentry capture les exceptions en production. Nous avons des alertes sur : latence P95 > 1000ms, taux d'erreur 5xx > 1%, Redis latency > 50ms.

Dashboard principal : 12 métriques critiques. Temps moyen pour détecter et fixer un bug en production : 8 minutes.

Coûts et uptime

Décomposition mensuelle (~800 euros) :

Uptime sur 12 mois : 99.7%. Deux incidents majeurs (une corruption de DB, une fuite mémoire). Récupération en moins de 1 heure chaque fois.

6. Tableau récapitulatif du stack

Composant Technologie Pourquoi ce choix
Backend API Laravel 11 / PHP 8.3 Itération rapide, typage fort, écosystème mature
Frontend Next.js 14 App Router SSR requis pour SEO, pages dynamiques propres
Base données Cloud SQL PostgreSQL