gg.dev
2023/Founding Engineer · Fullstack, Data & Elasticsearch

Nricher, plateforme SaaS de pricing intelligence e-commerce

Founding Engineer : data engineering vers Elasticsearch (moteur Java), conception des index et des agrégations, API NestJS de 330 endpoints et front Next.js.

Voir le site du projetnricher.io
ElasticsearchSnowflakeJava 21Spring BootNestJSNext.js 16React 19PostgreSQLDockerScalewayTypeScript

Un e-commerçant suit des milliers de références, face à des concurrents qui changent leurs prix tous les jours. Nricher lui dit, référence par référence : qui vend la même chose, à quel prix, et si sa fiche produit tient la comparaison.

Au départ, la data existait déjà, mais pas le SaaS : les analyses étaient livrées via un Power BI. Construction de la plateforme à partir de là, et écriture de l’intégralité du code : le moteur qui indexe la data dans Elasticsearch, l’API qui la sert, les écrans qui l’exposent, et l’infrastructure qui fait tourner l’ensemble.

Périmètre data engineering : du data warehouse à Elasticsearch, avec le calcul, le streaming, l’indexation et le cycle de vie des index. Le data warehouse lui-même, son alimentation et sa modélisation étaient gérés par l’équipe data.

11
domaines ingérésSnowflake vers Elasticsearch
330
endpoints APINestJS, 245 services
177
colonnes filtrablesmoteur de filtres typé
24
index Elasticsearchmulti-tenants
01

Rôle et périmètre

Développement du produit de bout en bout, du moteur d’indexation jusqu’aux écrans utilisés par les clients. En amont, le data warehouse restait géré par l’équipe data.

PérimètreRéalisations
Data engineeringDu data warehouse à Elasticsearch : moteur Java 21 / Spring Boot, calcul et indexation de 11 domaines
Search & analyticsConception des index, agrégations, moteur de filtres, recherche produit
BackendAPI NestJS, modélisation PostgreSQL, exports asynchrones
FrontendVues analytiques Next.js, migration MUI vers shadcn/ui
InfrastructureMigration Heroku vers Scaleway, CI/CD, déploiement sans coupure
02

Architecture

Développement du moteur d’indexation, des index Elasticsearch, de l’API et du front, soit tout ce qui se trouve en aval du data warehouse.

BriqueRôle
SnowflakeData warehouse source des données de marché, tenu par l’équipe data
Moteur d’indexation (Java)Calcule, streame et indexe vers Elasticsearch
ElasticsearchCouche de service : tout le read analytique
API NestJS + front Next.jsProduit SaaS : vues analytiques, filtres, exports
03

Moteur d’indexation

Data engineering, du data warehouse à Elasticsearch

Premier chantier : sortir du Power BI. Écriture du service qui prend la data du data warehouse, la calcule, la streame et l’indexe dans Elasticsearch, pour 11 domaines métier. Sans lui, aucune vue analytique n’existe.

11

domaines

un pipeline par domaine

100 k

lignes par fetch

streaming colonne

2 000

docs par bulk

indexation par lots

  • Pipeline producteur / consommateur écrit à la main : file bornée pour la back-pressure, pool de consommateurs, arrêt propre. La mémoire dépend de la file, pas du volume de la source.
  • Réindexation sans coupure : index horodaté puis bascule d’alias atomique, avec une garde qui préserve les données en place si un run ne produit rien.
  • Runs isolés dans des conteneurs éphémères plafonnés en mémoire, suivi d’état persisté et notification en fin de traitement.
04

Elasticsearch

Le cœur analytique du produit

  • Index multi-tenants : passage d’un index par client à des index globaux, isolation centralisée en un point unique du code.
  • Calcul déporté côté cluster : les écarts de prix sont classés par agrégation et script Painless, en une requête et sans post-traitement.
  • Volumétrie : pagination search_after et composite pour les exports massifs, updateByQuery asynchrone avec progression réelle.
  • Moteur de filtres : un DSL typé partagé front/back, compilé en Query DSL, avec facettes correctes sur 177 colonnes.
  • Recherche produit tolérante aux fautes : titre, EAN, SKU, URL ou liste collée depuis Excel, avec search-as-you-type. Le module le plus testé du projet.

Observabilité

Chaque requête passe par un wrapper APM qui sépare le temps cluster du temps applicatif. C’est ce qui distingue une requête réellement lente d’un problème de volume ou de sérialisation, et ce qui a orienté les optimisations.

05

Backend et frontend

API NestJS, Next.js 16, React 19

  • API NestJS : 330 endpoints, modélisation PostgreSQL, exports massifs en jobs asynchrones annulables.
  • Sécurité conçue de bout en bout : authentification par jetons avec rotation, second facteur, contrôle d’accès par rôles, isolation multi-tenant à plusieurs niveaux.
  • ~1 200 fichiers migrés de MUI vers shadcn/ui + Tailwind, en dépréciation progressive et sans gel de livraison.
  • Vues analytiques Next.js 16 / React 19 : tables configurables, rendu à la demande, virtualisation, et un composant de graphique SVG écrit de zéro.
06

DevOps

Migration Heroku vers Scaleway, menée en autonomie

Sortie d’Heroku et reconstruction complète de l’infrastructure, sans interruption pour les clients.

BriqueChoix
ComputeVPS Scaleway, préproduction iso-prod
Base de donnéesPostgreSQL 17 managé en haute disponibilité
CI/CDGitHub Actions à barrières test, build, deploy
ObservabilitéSentry, Elastic APM, Grafana

Déploiement blue/green écrit à la main : la nouvelle version démarre à côté de l’ancienne, le trafic ne lui est confié qu’après validation de son état de santé, et tout démarrage qui échoue déclenche un retour arrière automatique.

« Pourquoi pas Kubernetes ? »

Une seule application, un seul serveur, une seule personne pour l’exploiter : Kubernetes aurait ajouté un système à opérer pour un besoin que Traefik et quarante lignes de bash couvrent, rollback automatique compris. Le seuil où il se justifie reste clair : plusieurs services à scaler séparément, ou plusieurs équipes qui déploient en parallèle.

07

Ce que ce projet démontre

D’un Power BI et d’un data warehouse existant à un produit SaaS vendu à des retailers. Compétences mises en œuvre :

CompétencePreuve
Data engineeringPipeline Java du data warehouse vers Elasticsearch : back-pressure, indexation par lots, réindexation sans coupure
Elasticsearch avancéIndex multi-tenants, agrégations, Painless, pagination profonde, transforms
BackendAPI NestJS de 330 endpoints, jobs asynchrones, sécurité multi-tenant
FrontendNext.js 16 / React 19, migration UI de 1 200 fichiers sans gel de livraison
DevOpsHeroku vers Scaleway, CI/CD à barrières, blue/green avec retour arrière automatique
IndustrialisationProcédures d’agent versionnées pour tenir cette surface avec une seule personne