LBCA — ambientes¶
A plataforma de cobrança LBCA é o sistema de recuperação de crédito para instituições de ensino: importa a carteira de inadimplentes, separa o que vale cobrar do que provavelmente prescreveu, negocia com desconto parametrizado por instituição, coleta a assinatura do acordo e concilia o pagamento dando baixa nos títulos. É produto da LBCA, construído pela Bravonix.
Desde agosto de 2026 ele tem três ambientes padronizados — dev, homolog e prod —, gerenciados por uma instalação própria do Coolify, em br-sao (São Paulo).
Esta página descreve esses ambientes: o que cada um serve, como o código chega neles e o que muda de um para o outro.
Multi-instituição — a ideia que organiza tudo¶
A plataforma atende várias instituições na mesma aplicação, e cada uma tem a própria gaveta no banco: tabelas separadas, cadastros de usuário separados. A instituição é resolvida pelo endereço — quem entra por fmu.… está na FMU, e não existe consulta que traga dado de outra instituição, porque ele não está lá.
Isso não é capricho de arquitetura: cada instituição é controladora distinta sob a LGPD, e a Bravonix é operadora. Com uma tabela só, o isolamento dependeria de todo filtro do sistema estar certo para sempre; com gavetas separadas, ele vira ausência de dado.
Endereço não cadastrado devolve 404 em tudo
A instituição sai do hostname. Um endereço que não esteja na tabela de domínios da aplicação recebe "não encontrado" em toda requisição — inclusive nos webhooks de provedores externos, que veriam um 404 onde esperavam um 200. Quando um ambiente ganha endereço novo, ele precisa ser cadastrado na aplicação, não só no DNS.
Os três ambientes¶
A FMU é a primeira instituição atendida, e por isso é ela que aparece nos endereços:
| Ambiente | Endereço da FMU | Serve para |
|---|---|---|
| Dev | fmu.dev.bravonix.ia.br | Integração contínua do time; base vazia |
| Homologação | fmu.homolog.bravonix.ia.br | Validação antes de produção; base vazia ou com amostra anonimizada |
| Produção | fmu.bravonix.ia.br | Ambiente-alvo, no ar e ainda sem dados |
Produção está no ar, mas ainda não recebeu a carteira
O ambiente responde normalmente e a base está vazia. A carga da carteira é um passo à parte, feito pela equipe responsável.
Por que os internos usam bravonix.ia.br
Ambientes internos ficam todos na zona bravonix.ia.br, no mesmo padrão dos demais serviços. O endereço comercial que a instituição vai usar é decisão separada.
O que compõe um ambiente¶
Os três têm o mesmo desenho: duas aplicações (build por Dockerfile) e um banco (recurso do Coolify, sem porta publicada na internet).
flowchart TB
U["Usuário"]
subgraph AMB["Um ambiente (dev / homolog / prod)"]
FE["Frontend<br>nginx — serve as telas e encaminha"]
API["API<br>Django + gunicorn"]
DB[("PostgreSQL<br>uma gaveta por instituição")]
end
EXT["Serviços externos<br>assinatura eletrônica · modelo de linguagem"]
U --> FE
FE --> API
API --> DB
API --> EXT
| Peça | Papel |
|---|---|
| Frontend (nginx) | Serve as telas e encaminha /api/, /admin/ e /static/ para a API — o navegador fala só com ele |
| API (Django + gunicorn) | Regras do produto, autenticação, importação da carteira, política de desconto e conciliação |
| PostgreSQL | Dados da aplicação, com um schema por instituição |
Só o frontend fica exposto na internet
A API não tem endereço público. Ela é alcançada apenas pelo frontend, por dentro da rede do ambiente. Quem precisa do admin do Django entra por /admin/ no mesmo endereço.
Os três ambientes dividem a mesma máquina
Como no SmartITBI, e diferente do Adapter, onde cada ambiente tem servidor próprio. A separação aqui é lógica: aplicações, bancos e endereços são independentes, mas o hardware é o mesmo — uma carga pesada em um ambiente pode ser sentida nos outros.
Branches — uma por ambiente¶
| Branch | Ambiente |
|---|---|
dev |
Dev |
homolog |
Homologação |
main |
Produção |
Um merge na branch dispara o deploy das duas aplicações daquele ambiente.
Como o código chega no ambiente¶
flowchart LR
A["Merge na branch<br>do ambiente"] --> B["Webhook<br>para o Coolify"]
B --> C["Build na máquina<br>dedicada de build"]
C --> D["Imagem publicada<br>no registry privado"]
D --> E["Servidor do ambiente<br>baixa e sobe o container"]
- O build não roda no servidor do ambiente: existe uma máquina só para isso — a mesma que atende o Adapter e o SmartITBI — e a imagem pronta vai para o registry privado da Bravonix.
- Nome da imagem:
<aplicação>-<ambiente>, com a tag sendo o commit. Cada ambiente tem seu próprio repositório de imagem. - Deploy bem-sucedido troca o container, e a troca tem alguns segundos de 502. Deploy que falha não derruba nada: o container antigo só sai depois que o novo sobe.
- O banco se resolve no boot: o passo de inicialização espera o banco responder, roda as migrations de todas as instituições e coleta os estáticos antes de a aplicação atender. Qualquer passo que falhe derruba o container — de propósito, para que ninguém fique atendendo com o banco pela metade.
As duas variáveis que decidem tudo¶
Cada ambiente diz duas coisas sobre si mesmo: em que máquina o processo está e qual configuração carregar. Elas têm que concordar, e o processo não sobe se discordarem.
A combinação que essa trava existe para impedir é "estou em produção" com a configuração de desenvolvimento: as outras quebram alguma coisa logo, essa funciona — e liga o modo de depuração, que mostra a configuração inteira, credencial de banco junto, para quem provocar um erro.
Dados — o que cada ambiente contém¶
| Ambiente | Origem dos dados | Contém dado pessoal? |
|---|---|---|
| Dev | Nasceu vazio | Não |
| Homologação | Vazio; recebe amostra anonimizada quando precisar | Não |
| Produção | Vazio até a carga da carteira | Ainda não |
A carteira tem dado pessoal de mais de cem mil pessoas
Nome, documento, telefone e endereço de devedores reais. Esse dado entra só em produção. Homologação e desenvolvimento trabalham com dado de teste ou amostra anonimizada — nunca com a base real.
A chave de cifra é diferente em cada ambiente, e isso é deliberado
Os dados pessoais são guardados cifrados, e cada ambiente tem a própria chave. Com chaves iguais, restaurar um backup de produção em homologação funcionaria — e a base real passaria a viver no ambiente onde mais gente tem acesso e ninguém audita. Com chaves diferentes, essa restauração falha imediatamente, com erro claro.
Consequência que vale saber antes de precisar: restaurar um backup exige a mesma chave que o cifrou. Ela não é trocada depois que existe dado, e é guardada separada do backup do banco.
Backup¶
| O que é salvo | Frequência | Onde |
|---|---|---|
| O banco de cada ambiente | Diário, horários escalonados | Bucket de backup por ambiente |
| Configuração do Coolify (variáveis e acessos dos três) | Diário | Bucket próprio |
- Um bucket por ambiente, com credencial restrita a ele — backup de produção não é alcançável por credencial de dev.
- Alerta por e-mail quando um backup falha, quando o arquivo não chega ao destino e também quando o backup deixa de rodar — a falha silenciosa é a que mais engana.
- O backup existe desde o primeiro dia do ambiente, não depois da primeira carga.
O backup mais importante não é o dos ambientes
É o da configuração do Coolify: ele guarda as variáveis e os acessos dos três ambientes de uma vez. A cópia só é útil junto com a chave que decifra essas variáveis — por isso as duas viajam juntas.
Convenção de nomes¶
Servidores seguem lbca-<papel>-<YYMM>: o papel no meio (controle, ambientes) e a data de criação no fim — nessa ordem porque só assim a listagem alfabética fica em ordem cronológica. É a mesma regra do SmartITBI e do Adapter.
O nome do servidor não diz quem está servindo o endereço
Quem responde por um domínio é o DNS, não o nome da máquina.
Troubleshooting¶
| Sintoma | Causa provável | O que fazer |
|---|---|---|
| O endereço devolve 404 em tudo, inclusive na verificação de saúde | Hostname não cadastrado na tabela de domínios da aplicação — a instituição sai do endereço | Cadastrar o endereço na instituição; sem isso nem o webhook de assinatura chega |
| A aplicação parece de pé, mas o painel a marca como não saudável | A verificação de saúde bate no endereço interno, que também precisa estar cadastrado | Cadastrar o endereço interno junto com os demais |
| As telas abrem e a API responde 404 num caminho | Caminho não encaminhado pelo frontend | Conferir a lista encaminhada (/api/, /admin/, /static/) |
| Um usuário criado não consegue entrar no admin da instituição | Usuário criado na gaveta errada — o comando padrão cria no cadastro da plataforma, não no da instituição | Recriar o usuário dentro da gaveta da instituição |
| Merge não dispara deploy nenhum | Branch sem ambiente correspondente | Usar dev, homolog ou main |
| Erro 502 por alguns segundos | Troca de container em deploy bem-sucedido | Comportamento esperado; escolher a janela de deploy |
| Uma variável mudou no painel e a tela continua igual | Variável de build fica congelada dentro do JavaScript — mudá-la no painel não faz efeito | Refazer o build; e nunca colocar segredo em variável de build, ela é baixada por qualquer visitante |
| O container não sobe e o log não diz nada útil | Segredo colado com espaço no fim: o painel não limpa o valor, e uma chave de cifra com um caractere a mais é recusada | Recolar o valor sem espaço |
Onde estão as credenciais
Acessos ao painel, aos bancos e às contas de serviço ficam com a equipe de desenvolvimento — nunca nesta wiki. Solicite ao responsável pelo ambiente.