Saltar al contenido
Florin Todor
Español
Descargar CV
← Todos los proyectos

Radar España - Trenes, metros y emergencias en un mapa

2026 Datos abiertosBackendSistemasCiberseguridad

Mapa de los trenes, metros, tranvías y autobuses de España, cruzado con tráfico, terremotos, incendios, avisos meteorológicos, la red eléctrica y los avisos oficiales de protección civil. Reúne 53 fuentes de datos abiertos y un motor de reglas avisa de lo que merece atención. Está en producción en radarespaña.es y su presentación en X pasó de 200.000 visualizaciones.

  • +200.000visualizaciones en X
  • 53fuentes de datos abiertos

Qué hace

  • Trenes de Renfe (Cercanías, AVE, Larga y Media Distancia), FGC, Euskotren y Metro Bilbao con su posición y su retraso en directo. Donde el operador sólo publica el horario (Ouigo, ALSA, una docena de metros y tranvías), una posición estimada y marcada como tal
  • Lo que le queda a cada tren hasta su destino, dibujado por la vía con la red ferroviaria de Adif, y su recorrido de los últimos 45 minutos
  • Motor de reglas que avisa de trenes detenidos en plena vía, varios parados en la misma zona, saltos bruscos de retraso, terremotos o incendios cerca de trenes y fuentes de datos caídas
  • Apagón de una isla: compara la demanda eléctrica real de cada isla de Canarias, Ceuta y Melilla con la prevista. Con los datos del 2 de noviembre habría avisado del apagón de La Palma a los 3 minutos, una hora antes que el aviso oficial
  • Unas 2.400 estaciones con su ficha (trenes que llegan con vía y retraso, líneas, conexiones a pie y accesibilidad) y casi 1.900 fotos de Wikimedia Commons revisadas una a una: licencia, autor y sin personas reconocibles
  • Sólo fuentes con licencia de reutilización, cada dato con su atribución y su fecha. Nada de endpoints internos de apps ni de visores: Adif bloquea los clientes automatizados y ese bloqueo no se esquiva

La web en marcha

Grabado en producción: Madrid con sus Cercanías, un AVE con lo que le queda hasta su destino, la ficha de una estación y una alerta. La web no se deja incrustar en otras páginas (es una de sus defensas), así que aquí va en vídeo.

Cómo está hecho

Seguridad

  • Ningún puerto web abierto en el VPS: las visitas entran por un túnel de Cloudflare.
  • Contenedor de sólo lectura, sin capacidades de Linux ni escalada de privilegios, y con techo de memoria y CPU para que un fallo no se coma la máquina.
  • CSP estricta, HSTS y prohibido incrustar la web en otras páginas. Estadísticas sin cookies y sin registro de visitas en el servidor.
  • Repositorio público sin pistas para un atacante: ni direcciones, ni claves, ni cómo se protege el servidor.

Caché y rendimiento

  • El directo se sirve desde la caché de Cloudflare y se renueva cada pocos segundos: el servidor lo calcula una vez y lo comparten todas las visitas, así que un pico de tráfico apenas le llega.
  • Respuestas de la API memorizadas, con caducidad y techo de memoria. Los cálculos caros (el recorrido de un tren, lo que le queda) tienen su propio tope y se comparten entre visitas.
  • Horarios GTFS de más de cien redes leídos por partes y guardados ya procesados: tras un reinicio el mapa vuelve completo en segundos, y el pico de memoria bajó de 924 a 584 MB.
  • Colas con tope y fallos aislados: ni una fuente que responda mal ni una avalancha de visitas tumban el servidor.

Despliegue

  • Pipeline en GitHub Actions: tests, entorno de pruebas con datos reales en el mismo VPS (tras Cloudflare Access), aprobación manual y producción, que despliega la misma imagen que se ha probado.
  • Sin cortes: la versión nueva arranca junto a la que funciona y nginx le pasa las visitas cuando ya ha cargado los datos. Si no arranca bien, vuelve sola a la anterior.
  • Tests sin red y con reloj inyectable: dan lo mismo en el servidor que en un portátil.

Arquitectura

  • Node.js con arquitectura hexagonal: dominio puro, casos de uso con sus puertos y un adaptador por fuente. Una fuente GTFS-Realtime nueva no necesita código.
  • Sin framework: servidor HTTP, planificador de sondeos y motor de reglas escritos a mano, con cuatro dependencias en total.
  • El trabajo pesado de CPU, como el XML de tráfico de la DGT, va en hilos aparte (worker_threads).