Skip to content

Staging — Referência Rápida

Documento de referência preenchido com os valores reais do ambiente de staging. Para as motivações e decisões por trás do staging, ver STAGING_WHY.md. Para o guia de setup inicial, ver STAGING_SETUP.md.

Última atualização: 2026-04-05


1. Visão Geral da Infraestrutura

text
 PRODUÇÃO                                    STAGING
 ════════                                    ═══════

 olp.digital                                 staging.olp.digital
      │                                           │
      ▼                                           ▼
 ┌──────────────────┐                       ┌──────────────────┐
 │ Lovable Hosting  │                       │ Cloudflare Pages │
 │ (frontend)       │                       │ Branch: main     │
 └────────┬─────────┘                       └────────┬─────────┘
          │                                          │
          ▼                                          ▼
 ┌──────────────────┐                       ┌──────────────────┐
 │ CF Worker        │                       │ CF Worker        │
 │ gateway.olp      │                       │ gateway-staging  │
 │ .digital         │                       │ .olp.digital     │
 │                  │                       │                  │
 │ COOKIE_DOMAIN:   │                       │ COOKIE_DOMAIN:   │
 │ .olp.digital     │                       │ .staging.olp     │
 │                  │                       │   .digital       │
 └────────┬─────────┘                       └────────┬─────────┘
          │                                          │
          ▼                                          ▼
 ┌──────────────────┐                       ┌──────────────────┐
 │ Supabase PROD    │                       │ Supabase STAGING │
 │ mjvuzsizjlca...  │                       │ nrgcajnhpjmw...  │
 │                  │                       │                  │
 │ JWT_SECRET: A    │  ← DIFERENTES →       │ JWT_SECRET: B    │
 │ PEPPER: X        │                       │ PEPPER: Y        │
 │ 52+ Edge Funcs   │                       │ 52+ Edge Funcs   │
 └──────────────────┘                       └──────────────────┘

 ⚠️ Token assinado com JWT_SECRET A NÃO funciona no ambiente B (e vice-versa)

2. URLs e Endpoints

RecursoURL
Frontendhttps://staging.olp.digital
Worker Gatewayhttps://gateway-staging.olp.digital
Supabase APIhttps://nrgcajnhpjmwilfcmqyb.supabase.co
Edge Functionshttps://nrgcajnhpjmwilfcmqyb.supabase.co/functions/v1/<nome>
Supabase Dashboardhttps://supabase.com/dashboard/project/nrgcajnhpjmwilfcmqyb
Portal Monteiro Lobatohttps://staging.olp.digital/escola/monteiro-lobato
Portal Nova Erahttps://staging.olp.digital/escola/nova-era

3. Supabase Staging — Identificadores

ItemValor
Project Refnrgcajnhpjmwilfcmqyb
Região(mesma de produção)
Anon KeyConfigurada no Cloudflare Pages e GitHub Secrets

⚠️ Nunca commitar o service_role_key no código. Está apenas nos GitHub Secrets.


4. Secrets — Supabase Staging

Secrets configurados via Supabase Dashboard → Settings → Edge Functions → Secrets.

SecretStatusNota
OLP_JWT_SECRET✅ ConfiguradoPróprio do staging (≠ produção)
OLP_PEPPER_SECRET✅ ConfiguradoPróprio do staging (≠ produção)
E2E_TEST_PASSWORD✅ ConfiguradoMesmo valor no GitHub Actions
CRON_SECRET✅ ConfiguradoPróprio do staging (≠ produção)
WASENDER_API_KEY✅ ConfiguradoCredenciais de staging
WASENDER_WEBHOOK_SECRET✅ ConfiguradoCredenciais de staging
NTFY_TOPIC✅ ConfiguradoTópico diferente de produção
SUPABASE_URL✅ AutoPreenchido automaticamente
SUPABASE_ANON_KEY✅ AutoPreenchido automaticamente
SUPABASE_SERVICE_ROLE_KEY✅ AutoPreenchido automaticamente
SUPABASE_DB_URL✅ AutoPreenchido automaticamente
SUPABASE_PUBLISHABLE_KEY✅ AutoMesmo valor do anon key
OLP_PORTAL_SECRETN/APortal usa OLP_JWT_SECRET (unificado). Não existe no código — ver AUTHENTICATION.md
TWILIO_*❌ DescontinuadoTwilio removido — Wasender é o provedor exclusivo
MP_ACCESS_TOKEN❌ PendenteMercadoPago não configurado

Regra de isolamento

text
CORRETO:
  OLP_JWT_SECRET do staging ≠ OLP_JWT_SECRET da produção
  OLP_PEPPER_SECRET do staging ≠ OLP_PEPPER_SECRET da produção
  CRON_SECRET do staging ≠ CRON_SECRET da produção
  NTFY_TOPIC do staging ≠ NTFY_TOPIC da produção

ERRADO:
  Qualquer secret de segurança igual entre staging e produção

5. Rotação de Secrets

