Skip to content

Redis dev entra em MISCONF no Windows (Docker Desktop) e o rate-limit de login para de funcionar silenciosamente #185

Description

@vagnerdearaujo

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

  1. Windows + Docker Desktop, repositório em unidade D: (HD externo ou partição não-C).
  2. docker compose --env-file .env.local up -d (override sobe redis com bind ./data/redis).
  3. docker exec deskcomm-redis redis-cli incr smoke:1MISCONF (escritas desabilitadas).
  4. npx vitest run app/actions/auth/signInWithPassword.test.ts → 1 falha (rate_limited esperado, invalid_credentials recebido).
  5. 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/redisC:\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_statusok, e o teste passa verde.

Sugestão para o upstream

  1. 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.
  2. 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).
  3. 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.
  • Supabase CLI 2.110.0; teste afetado: app/actions/auth/signInWithPassword.test.ts (issue Rate limit ausente em login, signup e aceite de convite #64).
  • Nenhum impacto em produção/self-host (Linux): o docker-compose.prod.yml roda Redis efêmero (--appendonly no) e o MISCONF não ocorre.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions