Prix de l'essence
Contactez-moi- CodeIgniter 4
- Elasticsearch
- n8n
- Redis
- MariaDB
- Open data
- Schema.org
Le site en bref
MaStationService répond à une question simple : où faire le plein au meilleur prix, près de chez moi, maintenant ? Le site exploite les prix déclarés par les stations-service françaises et les remet à jour toutes les heures.
Fonctionnalités :
- Recherche par ville ou par géolocalisation, avec autocomplétion des communes.
- Page par commune : la station la moins chère pour chaque carburant (gazole, SP95, E10, SP98, E85, GPL), l’écart avec la moyenne nationale, la carte des stations (Leaflet) et un tableau triable.
- Page par station : adresse, carte, prix actuels avec leur date de mise à jour, évolution des prix et stations voisines.
- Recommandation d’achat : une popin conseille le moment de faire le plein, et l’utilisateur peut noter ce conseil (pouce vert ou rouge).
- Alerte prix en baisse : un email arrive au moment opportun pour faire le plein, selon les carburants, la fréquence et la station ou la zone choisies. L’abonnement passe par une double validation (opt-in) et un captcha, et les alertes sont générées chaque jour.
- Compte utilisateur pour gérer ses alertes.
- Blog et FAQ sur le prix des carburants.
La page d’accueil réunit l’essentiel : la recherche par ville, la recommandation d’achat, le graphique de l’évolution des prix moyens (comparés au cours du baril de pétrole) et le tableau des tendances à la veille, à la semaine et au mois.
But du projet
Les données publiques sur les carburants sont riches mais brutes : des dizaines de milliers de lignes, des identifiants de stations et des horodatages. Le projet les transforme en réponses locales et lisibles, accessibles depuis un moteur de recherche (« prix essence à Lyon ») ou depuis le téléphone, devant la pompe.
C’est aussi un terrain d’expérimentation complet. Il réunit sur un même produit en production l’ingestion de données, la recherche géographique, la performance, le SEO à grande échelle et l’automatisation.
Stack technique
- Back-end : PHP 8 et CodeIgniter 4. Les contrôleurs sont distincts pour les pages, l’API JSON et le monitoring.
- Recherche et données de prix : Elasticsearch 9, avec plusieurs index :
essence: les prix courants ;carburant-AAAA.MM.JJ.HH: un instantané par heure ;communes-france: les communes et leur géolocalisation ;pdv: les points de vente OpenStreetMap ;histo-carburants: les statistiques de recherche.
- Cache : Redis, avec des durées adaptées à chaque donnée (15 min pour les prix, 2 h pour les stations, 24 h pour la géographie) et un repli sur fichier.
- Base relationnelle : MariaDB pour les alertes, les comptes, les recommandations et les articles du blog.
- Automatisation : n8n pour l’ingestion horaire des prix et la production des articles du blog.
- Front : rendu serveur, Leaflet pour les cartes, Highcharts pour les graphiques.
- Qualité et sécurité :
- CI GitLab qui enchaîne qualité, tests, sécurité puis déploiement (PHPStan, PHP-CS-Fixer, PHPUnit,
composer audit) ; - limitation de débit sur les endpoints sensibles et compression GZIP ;
- hCaptcha sur les formulaires.
- CI GitLab qui enchaîne qualité, tests, sécurité puis déploiement (PHPStan, PHP-CS-Fixer, PHPUnit,
- Mesure d’audience : Matomo auto-hébergé.
Référencement
Le site est construit pour répondre à des requêtes locales à très fort volume, de la forme « prix essence + ville » :
- Une URL par commune (
/lyon,/rennes…), avec un H1 en forme de question (« Combien coûte le carburant à Lyon ? ») et un texte généré à partir des prix réels du moment. - Une URL par station, lisible et descriptive (
/station/<id>-<enseigne>-<ville>). - Un sitemap XML dynamique, qui couvre les 3 000 communes les plus peuplées et tous les articles publiés du blog.
- Une URL canonique sur chaque page, et des pages légales en
nofollowdans le pied de page. - Un contenu frais en permanence : la date de dernière mise à jour des prix est affichée en tête de page, et le blog publie de nouveaux articles en continu.
- La performance comme levier SEO : cache Redis, compression GZIP et requêtes Elasticsearch regroupées (
msearch).
Maillage interne
Le maillage suit la géographie : depuis n’importe quelle page, on rebondit vers ce qui est proche.
- Commune vers communes voisines : chaque page ville liste les communes situées dans un rayon de 30 km. Ce rayon passe à 70 km s’il y en a moins de 20, pour que les zones rurales soient elles aussi bien maillées.
- Commune vers stations : chaque ligne du tableau des prix pointe vers la page de la station.
- Station vers stations voisines et communes proches, ce qui ferme la boucle.
- Blog : chaque article généré contient 2 liens internes vers des articles passés choisis pour leur pertinence.
- Pied de page commun : accueil, blog, FAQ, qui sommes-nous.
Données structurées
Chaque type de page publie un JSON-LD Schema.org adapté :
WebSite+SearchActionsur tout le site : il décrit le moteur de recherche interne par ville.QAPagesur les pages commune : la question « Combien coûte l’essence autour de X ? » a pour réponse les meilleurs prix du moment, par carburant.GasStationetLocalBusinesssur les pages station, avec l’adresse postale, les coordonnées GPS (GeoCoordinates), le logo de l’enseigne et la devise acceptée.
Les flux n8n
Ingestion des prix, toutes les heures
Un workflow n8n se déclenche toutes les heures et met à jour Elasticsearch à partir du flux instantané des prix publié en open data :
- Déclenchement horaire par le planificateur de n8n.
- Téléchargement du flux des prix publié par l’État, récupéré en texte brut puis analysé explicitement. Un contrôle bloque la suite si la réponse est vide ou invalide : on n’écrase jamais des prix valides par des données corrompues.
- Transformation de chaque station en document normalisé : identifiant, position géographique (
geo_point), adresse, services, et pour chaque carburant le prix et la date de mise à jour. - Écriture en masse (
_bulkNDJSON) dans deux cibles :- l’index
essence, qui porte l’état courant lu par les pages ; - un index horaire
carburant-AAAA.MM.JJ.HH, qui garde l’historique utilisé pour les graphiques d’évolution et la recommandation d’achat.
- l’index
- Rétention maîtrisée : une politique ILM fait vieillir les index horaires (passage en lecture seule à 2 jours) puis les supprime au bout de 30 jours, soit environ 720 instantanés.
- Supervision : toute erreur déclenche une alerte par email.
Côté site, le cache Redis des prix dure 15 minutes : chaque nouvel import est visible en ligne en moins d’un quart d’heure.
Rédaction du blog, chaque jour
Un second workflow tourne chaque matin à 6 h :
- Il lit des flux RSS d’actualité sur les carburants et ne garde que les 3 derniers jours.
- Un premier modèle d’IA rédige l’article, en y plaçant 2 liens internes vers des articles déjà publiés.
- Un deuxième passage relit l’article, un troisième le finalise.
- L’article est inséré dans MariaDB, puis repris automatiquement dans le blog et le sitemap.
Historique
La transparence des prix des carburants est imposée en France depuis 2007 avec le site prix-carburants.gouv.fr, alimenté par les déclarations obligatoires des stations. Le passage à un flux open data mis à jour en continu a permis de construire des services tiers comme MaStationService, sans scraping.
Mon expertise
Je conçois et j’exploite MaStationService de bout en bout :
- ingestion horaire des prix publics par un flux n8n, indexés dans Elasticsearch ;
- application PHP CodeIgniter 4 avec Redis, MariaDB, cartes Leaflet et graphiques Highcharts ;
- fonctions utilisateur : recherche par ville ou géolocalisation, recommandation d’achat, alertes de prix par e-mail avec double validation ;
- SEO à grande échelle, suivi avec Search Console et Matomo.
Réalisations
- MaStationService.fr : le comparateur décrit sur cette page, conçu, développé et exploité de bout en bout.