ee-database 同步客户端 - Entity Enricher 文档

ee-database 同步客户端

面向 schema 数据库 的开源应用客户端。在任何能访问你自有 PostgreSQL 的机器上运行,配对一次,它便会让该数据库与你的 enrichment 保持一致 — 先从快照引导启动,然后通过单条出站 WebSocket 应用实时增量流。你的连接字符串永远不会离开那台机器。

Entity Enricher服务器 · 发件箱ee-database你的机器您的数据库Postgres · MySQL · SQLitebatch · 租约 120 秒apply — 单个事务提交ack 立即推送下一个窗口

每条语句都受修订校验保护,因此重新投递的批次会收敛到相同的行。SQL 错误会回滚整个批次并停止执行——有问题的增量绝不会被静默跳过。

客户端拉取的是 状态,而非操作:每个增量都以幂等的 INSERT … ON CONFLICT … DO UPDATE 形式携带已变更实体的完整当前行,因此即使漏掉某个批次,目标也能收敛一致。

为什么使用同步客户端?

数据库同步可通过多种方式使用——n8n、Make.com、MCP、原始 webhook,或 REST 差异馈送。同步客户端是全自动的方式:构建工作最少,泄露风险也最小。

无需搭建任何工作流

无需 n8n 场景,无需 cron,无需胶水代码。配对一次即可从快照初始化,随后在每个增量到达时应用它。

你的 DSN 绝不会离开你的机器

连接字符串通过命令行传入,或以 mode-600 权限在本地存储——绝不会发送给 Entity Enricher。客户端仅向外连接。

从设计上即可安全重放

每个增量都是幂等、受修订校验保护的 upsert 操作。若客户端在批次中途中断,租约到期后会重新投递该批次,重新应用会收敛到相同的行。

失败时隔离,绝不静默

SQL 错误会回滚该批次并报告出错的增量。服务器会隔离该次富集的整个批次,并在剔除它后重新推送队列,因此客户端保持连接并继续应用——一行坏数据不会卡住排在它后面的所有内容,被隔离的任务会一直列出,直到你处理为止。

快速开始

请先在 schema 上注册数据库,然后配对客户端并在一台能访问你数据库的机器上运行它。

  1. 1

    注册数据库

    Database Sync 页面,为你要镜像的架构注册一个数据库,并检查其数据库键。完整模型请参见 Database Sync。此步骤声明客户端将采用的目标方言。

  2. 2

    安装客户端

    在终端中粘贴此内容。脚本会在安装前验证 cosign 签名。

    curl -fsSL https://entityenricher.ai/install-eedatabase.sh | sh

    Windows:iwr -useb https://entityenricher.ai/install-eedatabase.ps1 | iex。或从版本发布页下载已签名的二进制文件,或从源码构建(Go ≥ 1.23):go build -o ee-database .

    源代码与签名发布版本位于 TOT-Concept/ee-database(MIT)。

  3. 3

    通过浏览器配对

    运行 ee-database pair。浏览器会打开 /database/connect 标签页并显示一个短码——确认它,然后选择此客户端应同步哪个数据库

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

    更想用令牌?可在 Database Sync 页面(同步客户端 → 配对客户端)签发一个,然后直接传入:ee-database pair --server … <refresh-token>

    整个流程中唯一需要决定的事项:这台机器同步哪个已注册的数据库。配对会替换该数据库先前的凭据,因此旧客户端会停止工作。
  4. 4

    在一台能访问你数据库的机器上运行它

    首次运行时,客户端会获取 .sql 快照并应用它,然后连接并流式接收增量。--save-dsn 会将连接字符串保存在本地,因此后续运行无需任何参数。

    每次运行还会自检登录账号的预配权限(创建数据库、DDL、DML)并将结果报告到同步客户端卡片,因此缺失的授权会在增量应用失败之前就可见。如果尚未发布任何关联的 schema,客户端会保持连接并等待——首次发布会自行启动数据流,无需重启。

    ee-database run --dsn "postgres://user:pass@localhost:5432/mydb" --save-dsn

    “紧邻”指的是网络可达,而非运行在数据库服务器上:任何能访问该 DSN 的机器或容器都可以——包括云托管的 PostgreSQL(Azure、OVHcloud、AWS RDS…),它们通常强制使用 TLS:…/mydb?sslmode=require

    运行中的客户端反馈的信息:是否已连接,以及其预配权限自检的结果。

托管同步主机

