Proyecto educativo: Plataforma de monitoreo de dispositivos IoT en tiempo real con Event-Driven Architecture (EDA), procesamiento resiliente de eventos, dashboard PWA, y seguridad enterprise-grade.
| Documento | Audiencia | DescripciΓ³n |
|---|---|---|
| docs/INDEX.md | π€ Todos | Γndice principal de toda la documentaciΓ³n + mapa de mΓ³dulos |
| docs/diagrams/architecture.md | π€ Todos | 6 diagramas Mermaid β C4, event flow, ERD, state machine, security |
| docs/technical/01_architecture.md | ποΈ Arquitectos | C4 Mermaid, EDA, resiliencia, persistencia |
| docs/technical/07_security.md | π Security | 6 capas de defensa en profundidad |
| docs/technical/05_testing.md | π§ͺ QA/Dev | 92+ tests, archivos, comandos, desafΓos |
| docs/technical/02_design_patterns.md | π¨βπ» Developers | Patrones de diseΓ±o implementados |
| docs/operations/01_infrastructure.md | βοΈ DevOps | Docker hardened, resource limits, secrets |
| docs/adr/ | ποΈ Arquitectos | 5 ADRs con contexto, alternativas y trade-offs |
| docs/product/02_prd.md | π Product | Product Requirements Document |
| docs/domain/business_rules.md | π Domain | Reglas de negocio del sistema |
| data_dictionary.md | π¨βπ» Developers | 10 tablas PostgreSQL, enums, constraints |
| CHANGELOG.md | π€ Todos | Historial de cambios (Keep a Changelog) |
| CONTRIBUTING.md | π¨βπ» Developers | GuΓa de contribuciΓ³n + reglas de cΓ³digo |
| CategorΓa | TecnologΓa | VersiΓ³n | PropΓ³sito |
|---|---|---|---|
| Runtime | Node.js | 20.x LTS | Backend + Simulator |
| Lenguaje | TypeScript | 5.x | Tipado estricto con exactOptionalPropertyTypes |
| Web Framework | Express.js | 4.x | API REST + middleware pipeline |
| Message Broker | RabbitMQ | 3.x | Eventos AMQP con ACK manual |
| Base de Datos | PostgreSQL | 14+ | OLTP normalizado (3NF+), triggers, enums |
| Cache | Redis | 7+ | Cache de dispositivos + Token Blacklist |
| Frontend | Next.js | 14.x | Dashboard PWA con SSR |
| Tiempo Real | WebSockets | ws | ProyecciΓ³n de estado al dashboard |
| Proxy Reverso | Nginx | alpine | Reverse proxy, IPv4/IPv6, routing |
| MΓ©tricas | Prometheus | latest | Pull-based scraping cada 15s |
| Dashboards | Grafana | latest | VisualizaciΓ³n de mΓ©tricas operacionales |
| Tracing | Jaeger | latest | Distributed tracing via OTLP |
| Contenedores | Docker (Distroless) | β | read_only, secrets, resource limits |
| Testing | Vitest + Supertest | 2.x | 92+ tests (unit + integration) |
| Linting | ESLint | strict | strict-type-checking config |
| HTTP Security | Helmet | 7.x | Headers de seguridad |
| CI/CD | GitHub Actions | β | Pipeline fail-fast |
SmartAccess simula una plataforma IoT completa que:
- β Simula dispositivos IoT con comportamiento realista (telemetrΓa, conexiΓ³n/desconexiΓ³n, alertas)
- β Procesa eventos con ACK manual, retry con backoff exponencial y Dead Letter Queue
- β Garantiza idempotencia β eventos duplicados no generan efectos duplicados
- β Persiste con Outbox Pattern β consistencia entre base de datos y broker
- β Proyecta en tiempo real vΓa WebSocket al dashboard PWA
- β AutenticaciΓ³n enterprise β tokens encriptados ChaCha20-Poly1305 (no JWT plano)
- β CSRF Protection β Double-Submit Cookie Pattern
- β RBAC por ruta β ADMIN, OPERATOR, VIEWER con middleware
- β Token Blacklist β revocaciΓ³n inmediata via Redis
- β
Docker hardened β Distroless,
read_only, secrets, resource limits - β Observabilidad completa β Prometheus + Grafana + Jaeger + Winston JSON
- β 92+ tests automatizados (unit + integration) con Vitest
graph TB
SIM["π§ Device Simulator<br>Node.js + TypeScript"] -->|AMQP publish| RMQ["π¨ RabbitMQ<br>Message Broker"]
RMQ -->|AMQP consume<br>ACK manual| BE["π₯οΈ Backend API<br>Express + TypeScript"]
BE -->|SQL transactions| PG["π PostgreSQL<br>10 tablas, 3NF+"]
BE -->|Cache + Blacklist| RD["β‘ Redis<br>Cache + Rate Limit"]
BE -->|WebSocket| FE["π Dashboard<br>Next.js PWA"]
FE -->|HTTP/REST| BE
BE -->|/metrics| PROM["π Prometheus"]
RMQ -->|/metrics| PROM
PROM --> GF["π Grafana"]
BE -->|OTLP| JG["π Jaeger"]
INET(("π Internet")) --> NGX["π Nginx<br>Reverse Proxy"]
NGX -->|Proxy| BE
NGX -->|Proxy| FE
style BE fill:#2196F3,color:#fff
style RMQ fill:#FF6F00,color:#fff
style PG fill:#336791,color:#fff
style FE fill:#000,color:#fff
style NGX fill:#009639,color:#fff
π Diagramas detallados (C4, ERD, flujo de eventos) en docs/technical/01_architecture.md
Patrones clave: ACK Manual, Retry + DLQ, Idempotencia, Outbox Pattern, Unit of Work, State Machine, Observer, Factory, Repository, Adapter.
- Docker & Docker Compose
- Node.js 20+ (solo para desarrollo local)
- Git
# Clonar repositorio
git clone https://github.com/facundognz/smartaccess.git
cd smartaccess
# Configurar variables de entorno
cp .env.example .env
# Editar .env si es necesario (funciona con defaults)# Levantar 10 servicios (Nginx, Backend, Dashboard, Simulator,
# PostgreSQL, RabbitMQ, Redis, Prometheus, Grafana, Jaeger)
docker compose up -d
# Verificar que todos estΓ©n healthy
docker compose ps# Health check
curl http://localhost/api/health
# Ver dashboard (browser)
open http://localhost
# Ver mΓ©tricas (Grafana)
open http://localhost:3001 # admin / (ver secrets/grafana_password.txt)
# Ver traces (Jaeger)
open http://localhost:16686
# Ver colas (RabbitMQ Management)
open http://localhost:15672 # smartaccess / smartaccess# Backend
cd backend && npm install && npm run dev
# Dashboard
cd dashboard && npm install && npm run devsmartaccess/
βββ backend/ # Backend API (Node.js + TypeScript)
β βββ src/
β βββ application/
β β βββ consumers/ # Consumers AMQP (event processing)
β β βββ middleware/ # Auth, RBAC, CSRF, correlation ID, validation
β β βββ routes/ # Express routes (auth, devices, events, alerts)
β β βββ services/ # Business logic (auth, device, alert, DLQ)
β β βββ __tests__/ # Unit tests (5 archivos, 39 tests)
β βββ domain/
β β βββ auth/ # Auth types, token encryption
β β βββ devices/ # Device types, state machine
β β βββ events/ # Event types, factory, observer, payload builder
β βββ infrastructure/
β β βββ broker/ # RabbitMQ connection + consumer
β β βββ cache/ # Redis client
β β βββ database/ # PostgreSQL pool + connection
β β βββ repositories/ # Data access layer
β β βββ retry/ # Retry strategy (backoff exponencial)
β β βββ websocket/ # WebSocket gateway
β β βββ outbox/ # Outbox pattern dispatcher
β βββ shared/
β β βββ errors/ # Error classes (AppError, NotFoundError)
β β βββ logger/ # Winston JSON structured logging
β β βββ utils/ # asyncHandler, helpers
β βββ config/ # Environment config
β βββ __tests__/integration/ # Integration tests (8 archivos, 53+ tests)
β βββ main.ts # App entry point
βββ dashboard/ # Frontend PWA (Next.js)
βββ simulator/ # Device Simulator (Node.js + TypeScript)
βββ nginx/ # Nginx config (reverse proxy)
βββ prometheus/ # Prometheus scraping config
βββ grafana/ # Grafana provisioning + dashboards
βββ secrets/ # Docker Secrets (db, mq, grafana passwords)
βββ docs/
β βββ technical/ # Arquitectura, patrones, testing, seguridad
β βββ adr/ # 5 Architectural Decision Records
β βββ product/ # PRD, informaciΓ³n de producto
β βββ domain/ # Reglas de negocio
β βββ operations/ # Infraestructura, observabilidad, deployment
β βββ governance/ # Γtica, cumplimiento
β βββ collaboration/ # Git workflow, coding standards
βββ docker-compose.yml # 10 servicios hardened
βββ init.sql # Schema PostgreSQL (10 tablas, triggers, enums)
βββ data_dictionary.md # Diccionario de datos completo
βββ .env.example # Variables de entorno
El sistema implementa 6 capas de defensa en profundidad:
| Capa | ImplementaciΓ³n | Vector Mitigado |
|---|---|---|
| Tokens | ChaCha20-Poly1305 + HKDF (PASETO-inspired) | Token interception |
| Cookies | HttpOnly + SameSite=Strict + Secure | XSS robo de tokens |
| CSRF | Double-Submit Cookie Pattern | Cross-Site Request Forgery |
| Passwords | Scrypt (Node.js crypto nativo) | Brute force |
| RevocaciΓ³n | Redis Token Blacklist con TTL | Token reuse post-logout |
| Containers | Distroless + read_only + Docker Secrets | Container escape, credential exposure |
π Detalle completo en docs/technical/07_security.md
| MΓ©todo | Endpoint | DescripciΓ³n |
|---|---|---|
POST |
/api/auth/login |
Login con email/password β HttpOnly cookies |
POST |
/api/auth/register |
Registro de nuevo usuario |
POST |
/api/auth/refresh |
Refresh del access token |
POST |
/api/auth/logout |
Logout + clear cookies + blacklist token |
| MΓ©todo | Endpoint | DescripciΓ³n |
|---|---|---|
GET |
/api/v1/devices |
Lista todos los dispositivos |
GET |
/api/v1/devices/:uuid |
Detalle de un dispositivo |
PATCH |
/api/v1/devices/:uuid/status |
Cambiar estado (state machine) |
| MΓ©todo | Endpoint | DescripciΓ³n |
|---|---|---|
GET |
/api/v1/events |
Eventos paginados (limit, offset) |
GET |
/api/v1/events/:uuid |
Detalle de un evento |
GET |
/api/v1/events/dlq/list |
Eventos en Dead Letter Queue |
| MΓ©todo | Endpoint | DescripciΓ³n |
|---|---|---|
GET |
/api/v1/alerts |
Lista de alertas |
POST |
/api/v1/alerts/:id/acknowledge |
Marcar alerta como reconocida |
| MΓ©todo | Endpoint | DescripciΓ³n |
|---|---|---|
GET |
/health |
Health check (DB + Redis + RabbitMQ) |
GET |
/api/v1/metrics/summary |
Resumen de mΓ©tricas del sistema |
# Unit Tests β sin Docker (39 tests, 5 archivos)
cd backend && npx vitest run src/application/services/__tests__/ --reporter=verbose
# Integration Tests β con o sin Docker (53+ tests, 8 archivos)
cd backend && npx vitest run src/__tests__/integration/ --reporter=verbose
# Todos los tests
cd backend && npm test| Suite | Archivos | Tests | Requiere Docker |
|---|---|---|---|
| Unit (services) | 5 | 39 | β No |
| Integration (HTTP pipeline) | 8 | 53+ | |
| Domain (pre-existing) | 2 | 20 | β No |
| Total | 15 | 92+ | β |
π§ͺ Detalle en docs/technical/05_testing.md
# --- Database (PostgreSQL) ---
POSTGRES_DB=smartaccess
POSTGRES_USER=smartaccess
POSTGRES_PASSWORD=smartaccess
DATABASE_URL=postgres://smartaccess:smartaccess@postgres:5432/smartaccess
# --- Message Broker (RabbitMQ) ---
RABBITMQ_DEFAULT_USER=smartaccess
RABBITMQ_DEFAULT_PASS=smartaccess
RABBITMQ_URL=amqp://smartaccess:smartaccess@rabbitmq:5672
# --- Cache (Redis) ---
REDIS_URL=redis://redis:6379
# --- Application ---
NODE_ENV=development
PORT=3000
LOG_LEVEL=debug
# --- Authentication ---
JWT_SECRET=change-this-in-production # Master key para ChaCha20
JWT_EXPIRATION=1h
# --- Simulator ---
SIM_DEVICE_COUNT=5
SIM_TELEMETRY_INTERVAL_MS=5000
SIM_CONNECTION_TOGGLE_PROB=0.05
SIM_ALERT_PROB=0.08
β οΈ En producciΓ³n, las credenciales se inyectan vΓa Docker Secrets (no env vars).
| # | DecisiΓ³n | Alternativas Evaluadas | Status |
|---|---|---|---|
| 001 | Token encryption con ChaCha20-Poly1305 | JWT, JWE, PASETO v4 | Accepted |
| 002 | Password hashing con Scrypt nativo | bcrypt, argon2, PBKDF2 | Accepted |
| 003 | DLQ con persistencia en PostgreSQL | Retry infinito, descartar, DLQ nativo | Accepted |
| 004 | Distroless + read_only + Secrets | Alpine, Slim, Scratch | Accepted |
| 005 | Pivot E2E β unit + integration | Playwright, Cypress, WSL2 | Accepted |
Todos los contenedores estΓ‘n fortificados:
| Medida | QuΓ© hace | Alcance |
|---|---|---|
read_only: true |
Filesystem inmutable | 9/10 servicios |
| Docker Secrets | Credenciales en /run/secrets/ |
Postgres, Backend, Simulator, Grafana |
| Resource Limits | CPU + RAM limitados | 10/10 servicios |
| Distroless | Sin shell, sin herramientas | Backend, Simulator |
| tmpfs | Solo escritura en RAM | 9/10 servicios |
βοΈ Detalle en docs/operations/01_infrastructure.md
- Event-Driven Architecture con RabbitMQ (ACK manual, retry, DLQ)
- Outbox Pattern para consistencia DB β Broker
- Idempotencia con constraint UNIQUE
- State Machine para transiciones de dispositivos
- Dashboard PWA con WebSocket en tiempo real
- API REST con RFC 7807 (Problem Details)
- Auth: ChaCha20 tokens + HttpOnly cookies + CSRF + Redis Blacklist
- RBAC por ruta (ADMIN, OPERATOR, VIEWER)
- Docker Hardening (Distroless, read_only, secrets, resource limits)
- Observabilidad (Prometheus + Grafana + Jaeger + Winston)
- 92+ tests automatizados (unit + integration)
- 5 ADRs formalizados
- DocumentaciΓ³n tΓ©cnica completa (27+ archivos)
- CI/CD pipeline con GitHub Actions
- Performance testing con k6
- E2E tests en CI Linux (Playwright)
Este es un proyecto educativo. Pull requests son bienvenidos.
MIT License β Proyecto educativo de cΓ³digo abierto.
Facundo NicolΓ‘s GonzΓ‘lez
β Si este proyecto te fue ΓΊtil, dale una star en GitHub!