Some checks failed
Auto Tag on Merge to Main / auto-tag (push) Successful in 27s
CI - Lint and Build / lint-backend (push) Failing after 30s
CI - Lint and Build / lint-frontend (push) Failing after 2s
CI - Lint and Build / build-frontend (push) Has been skipped
CI - Lint and Build / docker-build-test (push) Has been skipped
Complete real-time train tracking system for Spanish railways (Renfe/Cercanías): - Backend API (Node.js/Express) with GTFS-RT polling workers - Frontend dashboard (React/Vite) with Leaflet maps - Real-time updates via Socket.io WebSocket - PostgreSQL/PostGIS database with Flyway migrations - Redis caching layer - Docker Compose configuration for development and production - Gitea CI/CD workflows (lint, auto-tag, release) - Production deployment with nginx + Let's Encrypt SSL 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
6.5 KiB
6.5 KiB
Sistema de Tracking de Trenes - Referencia Operativa
Estado del Proyecto (27 Nov 2025)
| Fase | Backend | Frontend |
|---|---|---|
| 1. MVP | ✅ 100% | ✅ 100% |
| 2. Enriquecimiento | ✅ 100% | ⏳ 0% |
| 3. Analytics | ✅ 100% | ⏳ 0% |
Quick Start
# 1. Configurar
cp .env.example .env
# Editar .env con contraseñas seguras
# 2. Ejecutar migraciones
make migrate
# 3. Iniciar
make start
# 4. Acceder
# App: http://localhost
# API: http://localhost/api
Servicios Docker
| Servicio | Puerto | Descripción |
|---|---|---|
| nginx | 80 | Reverse proxy |
| api | 3000 | API REST + WebSocket |
| frontend | 5173 | React app |
| postgres | 5432 | PostgreSQL + PostGIS |
| redis | 6379 | Cache |
| worker | - | GTFS-RT Vehicle Positions |
| gtfs-static-syncer | - | Sync GTFS Static (3 AM) |
| trip-updates-poller | - | Trip Updates (30s) |
| alerts-poller | - | Service Alerts (30s) |
| analytics-refresher | - | Refresh vistas (15 min) |
API Endpoints
Fase 1 - Core
GET /health - Health check
GET /trains/current - Posiciones actuales
GET /trains/:id - Info de un tren
GET /trains/:id/history - Histórico de posiciones
GET /trains/:id/path - Trayectoria
GET /trains/area - Trenes en área geográfica
GET /routes - Todas las rutas
GET /routes/:id - Ruta específica
GET /stations - Todas las estaciones
GET /stations/:id - Estación específica
GET /stats - Estadísticas sistema
WS /ws - WebSocket (Socket.io)
Fase 2 - Alertas y Delays
GET /alerts - Alertas activas
GET /alerts/:id - Alerta específica
GET /alerts/route/:routeId - Alertas por ruta
GET /trips - Viajes activos hoy
GET /trips/:id - Detalles de viaje
GET /trips/:id/delays - Retrasos de viaje
GET /trips/delayed/all - Todos los retrasados
Fase 3 - Analytics
GET /analytics/traffic/heatmap - Heatmap de tráfico
GET /analytics/traffic/hourly - Tráfico por hora
GET /analytics/statistics/daily - Estadísticas diarias
GET /analytics/delays/top-routes - Rutas más retrasadas
GET /analytics/export - Exportar datos (CSV/JSON/GeoJSON)
GET /explorer/routes/:routeId - Explorar ruta completa
GET /explorer/planner - Planificador de viajes
GET /explorer/search - Búsqueda de estaciones
WebSocket Events
// Cliente
socket.emit('subscribe:train', trainId);
socket.emit('unsubscribe:train', trainId);
// Servidor
socket.on('trains:update', (positions) => {});
socket.on('train:update', (position) => {});
Comandos Make
make start # Iniciar servicios
make stop # Detener servicios
make logs # Ver todos los logs
make migrate # Ejecutar migraciones
make psql # Conectar a PostgreSQL
make redis-cli # Conectar a Redis
make debug-start # Iniciar con Adminer + Redis Commander
make test-start # Entorno de testing
make backup-db # Backup de BD
Base de Datos
Tablas Principales
trains- Catálogo de trenestrain_positions- Histórico (particionada por mes)routes- Rutas y líneasstations- Estacionesalerts- Alertas e incidenciastrips- Viajes programados (GTFS Static)trip_updates- Actualizaciones tiempo real
Funciones Útiles
-- Limpiar posiciones antiguas (>90 días)
SELECT cleanup_old_positions(90);
-- Crear siguiente partición mensual
SELECT create_next_partition();
-- Trayectoria de un tren
SELECT * FROM get_train_path('TRAIN_ID', '2025-01-01', '2025-01-02');
-- Trenes en área geográfica
SELECT * FROM get_trains_in_area(40.0, -4.0, 41.0, -3.0);
-- Próximas salidas desde estación
SELECT * FROM get_next_departures('STATION_ID', 10);
Fuentes de Datos GTFS-RT
| Feed | URL | Frecuencia |
|---|---|---|
| Vehicle Positions | https://gtfsrt.renfe.com/vehicle_positions.pb | 30s |
| Trip Updates | https://gtfsrt.renfe.com/trip_updates_cercanias.pb | 30s |
| Service Alerts | https://gtfsrt.renfe.com/alerts.pb | 30s |
| GTFS Static | https://data.renfe.com/dataset | Diario |
Estructura del Proyecto
trenes/
├── backend/src/
│ ├── api/
│ │ ├── server.js # API + WebSocket
│ │ └── routes/ # Endpoints (8 archivos)
│ ├── worker/ # 5 workers
│ ├── lib/ # db, redis, logger
│ └── config/
├── frontend/src/
│ ├── components/ # TrainMap, TrainInfo, Timeline
│ ├── hooks/useTrains.js # WebSocket hook
│ └── App.jsx
├── database/migrations/ # V1-V6
├── nginx/ # Reverse proxy config
├── docker-compose.yml
├── Makefile
└── .env.example
Troubleshooting
No se ven trenes
docker compose logs worker # Verificar worker
make psql
> SELECT COUNT(*) FROM train_positions WHERE recorded_at > NOW() - INTERVAL '1 hour';
Error conexión WebSocket
- Verificar
CORS_ORIGINen.env - Verificar
VITE_WS_URLen frontend
BD sin datos
make migrate # Ejecutar migraciones
make migrate-info # Verificar estado
Siguiente Fase: Frontend Fase 2/3
Pendiente implementar:
- Componente AlertsPanel - Mostrar alertas activas
- Componente PunctualityMonitor - Dashboard de puntualidad
- Timeline funcional - Reproducción de histórico
- Heatmap de tráfico - Visualización en mapa
- Dashboard Analytics - Gráficos y estadísticas
- Planificador UI - Interfaz de búsqueda de viajes
APIs disponibles para frontend:
GET /alerts- Lista de alertasGET /trips/delayed/all- Viajes retrasadosGET /analytics/traffic/heatmap- Datos para heatmapGET /analytics/statistics/daily- EstadísticasGET /explorer/planner?from=X&to=Y&time=Z- Planificador
Documentación Adicional
README.md- Introducción y setuparquitectura-sistema-tracking-trenes.md- Arquitectura detalladaFUENTES_DATOS.md- Fuentes de datos disponiblesFASE1-MVP.md- Detalles Fase 1FASE2-ENRIQUECIMIENTO.md- Detalles Fase 2FASE3-ANALYTICS.md- Detalles Fase 3
Última actualización: 27 noviembre 2025