多个数据库都落在同一台机器上?同步主机把配对流程提升了一个层级:只需为该机器配对一次,之后分配给它的每个数据库同步都会被自动认领、置备并保持同步——注册新的同步再也不需要另开一次终端会话。需要 1.5.0 或更高版本的客户端,它按每台服务器而非每台机器配对一次——因此一台主机可以并行服务多个 Entity Enricher 实例。

  1. 1

    注册主机

    Database Sync 页面,点击工具栏上的 Sync hosts 按钮,添加一个以该机器命名的主机。一次性配对令牌仅显示一次,它嵌入在可复制粘贴的 host pair 命令中,并附有引导式设置步骤。

  2. 2

    将机器配对一次

    在能够访问你的数据库服务器的机器上运行该命令。--dsn一个指定服务器、但不含数据库名称的基础连接字符串——每个已分配的同步都会由它派生出各自的数据库。与所有 DSN 一样,它以 mode-600 权限存储在本地,绝不会发送到 Entity Enricher。

    ee-database host pair --server https://entityenricher.ai \
      --dsn "postgres://user:pass@host:5432/" <token>

    配对会自检登录账号的预配权限(创建数据库、DDL、DML),并在授权缺失时快速失败。倾向于使用最小权限的登录账号?添加 --admin-dsn,预配就会改为通过管理连接创建每个缺失的角色和数据库——管理 DSN 仅在预配时使用,绝不存储。

    每台机器只需配对一次主机;之后分配给它的每项注册都会自动创建并同步,无需再次操作该机器。
  3. 3

    运行它,然后在界面中分配同步

    ee-database host run

    主机保持一个控制平面 WebSocket 连接,并响应在界面中进行的分配:在注册数据库时选择该主机,或稍后在数据库的 概览 标签页中选择。每个已分配的同步都会被认领,如果其数据库不存在则会创建(由同步名称转为 snake_case 命名;可通过主机 config.json 中的 database_names 为每个同步单独覆盖),然后由下方的常规循环进行同步。

    已与其他客户端配对的数据库会被报告并跳过——绝不会被接管。在界面中撤销主机会立即断开该机器的连接,包括它所占用的每个数据库凭据;分配关系和已同步的数据会保留,因此重新配对的主机会从旧主机停止的位置继续。

投递机制:租约与确认

增量通过严格的按数据库 FIFO 发件箱离开 Entity Enricher。服务器租用可见窗口 120 秒并将其作为一个批次推送;客户端在单个事务中应用整个批次,并回复 ack ,这会推进游标并立即触发下一个窗口。批次处理中途崩溃的客户端由租约到期和服务器端重新推送来兜底——不会丢失或重复提交任何内容。

快照 = 从零开始的增量

引导与稳态共用同一代码路径。如果你的数据库已初始化,可使用 --skip-bootstrap 跳过引导。

受修订校验保护

每条语句都带有 _sync_revision,因此较旧的行永远不会覆盖较新的行,即使顺序乱了也不会。

失败时隔离

SQL 错误会回滚该批次,并报告出错的增量以及完整的问题语句。服务器会隔离该次富集的批次,并在剔除它后重新推送队列——客户端继续应用其余内容。只有未指明具体增量的失败才会以非零状态退出。

每个窗口写入的内容

每个已应用的窗口都会按表报告其写入的结构,因此评估每晚重新增强的规模时,无需再去翻查那些已确认并清除的增量日志。

applying 12 delta(s) (10831 .. 10842) in one transaction
applied 12 delta(s) in 84ms — 38 statement(s): mushroom 4 upserts,
  mushroom_common_names 12 upserts + 4 prunes, mushroom_human_uses 14 upserts + 4 prunes
acked up to delta 10842

一次 upsert 对应一行,因此计数即行数;prune 是一条受版本保护的 DELETE,用于清除新载荷不再引用的子行或关联行。子记录会就地协调——绝不会先清空再重新插入。加上 --verbose 可为每个增量输出一行,包含其实体类型、实际耗时及自身的写入结构。

数据库与方言

目标方言由 Entity Enricher 中 Schema 与数据库的注册绑定决定——客户端只执行服务端生成的 SQL。首发支持的方言为 PostgreSQLMySQL / MariaDBSQL ServerOracle 渲染器正在规划中(MySQL 驱动已内置)。多语句执行由各驱动分别处理(pgx 简单协议、MySQL multiStatements)。

所需的数据库权限(PostgreSQL)

假设目标数据库已存在,该登录账号只需对数据库拥有 CONNECT 权限,并对目标模式拥有 USAGE + CREATE 权限。(自 PostgreSQL 15 起,public 默认不再向所有人授予 CREATE。)

其余一切都源于所有权:副本表由客户端自行创建,因此归其所有,而所有权意味着具备数据增量所需的读写权限。所有权并非可选项——数据流还会下发迁移语句(ALTER TABLE …CREATE INDEX …),PostgreSQL 仅允许表的所有者执行这些语句,任何权限授予组合都无法替代它

如果副本表已存在且属于其他所有者,运行前的权限预检仍会通过 —— 该登录账号可以创建表 —— 但第一条迁移增量会失败。请使用 ALTER TABLE … OWNER TO <login> 转移所有权(或将该登录账号加入所有者角色),而不是添加授权。

增量何时会被隔离

