Girowin: uma plataforma de jogos com dinheiro real
Como eu estruturei a plataforma do Girowin: serviços NestJS por domínio, carteira com ledger idempotente, mensageria com RabbitMQ e operação com várias réplicas.

1. Contexto & Desafio de Engenharia
O Girowin é uma plataforma de jogos online com cassino, jogos originais, cassino ao vivo, carteira, promoções, afiliados e KYC, operada por um backoffice completo. Eu sou o CTO e construí a arquitetura e boa parte do backend. Numa plataforma assim, cada centavo precisa estar certo: o mesmo depósito não pode virar saldo duas vezes, uma aposta não pode ser debitada duas vezes e o histórico precisa fechar com o saldo, mesmo com provedores reenviando callbacks e filas reentregando mensagens.
Os problemas que guiaram a arquitetura: • Provedores de jogos e gateways de pagamento reenviam chamadas; a fila reentrega mensagens. • Muitas apostas concorrentes sobre a mesma carteira. • Jobs agendados rodando em várias réplicas ao mesmo tempo. • Integrações com exigências diferentes, inclusive IP fixo de saída. • Um backoffice que precisa enxergar tudo: financeiro, risco, KYC e CRM.
2. Decisões
As decisões principais: • Serviços por domínio: auth, casino, gaming, payment, affiliates, communication e CRM, num monorepo NestJS, cada um com o próprio banco PostgreSQL. • Crédito idempotente: cada crédito leva o id do movimento de origem como chave, e um reenvio devolve o recibo original. • Ledger da carteira, hoje em implantação: cada movimento grava saldo anterior e posterior na mesma transação que altera o saldo, com uma chave única por carteira, tipo e id externo. • Concorrência explícita: débitos de aposta com FOR UPDATE e saques com advisory lock por saque e recibo de débito. • Eventos entre serviços por RabbitMQ, com o cliente endurecido contra queda do canal. • Workers separados da API (papéis web e worker), com crons coordenados por lease no Redis. • Um proxy de saída com IP fixo para os provedores que exigem allowlist.