You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Redis dev entra em MISCONF no Windows (Docker Desktop) e o rate-limit de login para de funcionar silenciosamente
Resumo
No desenvolvimento em Windows + Docker Desktop, se o repositório mora numa unidade diferente de C: (ex.: HD externo D:), o bind mount ./data/redis do docker-compose.override.yml fica quebrado: o Redis não consegue persistir (RDB e AOF falham) e entra em MISCONF (stop-writes-on-bgsave-error). Todo comando de escrita passa a ser recusado com erro — inclusive o INCR do rate-limit.
O efeito colateral pior é que isso desliga o teto de 5 falhas/5min por conta do login silenciosamente:
checkRateLimit (INCR) falha → cai no fallback em memória (memIncrement);
mas peekRateLimit (GET) não é bloqueado pelo MISCONF (só escritas são recusadas) → lê do Redis vazio e retorna 0;
resultado: o bloqueio por falhas (contaBloqueadaPorFalhas) nunca dispara — a 6ª tentativa contra a mesma conta passa reto, e o teste app/actions/auth/signInWithPassword.test.ts falha com expected 'invalid_credentials' to be 'rate_limited'.
Como reproduzir
Windows + Docker Desktop, repositório em unidade D: (HD externo ou partição não-C).
docker compose --env-file .env.local up -d (override sobe redis com bind ./data/redis).
Log do app: [ai-dispatcher.rate-limit] redis incr failed; falling back to in-memory a cada tentativa.
Causa raiz
Docker Desktop no Windows tem uma limitação conhecida: bind mount de arquivos/diretórios em unidades que não são C: se comporta mal (arquivos viram diretório, diretórios ficam inacessíveis). O projeto já esbarrou nisso no Supabase local (supabase\.temp → junction NTFS para C:), mas o redis do override não tinha a mesma proteção.
Fix aplicado localmente (workaround, sem mudar o compose)
Junction NTFS data/redis → C:\Users\<user>\.qwen\redis-data\deskcommcrm (mesmo padrão já usado em supabase\.temp). Após isso: incr volta a funcionar, rdb_last_bgsave_status/aof_last_write_status → ok, e o teste passa verde.
Sugestão para o upstream
docs/threat-model.md (T2) documenta apenas o caso "Redis não configurado" (UPSTASH_REDIS_REST_URL ausente). Fica uma lacuna: "Redis configurado mas quebrado (MISCONF)" também anula o limite, e o teste unitário da fiação (signInWithPassword.test.ts) é o único que pega isso — e só falha em ambientes Windows com bind D: quebrado.
Considerar um healthcheck ou aviso mais explícito quando INCR falha por MISCONF (o warn atual é genérico e some após a primeira vez por processo).
No docker-compose.override.yml, documentar o quirk do Windows/Docker Desktop junto do volume do redis (ou apontar o bind para C:).
Ambiente
Windows 11, Docker Desktop (WSL2), drive D: = HD externo.
Redis dev entra em MISCONF no Windows (Docker Desktop) e o rate-limit de login para de funcionar silenciosamente
Resumo
No desenvolvimento em Windows + Docker Desktop, se o repositório mora numa unidade diferente de
C:(ex.: HD externoD:), o bind mount./data/redisdodocker-compose.override.ymlfica quebrado: o Redis não consegue persistir (RDB e AOF falham) e entra em MISCONF (stop-writes-on-bgsave-error). Todo comando de escrita passa a ser recusado com erro — inclusive oINCRdo rate-limit.O efeito colateral pior é que isso desliga o teto de 5 falhas/5min por conta do login silenciosamente:
checkRateLimit(INCR) falha → cai no fallback em memória (memIncrement);peekRateLimit(GET) não é bloqueado pelo MISCONF (só escritas são recusadas) → lê do Redis vazio e retorna0;contaBloqueadaPorFalhas) nunca dispara — a 6ª tentativa contra a mesma conta passa reto, e o testeapp/actions/auth/signInWithPassword.test.tsfalha comexpected 'invalid_credentials' to be 'rate_limited'.Como reproduzir
D:(HD externo ou partição não-C).docker compose --env-file .env.local up -d(override soberediscom bind./data/redis).docker exec deskcomm-redis redis-cli incr smoke:1→ MISCONF (escritas desabilitadas).npx vitest run app/actions/auth/signInWithPassword.test.ts→ 1 falha (rate_limitedesperado,invalid_credentialsrecebido).[ai-dispatcher.rate-limit] redis incr failed; falling back to in-memorya cada tentativa.Causa raiz
Docker Desktop no Windows tem uma limitação conhecida: bind mount de arquivos/diretórios em unidades que não são
C:se comporta mal (arquivos viram diretório, diretórios ficam inacessíveis). O projeto já esbarrou nisso no Supabase local (supabase\.temp→ junction NTFS paraC:), mas oredisdo override não tinha a mesma proteção.Fix aplicado localmente (workaround, sem mudar o compose)
Junction NTFS
data/redis→C:\Users\<user>\.qwen\redis-data\deskcommcrm(mesmo padrão já usado emsupabase\.temp). Após isso:incrvolta a funcionar,rdb_last_bgsave_status/aof_last_write_status→ok, e o teste passa verde.Sugestão para o upstream
docs/threat-model.md(T2) documenta apenas o caso "Redis não configurado" (UPSTASH_REDIS_REST_URLausente). Fica uma lacuna: "Redis configurado mas quebrado (MISCONF)" também anula o limite, e o teste unitário da fiação (signInWithPassword.test.ts) é o único que pega isso — e só falha em ambientes Windows com bind D: quebrado.INCRfalha por MISCONF (o warn atual é genérico e some após a primeira vez por processo).docker-compose.override.yml, documentar o quirk do Windows/Docker Desktop junto do volume doredis(ou apontar o bind paraC:).Ambiente
D:= HD externo.app/actions/auth/signInWithPassword.test.ts(issue Rate limit ausente em login, signup e aceite de convite #64).docker-compose.prod.ymlroda Redis efêmero (--appendonly no) e o MISCONF não ocorre.