被你的数据库拒绝的语句——通常是新建唯一索引下已存在的重复数据——不会中断数据流。批次会回滚,客户端会报告出错的增量以及完整的问题语句(绝不截断),服务器则隔离该次富集的批次,并在剔除它后重新推送队列。你的客户端会继续应用后续的所有内容。

被隔离的任务会一直显示在 Database Sync 页面的隔离区标签页中,直到你处理为止:在你的数据库中修复原因后重新注入——它会按实体的当前状态重新投影,而不是重放过时的语句——或者在该行已无关紧要时将其丢弃。

引导初始化失败则不同:快照是单个事务,因此不会出现部分应用的情况;客户端会把它以 snapshot-failed.sql 为名保存到该配对的配置目录(权限 0600,每次尝试都会覆盖,下次成功后删除),你可以用 psql -f 检查或重放。

安全

仅出站

客户端通过 :443/wss 发起 WebSocket 连接。你的数据库主机从不接受入站连接——无需开放端口,也无需配置入口。

一个凭据、一个数据库、一个客户端

凭据绑定到单个数据库同步。再次配对将轮换凭据,并立即断开先前的实时连接。

短期访问令牌

365 天的刷新令牌(以 mode-600 权限存储)会兑换为用于验证 WebSocket 的 15 分钟访问令牌。在界面中撤销后,可在约 1 秒内断开在线客户端。

主机配对密钥是不透明的机密

托管主机使用简短的 eeh_… 密钥而非 JWT 进行配对:服务器只保存其哈希值,密钥永不过期,只有在界面中吊销该主机才会使其失效。

每个配对一个进程

按配置文件加锁可防止两个进程同时运行同一个配对——否则它们会不断互相挤掉对方的 WebSocket 会话。

权限受限,但拥有自己的表

以仅限于所同步模式的专用角色运行客户端,这样即使令牌泄露也无法触及其他内容——但要让该角色自行创建副本表,从而成为这些表的属主。迁移语句要求的是属主身份,而不是授权。

CLI 参考

命令它的功能
ee-database pair --server URL通过浏览器确认的设备码配对。选择要同步的数据库。
ee-database pair --server URL <token>使用在 Database Sync 页面签发的令牌进行配对(适用于无界面环境)。
ee-database run --dsn DSN [--save-dsn] [--skip-bootstrap]从快照引导(除非被跳过),然后连接并应用增量。
ee-database run … --create-missing当目标数据库不存在时,先使用 DSN 自带的凭据创建该数据库(postgres 需要 CREATEDB 权限,mysql 需要 CREATE 权限)。
ee-database run … --create-missing --admin-dsn DSN通过管理员连接初始化目标 DSN 指定的所有内容:缺失的角色/用户(使用该 DSN 的密码)以及归其所有的数据库。此后目标 DSN 无需创建权限;管理员 DSN 绝不会被存储。
ee-database run --all在单个进程中并发同步所有已配对的数据库(每个都需要已保存的 DSN)。
ee-database run … --verbose记录每个增量的写入结构和实际耗时,而不仅是各窗口的汇总。host run 也接受该选项。
ee-database host pair --server URL --dsn BASE_DSN [--admin-dsn DSN] <token>将本机一次性配对为受管同步主机——基础 DSN 指向你的数据库服务器(不含数据库名),且绝不离开本机;令牌来自 Sync hosts 对话框(Database Sync 页面工具栏上的 Sync hosts 按钮)。每台服务器一次配对:可同时与多台 Entity Enricher 服务器并行配对。
ee-database host run [--server URL]托管模式:分配给此主机的每个数据库同步都会被认领,缺失时自动创建,并自动保持同步 — 无需逐个数据库配对,一次性覆盖所有已配对的服务器(--server 可限定为单个服务器)。已与其他客户端配对的数据库只会被报告,绝不会被接管。
ee-database host status / host disconnect [--server URL]显示或清除此机器的主机配对。如需在服务端撤销,请使用“同步主机”卡片。
ee-database status显示配对状态、服务器 URL 以及已配对的数据库。
ee-database disconnect忘记某个配对的本地凭据。可在界面中从服务器端撤销。
ee-database version打印版本。

凭据以 mode-600 权限存储在 ~/.config/ee-database/profiles/ 下,每个已配对的数据库对应一份配置文件——每个数据库只需配对一次;配对了多个时,可用 --database NAME 指定其中之一。完全不想用自动化?同一数据流也是纯 REST:先 GET /api/databases//changes,再 POST /api/databases//ack——参见 Database Sync

开源

该客户端采用 MIT 许可,并托管在公开仓库中,任何人都可以审计究竟有哪些内容在对其数据库运行。

源代码: github.com/TOT-Concept/ee-database

版本发布: github.com/TOT-Concept/ee-database/releases — 每个二进制文件在发布前均使用 cosign 签名。

审查安装程序: curl -fsSL https://entityenricher.ai/install-eedatabase.sh | less