Adapter (LGPDQuest) — ambientes¶
O Adapter é a aplicação de conformidade LGPD que consome o BravoCore como backend de IA. Ele tem quatro ambientes — dev, test, homolog e prod. Desde 14/09/2026, test compartilha o servidor de dev; homologação e produção têm servidores próprios. Todos são gerenciados por uma única instalação do Coolify, numa VPC dedicada 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.
Os quatro ambientes¶
| Ambiente | Front | API | Serve para |
|---|---|---|---|
| Dev | dev.adapter.bravonix.ia.br | api.dev.adapter.bravonix.ia.br |
Integração contínua do time; origem da cópia inicial de test |
| Test | test.adapter.bravonix.ia.br | api.test.adapter.bravonix.ia.br | Testes da branch test, com cópia inicial de dev e dados separados |
| Homologação | homolog.adapter.bravonix.ia.br | api.homolog.adapter.bravonix.ia.br |
Validação antes de produção; base restaurada a partir do ambiente antigo |
| Produção (nova) | prod.adapter.bravonix.ia.br | api.prod.adapter.bravonix.ia.br |
Ambiente-alvo, no ar em paralelo com a produção atual |
A produção que atende clientes ainda é a antiga
Quem atende cliente hoje é adapter.lgpdnow.com.br (com API em adapter.bravonix.api.br), na infraestrutura anterior. O ambiente prod.adapter.bravonix.ia.br roda com uma cópia dos dados e existe para validação — os dois convivem, cada um no seu endereço, até a virada de DNS ser autorizada. Não mande cliente para o endereço novo.
Por que os internos usam bravonix.ia.br
Ambientes internos ficam todos na zona bravonix.ia.br. A produção fica em lgpdnow.com.br porque é o endereço que os clientes já usam — trocá-lo é decisão comercial, não técnica.
O que compõe um ambiente¶
Os quatro têm o mesmo desenho: cinco aplicações (build por Dockerfile) e quatro bancos (recursos do Coolify, sem porta publicada na internet), mais um bucket de objetos próprio.
flowchart TB
U["Usuário"]
subgraph AMB["Um ambiente (dev / test / homolog / prod)"]
FE["Front<br>nginx + build Vite"]
API["adapter-api<br>Koa"]
BC["BravoCore<br>Django"]
CW["celery worker"]
CB["celery beat"]
DB1[("adapter-db<br>PostgreSQL + pgvector")]
DB2[("bravocore-db<br>PostgreSQL + pgvector")]
R1[("Redis — Koa")]
R2[("Redis — Celery")]
end
COS[("Bucket de objetos<br>um por ambiente")]
LF["Langfuse<br>tracing de LLM"]
U --> FE
U --> API
FE --> API
API --> BC
API --> DB1
API --> R1
BC --> DB2
BC --> R2
R2 --> CW
CB --> R2
BC --> COS
BC --> LF
CW --> LF
| Peça | Repositório | Papel |
|---|---|---|
| Front | adapter (/frontend) |
Interface web, servida por nginx |
adapter-api |
adapter-api |
API principal (Koa), dona do login e dos processos |
BravoCore |
BravoCore (/backend) |
API de IA/RAG, admin Django e documentação da API |
celery worker |
BravoCore |
Processamento assíncrono (ingestão de documentos, agentes) |
celery beat |
BravoCore |
Tarefas agendadas |
Roteamento — um domínio, dois backends¶
O domínio de API de cada ambiente atende duas aplicações, divididas por caminho:
| Caminho | Vai para |
|---|---|
/api, /admin, /static |
BravoCore (Django) |
Todo o resto (/) |
adapter-api (Koa) |
Dois logins parecidos, em aplicações diferentes
POST /v1/auth/login é o login do Adapter (Koa).
POST /api/v1/auth/login/ é o login do BravoCore (Django).
Chamar a rota errada devolve 401 e parece senha inválida.
O admin do Django fica em /administrator/
/admin não existe como rota da aplicação — mas é o prefixo que roteia o tráfego até o Django, porque a regra casa por texto (/admin cobre /administrator). Por isso ele aparece na tabela acima.
Branches — uma por ambiente¶
| Repositório | Dev | Test | Homologação | Produção |
|---|---|---|---|---|
adapter |
dev |
test |
homolog |
main |
adapter-api |
dev |
test |
homolog |
main |
BravoCore |
develop |
test |
homolog |
main |
O BravoCore usa develop, não dev
É a única exceção. Apontar a branch errada falha no clone e o painel mostra apenas um erro genérico de deploy.
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, 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 — o mesmo commit em ambientes diferentes gera imagens diferentes, porque as variáveis de build também são diferentes. - 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. Isso decide a janela de deploy em ambiente que atende usuário.
Variável do front é de build, não de execução
O endereço da API usado pelo front (VITE_*) entra na hora do build. Mudar a variável sem refazer o build não muda nada — e o sintoma é o login falhar.
Dados — o que cada ambiente contém¶
| Ambiente | Origem dos dados | Contém dado pessoal? |
|---|---|---|
| Dev | Base de desenvolvimento existente | Há contas cadastradas; não presumir ausência de dados pessoais |
| Test | Cópia de dev em 14/09/2026, sem sincronização posterior | Tratar com os mesmos cuidados da origem; há contas copiadas |
| Homologação | Restaurado do ambiente antigo de homologação | Sim — há usuários reais de cliente na base do BravoCore |
| Produção (nova) | Cópia da produção atual | Sim |
Cópias de dados precisam preservar as chaves de criptografia
O BravoCore guarda e-mail cifrado no banco e o Adapter cifra dados de 2FA. Restaurar um dump de um ambiente em outro sem levar as chaves não dá erro de deploy: o ambiente sobe, responde normalmente e os campos aparecem em branco, com usuários que não conseguem entrar. Na migração de produção e na cópia inicial de dev para test, as chaves de cifra são copiadas da origem. Segredos de sessão e assinatura de test são próprios.
Nas chaves de banco e de Redis vale o contrário: são novas em cada ambiente, porque autenticam em vez de cifrar.
Cada ambiente também tem bucket de objetos próprio, com credencial restrita a ele: credencial de dev não alcança arquivo de produção, e apagar um documento no ambiente novo não toca no arquivo do cliente.
Observabilidade — Langfuse único¶
Os ambientes usam uma instância só do Langfuse, com projetos dev, homolog e prod. Test herdou a configuração de observabilidade de dev; não tem projeto exclusivo:
Backend e worker precisam de configuração própria. Consulte a página do Langfuse para configurar e validar cada ambiente.
Tracing falha em silêncio
Quando o endereço do Langfuse está errado, a aplicação não dá erro, não fica lenta e não registra nada no log: os traces simplesmente não aparecem. Se um ambiente parar de aparecer no Langfuse, o primeiro lugar a olhar é a variável que aponta para ele.
Backup¶
| O que é salvo | Frequência | Onde |
|---|---|---|
| Bancos de dev, homolog e prod | Diário, horários escalonados | Armazenamento de backup já configurado |
| Os dois PostgreSQL de test | Diário, 00h30 e 00h45 (Fortaleza) | Armazenamento existente, com diretórios exclusivos |
| Configuração do Coolify (variáveis e acessos dos quatro) | Diário | Bucket próprio |
| Volumes do Langfuse | Diário | Bucket próprio |
- Dev, homolog e prod mantêm a política existente de retenção de 14 dias. Test usa diretórios separados no armazenamento de backup existente.
- 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 é o caso que mais engana.
- As restaurações dos ambientes anteriores foram testadas em destino descartável. Em test, a cópia inicial foi conferida por contagem de tabelas e linhas, e os primeiros backups concluíram com sucesso; a restauração desses novos backups ainda não foi ensaiada.
O backup mais importante não é o dos ambientes
É o da configuração do Coolify: ele guarda as variáveis e as chaves de acesso dos quatro ambientes de uma vez. Perder essa máquina sem cópia é perder a configuração dos quatro — e a cópia só é útil junto com a chave que decifra as variáveis.
Particularidades de test¶
Atualizado em 14/09/2026.
- Branch
testnos três repositórios; publicação automática nas cinco aplicações. - Compartilha CPU, memória e disco com dev. Testes de carga podem afetar os dois ambientes.
- Dois PostgreSQL copiados de dev e dois Redis novos, inicialmente vazios. Bancos, senhas, volumes e filas são separados, sem portas públicas.
- Bucket próprio com 23 arquivos copiados de dev e conferidos por hash. Alterações posteriores não são sincronizadas. A pasta de mídia é compartilhada apenas pelos processos de test.
- Envio de e-mails reais habilitado em 15/09/2026, pelo Resend, com a mesma credencial de homologação. Recuperação de senha e convites podem enviar mensagens reais; use destinatários de teste autorizados.
- Integrações externas e observabilidade foram herdadas de dev; não representam isolamento completo de contas externas.
- Administração do BravoCore, documentação da API, saúde do Adapter e saúde do BravoCore.
- Login do Adapter validado até a tela de documentos legais pendentes; o aceite cabe ao usuário. Login administrativo do BravoCore, integração entre APIs e tarefa de fila foram validados. Isso não equivale à homologação completa de OCR, ingestão ou respostas dos agentes.
Convenção de nomes¶
Servidores seguem adapter-<NN>-<ambiente>-<YYMM>: o produto na frente, número apenas para ambiente (01-dev, 02-homolog, 03-prod), infraestrutura sem número, e a data de criação no fim — nessa ordem porque só assim a listagem alfabética fica em ordem cronológica.
O nome do servidor não diz quem está servindo o endereço
A regra nasceu de um problema real: nomes com "novo" e "produção" espalhados por máquinas que serviam outra coisa. Quem responde por um domínio é o DNS, não o nome da máquina.
Troubleshooting¶
| Sintoma | Causa provável | O que fazer |
|---|---|---|
| Login devolve 401 com credencial certa | Rota trocada entre Adapter (/v1/auth/login) e BravoCore (/api/v1/auth/login/) |
Conferir qual das duas aplicações deveria autenticar |
| Login falha depois de mudar o domínio | Variáveis VITE_* do front são de build |
Atualizar a variável e refazer o build |
| Caminho da API responde 404 vindo da aplicação | Prefixo do caminho sendo removido antes de chegar no backend | Verificar se a aplicação já serve naquele caminho |
| Deploy falha logo no início, sem log útil | Branch inexistente no repositório (o BravoCore usa develop) |
Conferir a branch configurada |
| Ambiente sobe, responde 200, mas quebra no primeiro uso | Banco vazio — migrations não aplicadas | Conferir se o passo de migração rodou no deploy |
| Traces pararam de aparecer no Langfuse | Endereço do Langfuse errado (falha silenciosa) | Conferir a variável do ambiente e o projeto de destino |
| Erro 502 por alguns segundos | Troca de container em deploy bem-sucedido | Comportamento esperado; escolher a janela de deploy |
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.