Il client di applicazione open source per i database dello schema. Eseguilo accanto al tuo PostgreSQL, esegui l'associazione una volta, e manterrà quel database allineato con i tuoi enrichment — con bootstrap da uno snapshot, poi applicando un feed delta in tempo reale su un unico WebSocket in uscita. La tua stringa di connessione non lascia mai la tua macchina.
Ogni istruzione è protetta da revisione, quindi un batch riconsegnato converge sulle stesse righe. Un errore SQL annulla il batch e lo interrompe: un delta problematico non viene mai saltato silenziosamente.
Il client preleva stato, non operazioni: ogni delta trasporta la riga (o le righe) corrente completa di un'entità modificata come INSERT … ON CONFLICT … DO UPDATE idempotente, così la destinazione converge anche se un batch è stato perso.
I database dello schema possono essere consumati in diversi modi — n8n, Make.com, MCP, webhook grezzi o il feed delta REST. Il client di sincronizzazione è il percorso completamente automatizzato: il meno da costruire e il meno da esporre.
Nessuno scenario n8n, nessun cron, nessun codice di collegamento. Abbinatelo una volta e si inizializza dallo snapshot, quindi applica ogni delta man mano che arriva.
La stringa di connessione viene passata sulla riga di comando o memorizzata localmente in modalità 600 — non viene mai inviata a Entity Enricher. Il client si connette solo verso l'esterno.
Ogni delta è un upsert idempotente e protetto da revisione. Se il client si interrompe a metà batch, il batch viene riconsegnato dopo la scadenza del suo lease e la riapplicazione converge sulle stesse righe.
Un errore SQL annulla il batch, segnala il delta non riuscito nella pagina Database ed esce con codice diverso da zero — un delta problematico non può mai essere ignorato silenziosamente.
Registrate prima un database su uno schema, poi abbinate un client ed eseguitelo accanto al vostro database.
Nella pagina Databases, registrate un database sullo schema che volete rispecchiare e verificatene le chiavi del database. Consultate Databases per il modello completo. Questo passaggio dichiara il dialetto di destinazione che il client applicherà.
Scaricare un binario firmato da Release, oppure compilare dal sorgente (Go ≥ 1.23).
go build -o ee-database .
Il codice sorgente e le release firmate si trovano su TOT-Concept/ee-database (MIT).
Eseguite ee-database pair. Si apre una scheda del browser su /database/connect con un codice breve: confermatelo e scegliete quale database questo client deve sincronizzare.
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...
Preferite un token? Emettetene uno nella pagina Databases (Sync client → Pair a client) e passatelo direttamente: ee-database pair --server … <refresh-token>.
Alla prima esecuzione il client recupera lo snapshot .sql e lo applica, quindi si connette e trasmette i delta in streaming. --save-dsn memorizza la stringa di connessione in locale, così le esecuzioni successive non richiedono argomenti.
ee-database run --dsn "postgres://user:pass@localhost:5432/mydb" --save-dsn
«Accanto» significa adiacente in rete, non sul server del database: funziona qualsiasi macchina o container in grado di raggiungere il DSN — incluso PostgreSQL gestito in cloud (Azure, OVHcloud, AWS RDS…), che di solito impone il TLS: …/mydb?sslmode=require.
I delta escono da Entity Enricher attraverso una rigorosa outbox FIFO per database. Il server concede in lease la finestra visibile per 120 secondi e la invia come un unico batch; il client applica l'intero batch in un'unica transazione e risponde ack , il che fa avanzare il cursore e attiva immediatamente la finestra successiva. Un client che si arresta a metà batch è coperto dalla scadenza del lease e da un nuovo invio lato server — nulla va perso o viene sottoposto a commit due volte.
Il bootstrap e lo stato a regime condividono lo stesso percorso di codice. Saltare il bootstrap con --skip-bootstrap se il database è già popolato.
Ogni istruzione contiene un _sync_revision in modo che una riga più vecchia non sovrascriva mai una più recente, anche fuori ordine.
Un errore SQL memorizza l'id del delta non riuscito nella pagina Database → scheda del client di sincronizzazione, e il processo esce con codice diverso da zero affinché il supervisore lo riavvii.
Il dialetto di destinazione è determinato dalla registrazione del database dello schema in Entity Enricher — il client applica qualunque SQL il server generi. PostgreSQL è il dialetto iniziale; i driver MySQL e SQLite sono già inclusi in vista del rilascio dei rispettivi generatori SQL. L'applicazione di istruzioni multiple è gestita per singolo driver (protocollo semplice pgx, multiStatements di MySQL e SQLite senza CGO).
Il client avvia il WebSocket su :443/wss. L'host del database non accetta mai connessioni in entrata — nessuna porta da aprire, nessun ingress da configurare.
Una credenziale è associata a un singolo database dello schema. Un nuovo abbinamento la ruota ed elimina istantaneamente la connessione attiva precedente.
Il refresh token valido 365 giorni (memorizzato in modalità 600) viene scambiato con token di accesso da 15 minuti che autenticano il WebSocket. La revoca dall'interfaccia disconnette un client attivo entro ~1 secondo.
Eseguire il client con un ruolo del database dedicato e limitato allo schema sincronizzato, in modo che un token compromesso non possa toccare nient'altro.
| Comando | Che cosa fa |
|---|---|
| ee-database pair --server URL | Abbinamento tramite device-code confermato dal browser. Scegliere quale database sincronizzare. |
| ee-database pair --server URL <token> | Abbinatelo con un token emesso nella pagina Databases (adatto all'uso headless). |
| ee-database run --dsn DSN [--save-dsn] [--skip-bootstrap] | Eseguire il bootstrap dallo snapshot (se non saltato), quindi connettersi e applicare i delta. |
| ee-database run … --create-missing | Crea prima il database di destinazione se non esiste, utilizzando le credenziali del DSN stesso (postgres richiede CREATEDB, mysql il privilegio CREATE; i file sqlite vengono comunque creati automaticamente). |
| ee-database run … --create-missing --admin-dsn DSN | Inizializza tramite una connessione amministrativa tutto ciò a cui fa riferimento il DSN di destinazione: il ruolo/utente mancante (con la password del DSN) e il database di sua proprietà. Il DSN di destinazione non necessita quindi di alcun diritto di creazione; il DSN amministrativo non viene mai memorizzato. |
| ee-database run --all | Sincronizza tutti i database associati contemporaneamente da un unico processo (ciascuno richiede un DSN salvato). |
| ee-database status | Mostra lo stato dell'associazione, l'URL del server e i database associati. |
| ee-database disconnect | Elimina le credenziali locali di un'associazione. Revoca lato server dall'interfaccia. |
| ee-database version | Versione per la stampa. |
Le credenziali sono memorizzate in modalità 600, un profilo per ogni database associato, in ~/.config/ee-database/profiles/ — associare una volta per ciascun database, e --database NOME ne seleziona uno quando più database sono associati. Preferisce nessuna automazione? Lo stesso feed è disponibile come semplice REST: GET /api/databases//changes quindi POST /api/databases//ack — vedere Databases.
Il client è rilasciato con licenza MIT e risiede in un repository pubblico, così chiunque può verificare esattamente ciò che viene eseguito sul proprio database.
Sorgente: github.com/TOT-Concept/ee-database
Release: github.com/TOT-Concept/ee-database/releases — ogni binario è firmato prima della pubblicazione.