Contact
Travaillons ensemble
European Sourcing - Plateforme B2B d'Objets Publicitaires

European Sourcing - Plateforme B2B d'Objets Publicitaires

Un salon professionnel européen permanent en ligne pour l'industrie de l'objet publicitaire - 15+ applications interconnectées, 9M+ lignes de code, 7 langues, 8 ans de développement.

2010 - 2016
~6 ans
Software Engineer puis Senior Software Engineer
PHP 5.xSymfony 2/3MySQLElasticsearchAngularJSPropel ORMDoctrine ORMZend FrameworkMemcacheRabbitMQApacheProxmox VEAWS SESChefCoffeeScriptjQuery MobilePhoneGap/CordovaExtJS

Lignes de code

~9.2M

PHP, JS, Twig, CSS, HTML

Tables en base

97

MySQL (master-slave)

Sous-applications

15+

Écosystème microservices

Langues supportées

7

FR, EN, DE, ES, IT, NL, PT

Serveurs dédiés

9

OVH Proxmox VE

Connecteurs fournisseurs

26+

Import automatisé de données

Entrees de versioning

1,234

836 Git + 398 SVN

Sites revendeurs

~60

CMS hébergé MyEasyWeb

Présentation et définition du projet

Un salon professionnel européen permanent en ligne pour les objets publicitaires

European Sourcing est une plateforme B2B de sourcing d'objets publicitaires et promotionnels a l'échelle européenne. Le projet constitue un écosystème applicatif complet compose d'une quinzaine de sous-applications interconnectées, developpees sur une periode de plus de 6 ans (2010-2017).

La plateforme met en relation trois types d'acteurs du marche de l'objet publicitaire :

  • Les fournisseurs (fabricants/grossistes) qui référencent leurs catalogues produits
  • Les revendeurs/distributeurs (agences de communication par l'objet) qui recherchent des produits pour leurs clients
  • Les visiteurs qui consultent le catalogue en ligne

Le système fonctionne comme un salon professionnel permanent en ligne ("The European Online Tradeshow"), offrant aux fournisseurs une vitrine multicanal (catalogue en ligne, newsletters, bannieres publicitaires, guidebook annuel, Google Ads) et aux revendeurs un moteur de recherche produits multilingue couvrant 7 langues européennes.

Domaine métier

Communication par l'objet B2B - mise en relation des fournisseurs, revendeurs et agences européens dans l'industrie de l'objet promotionnel.

Utilisateurs cibles

Professionnels B2B a travers l'Europe - ~60 agences revendeurs hebergees, fournisseurs européens majeurs (Midocean, PF Concept, BIC, Paul Stricker, Topico, Inspirion, Makito, TopTex).

Périmètre fonctionnel
Catalogue produits multilingue (7 langues)
Recherche full-text (Elasticsearch)
Back-office fournisseurs/revendeurs
Import automatisé de données fournisseurs (26+ connecteurs)
API REST avec authentification WSSE
Système de traduction centralisé
Paiement en ligne (Sogenactif)
CMS mini-sites revendeurs (MyEasyWeb)
Applications mobiles (PhoneGap/Cordova)

Objectifs, contexte, enjeux et risques

Digitaliser le marche européen de l'objet publicitaire

Objectifs
  • Creer le **premier salon professionnel permanent en ligne** pour le marche européen de l'objet publicitaire
  • Proposer un **catalogue produits multilingue** (7 langues) agregeant les catalogues de dizaines de fournisseurs
  • Fournir aux revendeurs un **moteur de recherche avance** avec filtres par categorie, marque, prix, attributs, marquage
  • Automatiser l'**import des flux de données** fournisseurs (prix, stocks, docs, descriptions) de 26+ fournisseurs
  • Offrir aux revendeurs une solution **clé en main de mini-sites e-commerce** (MyEasyWeb) avec ~60 sites hébergés
  • Générer des **statistiques de consultation** détaillées pour les fournisseurs (vues produits, recherches, clics)
Contexte

Le projet initial (v1/v2) a été développé par SQLI, une ESN française, avec un framework PHP custom et des templates Smarty. Le code legacy contenait 398 revisions SVN couvrant la periode 2010-2013.

A partir de 2014-2016, l'équipe Medialeads a entrepris une réécriture complète de la plateforme (surnommee "Phoenix" pour l'API et "Rebirth" pour l'extranet), migrant progressivement du framework custom vers Symfony 2/3 tout en maintenant le site public sur un framework MVC custom plus leger.

La plateforme était multilingue (7 langues), multi-pays, avec une forte volumetrie de données produits, et la nécessite de maintenir la compatibilité avec les flux de données fournisseurs existants - le tout hébergé sur des serveurs dédiés OVH autogeres.

Enjeux

Modèle economique

Revenus des abonnements fournisseurs (240-288 EUR/an) et des services publicitaires (bannieres, newsletters, guidebook, Google Ads, mediaplanning).

Position stratégique

European Sourcing se positionnait comme la référence du sourcing d'objets publicitaires en ligne en Europe, en remplacement des catalogues papier et salons physiques traditionnels.

Écosystème de marques

La société opérait egalement TendanceObjet.com, Kadobjet.fr, FranceObjet.com, Omyague.com, GourmetOnline.pro - chaque marque ciblant un segment spécifique du marche.

Risques identifiés

Dette technique

Migration progressive d'un framework custom vers Symfony, coexistence de deux architectures (SVN legacy + Git moderne), hachage MD5 des mots de passe avec une seule iteration et sans salt.

Complexité d'intégration

Les flux de données fournisseurs étaient hétérogènes (CSV, XML, API), nécessitant des adaptateurs spécifiques par fournisseur - 26+ connecteurs identifiés.

Dépendance a l'infrastructure

9 serveurs dédiés OVH avec virtualisation Proxmox, replication MySQL master/slave, deploiements manuels via svn up + chmod -R 777.

Bus factor

Seulement 3 développeurs principaux pour l'ensemble de l'écosystème de 38 sous-projets et 9 serveurs.

Les étapes - Ce que j'ai fait

Du monolithe SQLI a l'architecture microservices distribuee

Phase 1
Développement SQLI et legacy SVN (2008-2013)
2008 - 2013
  • Gestion du code legacy hérité de SQLI - un monolithe PHP avec templates Smarty, sous versioning SVN (398 revisions)
  • Maintenance et extension de l'extranet pour les fournisseurs et revendeurs (CRUD produits, gestion d'docs, prix, attributs, marquages)
  • Operations de déploiement sur serveurs dédiés et coordination avec la documentation SQLI (47+ documents de spécifications)
  • Développement de scripts de correction de données pour résoudre les problèmes de qualité (categories parentes manquantes, couleurs incorrectes, docs cassees)
