Skip to content

titesen/smartaccess

Repository files navigation

SmartAccess β€” IoT Device Monitoring Platform

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.

Node.js TypeScript Docker Tests License

πŸ“š DocumentaciΓ³n

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

πŸ“‹ DescripciΓ³n

Stack TecnolΓ³gico

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

πŸ—οΈ Arquitectura

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
Loading

πŸ“ 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.

πŸš€ Quick Start

1. Requisitos Previos

  • Docker & Docker Compose
  • Node.js 20+ (solo para desarrollo local)
  • Git

2. InstalaciΓ³n

# 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)

3. Levantar Todos los Servicios

# 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

4. Verificar Funcionamiento

# 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

5. Desarrollo Local (sin Docker)

# Backend
cd backend && npm install && npm run dev

# Dashboard
cd dashboard && npm install && npm run dev

πŸ“ Estructura del Proyecto

smartaccess/
β”œβ”€β”€ 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

πŸ”’ Seguridad

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

πŸ“Š API Endpoints

AutenticaciΓ³n

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

Dispositivos (requiere auth)

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)

Eventos (requiere auth)

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

Alertas (requiere auth)

MΓ©todo Endpoint DescripciΓ³n
GET /api/v1/alerts Lista de alertas
POST /api/v1/alerts/:id/acknowledge Marcar alerta como reconocida

Sistema

MΓ©todo Endpoint DescripciΓ³n
GET /health Health check (DB + Redis + RabbitMQ)
GET /api/v1/metrics/summary Resumen de mΓ©tricas del sistema

πŸ§ͺ Testing

# 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+ ⚠️ Opcional
Domain (pre-existing) 2 20 ❌ No
Total 15 92+ β€”

πŸ§ͺ Detalle en docs/technical/05_testing.md

πŸ” Variables de Entorno

# --- 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).

πŸ—οΈ Decisiones ArquitectΓ³nicas (ADRs)

# 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

🐳 Docker Hardening

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

πŸ“ˆ Roadmap

  • 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)

🀝 Contribuir

Este es un proyecto educativo. Pull requests son bienvenidos.

πŸ“„ Licencia

MIT License β€” Proyecto educativo de cΓ³digo abierto.

πŸ‘€ Autor

Facundo NicolΓ‘s GonzΓ‘lez


⭐ Si este proyecto te fue útil, dale una star en GitHub!

About

🏒 IoT device monitoring platform with Event-Driven Architecture. Real-time dashboard, RabbitMQ event processing, hardened Docker deployment with Distroless containers, and defense-in-depth security (ChaCha20 encrypted tokens, CSRF, RBAC).

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors