Gaspri: Cómo construí una app de gasolineras con datos reales del gobierno
¿Qué es Gaspri?
Gaspri es una aplicación web que permite consultar y comparar los precios de combustible de todas las gasolineras de España en tiempo real. Filtra por provincia, tipo de combustible, y compara precios entre las principales compañías petroleras con un mapa interactivo.
Puedes verla en producción en gaspri.hgccarlos.es.
El punto de partida: la API del Ministerio
El Gobierno de España publica, a través del Ministerio para la Transición Ecológica (MITERD), datos abiertos con los precios de todas las gasolineras del país. El problema: la API devuelve un JSON enorme con miles de registros, sin historial, sin filtros avanzados y con actualizaciones irregulares.
Mi objetivo fue construir una capa intermedia que:
- Sincronizase automáticamente esos datos con una base de datos propia.
- Almacenase el historial de precios para análisis de tendencias.
- Expusiese una API limpia que el frontend pudiese consumir de forma eficiente.
Arquitectura
La aplicación está dividida en dos partes completamente independientes:
Backend (Python + PostgreSQL)
El backend está construido en Python y se ocupa de toda la lógica de negocio:
- Sincronización automática: Un proceso orquestado con n8n dispara la sincronización con la API del Ministerio periódicamente, actualizando precios y detectando nuevas gasolineras o cambios.
- Base de datos: PostgreSQL almacena tanto los datos actuales como el historial de precios, con índices optimizados para consultas por provincia, compañía y tipo de combustible.
- Deduplicación: Se implementó un sistema para evitar duplicados en el histórico, ahorrando espacio y mejorando el rendimiento.
- API REST: Expone endpoints para el frontend: listado de gasolineras con filtros, analíticas por provincia/compañía, precios mínimos y máximos, etc.
Frontend (Next.js)
El frontend está desarrollado con Next.js y ofrece:
- Mapa interactivo: Visualización geográfica de todas las gasolineras con marcadores por compañía, filtrados en tiempo real.
- Filtros dinámicos: Por provincia, tipo de combustible (gasolina 95, diésel, GLP…) y compañía.
- Analíticas: Tablas comparativas con precios medios por provincia y compañía.
- Noticias: Sección con noticias del sector energético.
- Diseño responsive: Interfaz adaptada a móvil con navegación inferior, pensada para consultar desde el surtidor.
- Formulario de contacto: Integrado con Brevo (ex-Sendinblue) para reportar errores o sugerencias.
- Protección anti-spam: Rate limiting por IP y honeypot en el formulario de contacto.
Retos técnicos
1. Volumen de datos
La API del Ministerio devuelve más de 11.000 gasolineras en cada petición. Procesar, deduplicar y almacenar ese volumen de forma eficiente requirió:
- Índices compuestos en PostgreSQL (
provincia,fecha,tipo_combustible). - Procesamiento por lotes en la sincronización.
- Consultas optimizadas con filtros en la base de datos, nunca en memoria.
2. Historial de un año
Para ofrecer análisis de tendencias, implementé un sistema de backfilling que reconstruyó el historial de precios del último año combinando snapshots guardados con la API del Ministerio.
3. Autenticación entre microservicios
La comunicación entre el frontend y el backend incluye cabeceras de seguridad y rate limiting para evitar abusos, sin necesidad de autenticación de usuario.
Stack completo
| Capa | Tecnología | |------|------------| | Frontend | Next.js, TypeScript, Tailwind CSS | | Backend | Python | | Base de datos | PostgreSQL | | Orquestación | n8n | | Despliegue | Docker + Coolify | | Mapa | Leaflet / MapLibre | | Email / Contacto | Brevo |
Conclusión
Gaspri es el proyecto en el que más me he centrado en los últimos meses. Combina consumo de APIs gubernamentales, procesamiento de datos en tiempo real, visualización geográfica y un frontend moderno y usable desde el móvil. Si te interesa la arquitectura en detalle o quieres ver el código, no dudes en contactarme.