ee-database Sync Client - Entity Enricher-documentatie

ee-database sync client

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.

Entity Enricherserver · outboxee-databasejouw machineJe databasePostgres · MySQL · SQLitebatch · lease 120sapply — één transactiecommitack volgende venster direct verstuurd

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.

Waarom de sync-client?

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 workflow om te bouwen

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.

Je DSN verlaat nooit je machine

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.

Replay-veilig door ontwerp

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.

Faalt luid, nooit stil

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.

Snel aan de slag

Registreer eerst een database op een schema, koppel daarna een client en draai deze naast je database.

  1. 1

    Registreer een 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.

  2. 2

    Installeer de client

    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).

  3. 3

    Koppelen via je browser

    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>.

  4. 4

    Draai deze naast je database

    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.

Hoe levering werkt: lease & ack

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.

Snapshot = delta vanaf nul

Bootstrap en steady-state delen één codepad. Sla de bootstrap over met --skip-bootstrap als je database al is geseed.

Revisie-bewaakt

Elke statement bevat een _sync_revision zodat een oudere rij nooit een nieuwere overschrijft, zelfs niet buiten volgorde.

Stoppen bij fout

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.

Databases & dialecten

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).

Beveiliging

Alleen uitgaand

De client start de WebSocket over :443/wss. Je databasehost accepteert nooit inkomende verbindingen — geen poorten om te openen, geen ingress om te configureren.

Eén inloggegeven, één database, één client

Een credential is gebonden aan één schema-database. Opnieuw koppelen roteert het en verwijdert direct de vorige actieve verbinding.

Kortlevende toegangstokens

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.

Minimale rechten aanbevolen

Draai de client met een specifieke databaserol die beperkt is tot het gesynchroniseerde schema, zodat een gecompromitteerd token verder niets kan raken.

CLI-referentie

OpdrachtWat het doet
ee-database pair --server URLDevice-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-missingMaak 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 DSNBootstrap 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 --allSynchroniseer elke gekoppelde database gelijktijdig vanuit één proces (elk heeft een opgeslagen DSN nodig).
ee-database statusToon de koppelingsstatus, server-URL en de gekoppelde databases.
ee-database disconnectVergeet de lokale inloggegevens van één koppeling. Trek server-side in via de UI.
ee-database versionAfdrukversie.

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.

Open source

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.