Клиент применения изменений с открытым исходным кодом для баз данных схем. Запустите его рядом с вашей собственной PostgreSQL, выполните сопряжение один раз — и он будет поддерживать эту базу данных в соответствии с вашими обогащениями: начальная загрузка из снимка, затем применение живого потока дельт по единственному исходящему WebSocket. Строка подключения никогда не покидает вашу машину.
Каждый оператор защищён по ревизии, поэтому повторно доставленный пакет сходится к тем же строкам. Ошибка SQL откатывает пакет и останавливает работу — «ядовитая» дельта никогда не пропускается молча.
Клиент получает состояние, а не операции: каждая дельта несёт полные текущие строки изменённой сущности в виде идемпотентного INSERT … ON CONFLICT … DO UPDATE, поэтому целевая база сходится, даже если пакет был пропущен.
Базы данных схем можно использовать несколькими способами — n8n, Make.com, MCP, «сырые» вебхуки или REST-поток дельт. Клиент синхронизации — полностью автоматизированный путь: меньше всего разрабатывать и меньше всего рисков утечки.
Никакого сценария n8n, никакого cron, никакого связующего кода. Выполните сопряжение один раз — и клиент загружается из снимка, а затем применяет каждую дельту по мере поступления.
Строка подключения передаётся в командной строке или хранится локально с режимом 600 — она никогда не отправляется в Entity Enricher. Клиент устанавливает только исходящие соединения.
Каждая дельта — это идемпотентный upsert с защитой по ревизии. Если клиент завершается посреди пакета, пакет повторно доставляется после истечения аренды, и повторное применение сходится к тем же строкам.
Ошибка SQL откатывает пакет, сообщает о сбойной дельте на странице «Базы данных» и завершается с ненулевым кодом — «ядовитая» дельта никогда не будет тихо пропущена.
Сначала зарегистрируйте базу данных для схемы, затем выполните сопряжение клиента и запустите его рядом с вашей базой данных.
На странице Databases зарегистрируйте базу данных для схемы, которую хотите зеркалировать, и проверьте её ключи базы данных. Полную модель см. в разделе Databases. На этом шаге объявляется целевой диалект, который будет применять клиент.
Скачайте подписанный бинарный файл из раздела Releases или соберите из исходного кода (Go ≥ 1.23).
go build -o ee-database .
Исходный код и подписанные релизы — на TOT-Concept/ee-database (MIT).
Запустите 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...
Предпочитаете токен? Выпустите его на странице Databases (Sync client → Pair a client) и передайте напрямую: ee-database pair --server … <refresh-token>.
При первом запуске клиент загружает снимок .sql и применяет его, затем подключается и получает поток дельт. --save-dsn сохраняет строку подключения локально, поэтому последующие запуски не требуют аргументов.
ee-database run --dsn "postgres://user:pass@localhost:5432/mydb" --save-dsn
«Рядом» означает сетевую близость, а не размещение на сервере базы данных: подойдёт любая машина или контейнер, способные достучаться до DSN, — включая облачный управляемый PostgreSQL (Azure, OVHcloud, AWS RDS…), который обычно требует TLS: …/mydb?sslmode=require.
Дельты покидают Entity Enricher через строгую очередь FIFO, отдельную для каждой базы данных. Сервер арендует видимое окно на 120 секунд и отправляет его одним пакетом; клиент применяет весь пакет в одной транзакции и отвечает ack , что продвигает курсор и немедленно запускает следующее окно. Если клиент прерывается посреди пакета, его защищают истечение аренды и повторная отправка на стороне сервера — ничего не теряется и не фиксируется дважды.
Первоначальная загрузка и установившийся режим используют один и тот же код. Пропустите первоначальную загрузку с помощью --skip-bootstrap, если ваша база данных уже заполнена.
Каждый оператор содержит _sync_revision, поэтому более старая строка никогда не перезаписывает более новую, даже при нарушении порядка.
Ошибка SQL сохраняет идентификатор сбойной дельты на странице «Базы данных» → карточка клиента синхронизации, а процесс завершается с ненулевым кодом, чтобы ваш супервизор мог перезапустить его.
Целевой диалект задаётся при регистрации базы данных схемы в Entity Enricher — клиент применяет любой SQL, который формирует сервер. PostgreSQL — стартовый диалект; драйверы MySQL и SQLite уже включены на случай выхода их SQL-генераторов. Применение нескольких инструкций обрабатывается отдельно для каждого драйвера (простой протокол pgx, multiStatements у MySQL и SQLite без CGO).
Клиент инициирует WebSocket по :443/wss. Хост вашей базы данных никогда не принимает входящие подключения — не нужно открывать порты и настраивать входящий трафик.
Учётные данные привязаны к одной базе данных схемы. Повторное сопряжение обновляет их и мгновенно разрывает предыдущее активное подключение.
365-дневный токен обновления (хранится с режимом 600) обменивается на 15-минутные токены доступа, которые аутентифицируют WebSocket. Отзыв в интерфейсе отключает активный клиент примерно за 1 секунду.
Запускайте клиент под отдельной ролью базы данных, ограниченной синхронизируемой схемой, чтобы скомпрометированный токен не мог затронуть ничего другого.
| Команда | Что это делает |
|---|---|
| ee-database pair --server URL | Сопряжение по коду устройства с подтверждением в браузере. Выберите базу данных для синхронизации. |
| ee-database pair --server URL <token> | Выполните сопряжение с помощью токена, выданного на странице Databases (подходит для headless-режима). |
| ee-database run --dsn DSN [--save-dsn] [--skip-bootstrap] | Выполните первоначальную загрузку из снимка (если не пропущена), затем подключитесь и примените дельты. |
| ee-database run … --create-missing | Сначала создайте целевую базу данных, если она не существует, используя учётные данные из самого DSN (для postgres требуется право CREATEDB, для mysql — привилегия CREATE; файлы sqlite в любом случае создаются автоматически). |
| ee-database run … --create-missing --admin-dsn DSN | Создайте всё, что указывает целевой DSN, через административное подключение: отсутствующую роль/пользователя (с паролем из DSN) и принадлежащую ей базу данных. После этого целевому DSN не требуются права на создание, а административный DSN нигде не сохраняется. |
| ee-database run --all | Синхронизировать все сопряжённые базы данных параллельно из одного процесса (для каждой нужен сохранённый DSN). |
| 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 — см. Databases.
Клиент распространяется под лицензией MIT и находится в публичном репозитории, чтобы любой мог проверить, что именно выполняется в его базе данных.
Исходный код: github.com/TOT-Concept/ee-database
Релизы: github.com/TOT-Concept/ee-database/releases — каждый бинарный файл подписывается перед публикацией.