Редактор баз данных, который запускается рядом с данными, а не на вашем ноутбуке.
English · 简体中文 · 日本語 · Español · اردو · हिन्दी · 한국어 · Português (Brasil) · Русский
В списках проекта PostgreSQL: News · PostgreSQL Clients · Software Catalogue · Community Guide to GUI Tools
А также в официальной документации Oracle, MySQL, Redis, Valkey, ClickHouse Visual Interfaces, ClickHouse SQL Clients, MariaDB Graphical Clients, MariaDB Ecosystem Hub, Trino, YugabyteDB, TimescaleDB, DragonflyDB, Garnet, OpenSearch, DuckDB, StarRocks, Databend, Aiven for PostgreSQL, Aiven for MySQL, ScyllaDB, Couchbase, Apache Cloudberry, Apache Doris, Apache Kafka, Apache Cassandra и Apache Druid
Quick Start • Live Demo • Install Options • Deploy Your Own
> Этот README на русском языке переведён сообществом и может отставать от английского. Если тексты расходятся, верной считается [английская версия](README.md). ## Быстрый старт Полноценный редактор баз данных с запуском одной командой: ничего не нужно клонировать и собирать. ```bash # Docker (рекомендуется) docker run -p 3000:3000 ghcr.io/libredb/libredb-studio:latest # или Node.js 24+, без Docker npx @libredb/studio ``` После запуска откройте **http://localhost:3000**. Пароль администратора при первом запуске выводится в лог, никаких файлов конфигурации не требуется. > Если вы открываете Studio не через localhost и не по HTTPS (например, по адресу `http://192.168.x.x:3000` в локальной сети), задайте ещё и `AUTH_COOKIE_SECURE=false`. Иначе проверка состояния (health check) проходит, но войти не получится: после ввода пароля вас без сообщения об ошибке вернёт на страницу входа. Нужен deb- или rpm-пакет с сервисом systemd, Snap, AppImage, архив tar.gz, Homebrew, winget или Helm? Все варианты перечислены в разделе [Установка](#установка). ## Зачем ещё один инструмент для баз данных Вы разворачиваете Postgres на управляемой платформе, и через сорок секунд он готов. Потом вам нужно посмотреть, что внутри. Для этого приходится либо открывать доступ к базе из интернета, либо ставить настольный клиент и пробрасывать SSH-туннель, либо махнуть рукой и вернуться в командную строку. База поднялась за сорок секунд, а на то, чтобы в неё заглянуть, ушло полдня. Теперь представьте то же самое в масштабе команды. Приложение работает с Postgres, документы лежат в Mongo, кэш в Redis, события в ClickHouse. Четыре базы, четыре клиента, четыре набора учётных данных. В понедельник приходит новый сотрудник, и до первой строчки кода ему нужно выяснить, где какие данные лежат, собрать строки подключения из вики и трёх личных переписок, дождаться доступа к VPN и установить отдельную программу для каждой СУБД. **Базы данных уже переехали.** Они ушли в Kubernetes, в облачные сервисы, в закрытые сети (VPC), куда можно попасть только через промежуточный сервер (bastion host). **А инструменты для работы с ними остались на месте.** Это всё те же настольные приложения: тяжёлые, с лицензией на каждое рабочее место, требующие установки. Они рассчитаны на то, что у вас одна база, один ноутбук и один человек, который всегда работает с одного и того же компьютера. LibreDB Studio устроен наоборот: **инструмент приходит к данным, а не данные к инструменту.** Если отнестись к этому всерьёз, получается не пожелание, а список требований. - Редактор должен работать в браузере, потому что и данные, и ваши коллеги находятся не на вашем компьютере. - Он должен открываться с телефона, потому что авария не будет ждать, пока вы доберётесь до ноутбука. - Он должен устанавливаться так же, как остальная инфраструктура: контейнером, через Helm chart, Operator или шаблон в один клик. Так ставится всё, что работает рядом с базой данных. - Он должен встраиваться в другие продукты, потому что удобнее всего работать с базой там же, где она была создана. - В нём не должно быть платных ограничений. Инструмент с лицензией на каждое рабочее место и функциями, доступными только за деньги, не поставишь во все окружения, за которые вы отвечаете. **Если единый вход (SSO) нужно оплачивать отдельно, разворачивать такой инструмент по умолчанию уже не получится.** > Лицензия MIT здесь — не щедрость, а необходимость: без неё такая архитектура не работает. ## Основные возможности ### Сорок один СУБД, один интерфейс PostgreSQL · MySQL · Oracle · Db2 LUW · SQL Server · SQLite · libSQL · DuckDB · MongoDB · Redis · Couchbase · Firestore · ClickHouse · Apache Druid · Elasticsearch · OpenSearch · Trino · BigQuery · Databend · Snowflake · Apache Spark · Apache Cassandra · Prometheus · Apache Kafka · etcd · Neo4j · Milvus · Qdrant · InfluxDB (InfluxQL) · InfluxDB 3 (SQL) · Oxia · S3-compatible object storage · Kubernetes · MQTT · RabbitMQ · OPC UA · MTConnect · Modbus · NETCONF · SNMP · Sparkplug B Для всех SQL-СУБД доступен одинаковый набор инструментов: дерево объектов базы (схемы, таблицы, столбцы), ER-диаграммы, сравнение схем и панели мониторинга. MongoDB и Redis работают не на SQL, поэтому ER-диаграмм и сравнения схем для них нет. У Druid, Elasticsearch, OpenSearch и Trino есть два ограничения. Во-первых, к ним нельзя подключиться по строке подключения: у их SQL-интерфейсов поверх HTTP нет общепринятого формата URI, поэтому указываются только хост и порт. Во-вторых, для них не генерируется SQL для миграции: в их диалекте SQL нет команд для изменения столбцов, и Studio прямо сообщает об этом, а не выдаёт неработающий DDL. То же касается коллекций Couchbase, у которых нет схемы. ER-диаграмма для Elasticsearch и OpenSearch показывает индексы без связей между ними: внешних ключей в этих СУБД не существует. | СУБД | Драйвер | Возможности | | :--- | :--- | :--- | | **PostgreSQL** | `pg` | Полноценная SQL IDE, планы выполнения EXPLAIN, транзакции, отмена запросов (`pg_cancel_backend`) | | **MySQL** | `mysql2` | Полноценная SQL IDE, EXPLAIN, транзакции, отмена запросов (`KILL QUERY`) | | **Oracle** | `oracledb` (тонкий клиент, режим Thin) | Полноценная SQL IDE, постраничный вывод через `FETCH FIRST N ROWS`, представления мониторинга `V$`, `ANALYZE TABLE`, `ALTER INDEX REBUILD`, транзакции | | **Db2 LUW** | `db2-node` (DRDA-клиент на Rust в нативном аддоне N-API, без клиента IBM) | SQL IDE для Db2 for Linux, UNIX and Windows: обозреватель схем с таблицами, представлениями, материализованными таблицами запросов, псевдонимами, последовательностями, модулями, процедурами, функциями и триггерами, сохранённые определения, постраничный вывод через `FETCH FIRST` / `OFFSET`, RUNSTATS и REORG для отдельной таблицы. TLS обязателен, если вы сознательно его не отключили, потому что без него драйвер передаёт пароль открытым текстом. Драйвер неверно читает некоторые типы (не-ASCII текст, BIGINT больше 2^53, BOOLEAN, XML, LOB), поэтому редактирование строк, импорт, EXPLAIN, транзакции и отмена запроса отключены; известные проблемы описаны в [`docs/providers/db2.md`](docs/providers/db2.md) | | **SQL Server** | `mssql` (tedious) | Полноценная SQL IDE, постраничный вывод через `TOP N` / `OFFSET FETCH`, системные представления `sys.dm_*`, `UPDATE STATISTICS`, `DBCC CHECKDB`, транзакции, автоопределение Azure SQL | | **SQLite** | `bun:sqlite` / `node:sqlite` (в зависимости от среды выполнения) | Полноценная SQL IDE, база в файле на сервере или в памяти | | **libSQL** | Без драйвера, по HTTP (протокол Hrana, `POST /v2/pipeline`, порт 8080) | Полноценная SQL IDE для своего сервера libSQL (`sqld`) и для Turso Cloud. Это тот же диалект SQLite, только по сети. Есть `EXPLAIN QUERY PLAN` и реальный размер таблиц и индексов из `dbstat`. Вместо пароля используется токен доступа. Из операций обслуживания доступны только `REINDEX` и `PRAGMA integrity_check`, остальные (`VACUUM`, `ANALYZE`, `PRAGMA optimize`) сервер не принимает | | **DuckDB** | `@duckdb/node-api` (нативный модуль, около 68 МБ на платформу) | Полноценная SQL IDE для локального файла DuckDB или базы в памяти (`:memory:`). Файл должен лежать на том же сервере, где запущена Studio. Есть дерево плана через `EXPLAIN (FORMAT JSON)`, реальный размер таблиц и отмена запросов. Операции обслуживания: `VACUUM`, `ANALYZE` и `CHECKPOINT`. Журнала медленных запросов и списка сеансов в DuckDB нет, и соответствующие панели прямо об этом сообщают. Файл базы может открыть только один процесс, даже на чтение, поэтому второй экземпляр Studio к той же базе не подключится | | **MongoDB** | `mongodb` | Редактор запросов в формате JSON, операции с коллекциями (find, aggregate, insert, update, delete) | | **Couchbase** | Без драйвера, по HTTP (REST API запросов и управления) | Полноценная IDE для SQL++, EXPLAIN, просмотр бакетов, скоупов и коллекций, определение полей через `INFER` | | **Firestore** | Без драйвера, по REST (Firestore REST API v1) | Только чтение: коллекции верхнего уровня в дереве, документы и подколлекции любой глубины в панели Keys, данные документа во вкладке Source и цепочка запросов Admin SDK, которую Studio разбирает и никогда не выполняет как JavaScript, с `count()`, `sum()`, `average()`, `findNearest` и Query Explain | | **ClickHouse** | Без драйвера, по HTTP (SQL-интерфейс, порт 8123) | Полноценная SQL IDE, дерево EXPLAIN в JSON, чтение схемы из системных таблиц, `OPTIMIZE TABLE` | | **Apache Druid** | Без драйвера, по HTTP (`POST /druid/v2/sql`) | SQL IDE только для чтения, дерево EXPLAIN, чтение схемы из `INFORMATION_SCHEMA`, мониторинг по таблицам `sys.*` | | **Elasticsearch** | Без драйвера, по HTTP (`POST /_sql?format=json`, порт 9200) | SQL IDE только для чтения, просмотр индексов и полей, состояние кластера, число документов и размер каждого индекса. Нет EXPLAIN, операций обслуживания, панелей медленных запросов и сеансов. В SQL Elasticsearch нет `OFFSET`, поэтому вторую страницу результатов получить нельзя | | **OpenSearch** | Без драйвера, по HTTP (`POST /_plugins/_sql`, порт 9200) | То же, что и для Elasticsearch: IDE только для чтения и просмотр индексов. Отличие в том, что `LIMIT n OFFSET m` здесь работает, поэтому постраничный вывод доступен | | **Trino** | Без драйвера, по HTTP (клиентский протокол, `POST /v1/statement`, порт 8080) | Полноценная SQL IDE по всем настроенным каталогам, дерево схемы из `information_schema`, мониторинг по `system.runtime` и `jmx`, реальное число строк через `SHOW STATS`, отмена запросов. Trino только выполняет запросы и сам ничего не хранит, поэтому в нём нет ни ключей, ни индексов. Из-за этого ER-диаграмма показывает таблицы без связей, правка строк отключена, а вместо размеров выводится список каталогов. Пароль по незашифрованному HTTP Trino не принимает, даже если аутентификация на кластере отключена | | **Databend** | Без драйвера, по HTTP (собственный API запросов Databend, `POST /v1/query`, порт 8000) | SQL IDE для своего сервера Databend или warehouse в Databend Cloud: каталоги и базы данных в дереве с таблицами, представлениями, материализованными представлениями и динамическими таблицами, текстовые планы `EXPLAIN`, мониторинг по `system.*` каталога по умолчанию, отмена запросов через `KILL QUERY` из панели сессий. Каждый оператор выполняется в отдельной сессии, поэтому транзакция или временная таблица заканчивается вместе с оператором, который её открыл. Databend не объявляет ключей, поэтому правка строк отключена, как и Create Table. Пароль по незашифрованному HTTP к хосту, который не loopback и не за туннелем, отклоняется, если подключение не дало на это согласия. Подключение к Cloud указывает свой warehouse, который возобновляется на первом операторе, и с этого момента за него берётся плата; открытие подключения тоже считается, потому что оно читает дерево объектов. TLS со своим CA и клиентскими сертификатами; SSH-туннель | | **BigQuery** | Без драйвера, по HTTP (REST API BigQuery, `jobs.query`) | SQL IDE (GoogleSQL): проекты, датасеты, таблицы, представления и материализованные представления в дереве, запросы через `jobs.query`. `EXPLAIN` выполняется как пробный запуск (dry run) и сообщает число обработанных байт. Учётные данные: ключ сервисного аккаунта или токен доступа | | **Snowflake** | Без драйвера, по HTTP (SQL API v2 Snowflake) | SQL IDE: базы данных, схемы, таблицы, представления, потоки, задачи, стейджи и другое в дереве, один запрос на обращение. `EXPLAIN USING JSON` компилирует запрос, не выполняя его. Вход по паре ключей или токену программного доступа, каждый запрос от одной роли | | **Apache Spark** | `@grpc/grpc-js` и `apache-arrow`, gRPC (Spark Connect, Spark 4.1 и новее) | SQL IDE: каталоги и пространства имён с таблицами, представлениями и функциями в дереве, одна сессия Spark на запрос, `EXPLAIN FORMATTED` строит план без выполнения. Токен через TLS, на loopback или через SSH-туннель; режим плана агента | | **Apache Cassandra** | `cassandra-driver` (чистый JavaScript, без нативных модулей) | IDE для CQL (порт 9042), просмотр keyspace с пометкой ключей партиционирования и кластеризации, сводка из `system_views`, время работы и выполняющиеся запросы. Для подключения **обязательно указать `localDataCenter`**, иначе драйвер не соединится. В CQL нет EXPLAIN, протокол не умеет отменять запросы, а обслуживание (compaction, repair, flush) выполняется утилитой `nodetool`, поэтому этих функций нет. **Число строк и размер таблиц не показываются**: Cassandra отдаёт только грубые оценки (таблица из 500 строк оценивалась в 143), а неверное число хуже, чем никакого | | **Prometheus** | Без драйвера, по HTTP (HTTP API Prometheus, порт 9090) | Редактор PromQL: запрос уходит на сервер без изменений, результат выводится таблицей и графиком. На графике одновременно рисуется не больше восьми рядов. Учтите, что пропущенные значения, `NaN` и `Inf` график рисует как 0. Есть просмотр метрик с их метками, групп правил записи и оповещения (сработавшие оповещения помечаются), целей опроса (недоступные помечаются), а также состояние, версия, время работы и статистика TSDB. Только чтение: Studio не вызывает административный API и remote write. EXPLAIN и операций обслуживания нет. Учётные данные отправляются и по незашифрованному HTTP, поэтому в недоверенной сети включайте TLS | | **Apache Kafka** | `@platformatic/kafka` (чистый TypeScript, порт 9092) | Чтение сообщений топика (topic): можно выбрать партицию (partition) и начать с нужного смещения (offset) или момента времени, с самого начала или с последних сообщений. Ключи, значения и заголовки (headers) показываются как JSON, текст или base64. Есть просмотр топиков с партициями и настройками (проблемные топики помечаются), групп потребителей (consumer groups) с отставанием (lag) по каждой партиции, брокеров (brokers), а также состояние, число топиков и объём на диске. Только чтение: Studio не отправляет сообщения, не фиксирует смещения, не вступает в группы и не создаёт топики. Поддерживаются TLS с собственным CA и клиентскими сертификатами, SASL PLAIN и SCRAM только поверх TLS. SSH-туннель не поддерживается, потому что клиент Kafka подключается к каждому брокеру по адресу, который тот сам сообщает | | **etcd** | `@grpc/grpc-js` (чистый JavaScript, gRPC, порт 2379) | Подмножество etcdctl в редакторе (`get`, `put`, `del`, `txn`, аренды (leases), ограниченный `watch`, участники кластера, тревоги (alarms), пользователи и роли); группы по префиксу ключа в дереве и каждый ключ в панели ключей; значение ключа меняется одной транзакцией с проверкой его ревизии; сжатие истории, дефрагментация и снятие тревог для администраторов, каждое с подтверждением вводом имени подключения. Любая запись под префиксом Kubernetes или в `compact_rev_key` отклоняется, а секреты Kubernetes и значения в protobuf или зашифрованные никогда не показываются. TLS с собственным CA, клиентские сертификаты (их Common Name как пользователь etcd) и вход по паролю только поверх TLS; SSH-туннель; режим только для чтения, заданный в seed-файле | | **Neo4j** | `neo4j-driver-lite` (чистый JavaScript, Bolt, порт 7687) | Cypher только для чтения в редакторе, один оператор за запуск, для Neo4j 5.26 LTS; метки узлов и типы связей с их свойствами в качестве столбцов, индексы и ограничения в дереве; узлы, связи и пути в таблице как помеченные JSON-ячейки, 64-битные целые и значения даты и времени без потери точности; панели мониторинга, доступные в Community. Каждый оператор проходит политику чтения по его токенам, затем собственную классификацию сервера через `EXPLAIN` (разрешённая форма SHOW её пропускает) и выполняется в сеансе READ, так что запись должна преодолеть все три уровня. Нет просмотра EXPLAIN и PROFILE, нет обслуживания, нет выполнения агентом и нет `run_read_query` в MCP. TLS с собственным CA и SSH-туннель; без строки подключения | | **Milvus** | `@grpc/grpc-js` (чистый JavaScript, gRPC, порт 19530) | Собственные запросы REST v2 Milvus в редакторе (`POST /v2/vectordb/<маршрут>` с одним телом JSON) для чтения, точного подсчёта и векторного поиска по всем типам векторов, включая BM25 и гибридный поиск; базы данных и коллекции в дереве с полями, разделами, индексами и состоянием загрузки; векторные ячейки с размерностью и копированием полного значения; Load и Release для администраторов, с предпросмотром и подтверждением. Studio не записывает данные, отклоняет запросы, из-за которых сервер обратился бы к другому сервису, и предупреждает о пароле `root` по умолчанию. TLS с собственным CA и клиентскими сертификатами; пароль только поверх TLS, на loopback или через SSH-туннель; режим только для чтения, заданный в seed-файле | | **Qdrant** | нет, HTTP (REST API Qdrant, порт 6333) | Собственные REST-запросы Qdrant в редакторе (`МЕТОД /путь` с одним телом JSON), семнадцать маршрутов чтения: чтение точек, прокрутка, точный подсчёт, фасеты, а также запросы, пакеты и сгруппированные запросы по плотным, разреженным и мультивекторным данным, включая локальную модель BM25; коллекции в дереве с векторами, индексами payload и выборочным видом ключей payload; векторные ячейки с размерностью и копированием полного значения. Studio ничего не записывает, отклоняет любой ввод для инференса, кроме локальной BM25, и предупреждает о JWT без срока действия или с правами управления. TLS с собственным CA и клиентскими сертификатами; ключ только поверх TLS, на loopback или через SSH-туннель; режим только для чтения, заданный в seed-файле | | **InfluxDB (InfluxQL)** | нет, HTTP (API v1 InfluxDB, порт 8086) | InfluxQL только для чтения в редакторе для InfluxDB 1.x, 2.x и 3 через API v1 `/query`, один `SELECT`, `SHOW` или `EXPLAIN` за запуск; базы данных и measurements в дереве, теги и поля measurement как его столбцы, а целые числа больше 2^53 и наносекундные метки времени в таблице результатов точны. Только чтение, что бы ни было указано в подключении: на 1.x и 2.x собственная политика чтения Studio единственный барьер перед `DROP DATABASE`, поэтому любой другой оператор отклоняется до отправки запроса, и ни один endpoint записи не вызывается. Пользователь и пароль либо токен в поле пароля; учётные данные по незашифрованному HTTP к хосту, который не loopback и не за туннелем, отклоняются, если подключение не дало на это согласия; `_internal` на сервере InfluxDB 3 никогда не читается | | **InfluxDB 3 (SQL)** | нет, HTTP (SQL API InfluxDB 3, порт 8181) | SQL только для чтения в редакторе для InfluxDB 3 Core и Enterprise; таблицы базы данных подключения в дереве со столбцами. Только чтение, что бы ни было указано в подключении: таблица маршрутов не достигает ни одного endpoint записи, токенов, кэша или плагинов, а из endpoint настройки только списка баз данных, GET-запроса, любой оператор, который не начинается с ключевого слова чтения, отклоняется до отправки запроса, а планировщик сервера отклоняет любую запись сверх того. Токен и без имени пользователя; токен по незашифрованному HTTP к хосту, который не loopback и не за туннелем, отклоняется, если подключение не дало на это согласия; при подключении к серверу 1.x или 2.x предлагает выбрать InfluxDB (InfluxQL) | | **Oxia** | `@grpc/grpc-js` (чистый JavaScript, gRPC, порт 6648) | Команды `oxia client` только для чтения (`get`, `list`, `range-scan`), шарды в дереве и каждый ключ в панели ключей | | **S3-compatible object storage** | нет, HTTP (S3 REST API, адресация по пути, подпись собственным кодом SigV4 Studio; `hyparquet` для предпросмотра Parquet) | Команды чтения AWS CLI, только для чтения (`aws s3 ls`, `aws s3api list-buckets`, `aws s3api head-object`, `aws s3api list-object-versions`), и собственная команда Studio `preview`; бакеты в дереве и папки в панели ключей, по одному уровню; метаданные объекта и ограниченный предпросмотр текста, JSON, CSV и Parquet. Проверено на MinIO, Silo, Garage и RustFS; на AWS S3 и облачных сервисах не проверялось | | **Kubernetes** | Без драйвера, по HTTP (REST API сервера API, порт 6443) | Только чтение: подмножество kubectl в редакторе (`get`, `describe`, `logs`, `top`, `events`, `explain`, `auth can-i`), пространства имён и их типы в дереве с YAML-представлением каждого объекта и импорт kubeconfig в диалоге подключения. Значения Secret никогда не показываются | | **MQTT** | `mqtt-packet` (только парсер; пять пакетов, которые отправляет Studio, менеджер соединения и односторонний клапан написаны в самом Studio) | Только чтение по построению: исходящий путь кодирует только CONNECT, SUBSCRIBE, UNSUBSCRIBE, PINGREQ и DISCONNECT, функции, записывающей PUBLISH, не существует, а CONNECT не несёт Will. Панель ключей строит дерево топиков по одной подписке и показывает рядом с каждой строкой остаток времени жизни, сообщённый самим сервером; топик открывается с полезной нагрузкой и метаданными. В MQTT нет команды, перечисляющей топики, поэтому ни одно чтение не объявляет себя полным: каждое сообщает, что увидело, почему остановилось и какую потерю может доказать. Фильтры `$share/`, `$queue/` и `$exclusive/` отклоняются до отправки SUBSCRIBE, потому что каждый из них отбирает сообщения у устройств, подписанных рядом со Studio. Проверено на Mosquitto, EMQX, HiveMQ CE, NanoMQ и RabbitMQ 4 | | **RabbitMQ** | нет: HTTP API управления (порт 15672) и собственный клиент чтения AMQP 0-9-1 в Studio (порт 5672) | Только чтение по построению: клиент чтения не умеет кодировать публикацию, изъятие сообщения или объявление. Виртуальные хосты, стримы, очереди и обменники в дереве; JSON-запрос на чтение читает сообщения стрима и никогда не читает очередь | | **OPC UA** | `node-opcua-client` (чистый JavaScript, `opc.tcp`, порт 4840) | Только чтение по построению: шов клиента объявляет восемь служб чтения (GetEndpoints, CreateSession, ActivateSession, Browse, BrowseNext, Read, HistoryRead и CloseSession), и ни Write, ни Call, ни HistoryUpdate, ни подписки в провайдере нет вовсе. Панель ключей идёт по адресному пространству уровень за уровнем, один Browse на уровень, а ключ — это экранированный путь обзора, потому что BrowseName сам может содержать разделитель; узел открывается со своим значением, статусом, двумя метками времени и расшифрованным AccessLevel, а консоль читает текущие значения или сырую историю одним JSON-запросом. Каждая граница — своя, а не та, которую публикует сервер: из четырёх измеренных серверов два обслуживают запросы далеко за пределами объявленного ими лимита, а один публикует его как 0. Узел-метод перечисляется и никогда не вызывается. Проверено на Microsoft OPC PLC 2.15.10, open62541 1.5.9, Python asyncua 2.1.0 и демо Eclipse Milo | | **MTConnect** | нет: собственный клиент этого репозитория поверх общего транспорта `node:http(s)` (порт 5000) | Только чтение по устройству: в таблице маршрутов девять записей, и все они GET, поэтому нет ни PUT, ни POST, ни потока. Устройство — это контейнер, data item и condition — отношения со столбцами значение, метка времени и номер последовательности, а XML каждого asset открывается во вкладке Source | | **Modbus** | нет: собственный клиент этого репозитория поверх сырого сокета через общее правило исходящих соединений (порт 502, или 802 для MODBUS/TCP Security) | Только чтение по построению: кодировщик называет четыре функциональных кода чтения и идентификацию устройства, ни одна функция не собирает запись, а клапан перепроверяет каждый исходящий байт. В Modbus нет обнаружения, поэтому дерево строится из карты регистров, хранимой вместе с подключением, а чтение — это один JSON-запрос к точкам, которые эта карта называет | | **NETCONF** | `ssh2` (только транспорт SSH; этот репозиторий открывает сокет и передаёт его, а кадрирование, запросы и сессия NETCONF свои собственные, порт 830) | Только чтение по построению: `requests.ts` собирает пять тел запросов, четыре из них чтения, `Для всех, кто работает с данными, где бы они ни хранились и куда бы ни передавались.