De open-source apply-client voor schemadatabases. Draai hem naast je eigen PostgreSQL, koppel één keer, en hij houdt die database geconvergeerd met je verrijkingen — bootstrappen vanaf een snapshot, gevolgd door het toepassen van een live deltafeed over één enkele uitgaande WebSocket. Je connectiestring verlaat nooit je machine.
Elke statement is revisie-bewaakt, dus een opnieuw geleverde batch convergeert naar dezelfde rijen. Een SQL-fout rolt de batch terug en stopt — een giftige delta wordt nooit stilzwijgend overgeslagen.
De client haalt status op, geen operaties: elke delta bevat de volledige huidige rij(en) voor een gewijzigde entiteit als een idempotente INSERT … ON CONFLICT … DO UPDATE, zodat het doel convergeert, zelfs als een batch is gemist.
Schemadatabases kun je op verschillende manieren gebruiken — n8n, Make.com, MCP, ruwe webhooks of de REST-deltafeed. De sync-client is het volledig geautomatiseerde pad: het minste om te bouwen en het minste om te lekken.
Geen n8n-scenario, geen cron, geen lijmcode. Koppel één keer en het bootstrapt vanaf de snapshot, en past daarna elke delta toe zodra die binnenkomt.
De connectiestring wordt meegegeven op de commandoregel of lokaal opgeslagen met mode-600 — deze wordt nooit naar Entity Enricher gestuurd. De client verbindt alleen naar buiten.
Elke delta is een idempotente, revisie-bewaakte upsert. Als de client halverwege een batch crasht, wordt de batch opnieuw geleverd nadat de lease verloopt, en opnieuw toepassen convergeert naar dezelfde rijen.
Een SQL-fout draait de batch terug, meldt de mislukte delta op de Databases-pagina en sluit af met een niet-nul code — een poison-delta kan nooit stilletjes worden overgeslagen.
Registreer eerst een database op een schema, koppel daarna een client en draai deze naast je database.
Registreer op de pagina Databases een database op het schema dat je wilt spiegelen en controleer de database-sleutels. Zie Databases voor het volledige model. Deze stap bepaalt het doeldialect dat de client zal toepassen.
Download een ondertekende binary van Releases, of bouw vanaf de broncode (Go ≥ 1.23).
go build -o ee-database .
Broncode en ondertekende releases vind je op TOT-Concept/ee-database (MIT).
Voer ee-database pair uit. Er opent een browsertabblad op /database/connect met een korte code — bevestig deze en kies welke database deze client moet synchroniseren.
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...
Liever een token? Geef er een uit op de pagina Databases (Sync client → Pair a client) en geef het direct mee: ee-database pair --server … <refresh-token>.
Bij de eerste run haalt de client de .sql-snapshot op en past die toe, en maakt daarna verbinding om delta's te streamen. --save-dsn slaat de connection string lokaal op, zodat latere runs geen argumenten nodig hebben.
ee-database run --dsn "postgres://user:pass@localhost:5432/mydb" --save-dsn
„Naast” betekent netwerk-nabij, niet op de databaseserver: elke machine of container die de DSN kan bereiken werkt — inclusief cloud-beheerde PostgreSQL (Azure, OVHcloud, AWS RDS…), die meestal TLS afdwingt: …/mydb?sslmode=require.
Delta's verlaten Entity Enricher via een strikte FIFO-outbox per database. De server leaset het zichtbare venster voor 120 seconden en pusht het als één batch; de client past de hele batch toe in één transactie en antwoordt met ack , waardoor de cursor vooruitgaat en direct het volgende venster wordt getriggerd. Een client die halverwege een batch crasht, wordt gedekt door het verlopen van de lease en een re-push aan de serverkant — er gaat niets verloren en niets wordt dubbel gecommit.
Bootstrap en steady-state delen één codepad. Sla de bootstrap over met --skip-bootstrap als je database al is geseed.
Elke statement bevat een _sync_revision zodat een oudere rij nooit een nieuwere overschrijft, zelfs niet buiten volgorde.
Een SQL-fout slaat de id van de mislukte delta op op de Databases-pagina → Sync client-kaart, en het proces sluit af met een niet-nul code zodat je supervisor het opnieuw kan starten.
Het doeldialect wordt vastgelegd door de schemadatabase-registratie in Entity Enricher — de client past toe welke SQL de server ook rendert. PostgreSQL is het lanceringsdialect; de MySQL- en SQLite-drivers zijn al meegeleverd voor wanneer hun SQL-renderers verschijnen. Toepassing van meerdere statements wordt per driver afgehandeld (pgx simple protocol, MySQL multiStatements, en CGO-vrije SQLite).
De client start de WebSocket over :443/wss. Je databasehost accepteert nooit inkomende verbindingen — geen poorten om te openen, geen ingress om te configureren.
Een credential is gebonden aan één schema-database. Opnieuw koppelen roteert het en verwijdert direct de vorige actieve verbinding.
Het refresh-token met een geldigheid van 365 dagen (opgeslagen met mode-600) wordt ingewisseld voor toegangstokens van 15 minuten die de WebSocket authenticeren. Intrekken in de UI verbreekt binnen ~1 seconde de verbinding met een actieve client.
Draai de client met een specifieke databaserol die beperkt is tot het gesynchroniseerde schema, zodat een gecompromitteerd token verder niets kan raken.
| Opdracht | Wat het doet |
|---|---|
| ee-database pair --server URL | Device-code-koppeling bevestigd via de browser. Kies welke database je wilt synchroniseren. |
| ee-database pair --server URL <token> | Koppel met een token dat is uitgegeven op de pagina Databases (headless-vriendelijk). |
| ee-database run --dsn DSN [--save-dsn] [--skip-bootstrap] | Bootstrap vanaf de snapshot (tenzij overgeslagen), maak vervolgens verbinding en pas de delta's toe. |
| ee-database run … --create-missing | Maak eerst de doeldatabase aan als deze nog niet bestaat, met de eigen inloggegevens van de DSN (postgres heeft CREATEDB nodig, mysql het CREATE-recht; sqlite-bestanden worden sowieso automatisch aangemaakt). |
| ee-database run … --create-missing --admin-dsn DSN | Bootstrap alles wat de doel-DSN benoemt via een admin-verbinding: de ontbrekende rol/gebruiker (met het wachtwoord van de DSN) en de database die eigendom is van die rol. De doel-DSN heeft dan geen aanmaakrechten nodig; de admin-DSN wordt nooit opgeslagen. |
| ee-database run --all | Synchroniseer elke gekoppelde database gelijktijdig vanuit één proces (elk heeft een opgeslagen DSN nodig). |
| ee-database status | Toon de koppelingsstatus, server-URL en de gekoppelde databases. |
| ee-database disconnect | Vergeet de lokale inloggegevens van één koppeling. Trek server-side in via de UI. |
| ee-database version | Afdrukversie. |
Inloggegevens worden opgeslagen met mode-600, één profiel per gekoppelde database, onder ~/.config/ee-database/profiles/ — koppel één keer per database, en --database NAME selecteert er één wanneer er meerdere zijn gekoppeld. Liever helemaal geen automatisering? Dezelfde feed is gewone REST: GET /api/databases//changes en vervolgens POST /api/databases//ack — zie Databases.
De client valt onder de MIT-licentie en staat in een openbare repository, zodat iedereen precies kan controleren wat er tegen hun database draait.
Broncode: github.com/TOT-Concept/ee-database
Releases: github.com/TOT-Concept/ee-database/releases — elke binary wordt vóór publicatie ondertekend.