Quando rotacionar

  • Suspeita de comprometimento
  • Rotação periódica (recomendado: a cada 90 dias para secrets de segurança)
  • Mudança de pessoal com acesso

Processo de rotação

bash
# 1. Gerar novo valor
NEW_SECRET=$(openssl rand -hex 32)

# 2. Atualizar no Supabase
supabase secrets set --project-ref nrgcajnhpjmwilfcmqyb \
  OLP_JWT_SECRET="$NEW_SECRET"

# 3. Redeploy de TODAS as Edge Functions que usam o secret
#    (o redeploy faz as funções lerem o novo valor do env)
supabase functions deploy --project-ref nrgcajnhpjmwilfcmqyb

# 4. Validar
curl -X POST "https://nrgcajnhpjmwilfcmqyb.supabase.co/functions/v1/auth-diagnostics" \
  -H "Content-Type: application/json" \
  -d '{"action": "check"}'

Dependências de cada secret

SecretEdge Functions que dependemImpacto da rotação
OLP_JWT_SECRETTodas que usam auth-helpers.ts (extractAuthenticatedUser) — ~45 funçõesTodas as sessões existentes são invalidadas (JWT assinado com secret antigo falha verificação)
OLP_PEPPER_SECRETsend-otp, verify-otp (hash do OTP)OTPs pendentes falham verificação — novos OTPs funcionam normalmente
CRON_SECRETfaturamento-cron, maintenance-cron, healthcheck-cronCrons autenticados via header X-Cron-Secret param de funcionar até atualizar o caller (Supabase cron ou externo)
E2E_TEST_PASSWORDe2e-loginTestes CI falham até atualizar o GitHub Secret correspondente
WASENDER_API_KEYsend-otp (envio via WaSender)Envio de mensagens WhatsApp falha

Ordem recomendada para rotação do OLP_JWT_SECRET

  1. Gerar novo valor
  2. supabase secrets set com novo valor
  3. Redeploy de todas as Edge Functions
  4. Nota: usuários logados serão deslogados (cookie olp_auth contém JWT inválido)
  5. Validar com auth-diagnostics ou login de teste via e2e-login

6. Impacto dos Secrets Pendentes

Secret pendenteFuncionalidade quebrada no stagingTestes afetadosWorkaround
Seed data do muralPortal mural sem dados (mural_liberacoes, mural_dados_publicados, escola_mural_config)E2E de mural não rodam no CINenhum — testes de mural estão desabilitados
TWILIO_*(Descontinuado — Wasender é o provedor exclusivo)N/AN/A
MP_ACCESS_TOKENmercadopago-preference retorna erro ao criar preferência de pagamento; mercadopago-webhook não valida assinaturaFluxo de pagamento completo não testávelNenhum — pagamentos não são alvo dos testes CI

7. Mecanismo do e2e-login

O login direto para testes automatizados funciona por ausência intencional de secret em produção — sem flags de ambiente, sem código condicional. O E2E_TEST_PASSWORD é a senha real dos usuários de teste, e o e2e-login autentica legitimamente, apenas pulando o envio de OTP WhatsApp.

Como funciona

text
1. Edge Function `e2e-login` registrada em config.toml com verify_jwt = false
2. Recebe: { cpf_or_code, papel? } + header X-E2E-Key
3. Valida: X-E2E-Key === Deno.env.get("E2E_TEST_PASSWORD")
4. Se válido: busca usuário → gera JWT → seta cookie olp_auth → retorna dados

Por que é seguro

text
PRODUÇÃO:
  E2E_TEST_PASSWORD não está configurado
  → Deno.env.get("E2E_TEST_PASSWORD") retorna undefined
  → "qualquer-valor" === undefined → false
  → 401 Unauthorized (SEMPRE)

STAGING:
  E2E_TEST_PASSWORD está configurado
  → header deve conter o valor exato
  → 200 OK + JWT + cookie

Não é uma flag de ambiente. A segurança não depende de NODE_ENV=production ou qualquer condicional. Depende da ausência física do secret no ambiente de produção. Mesmo que alguém descubra o nome do header e da Edge Function, sem o secret correto a resposta é sempre 401.


8. Secrets — GitHub Actions

Repository secrets configurados em Settings → Secrets and variables → Actions.

SecretStatusUso
SUPABASE_ACCESS_TOKENToken pessoal do Supabase CLI
STAGING_PROJECT_REFnrgcajnhpjmwilfcmqyb
STAGING_SUPABASE_URLhttps://nrgcajnhpjmwilfcmqyb.supabase.co
STAGING_SUPABASE_ANON_KEYAnon key do projeto staging
E2E_TEST_PASSWORDMesmo valor do Supabase staging
SUPABASE_SERVICE_ROLE_KEYPara operações administrativas no CI
NTFY_TOPIC_URLNotificações de falha do CI (hash ou URL completa)

Como o CI usa os secrets

yaml
env:
  VITE_SUPABASE_URL: ${{ secrets.STAGING_SUPABASE_URL }}
  VITE_SUPABASE_PUBLISHABLE_KEY: ${{ secrets.STAGING_SUPABASE_ANON_KEY }}
  E2E_TEST_PASSWORD: ${{ secrets.E2E_TEST_PASSWORD }}

