Go-live da Nero — checklist com prova¶
A Nero só recebe key_live_ depois de cumprir esta lista na operação nero-br-hml (sandbox). Cada item
tem uma prova: algo que se mostra (saída de teste, log, métrica, print do painel), não uma promessa. Item
sem prova conta como não feito. Esta lista complementa o checklist geral de
../go-live-operador.md com o que é específico da bet.
Copie para o tracker da Nero, preencha a coluna "Prova" e anexe ao registro de go-live.
1. Credencial e rede¶
| # | Item | Prova |
|---|---|---|
| N1 | Credencial do Dracma legível só pelo user Linux do nero_payments (0400), entregue pelo ops da Nero |
stat -c '%a %U' <arquivo> = 400 <user do nero_payments>; grep -r key_live_ no repositório e na imagem sem resultado |
| N2 | Egress para o Dracma só do user do nero_payments (R13) |
regra nftables versionada + teste: curl ao host do Dracma a partir de outro user falha |
| N3 | Allowlist da operação com todos os IPs de saída (NAT, DR) | print do painel com a lista + GET /v1/ping 200 a partir de cada IP |
| N4 | Caddy com a lista de IPs de egress do Dracma só na rota do webhook | trecho do Caddyfile versionado + curl à rota a partir de IP fora da lista → recusado no Caddy |
| N5 | NTP ativo e alerta de desvio > 5 s via GET /v1/ping |
chronyc tracking + regra de alerta versionada |
| N6 | mTLS de produção instalado; renovação agendada aos 60 dias | certificado com validade ≤ 90 dias + job/alerta de expiração a 30 dias |
| N7 | Rotação de chave e de segredo de webhook ensaiadas no sandbox sem downtime | log do ensaio: dois segredos ativos, webhooks ok durante a troca, chave antiga revogada |
2. Depósito¶
| # | Item | Prova |
|---|---|---|
| N8 | external_id = dep_<uuidv7> = deposit_id = Idempotency-Key, gravado no outbox antes do POST |
teste: matar o processo entre o commit do intent e a chamada; o worker retoma com a mesma chave e cria 1 depósito |
| N9 | Valor convertido para centavos sem float | teste de unidade com 50, 50.5, 0.01, 50.001 (recusa), 1e3 (recusa) |
| N10 | Exigências de GET /v1/currencies respeitadas: player.name e player.email do cadastro quando exigidos; em hml só @….test |
teste: jogador sem e-mail recebe "complete o cadastro" sem chamada ao Dracma; depósito com e-mail .test cria 201 |
| N11 | Front mostra o expires_at devolvido pelo Dracma |
print da tela + teste do mapeamento |
| N12 | Crédito só em paid lido por fetch-back, idempotente por external_id |
receita 4.1 de ../sandbox.md: 1 crédito; redeliver do mesmo evento: continua 1 |
| N13 | Webhook forjado (assinado com o segredo de sandbox) para depósito pending não credita |
teste com verificarWebhook + fetch-back: 200, 0 créditos |
| N14 | under_review não credita; returned aparece como failed |
receita 4.2 (PAYER_MISMATCH) e 4.3 (AMOUNT_MISMATCH) |
| N15 | paid_amount num depósito terminal (pago depois de expirar/cancelar) → needs_decision, sem crédito (D8) |
teste de unidade do aplicador com um objeto expired + paid_amount |
3. Saque¶
| # | Item | Prova |
|---|---|---|
| N16 | Reserva antes do POST /withdrawals, na mesma transação do intent wdr_<uuidv7> |
teste: falha de rede no POST → reserva continua, worker repete com a mesma chave, 1 saque |
| N17 | Reserva devolvida só em rejected/failed/cancelled confirmados ou em 4xx |
receitas reject e fail no sandbox: devolução exatamente 1 vez; 503 (outage) não devolve |
| N18 | player.ip do jogador em todo saque |
log do corpo enviado (sem PII) mostrando o campo presente; saque dentro de X× sai approved |
| N19 | Chave PIX normalizada e pix_type legado mapeado |
teste de unidade (evp → random, telefone em +55…) |
| N20 | Mensagens ao jogador genéricas em bloqueio (sem revelar lista/motivo) | print das mensagens para player_blocked, destination_blocked |
| N21 | returned/recalled → needs_decision, sem recrédito automático (D7/D18) |
receita return no sandbox: caso na fila, carteira intacta |
| N22 | 409 idempotency_key_reused no envio → needs_decision, reserva mantida (D12) |
teste de unidade do tratamento de resposta |
4. Recuperação, reconciliação e operação¶
| # | Item | Prova |
|---|---|---|
| N23 | Job de GET /events a cada 5 min, cursor persistido, mesmo aplicador do webhook |
teste: receptor desligado durante um pay; o job credita 1 vez em ≤ 5 min |
| N24 | Reconciliação diária com digest e assinatura conferidos | relatório de um dia de sandbox comparado nos dois lados, zero divergência, header guardado |
| N25 | Fila needs_decision no backoffice com permissões payments.decisions.*, step-up e motivo (D11) |
print da tela + teste de permissão (papel sem concessão não decide) |
| N26 | Alertas da tabela de webhook-e-jobs.md ativos | regras versionadas + disparo de teste de cada uma |
| N27 | Logs sem segredo, sem Dracma-Signature inteiro, sem CPF completo nem chave PIX em claro; Dracma-Trace-Id em toda chamada |
amostra de log revisada + busca pelos valores proibidos sem resultado |
| N28 | Suíte de conformidade verde contra nero-br-hml |
saída do go test … -v com todos os casos PASS e a data |
5. Dia do corte¶
| # | Item | Prova |
|---|---|---|
| N29 | Front em prd sem Dracma configurado responde 503 payment_provider_not_configured e o resto da bet funciona (D5) |
teste em hml com a credencial removida |
| N30 | Rotas legadas de gateway removidas (404) |
curl em cada rota da lista do §11 |
| N31 | Primeira transação real de valor mínimo (depósito e saque) acompanhada pelos dois lados, do POST à linha da reconciliação |
registro com os external_id, trace_id e a linha do relatório do dia |
| N32 | Caixa inicial conferido em GET /v1/balances e alerta de caixa baixo ativo |
print + regra de alerta |
| N33 | Decisões do dono registradas: D1 (saques antigos), D6, D7, D8, D12, D18 | link para o registro de decisão |
| N34 | Registro de go-live assinado pelos responsáveis da Nero e do Dracma | documento assinado |