Desarrollado por CMD Servicios Tecnológicos SpA
FLOTA es una plataforma completa para administrar flotas vehiculares: documentos, mantenciones, gastos, GPS, vencimientos, alertas automáticas y análisis de documentos con inteligencia artificial.
- CRUD completo de vehículos con ficha técnica (marca, modelo, año, VIN, motor, color, titular)
- Ciclo de vida por vehículo — timeline cronológico con documentos, mantenciones y gastos
- GPS / Tracking — AirTag, GPS prepago o suscripción, con empresa y vencimiento
- Búsqueda de patentes vía AutoRiesgo (API gratuita chilena)
- Versionado automático — cada renovación archiva la versión anterior, siempre vigente disponible
- Análisis con visión — sube una foto del SOAP, permiso o revisión y la IA extrae tipo, vencimiento, patente y titular automáticamente
- Multi-proveedor — OpenAI, OpenRouter, Groq, Ollama (local) o cualquier endpoint OpenAI-compatible, configurable por empresa desde la UI
- Almacenamiento de archivos — PDF e imágenes hasta 25MB con validación de seguridad
- Historial de versiones — acceso a copias anteriores de cada documento
- Email de vencimientos vía Resend — avisos a 30, 14 y 7 días antes + día de vencimiento
- Anti-spam con dedupe en base de datos
- Template HTML profesional con branding
- Mantenciones con kilometraje, tipo, costo y descripción
- Gastos con categorías (combustible, seguro, patente, repuestos, etc.)
- KPIs de inversión total por vehículo
- Roles: admin (ve toda la flota) y usuario (ve solo vehículos asignados)
- API Keys para agentes IA y automatizaciones (scopes read/write)
- JWT + refresh tokens con rotación atómica
- Indicadores económicos (UF, UTM, dólar, euro) vía mindicador.cl
- Sismos en tiempo real vía api.gael.cloud
- Feriados nacionales vía date.nager.at
- 11 endpoints de lectura/escritura bajo
/api/agent/* - Discovery automático —
GET /api/agentdevuelve documentación legible por LLMs - Rate limiting por API key (60 req/min)
- PWA instalable — manifest, service worker, iconos, funciona offline
- Dark / Light mode con toggle persistente (Auto / Oscuro / Claro)
- Neural background animado adaptativo (efecto brand CMD)
- Responsive móvil — header de 2 filas, tabs scrollables
- Accesibilidad WCAG AA — labels, aria-live, focus-trap en modales, reduced motion
| Capa | Tecnología |
|---|---|
| Frontend | SPA vanilla (HTML+CSS+JS), sin framework, ~100KB |
| Backend | Node.js 22 + Express 4 |
| Base de datos | PostgreSQL 17 |
| Reverse proxy | nginx |
| Deploy | Docker Compose + Cloudflare Tunnel |
| IA | Cualquier API OpenAI-compatible (OpenAI, OpenRouter, Groq, Ollama) |
| Resend API | |
| DNS/SSL | Cloudflare |
- No usa React, Vue ni Angular
- No usa SDK de OpenAI (fetch nativo)
- No usa Supabase ni Firebase
- 100% PostgreSQL open source
FLOTA/
├── api/ Backend Node.js
│ ├── Dockerfile
│ ├── package.json
│ └── src/
│ ├── server.js Entry point + Express patch
│ ├── expressPatch.js Async error handler global
│ ├── config.js Variables de entorno (fail-fast)
│ ├── db.js Pool PostgreSQL + type parsers
│ ├── auth.js JWT + bcrypt + refresh tokens
│ ├── seed.js Bootstrap del admin
│ ├── aiVision.js Análisis IA multi-proveedor (PDF→imagen→análisis)
│ ├── boostr.js AutoRiesgo/Boostr (lookup patentes)
│ ├── notifier.js Alertas de email (Resend)
│ ├── middleware/
│ │ ├── auth.js JWT auth + control de acceso
│ │ ├── apiKeyAuth.js API key para agentes IA
│ │ ├── rateLimit.js Rate limit login
│ │ ├── rateLimitAgent.js Rate limit agente
│ │ ├── validate.js Validadores + buildUpdate
│ │ └── asyncHandler.js Wrapper async errors
│ └── routes/
│ ├── auth.js Login/logout/refresh/password
│ ├── vehiculos.js CRUD vehículos + lookup patente
│ ├── documentos.js CRUD + versionado + análisis IA
│ ├── mantenciones.js CRUD mantenciones
│ ├── gastos.js CRUD gastos
│ ├── usuarios.js CRUD usuarios + API keys
│ ├── resumen.js KPIs globales
│ ├── chile.js APIs públicas (UF/sismos/feriados)
│ └── agent.js API completa para agentes IA
├── db/
│ ├── init.sh Script de inicialización PostgreSQL
│ └── sql/
│ ├── 01-schema.sql Esquema completo (8 tablas)
│ └── 02-seed.sql Datos iniciales (vehículos demo)
├── web/
│ ├── Dockerfile nginx:alpine
│ ├── nginx.conf Proxy + headers de seguridad
│ └── public/
│ ├── index.html SPA completa (~2500 líneas)
│ ├── manifest.json PWA manifest
│ ├── sw.js Service Worker
│ ├── cmd-logo.png Logo CMD
│ └── icon-*.png Iconos PWA
├── docker-compose.yml Stack: db + api + web (red aislada)
└── .gitignore
- Servidor con Docker + Docker Compose
- Dominio con DNS en Cloudflare
# PostgreSQL
POSTGRES_SUPERUSER=postgres
POSTGRES_SUPERPASS=<secreto>
DB_PASSWORD=<secreto>
# JWT
JWT_SECRET=<64-chars-hex>
# Admin inicial
ADMIN_EMAIL=admin@empresa.com
ADMIN_PASSWORD=<password-inicial>
ADMIN_NOMBRE=Administrador
# OpenAI (OPCIONAL — fallback del servidor para análisis de documentos)
# Cada empresa puede configurar su propio proveedor IA desde la UI
# (OpenAI, OpenRouter, Groq, Ollama local o endpoint personalizado)
OPENAI_API_KEY=sk-...
# Resend (alertas de email)
RESEND_API_KEY=re_...
ALERTA_FROM=flota@empresa.com
ALERTA_TO=pagos@empresa.com
# Lookup de patentes (opcional, AutoRiesgo es gratis)
BOOSTR_API_KEY=Cada empresa elige su proveedor en Configuración (pestaña web, solo admin):
| Proveedor | API key | Modelos sugeridos (con visión) |
|---|---|---|
| OpenAI | sk-... |
gpt-4o, gpt-4o-mini, gpt-4.1 |
| OpenRouter | sk-or-... |
openai/gpt-4o-mini, anthropic/claude-3.5-sonnet, google/gemini-2.5-flash |
| Groq | gsk_... |
meta-llama/llama-4-scout-17b-16e-instruct |
| Ollama | no requiere | llama3.2-vision, qwen2.5vl, llava |
| Personalizado | según provider | cualquier endpoint /v1/chat/completions OpenAI-compatible |
- El modelo debe soportar entrada de imágenes (visión).
- Si la empresa no configura nada, se usa
OPENAI_API_KEYdel servidor como fallback (solo para OpenAI). - Ollama debe correr en el host Docker (
host.docker.internal:11434, ya mapeado endocker-compose.yml).
# Clonar
git clone https://github.com/cmadridnarvaez/FLOTA.git
cd FLOTA
# Configurar
cp .env.example .env # editar con tus valores
# Levantar
docker compose up -d --build
# Verificar
curl http://localhost:8090/api/healthcloudflared tunnel create flota
# Configurar ingress: flota.tudominio.com → http://localhost:8090
# Crear DNS CNAME flota.tudominio.com → <tunnel>.cfargotunnel.com- JWT con refresh tokens de rotación atómica
- API Keys hasheadas con SHA-256
- Rate limiting en login (10/15min) y agentes IA (60/min)
- Validación de archivos por magic numbers (no MIME del cliente)
- Path traversal cerrado en uploads
- SVG bloqueado (previene XSS almacenado)
- Content-Disposition: attachment en descargas
- Cookies httpOnly + sameSite + secure
- Fail-fast si faltan secretos obligatorios
- Parámetros $N en todas las queries SQL (sin inyección)
- Control de acceso por vehículo en cada endpoint
- UNIQUE parcial en documentos vigentes
- Transacciones en versionado de documentos
usuarios ──┬── acceso_vehiculo ──── vehiculos
│ ├── documentos (versionado: grupo_id + es_vigente)
│ ├── mantenciones
│ ├── gastos
│ └── gps (4 campos: tipo, empresa, device_id, vence)
│
├── refresh_tokens
├── api_keys
└── alerta_envios (dedupe de notificaciones)
Este proyecto está bajo la licencia MIT. Ver LICENSE.
Copyright © 2026 CMD Servicios Tecnológicos SpA.
FLOTA es un producto de CMD Servicios Tecnológicos SpA, empresa chilena de tecnología y servicios cloud.
Aplicación desarrollada por CMD Servicios Tecnológicos SpA