Всем привет! Я Дмитрий Пономарев, разработчик ESB ИТ-интегратора «Белый код». В большинстве интеграционных проектов мы опираемся на стандартные коннекторы платформы и живём спокойно, пока реальность не подбрасывает задачу вне «типового набора». Именно так и случилось: по требованиям заказчика результаты соревнований необходимо было отправлять на сервер по протоколу SFTP, а в DATAREON «из коробки» такого коннектора просто нет. Единственным разумным вариантом стало расширить платформу — через программные модули и кастомный SFTP-коннектор.

В этой статье мы разберём, как была реализована интеграция: от постановки задачи и ограничений DATAREON до разработки собственного SFTP-модуля, его встраивания в существующие процессы и организации безопасной выгрузки файлов на Linux-сервер. По сути, это кейс о том, как использовать DATAREON не только как «конструктор из готовых блоков», но и как платформу, которую можно расширять под конкретные сценарии, когда стандартного функционала уже недостаточно.

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

Почему «из коробки» не получилось

В DATAREON Platform доступны стандартные коннекторы: 1С, Файловый каталог, FTP, База данных, Расширенное REST API, Веб-сервис, Email, DATAREON ESB, а также программируемый коннектор. Однако для решения задачи требовалось взаимодействие именно по SFTP, а такого сценария штатный набор коннекторов не предоставляет. Поэтому решили расширить платформу и реализовать собственный SFTP-коннектор на базе программного модуля, встроив его в существующую схему обработки.

Архитектура решения

Так выглядит схема обработки, реализующая полный цикл выгрузки и отправки результатов:

 

Процесс начинается с шага «Заполнение тела запроса», где формируется корректное тело для запроса во внешний источник. Далее выполняется «Запрос результатов» — ключевой шаг получения данных. Если на этом этапе возникает ошибка, процесс уходит в отдельную ветку «Лог ошибки запроса», чтобы зафиксировать причину сбоя и упростить диагностику. При успешном выполнении запроса результат дополнительно фиксируется на шаге «Лог ответа по запросу», после чего данные передаются на шаг «Отправка по SFTP» — выгрузка файла в целевой каталог на сервере. Завершается цепочка стандартным шагом «Завершение».

Давайте детально рассмотрим шаг «Отправка по SFTP» и разберем все аспекты разработки собственного программного модуля.

Реализация кастомного SFTP-коннектора

Для начала был создан программный модуль SFTP_Conn и подключена сторонняя библиотека Renci.SshNet для работы с SFTP — она обеспечивает установление защищенного соединения, управление удалёнными каталогами и передачу файлов, закрывая сценарий, который не поддерживается стандартными коннекторами DATAREON.

Далее были реализованы методы для генерации безопасного имени файла и загрузки текстового содержимого на сервер SFTP. 

Метод для загрузки текстового содержимого на сервер SFTP UploadUtf8Text принимает параметры подключения и целевой путь, кодирует контент в UTF-8 и отправляет его на сервер через SftpClient, при этом заранее нормализует путь и гарантирует наличие директории на стороне Linux (создавая отсутствующие уровни каталога).

Код метода «UploadUtf8Text» в программном модуле:

public static void UploadUtf8Text(
    string host, int port, string username, string password,
    string remoteDirectory, string remoteFileName, string content)
{
    var bytes = Encoding.UTF8.GetBytes(content ?? "");

    using (var sftp = new SftpClient(host, port, username, password))
    using (var stream = new MemoryStream(bytes))
    {
        sftp.Connect();

        var targetDir = ResolveRemoteDirectory(sftp.WorkingDirectory, remoteDirectory);
        EnsureDirectoryExists(sftp, targetDir);

        var remotePath = CombineRemotePath(targetDir, remoteFileName);

        Logger.Debug($"SFTP upload -> {remotePath}");
        sftp.UploadFile(stream, remotePath, true);
        Logger.Info($"SFTP upload OK -> {remotePath}");

        sftp.Disconnect();
    }
}

Имя файла формируется методом BuildResultFileName: префикс очищается от неподходящих символов, добавляется метка времени в UTC и расширение JSON, чтобы файлы удобно сортировались и не конфликтовали друг с другом.

Код метода «BuildResultFileName» в программном модуле:

public static string BuildResultFileName(string prefix, DateTime momentUtc, string extension = "json")
{
    var safePrefix = Regex.Replace(prefix ?? "result", @"[^\w\-.]+", "_").Trim('_', '.');
    var ts = momentUtc.ToString("yyyyMMdd_HHmmss");
    var ext = (extension ?? "json").Trim().TrimStart('.');
    return $"{safePrefix}_{ts}.{ext}";
}

В самом шаге «Отправка по SFTP» на схеме обработки параметры подключения подтягиваются из сервиса Credential: по имени пользователя SFTP_USER читаются обычные свойства Host, Port, Username, RemoteDir, а пароль берётся как секретное свойство Password. Дальше осуществляется отправка и формирование имени файла с помощью выше описанных методов BuildResultFileName и UploadUtf8Text.

Код шага на схеме обработки «Отправка по SFTP»:

var jsonText = resultsResponse;

var credUser = Credential.GetUserByName("SFTP_USER");

string host = Credential.GetAdditionalProperty<string>(credUser, "Host");
int port = Credential.GetAdditionalProperty<int>(credUser, "Port");
string username = Credential.GetAdditionalProperty<string>(credUser, "Username");
string password = Credential.GetSecretProperty<string>(credUser, "Password");
string remoteDir = Credential.GetAdditionalProperty<string>(credUser, "RemoteDir");

string fileName = SFTP_Conn.BuildResultFileName("competition_results", DateTime.UtcNow);

SFTP_Conn.UploadUtf8Text(host, port, username, password, remoteDir, fileName, jsonText);

Заключение

В итоге задача выгрузки результатов соревнований на Linux-сервер по SFTP решена без изменений инфраструктуры и без компромиссов по безопасности. Там, где стандартных коннекторов DATAREON не хватило, платформа показала свою сильную сторону — возможность расширения через программные модули: кастомный SFTP-коннектор органично встроился в схему обработки и стал таким же «кирпичиком», как и типовые шаги. Отдельно важно, что параметры подключения вынесены в Credential: секреты не попадают в код, реквизиты можно менять централизованно, а сама интеграция остаётся поддерживаемой и масштабируемой. Такой подход превращает DATAREON из набора готовых коннекторов в полноценную интеграционную платформу, которую можно адаптировать под требования реальных проектов. 

Если перед вами стоят задачи по развитию интеграционного контура на DATAREON — от доработки существующих потоков до реализации нестандартных сценариев вроде SFTP-обмена, — обращайтесь за консультацией или проработкой решения. Такие кейсы встречаются регулярно: помогаем оценить объём работ, выбрать архитектуру, безопасно встроить кастомные модули и сделать интеграции управляемыми, надёжными и масштабируемыми.

Комментарии (0)