Phase 2
Reprise interne et microservices (2014-2016)
Jan 2016 - Dec 2016
  • Pilotage de la **migration de SVN vers GitHub** - 13 dépôts créés en janvier 2016, organisation medialeads avec 8 membres et 20+ repos prives
  • Réécriture de l'extranet (177 commits) sur un framework PHP MVC custom avec accès direct a la base MySQL
  • Développement de l'API REST (api.europeansourcing.com) sur Symfony 2.4 avec Propel ORM et authentification WSSE
  • Construction de connecteurs d'import automatique fournisseurs (15+ connecteurs : Pixika, Makito, Midocean, BIC, Paul Stricker, TopTex, Cybernecard)
  • Implémentation d'Elasticsearch pour la recherche full-text multilingue sur 7 index de langue
  • Création du système de traduction centralisé (translate.europeansourcing.com) sur Symfony 3.0
Phase 3
Modernisation "Rebirth" (2016-2017)
Mar 2016 - Nov 2016
  • Initiation de la **réécriture architecturale** avec des bundles Symfony partages (ESCoreBundle : 143 commits, ESSourcingBundle : 15 commits)
  • Conception de comportements Doctrine : Sluggable, Sortable, Timestampable, Translatable, Blameable, Toggleable, Visible, Overloadable, Tree
  • Implémentation du traitement asynchrone avec RabbitMQ pour l'import de données et les calculs de visibilité
  • Mise en place du provisioning d'infrastructure avec Chef pour le projet extranet_rebirth
Project Timeline
European Sourcing - 2008-2017
Supplier Data Import Flow
Versioning Activity Timeline

Les acteurs - Les interactions

Collaboration au sein d'une équipe réduite mais hautement productive

Équipe de développement

3 a 5 développeurs actifs selon les periodes, avec une répartition claire des responsabilites :

Jose DA COSTA

Lead développeur - 35,3% du versioning total (225 Git + 116 SVN). Dominant sur l'extranet (177 commits), flux (15), gestion du legacy SVN.

Thomas C.

Développeur senior - 36,9% (355 Git + 1 SVN). Dominant sur ESCoreBundle (113), translate (88), supplierbo (19).

wamania

Développeur - 24,2% (226 Git + 8 SVN). Dominant sur europeansourcing.com (166 commits), extranet (49).

IronXtreme

Développeur - 3,0% (29 commits Git sur ESCoreBundle).

Contribution Distribution (Git + SVN)
Commits per Repository
Parties prenantes externes

SQLI

ESN ayant développé la v1/v2/v3 (spécifications, développement initial)

Dolead

Agence de gestion Google AdWords (MCC 187-710-9091)

Universem

Agence SEO (audits TendanceObjet et Kadobjet)

OVH

Hébergeur (9 serveurs dédiés, compte LB6978-OVH)

Workflow de développement

Organisation GitHub medialeads (Bordeaux), branches par développeur (jose, fancyweb, wamania), documentation interne DokuWiki. Pas de processus formel de Pull Requests identifié - l'équipe s'appuyait sur des merges directs de branches et des zones de code attribuees a chaque développeur.

Les résultats

Impact mesurable pour l'entreprise et pour ma carriere

Pour moi
  • Maîtrise de l'écosystème Symfony 2/3 en production a grande échelle (Propel, Doctrine, bundles, services, sécurité, WSSE)
  • Expertise approfondie en replication MySQL master-slave, indexation Elasticsearch multilingue et cache Memcache
  • Développement de compétences solides en migration de code legacy - transition du monolithe SVN vers les microservices Git sans interruption de service
  • Acquisition de connaissances métier en marche B2B de l'objet publicitaire, automatisation de flux de données et e-commerce multi-pays
  • Apprentissage de la coordination au sein d'une petite équipe ou chaque développeur possede des portions significatives du code
Pour l'entreprise

Couverture fonctionnelle

Cycle complet du sourcing B2B couvert : catalogue, recherche, import, extranet, sites revendeurs, traduction, statistiques, paiement, SEO

Portee multilingue

7 langues européennes avec des index Elasticsearch dédiés et une gestion centralisée des traductions

Échelle d'automatisation

26+ connecteurs automatisés de données fournisseurs gérant des formats hétérogènes (CSV, XML, API) de grandes marques européennes

Réseau revendeurs

~60 mini-sites revendeurs hébergés sur la plateforme CMS MyEasyWeb

Écosystème de marques

11+ marques operees : europeansourcing.com, tendanceobjet.com, kadobjet.fr, franceobjet.com, omyague.com, et plus

Modèle de revenus

Modèle d'abonnement B2B stable (240-288 EUR/an par fournisseur) plus services publicitaires multicanal

  • Catalogue produits multilingue avec recherche Elasticsearch en 7 langues
  • API REST avec authentification WSSE stateless
  • 26+ connecteurs d'import automatisé de données fournisseurs
  • Back-office fournisseurs/revendeurs avec gestion complète des produits
  • Dashboard fournisseurs SPA (AngularJS + CoffeeScript)
  • ~60 mini-sites revendeurs hébergés (MyEasyWeb)
  • Système de paiement en ligne (Sogenactif)
  • Back-office SEO/marketing (Zend Framework + ExtJS)
  • Applications mobiles (jQuery Mobile + PhoneGap/Cordova)
Codebase Metrics
Microservices Ecosystem
Technology Distribution

Architecture & Diagrams

Technical architecture visualizations

Architecture Phase 2 (2016) - Draw.io
European Sourcing - Architecture Phase 2 (2016) - 9+ microservices on 9 OVH Proxmox servers
Architectural Évolution - Monolith to Microservices
WSSE Authentication - Inter-Service Communication
Entity-Relationship Diagram (Simplified)

Les lendemains du projet

Ce qui s'est passe après le projet

Les derniers commits identifiés datent de fin 2016 (ESCoreBundle, bo.myeasyweb.pro) avec le dernier fichier date étant un export Google AdWords de février 2017. La phase de modernisation "Rebirth" (Phase 3) semble avoir été interrompue avant son achevement.

Les données et le code de la plateforme ont été archives sur un système de backup NAS, preservant l'historique SVN complet (398 revisions), les 13 dépôts Git (836 commits), la bibliotheque complète de documentation SQLI (47+ documents), les dumps de base de données et les pages DokuWiki internes.

