Runbook: Redis unavailable
Symptom:GET /ready returns {"redis":"error"}. Background jobs stall — escalation timers don’t fire, Slack messages queue but don’t send, AI generation jobs hang.
The API itself stays up (reads/writes to PostgreSQL still work), but any async operation will silently stall until Redis recovers.
Diagnose
1. Check the ready endpoint:redis: dial tcp: connection refused— Redis container is downredis: NOAUTH Authentication required—REDIS_PASSWORDis set in Regen but Redis has no auth (or vice versa)redis: ERR max number of clients reached— Redis connection limit hit
Mitigate
Redis container is down — restart it:redis-cli ping to return PONG before restarting the app.
Authentication mismatch:
- If Redis requires a password, set
REDIS_PASSWORDin Regen’s config - If Redis doesn’t require a password, remove
REDIS_PASSWORDfrom config - Restart the app after changing
maxclients limit (default: 10,000):
- Restart the app to flush stale connections
- Check for connection leaks in logs
REDIS_SENTINEL_ADDRS is configured correctly, Regen will reconnect automatically once the new primary is elected. Wait 60 seconds and re-check /ready.
Resolve
- Confirm
GET /readyreturns"redis":"ok" - Check that escalation timers resume — look for
escalation_triggeredlog lines within a minute - Verify Slack message delivery resumes — check recent timeline entries in any open incident
Prevention
- For production: use Redis Sentinel (
REDIS_SENTINEL_ADDRS) for automatic failover - Run Redis with a persistent volume (
appendonly yesin Redis config) — prevents queue loss on container restart - Monitor Redis memory usage — if Redis runs out of memory, it starts evicting keys, which can cause silent job loss
- Configure
/readyas the health check in your load balancer — it surfaces Redis failures immediately
