Клиент синхронизации ee-database — Документация Entity Enricher

клиент синхронизации ee-database

Клиент применения изменений с открытым исходным кодом для баз данных схем. Запустите его рядом с вашей собственной PostgreSQL, выполните сопряжение один раз — и он будет поддерживать эту базу данных в соответствии с вашими обогащениями: начальная загрузка из снимка, затем применение живого потока дельт по единственному исходящему WebSocket. Строка подключения никогда не покидает вашу машину.

Entity Enricherсервер · исходящиеee-databaseваша машинаВаша база данныхPostgres · MySQL · SQLitebatch · аренда 120 сприменение — одна транзакцияфиксацияack следующее окно отправляется немедленно

Каждый оператор защищён по ревизии, поэтому повторно доставленный пакет сходится к тем же строкам. Ошибка SQL откатывает пакет и останавливает работу — «ядовитая» дельта никогда не пропускается молча.

Клиент получает состояние, а не операции: каждая дельта несёт полные текущие строки изменённой сущности в виде идемпотентного INSERT … ON CONFLICT … DO UPDATE, поэтому целевая база сходится, даже если пакет был пропущен.

Зачем нужен клиент синхронизации?

Базы данных схем можно использовать несколькими способами — n8n, Make.com, MCP, «сырые» вебхуки или REST-поток дельт. Клиент синхронизации — полностью автоматизированный путь: меньше всего разрабатывать и меньше всего рисков утечки.

Никаких рабочих процессов создавать не нужно

Никакого сценария n8n, никакого cron, никакого связующего кода. Выполните сопряжение один раз — и клиент загружается из снимка, а затем применяет каждую дельту по мере поступления.

Ваш DSN никогда не покидает вашу машину

Строка подключения передаётся в командной строке или хранится локально с режимом 600 — она никогда не отправляется в Entity Enricher. Клиент устанавливает только исходящие соединения.

Изначально безопасно при повторной доставке

Каждая дельта — это идемпотентный upsert с защитой по ревизии. Если клиент завершается посреди пакета, пакет повторно доставляется после истечения аренды, и повторное применение сходится к тем же строкам.

Сообщает о сбоях, не замалчивает их

Ошибка SQL откатывает пакет, сообщает о сбойной дельте на странице «Базы данных» и завершается с ненулевым кодом — «ядовитая» дельта никогда не будет тихо пропущена.

Быстрый старт

Сначала зарегистрируйте базу данных для схемы, затем выполните сопряжение клиента и запустите его рядом с вашей базой данных.

  1. 1

    Зарегистрируйте базу данных

    На странице Databases зарегистрируйте базу данных для схемы, которую хотите зеркалировать, и проверьте её ключи базы данных. Полную модель см. в разделе Databases. На этом шаге объявляется целевой диалект, который будет применять клиент.

  2. 2

    Установите клиент

    Скачайте подписанный бинарный файл из раздела Releases или соберите из исходного кода (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...

    Предпочитаете токен? Выпустите его на странице Databases (Sync client → Pair a client) и передайте напрямую: ee-database pair --server … <refresh-token>.

  4. 4

    Запустите его рядом с вашей базой данных

    При первом запуске клиент загружает снимок .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 секунду.

Рекомендуется минимум привилегий

Запускайте клиент под отдельной ролью базы данных, ограниченной синхронизируемой схемой, чтобы скомпрометированный токен не мог затронуть ничего другого.

Справочник по CLI

КомандаЧто это делает
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 — каждый бинарный файл подписывается перед публикацией.