Skip to content

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 >= 20 e npm no host local. Wrangler é instalado via devDependencies (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)

bash
cd workers/olp-msgqueue
npm install
npx wrangler login        # abre browser, autoriza account olp-digital
npx wrangler whoami       # confirma account_id correto

Rodar testes antes de qualquer deploy:

bash
npm test                  # Vitest + miniflare — 100% verde obrigatório

2. Gerar MSG_QUEUE_SECRET

Shared secret entre Worker e Edge Functions Supabase. Mesmo valor nos dois lados. Rotação coordenada.

bash
openssl rand -base64 48   # copiar saída

Guardar 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:).

bash
# 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 staging

Cada comando abre prompt — colar valor, ENTER. Wrangler confirma Success!.

Listar (não revela valores):

bash
npx wrangler secret list
npx wrangler secret list --env staging

4. Configurar secrets do Supabase (Edge Functions)

No painel Lovable Cloud → Settings → Secrets, adicionar:

SecretValorNotas
MSG_QUEUE_WORKER_URLhttps://olp-msgqueue.<subdomain>.workers.dev (ou custom domain)Sem barra final
MSG_QUEUE_SECRETmesmo valor do passo 2Idêntico ao Worker
MSG_QUEUE_BACKENDworkerLiga 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

bash
# 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.dev

Custom 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):

bash
curl -sS https://olp-msgqueue-staging.<subdomain>.workers.dev/health | jq
# Esperado: { "ok": true, "redis": "up", "environment": "staging", ... }

Acquire (com auth):

bash
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:

bash
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: 401

Logs ao vivo:

bash
npx wrangler tail --env staging
npx wrangler tail            # production

7. Ativação em produção

Apenas depois de:

  • Staging com MSG_QUEUE_BACKEND=worker por 48h sem RATE_LIMITED em sms_log.
  • Smoke test verde em prod.
Lovable Cloud → Settings → Secrets → MSG_QUEUE_BACKEND = worker

Edge Functions pegam mudança no próximo cold start (segundos). Monitorar:

sql
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 = inprocess

Edge 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):

  1. Gerar novo: openssl rand -base64 48.
  2. Setar no Worker (staging + prod): npx wrangler secret put MSG_QUEUE_SECRET [--env staging].
  3. Setar no Supabase no MESMO momento. Janela de inconsistência = 401 transitório → fail-open absorve.
  4. 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

SintomaCausaAção
/health redis: downToken/URL errados ou Upstash foraConferir secrets; Upstash dashboard
401 em /acquireMSG_QUEUE_SECRET divergente Worker ↔ SupabaseRe-rotacionar secret nos dois lados
Edge Function sempre fallback inprocessMSG_QUEUE_WORKER_URL ausente, errada, ou Worker 5xxwrangler tail + checar secret Supabase
RATE_LIMITED voltou após ativardelayEntreEnviosMs reduzido cedo demais; ou múltiplos session_keySubir delay, conferir métricas Redis
Deploy falha com entrypoint not foundEsqueceu npm install ou path em wrangler.tomlReinstalar deps; conferir main = "src/index.js"

Referências