SQL-Proxy: http-сервис, транслирующий SQL-запросы через REST API

Описание
Легковесный REST-сервис для работы с базами данных в условиях отсутствия ADODB (например, в 1С на Linux)
Этот REST-сервис был разработан как альтернатива прямым вызовам SQL-запросов через устаревший слой ADODB, который недоступен при работе 1С:Предприятие на Linux-платформах. Он позволяет продолжить использование SQL-операций из конфигурации 1С даже в тех средах, где нативные драйверы БД или COM-объекты недоступны.
Почему это полезно для 1С?
Начиная с поддержки 1С в облаке и на Linux, многие традиционные способы взаимодействия с внешними базами данных (например, через ADODB) перестают работать. У 1С есть есть костыль в виде объекта конфигурации "Внешний источник данных", но лично мне он не нравится из-за необходимости коренной ломки конфигурации и ограниченности некоторых функций, а также крайнего неудобства и трудоёмкости разработки. Данный сервис закрывает этот пробел, позволяя переносить существующие решения 1С на новые платформы без потери функционала и существенной ломки уже работающих алгоритмов, структур и доступов к СУБД.
Особенности реализации
- Написан на компилируемом языке, что обеспечивает высокую производительность и минимальную потребность в вычислительных ресурсах, в особенности отличаясь по этим параметрам от подобных решений на Java, JavaScrypt и Python
- Не требует установки дополнительных библиотек, драйверов или зависимостей
- Кроссплатформенный — работает одинаково хорошо на Windows, Linux и в облаке
- Гибкая система настроек и минимальное время на развёртывание
- Безопасное управление учётными данными - сервис не хранит учетные данные SQL серверов, обеспечивая защиту конфиденциальной информации
- Безопасность - не выполняет проверку SQL-запросов в целях безопасности. Ответственность за настройку соответствующих привилегий лежит на администраторе баз данных (помним, что это замена вызовов ADODB).
Поставляется в виде готового проекта с исходным кодом на языке Go:
Основные функции
- Поддержка нескольких типов баз данных без необходимости установки драйверов в систему: PostgreSQL, Microsoft SQL Server и MySQL. При необходимости могут быть интегрированы дополнительные стандартные драйверы, имеющиеся в репозиториях экосистемы Golang;
- Режим запуска: можно настроить как простую отдельную службу, так и использовать в контейнере в k8s;
- Безопасная передача данных: при необходимости поддерживает HTTPS для безопасной передачи данных через сеть;
- Пул соединений: использует общий, SQL-соединения переиспользуются. Задачи обслуживания регулярно автоматически удаляют неиспользуемые или зависшие подключения;
- Поддержка SQL-команд: в настоящее время поддерживаются все SQL-команды без ограничений. Команда SELECT возвращает результаты запроса в виде гибкого JSON-набора записей;
- Ограничение результатов: есть настройка на ограничение на количество строк, возвращаемых командами SELECT, с индикацией о превышении;
- Сетевые привязки: может быть ограничен для доступа на localhost или любой указанный IP-адрес для повышения безопасности. По умолчанию предполагается привязка на localhost и работа на одном сервере с сервисом ПО-клиента, например на сервере 1С-Предприятия;
- Мониторинг: предоставляет метрики Prometheus для мониторинга производительности и состояния;
- Prepared statements: поддерживаются.
Описание API
См. спецификацию Swagger OpenAPI 3.0 в /src/docs в исходниках - можно смотреть соответствующим плагином Vscode.

Там же можно найти пример вызова методов REST API из модуля 1С, ниже фрагмент получения результата выполнения обычного запроса:
// Выполняет обычные SQL-запросы вида выборки таблиц
// Параметры:
// SQLСоединение - Строка - GUID открытого соединения
// SQLЗапрос - Строка - Текст SQL-запроса
// Возвращаемое значение:
// Результат запроса - Структура, содержащая массив структур - результат выборки запроса
Функция ЗапросВыборкаДанных(SQLСоединение, SQLЗапрос) Экспорт
http = Новый HTTPСоединение("localhost", 8080);
path = "/api/v1/query";
headers = Новый Соответствие;
headers.Вставить("API-Version", "1.2");
headers.Вставить("Connection-Id", SQLСоединение);
headers.Вставить("Content-Type", "text/plain;charset=UTF-8");
query = Новый HTTPЗапрос(path, headers);
query.УстановитьТелоИзСтроки(SQLЗапрос);
Ответ = http.ВызватьHTTPМетод("POST", query);
КодРезультата = Ответ.КодСостояния;
Если КодРезультата = 200 Тогда
Возврат ДесериализоватьИзJSON(Ответ.ПолучитьТелоКакСтроку());
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
Как скомпилировать
Выполнить в папке проекта:
make prod
Как запустить
Настройки передаются через переменные окружения, см. Makefile для деталей. По умолчанию без переданных параметров сервис слушает на localhost:8080. Для запуска демоном необходимо написать соответствующий файл конфигурации или скрипт для системы инициализации конкретного дистрибутива Linux, для запуска в контейнере написать свой Dockerfile.
BIND_ADDR=localhost BIND_PORT=8081 MAX_ROWS=10000 LOG_LEVEL=3 sql-proxy