Ir al contenido

TalentBricksAI incluye rate limiting en todos los endpoints sensibles (/auth/login, /auth/signup, pagos, y API general). Por defecto usa memoria local — funciona perfectamente para una sola instancia del servidor.

Si alguna vez escalas a múltiples réplicas en producción, necesitarás Redis para que los contadores sean compartidos entre todas las instancias.


Sin Redis, cada instancia tiene sus propios contadores:

Usuario malintencionado → Instancia A: 3 intentos de login
Usuario malintencionado → Instancia B: 3 intentos de login ← mismo usuario

El usuario puede hacer 5 intentos × N instancias antes de ser bloqueado. Con Redis, todos los servidores consultan el mismo contador:

Usuario malintencionado → Instancia A: consulta Redis → 4 intentos
Usuario malintencionado → Instancia B: consulta Redis → 5 intentos → BLOQUEADO ✓

Solo necesitas agregar una variable de entorno:

REDIS_URL=redis://tu-host-redis:6379

El servidor detecta la variable al arrancar y conecta automáticamente. Si no está definida, continúa usando memoria local sin errores.


Ventana de terminal
docker run -d --name redis -p 6379:6379 redis:alpine
REDIS_URL=redis://localhost:6379

Opción 2: Upstash (recomendado para producción serverless)

Sección titulada «Opción 2: Upstash (recomendado para producción serverless)»
  • Free tier: 10,000 requests/día
  • Sin servidor que gestionar
  • Funciona con Railway y Fly.io
  1. Crear cuenta en upstash.com
  2. Crear base de datos Redis → copiar REST URL (formato rediss://...)
  3. Agregar REDIS_URL como secret en tu plataforma de deployment
REDIS_URL=rediss://:password@your-instance.upstash.io:6380

Nota: rediss:// (con doble s) indica conexión TLS — requerido por Upstash.

Si ya usas Railway, puedes agregar Redis como servicio adicional en el mismo proyecto:

  1. Railway Dashboard → tu proyecto → New ServiceDatabaseRedis
  2. En las variables del servicio del servidor, agregar:
REDIS_URL=${{Redis.REDIS_URL}}

Railway inyecta la URL automáticamente.


Al arrancar el servidor con REDIS_URL configurado, verás en los logs:

✅ [Redis] Connected successfully
🚦 [RateLimit] Initializing rate limiting middleware
✅ [RateLimit] Rate limiting middleware activated

Sin REDIS_URL:

🚦 [RateLimit] Initializing rate limiting middleware
[RateLimit] REDIS_URL not set — using in-memory store for "login". Set REDIS_URL for distributed rate limiting.
✅ [RateLimit] Rate limiting middleware activated

EndpointLímiteVentana
POST /auth/login5 intentos15 minutos
POST /auth/signup3 registros1 hora
POST /operations/generate-checkout-session10 requests1 minuto
POST /operations/get-customer-portal-url10 requests1 minuto
POST /operations/* (resto)100 requests15 minutos

En desarrollo (NODE_ENV !== 'production'), los límites son mucho más altos para no interferir con el trabajo.


ArchivoPropósito
app/src/server/redisClient.tsSingleton getRedisClient() con ioredis
app/src/server/middleware/rateLimiter.ts4 limiters con buildStore(prefix)
app/src/server/setup.tsRegistro de middleware en Express

Cada limiter usa un prefijo de clave distinto en Redis (rl:login:, rl:signup:, rl:payment:, rl:api:) para evitar colisiones.