9. Frontend — Cloudflare Pages

ItemValor
PlataformaCloudflare Pages
Branchmain
Build Commandbun install && bun run build
Output Directorydist
Domíniostaging.olp.digital (CNAME no Cloudflare DNS)

Variáveis de ambiente (Cloudflare Pages Dashboard)

VariávelValor
VITE_SUPABASE_PROJECT_IDnrgcajnhpjmwilfcmqyb
VITE_SUPABASE_PUBLISHABLE_KEY(anon key do staging)
VITE_SUPABASE_URLhttps://nrgcajnhpjmwilfcmqyb.supabase.co
VITE_USE_WORKERtrue
VITE_WORKER_URLhttps://gateway-staging.olp.digital

10. Worker Gateway — Cloudflare

ItemValor
Nomeolp-gateway-staging
URLhttps://gateway-staging.olp.digital
COOKIE_DOMAIN.staging.olp.digital
SUPABASE_URLhttps://nrgcajnhpjmwilfcmqyb.supabase.co

O Worker reescreve os cookies olp_auth e olp_mural com Domain=.staging.olp.digital para que funcionem no frontend.


11. Dados de Teste

Ver seed_test_users.sql para referência completa.

Escolas

NomeSlug (mural)Uso
Escola Municipal Monteiro Lobatomonteiro-lobatoEscola principal
Colegio Particular Nova Eranova-eraIDOR cross-escola
Rede Educacional FuturoMulti-role

Usuários (7 ativos)

NomeCódigoPapelEscola
Dev Admin42970698064administradorGlobal
Dev Especialista63100416066especialistaGlobal
Dev Coordenador99407464075coordenadorMonteiro Lobato
Dev Diretor61626069026diretorMonteiro Lobato
Dev Escola77457094000157escolaMonteiro Lobato
Dev Testes Multi Role407508100179+ papéisTodas
Dev Coordenador da Nova Era47691226080coordenadorNova Era

Multi-Role detalhamento

O usuário 40750810017 possui: administrador, especialista, coordenador (×3 escolas), diretor, escola, pedagogico, professor.


12. Pipeline CI

text
lint-and-build → deploy-staging → contract-tests → security-tests → e2e
                                   (smoke test)     (IDOR bloqueador)  (Playwright)

O que cada job precisa

JobSecretsDados no banco
deploy-stagingSUPABASE_ACCESS_TOKEN, STAGING_PROJECT_REF
contract-testsSTAGING_SUPABASE_URL, STAGING_SUPABASE_ANON_KEY, E2E_TEST_PASSWORD7 usuários com CPFs exatos
security-testsIdemCoord Monteiro + Coord Nova Era
e2eIdem + BASE_URL=staging.olp.digitalAdmin, Coordenador, Edge Functions deployadas

13. Storage Buckets

BucketPúblicoStatus
banners-loginCriado
curso-thumbnailsCriado
tutoriais-thumbnailsCriado
mural-imagensCriado

14. Diferenças Staging vs Produção

AspectoProduçãoStagingImpacto no staging
Supabase RefmjvuzsizjlcalyfmbquynrgcajnhpjmwilfcmqybDados e sessões completamente isolados
Domínioolp.digitalstaging.olp.digitalCookies não vazam entre ambientes
FrontendLovable hostingCloudflare PagesDeploy via CF Pages Dashboard ou CI
Gateway Workergateway.olp.digitalgateway-staging.olp.digitalReescrita de cookies no domínio staging
WhatsApp (Wasender)Ativo✅ ConfiguradoProvedor exclusivo de mensagens
Pagamentos (MP)Ativo❌ Não configuradoFluxo de pagamento/fatura não testável
Notificações (WaSender)Ativo✅ ConfiguradoWhatsApp funcional para testes
NTFYTópico de produçãoTópico separadoAlertas de CI não poluem produção
E2E_TEST_PASSWORD❌ Não existe✅ ConfiguradoSenha dos usuários de teste para login direto (sem OTP)
e2e-loginRetorna 401 sempre✅ FuncionalVer §7 — Mecanismo do e2e-login
Portal (mural)Ativo (via OLP_JWT_SECRET unificado)❌ Sem seed data do muralTestes E2E de portal desabilitados

15. Troubleshooting

ErroCausaFix
404 "Usuário não encontrado"Usuário de teste não criadoCriar via UI com CPF exato
500 em authCatch block da EF não mapeia erroCorrigir a função
401 com cookie válidoOLP_JWT_SECRET não bateVerificar secret no Supabase staging
CORS bloqueadoOrigem não em ALLOWED_ORIGINSVerificar cors-helpers.ts
Cookie não setadoWorker não reescreve DomainVerificar COOKIE_DOMAIN no Worker
Edge Function timeoutCold startAumentar timeout ou warmup
CI falha "env not set"Secret faltando no GitHubAdicionar em Settings → Secrets

16. Referências