Le projet illustre un schéma classique de modernisation de legacy : une migration par phases qui accomplit des progrès significatifs (monolithe vers microservices, SVN vers Git, framework custom vers Symfony) mais ou la phase finale de consolidation ("Rebirth" avec bundles partages) est interrompue par des changements business ou organisationnels.

Les choix architecturaux de la Phase 2 - notamment l'approche orientee services avec des sous-domaines dédiés et l'authentification WSSE - se sont révélés pertinents et modernes pour leur époque. L'intégration d'Elasticsearch pour la recherche multilingue et l'infrastructure de connecteurs fournisseurs automatisés restent des réalisations techniquement impressionnantes.

Mon regard critique

Rétrospective honnete sur 8 ans de développement

Points forts
  • Architecture microservices bien pensee

    L'eclatement du monolithe SQLI en services spécialisés (API, recherche, flux, traduction, export, statistiques) démontré une vision architecturale solide. Chaque service a une responsabilité claire et un périmètre fonctionnel bien délimité.

  • Couverture fonctionnelle exceptionnelle

    La plateforme couvre l'intégralité du cycle de vie du sourcing B2B : catalogue, recherche, import automatisé, extranet fournisseurs, mini-sites revendeurs, traduction, statistiques, paiement, SEO.

  • Internationalisation native

    Le support de 7 langues avec des index Elasticsearch dédiés par langue et un système de traduction centralisé témoigne d'une ambition européenne reelle.

  • Automatisation des imports fournisseurs

    Les 26+ connecteurs gérant des formats hétérogènes (CSV, XML, API) représentent un investissement technique considerable et une valeur métier fondamentale.

Points d'amélioration
  • Pratiques de sécurité

    Hachage MD5 des mots de passe avec une seule iteration et sans salt base64 - une pratique obsolete et vulnérable même en 2016. Les fichiers de configuration contenaient des mots de passe en clair. Déploiement via chmod -R 777.

  • Absence de CI/CD

    Déploiement manuel via svn up, pas de pipeline d'intégration continue, pas de tests automatisés dans le workflow de déploiement.

  • Pas de releases ni tags

    Zero tags Git dans l'ensemble des 13 dépôts - pas de gestion de versions formelle, rendant les rollbacks difficiles.

  • Fragmentation technologique

    Coexistence de 4+ frameworks (PHP custom, Symfony 2.4, 2.8, 3.0, 3.1, Zend Framework 1) et 2 ORM (Propel, Doctrine) dans le même écosystème.

Ce que j'aurais fait différemment
  • Adopter un framework unique des le départ plutot que de maintenir un framework PHP custom en parallele de Symfony. La migration aurait pu etre plus radicale avec un front Symfony/Twig unifie.
  • Mettre en place une CI/CD des la migration vers GitHub (janvier 2016) - GitHub Actions n'existait pas encore, mais Jenkins, Travis CI ou GitLab CI étaient disponibles.
  • Utiliser Docker pour l'environnement de développement et le déploiement, plutot que des VPS Proxmox avec configuration manuelle.
  • Centraliser l'accès aux données via une seule API plutot que de connecter chaque service directement a la base MySQL.
  • Adopter bcrypt/scrypt pour le hachage des mots de passe des la migration vers Symfony.
Enseignements durables

La migration d'un legacy est un marathon

La transition du monolithe SQLI vers une architecture microservices a pris plus de 3 ans et n'était pas terminee. Planifier des jalons realistes et des compromis temporaires est essentiel.

L'automatisation des imports de données est critique

Les 26+ connecteurs fournisseurs représentent une valeur métier considerable mais aussi une dette de maintenance permanente - chaque fournisseur peut changer son format a tout moment.

L'internationalisation doit etre pensee des le debut

Le système de traduction centralisé est un excellent pattern. Gerer 7 langues après coup aurait été exponentiellement plus coûteux.

La documentation SSII est précieuse

Les spécifications SQLI ont permis de comprendre l'architecture même des années après la fin de la prestation. Investir dans la documentation technique a un ROI long terme.

Parcours associe

Experience professionnelle liee a cette realisation

Competences mobilisees

Competences techniques et humaines appliquees

Galerie d'images

Captures et visuels du projet