Redis para Rate Limiting
Sección titulada «Redis para Rate Limiting»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.
Por qué importa en multi-instancia
Sección titulada «Por qué importa en multi-instancia»Sin Redis, cada instancia tiene sus propios contadores:
Usuario malintencionado → Instancia A: 3 intentos de loginUsuario malintencionado → Instancia B: 3 intentos de login ← mismo usuarioEl 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 intentosUsuario malintencionado → Instancia B: consulta Redis → 5 intentos → BLOQUEADO ✓Activar Redis
Sección titulada «Activar Redis»Solo necesitas agregar una variable de entorno:
REDIS_URL=redis://tu-host-redis:6379El servidor detecta la variable al arrancar y conecta automáticamente. Si no está definida, continúa usando memoria local sin errores.
Opciones de Redis (de menor a mayor coste)
Sección titulada «Opciones de Redis (de menor a mayor coste)»Opción 1: Docker local (solo desarrollo)
Sección titulada «Opción 1: Docker local (solo desarrollo)»docker run -d --name redis -p 6379:6379 redis:alpineREDIS_URL=redis://localhost:6379Opció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
- Crear cuenta en upstash.com
- Crear base de datos Redis → copiar REST URL (formato
rediss://...) - Agregar
REDIS_URLcomo secret en tu plataforma de deployment
REDIS_URL=rediss://:password@your-instance.upstash.io:6380Nota:
rediss://(con dobles) indica conexión TLS — requerido por Upstash.
Opción 3: Railway Redis Plugin
Sección titulada «Opción 3: Railway Redis Plugin»Si ya usas Railway, puedes agregar Redis como servicio adicional en el mismo proyecto:
- Railway Dashboard → tu proyecto → New Service → Database → Redis
- En las variables del servicio del servidor, agregar:
REDIS_URL=${{Redis.REDIS_URL}}Railway inyecta la URL automáticamente.
Opción 4: Redis Cloud (managed)
Sección titulada «Opción 4: Redis Cloud (managed)»- Free tier: 30 MB
- redis.io/cloud
Verificar que está conectado
Sección titulada «Verificar que está conectado»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 activatedSin 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 activatedConfiguración actual de límites
Sección titulada «Configuración actual de límites»| Endpoint | Límite | Ventana |
|---|---|---|
POST /auth/login | 5 intentos | 15 minutos |
POST /auth/signup | 3 registros | 1 hora |
POST /operations/generate-checkout-session | 10 requests | 1 minuto |
POST /operations/get-customer-portal-url | 10 requests | 1 minuto |
POST /operations/* (resto) | 100 requests | 15 minutos |
En desarrollo (NODE_ENV !== 'production'), los límites son mucho más altos para no interferir con
el trabajo.
Implementación técnica
Sección titulada «Implementación técnica»| Archivo | Propósito |
|---|---|
app/src/server/redisClient.ts | Singleton getRedisClient() con ioredis |
app/src/server/middleware/rateLimiter.ts | 4 limiters con buildStore(prefix) |
app/src/server/setup.ts | Registro 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.
Ver también
Sección titulada «Ver también»- Variables de Entorno — referencia completa de
REDIS_URL - Deployment en Railway
- Deployment general