O cliente de aplicação open-source para bases de dados de schema. Execute-o junto ao seu próprio PostgreSQL, emparelhe uma vez e ele mantém essa base de dados convergida com os seus enrichments — inicializando a partir de um snapshot e, depois, aplicando um feed delta em tempo real através de um único WebSocket de saída. A sua connection string nunca sai da sua máquina.
Cada instrução é protegida por revisão, pelo que um batch reentregue converge para as mesmas linhas. Um erro de SQL faz rollback ao batch e interrompe-o — um delta problemático nunca é ignorado silenciosamente.
O cliente obtém estado, não operações: cada delta transporta a(s) linha(s) atual(is) completa(s) de uma entity alterada como um INSERT … ON CONFLICT … DO UPDATE idempotente, para que o destino convirja mesmo que um batch tenha sido perdido.
As bases de dados de schema podem ser consumidas de várias formas — n8n, Make.com, MCP, webhooks diretos ou o feed delta REST. O cliente de sincronização é o caminho totalmente automatizado: o menos a construir e o menos a expor.
Sem scenario do n8n, sem cron, sem código de ligação. Emparelhe uma vez e ele arranca a partir do snapshot, aplicando depois cada delta à medida que chega.
A connection string é passada na linha de comandos ou armazenada localmente em modo 600 — nunca é enviada para o Entity Enricher. O cliente liga-se apenas para o exterior.
Cada delta é um upsert idempotente e protegido por revisão. Se o cliente falhar a meio de um batch, o batch é reentregue após a expiração da sua concessão e a reaplicação converge para as mesmas linhas.
Um erro de SQL reverte o lote, reporta o delta com falha na página Bases de dados e termina com um código diferente de zero — um delta problemático nunca pode ser ignorado silenciosamente.
Registe primeiro uma base de dados num schema, depois emparelhe um cliente e execute-o junto à sua base de dados.
Na página Databases, registe uma base de dados no schema que pretende espelhar e reveja as respetivas chaves da base de dados. Consulte Databases para conhecer o modelo completo. Este passo declara o dialeto de destino que o cliente irá aplicar.
Transfira um binário assinado a partir de Versões ou compile a partir do código-fonte (Go ≥ 1.23).
go build -o ee-database .
O código-fonte e as versões assinadas encontram-se em TOT-Concept/ee-database (MIT).
Execute ee-database pair. Abre-se um separador do navegador em /database/connect com um código curto — confirme-o e escolha que base de dados este cliente deve sincronizar.
ee-database pair --server https://entityenricher.ai Open this URL in your browser to confirm pairing: https://entityenricher.ai/database/connect?code=7QX-KP2 Code: 7QX-KP2 Waiting for confirmation...
Prefere um token? Emita um na página Databases (Sync client → Pair a client) e passe-o diretamente: ee-database pair --server … <refresh-token>.
Na primeira execução, o cliente obtém o snapshot .sql e aplica-o, ligando-se depois e transmitindo deltas. --save-dsn guarda a string de ligação localmente, para que as execuções seguintes não precisem de argumentos.
ee-database run --dsn "postgres://user:pass@localhost:5432/mydb" --save-dsn
“Ao lado” significa adjacente na rede, não no servidor da base de dados: qualquer máquina ou contentor que consiga alcançar a DSN funciona — incluindo PostgreSQL gerido na cloud (Azure, OVHcloud, AWS RDS…), que normalmente impõe TLS: …/mydb?sslmode=require.
Os deltas saem do Entity Enricher através de uma caixa de saída FIFO rigorosa por base de dados. O servidor concede a janela visível durante 120 segundos e envia-a como um único lote; o cliente aplica todo o lote numa única transação e responde ack , o que faz avançar o cursor e aciona a próxima janela de imediato. Um cliente que falha a meio de um lote está protegido pela expiração da concessão e por um reenvio do lado do servidor — nada se perde nem é confirmado em duplicado.
O arranque inicial e o estado estável partilham o mesmo caminho de código. Ignore o arranque inicial com --skip-bootstrap se a sua base de dados já estiver preenchida.
Cada instrução transporta um _sync_revision para que uma linha mais antiga nunca substitua uma mais recente, mesmo fora de ordem.
Um erro de SQL armazena o id do delta com falha na página Bases de dados → cartão do cliente de sincronização, e o processo termina com um código diferente de zero para que o seu supervisor o reinicie.
O dialeto de destino é definido pelo registo da schema-database no Entity Enricher — o cliente aplica o SQL que o servidor gerar. PostgreSQL é o dialeto de lançamento; os drivers MySQL e SQLite já vêm incluídos para quando os respetivos geradores de SQL forem disponibilizados. A aplicação de múltiplas instruções é tratada por cada driver (protocolo simples pgx, multiStatements do MySQL e SQLite sem CGO).
O cliente inicia o WebSocket através de :443/wss. O host da sua base de dados nunca aceita ligações de entrada — sem portas para abrir, sem ingress para configurar.
Uma credencial está associada a uma única base de dados de esquema. Emparelhar novamente rotaciona-a e remove instantaneamente a ligação ativa anterior.
O refresh token de 365 dias (armazenado em modo 600) é trocado por tokens de acesso de 15 minutos que autenticam o WebSocket. Revogar na interface desliga um cliente ativo em cerca de 1 segundo.
Execute o cliente com uma função de base de dados dedicada, limitada ao schema sincronizado, para que um token comprometido não possa aceder a mais nada.
| Comando | O que faz |
|---|---|
| ee-database pair --server URL | Emparelhamento por código de dispositivo confirmado no navegador. Escolha que base de dados sincronizar. |
| ee-database pair --server URL <token> | Emparelhe com um token emitido na página Databases (compatível com modo headless). |
| ee-database run --dsn DSN [--save-dsn] [--skip-bootstrap] | Faça o arranque inicial a partir do snapshot (a menos que seja ignorado) e, em seguida, ligue-se e aplique os deltas. |
| ee-database run … --create-missing | Crie primeiro a base de dados de destino se ela não existir, utilizando as credenciais do próprio DSN (o postgres precisa de CREATEDB, o mysql do privilégio CREATE; os ficheiros sqlite são criados automaticamente de qualquer forma). |
| ee-database run … --create-missing --admin-dsn DSN | Inicialize tudo o que o DSN de destino nomeia através de uma ligação de administrador: o role/utilizador em falta (com a palavra-passe do DSN) e a base de dados de que é proprietário. O DSN de destino deixa então de necessitar de direitos de criação; o DSN de administrador nunca é armazenado. |
| ee-database run --all | Sincronizar todas as bases de dados emparelhadas em simultâneo a partir de um único processo (cada uma precisa de um DSN guardado). |
| ee-database status | Mostrar o estado do emparelhamento, o URL do servidor e as bases de dados emparelhadas. |
| ee-database disconnect | Esquecer as credenciais locais de um emparelhamento. Revogue no servidor a partir da interface. |
| ee-database version | Versão para impressão. |
As credenciais são armazenadas em modo-600, um perfil por base de dados emparelhada, em ~/.config/ee-database/profiles/ — emparelhe uma vez por base de dados e --database NAME seleciona uma quando várias estão emparelhadas. Prefere não usar automação de todo? O mesmo feed está disponível em REST simples: GET /api/databases//changes seguido de POST /api/databases//ack — consulte Bases de dados.
O cliente tem licença MIT e reside num repositório público, para que qualquer pessoa possa auditar exatamente o que é executado na sua base de dados.
Código-fonte: github.com/TOT-Concept/ee-database
Versões: github.com/TOT-Concept/ee-database/releases — cada binário é assinado antes da publicação.