Deploy — Worker olp-msgqueue
Runbook do Worker dono do Upstash Redis para fila/rate-limit Wasender. SSOT de procedimento. Para arquitetura, ver UPSTASH_REDIS e WORKER_V3_REDIS_PLAN.
Estágio: produção (olp.digital). NÃO tratar como protótipo. Toda mudança segue Migration Safety Protocol onde aplicável.
0. Pré-requisitos
- Conta Cloudflare com permissão Workers (Edit) no account
olp-digital. - Conta Upstash com Redis Database criado (região
gru1— São Paulo, mesma do Supabase). node >= 20enpmno host local. Wrangler é instalado viadevDependencies(não usar global).- Acesso ao painel de secrets do Supabase (Lovable Cloud → Settings → Secrets).
Nunca expor UPSTASH_REDIS_REST_TOKEN ou MSG_QUEUE_SECRET em chat, commit, ou frontend.
1. Bootstrap local (uma vez)
cd workers/olp-msgqueue
npm install
npx wrangler login # abre browser, autoriza account olp-digital
npx wrangler whoami # confirma account_id corretoRodar testes antes de qualquer deploy:
npm test # Vitest + miniflare — 100% verde obrigatório2. Gerar MSG_QUEUE_SECRET
Shared secret entre Worker e Edge Functions Supabase. Mesmo valor nos dois lados. Rotação coordenada.
openssl rand -base64 48 # copiar saídaGuardar temporariamente em gerenciador de senhas até passos 3 e 4.
3. Configurar secrets do Worker
Production e staging usam a mesma instância Upstash (separação por prefixo olp: vs olp-stg:).
# Production
npx wrangler secret put UPSTASH_REDIS_REST_URL
npx wrangler secret put UPSTASH_REDIS_REST_TOKEN
npx wrangler secret put MSG_QUEUE_SECRET
# Staging
npx wrangler secret put UPSTASH_REDIS_REST_URL --env staging
npx wrangler secret put UPSTASH_REDIS_REST_TOKEN --env staging
npx wrangler secret put MSG_QUEUE_SECRET --env stagingCada comando abre prompt — colar valor, ENTER. Wrangler confirma Success!.
Listar (não revela valores):
npx wrangler secret list
npx wrangler secret list --env staging4. Configurar secrets do Supabase (Edge Functions)
No painel Lovable Cloud → Settings → Secrets, adicionar:
| Secret | Valor | Notas |
|---|---|---|
MSG_QUEUE_WORKER_URL | https://olp-msgqueue.<subdomain>.workers.dev (ou custom domain) | Sem barra final |
MSG_QUEUE_SECRET | mesmo valor do passo 2 | Idêntico ao Worker |
MSG_QUEUE_BACKEND | worker | Liga o backend Redis. Default inprocess mantém comportamento antigo. |
Ainda NÃO setar MSG_QUEUE_BACKEND=worker em produção até concluir staging smoke (passo 6).
5. Deploy
# Staging primeiro — sempre
npm run deploy:staging
# → publica em olp-msgqueue-staging.<subdomain>.workers.dev
# Após smoke verde (passo 6):
npm run deploy
# → publica em olp-msgqueue.<subdomain>.workers.devCustom domain (opcional, recomendado prod): Cloudflare Dashboard → Workers → olp-msgqueue → Triggers → Custom Domains → msgqueue.olp.digital (ou similar). Atualizar MSG_QUEUE_WORKER_URL no Supabase se mudar.
6. Smoke test (staging primeiro, depois prod)
Health check (sem auth):
curl -sS https://olp-msgqueue-staging.<subdomain>.workers.dev/health | jq
# Esperado: { "ok": true, "redis": "up", "environment": "staging", ... }Acquire (com auth):
SECRET="<MSG_QUEUE_SECRET>"
URL="https://olp-msgqueue-staging.<subdomain>.workers.dev"
curl -sS -X POST "$URL/acquire" \
-H "Content-Type: application/json" \
-H "X-MsgQueue-Secret: $SECRET" \
-d '{"session_key":"smoke-test","min_interval_ms":7000,"max_wait_ms":8000}' | jq
# 1ª chamada → { "acquired": true, "wait_ms": 0 }
# Repetir imediatamente:
curl -sS -X POST "$URL/acquire" ... -d '{"session_key":"smoke-test", ...}' | jq
# 2ª → ou { "acquired": true, "wait_ms": ~7000 } (esperou) ou { "acquired": false, "deferred": true, ... }Auth negativa:
curl -sS -o /dev/null -w "%{http_code}\n" -X POST "$URL/acquire" \
-H "Content-Type: application/json" \
-H "X-MsgQueue-Secret: errado" -d '{}'
# Esperado: 401Logs ao vivo:
npx wrangler tail --env staging
npx wrangler tail # production7. Ativação em produção
Apenas depois de:
- Staging com
MSG_QUEUE_BACKEND=workerpor 48h semRATE_LIMITEDemsms_log. - Smoke test verde em prod.
Lovable Cloud → Settings → Secrets → MSG_QUEUE_BACKEND = workerEdge Functions pegam mudança no próximo cold start (segundos). Monitorar:
select count(*), date_trunc('hour', criado_em)
from sms_log
where status = 'rate_limited' and criado_em > now() - interval '24 hours'
group by 2 order by 2;Meta: 0 rate_limited em 7 dias consecutivos antes de reduzir delayEntreEnviosMs (7000 → 3000 → 1000 → 500) em messaging-rate-limits.ts.
8. Rollback
Imediato, sem redeploy:
Lovable Cloud → Settings → Secrets → MSG_QUEUE_BACKEND = inprocessEdge Functions voltam ao InProcessQueue em segundos. Worker continua up (sem tráfego). Investigar via wrangler tail antes de reativar.
Fail-open já está embutido: se Worker retorna 5xx ou timeout, Edge Function cai sozinha em InProcessQueue (ver messaging-queue-worker.ts).
9. Rotação de secrets
MSG_QUEUE_SECRET (a cada 90 dias ou suspeita de leak):
- Gerar novo:
openssl rand -base64 48. - Setar no Worker (staging + prod):
npx wrangler secret put MSG_QUEUE_SECRET [--env staging]. - Setar no Supabase no MESMO momento. Janela de inconsistência = 401 transitório → fail-open absorve.
- Validar com smoke (passo 6).
UPSTASH_REDIS_REST_TOKEN: regenerar no Upstash, repetir wrangler secret put para ambos environments. Não precisa mexer no Supabase.
10. Troubleshooting
| Sintoma | Causa | Ação |
|---|---|---|
/health redis: down | Token/URL errados ou Upstash fora | Conferir secrets; Upstash dashboard |
401 em /acquire | MSG_QUEUE_SECRET divergente Worker ↔ Supabase | Re-rotacionar secret nos dois lados |
Edge Function sempre fallback inprocess | MSG_QUEUE_WORKER_URL ausente, errada, ou Worker 5xx | wrangler tail + checar secret Supabase |
RATE_LIMITED voltou após ativar | delayEntreEnviosMs reduzido cedo demais; ou múltiplos session_key | Subir delay, conferir métricas Redis |
Deploy falha com entrypoint not found | Esqueceu npm install ou path em wrangler.toml | Reinstalar deps; conferir main = "src/index.js" |
Referências
- Arquitetura:
docs/architecture/UPSTASH_REDIS.md - Plano original:
docs/architecture/WORKER_V3_REDIS_PLAN.md - Limites de mensageria:
docs/architecture/MESSAGING_RATE_LIMITS.md - Auditoria de implementação:
docs/audits/AUDIT_WASENDER_REDIS_QUEUE_2026-05-13.md - README do Worker:
workers/olp-msgqueue/README.md(no repositório)