Передача файлов и EDI

Файл не пришёл, и никто не заметил до понедельника.

Передача файлов — самая старая задача в компании и обычно самая безнадзорная: shell-скрипт в cron, без повторов, без оповещений, без записи о том, что именно ушло. Dagu оставляет команды передачи и добавляет вокруг них ожидание поступления, проверку, повторы и историю.

Ожидание файла — это шаг, а не цикл опроса, который вы сопровождаете
Повторы и оповещения об ошибках на каждой передаче
Работает внутри сети, поэтому файлы не идут в обход через облако
Бесплатное самостоятельное размещение, без лицензии за каждое соединение
01

Интеграция, которую никто не модернизирует

Файлы заказов, счета, выгрузки по зарплате, банковские данные и остатки по складу до сих пор ходят файлами по расписанию. Сама передача — решённая задача. Не хватает обычно всего остального вокруг неё.

  • Скрипт знает, как отправить файл. Он не знает, что делать, когда другая сторона недоступна
  • Сбой обнаруживает человек ниже по потоку, часто спустя дни, потому что отсутствие файла выглядит так же, как тихий день
  • Никто не может ответить, какой файл ушёл, когда и был ли он полным, потому что это нигде не записано
02

Ожидание файла — это шаг

Большинство планировщиков вынуждают писать цикл опроса со sleep и счётчиком, а потом его сопровождать. В Dagu есть действие ожидания, поэтому окно поступления объявляется, а не программируется, а так и не пришедший файл приводит к сбою запуска, а не к его зависанию.

  • wait.file опрашивает появление или исчезновение пути с выбранным вами интервалом
  • Тайм-аут превращает несостоявшуюся доставку в сбой с оповещением, а не в задачу, висящую до тех пор, пока кто-нибудь не посмотрит
  • Проверка выполняется отдельным шагом, поэтому обрезанный или повреждённый файл останавливает загрузку, а не попадает в неё
Приём: ожидание, проверка, загрузка, архив
# edi-inbound.yaml
schedule: "0 * * * *"
max_active_runs: 1

s3:
  bucket: corp-edi-archive
  region: ap-northeast-1

steps:
  - id: wait_for_delivery
    action: wait.file
    with:
      path: /var/spool/edi/orders.csv
      poll_interval: 30s
    timeout_sec: 1800

  - id: verify
    run: |
      cd /var/spool/edi
      sha256sum -c orders.csv.sha256
    depends: wait_for_delivery

  - id: import
    run: /opt/core/import-orders.sh /var/spool/edi/orders.csv
    depends: verify
    retry_policy:
      limit: 2
      interval_sec: 300

  - id: archive
    action: s3.upload
    with:
      key: edi/inbound/orders.csv
      source: /var/spool/edi/orders.csv
    depends: import

  - id: mark_done
    action: file.move
    with:
      source: /var/spool/edi/orders.csv
      destination: /var/spool/edi/done/orders.csv
      create_dirs: true
    depends: archive

handler_on:
  failure:
    run: /opt/edi/notify-failure.sh

mail_on:
  failure: true
03

Тишина и есть режим отказа

Передача, которая падает громко, — небольшая проблема. Передача, которая падает тихо, превращается в проект по сверке. Добавлять стоит именно эксплуатационный слой.

  • retry_policy закрывает кратковременную недоступность другой стороны, а это большинство сбоев передачи
  • mail_on.failure и handler_on.failure доводят пропущенную доставку до человека в тот же час
  • max_active_runs: 1 не даёт медленной передаче наложиться на следующий запуск и отправить тот же файл дважды
04

Оба конца остаются внутри вашего периметра

Файлы, которые нельзя выпускать из сети, — норма в финансах, здравоохранении и госсекторе. Один бинарник на вашем узле доходит до партнёра по SFTP, а до основной системы — локально, без сторонних сервисов в маршруте.

  • sftp.upload и sftp.download передают файлы с аутентификацией по ключу и при необходимости через бастион-хост
  • Один и тот же рабочий процесс достаёт до локальной системы по SSH и до объектного хранилища для архивной копии
  • Ничего не проходит через облако поставщика, поэтому вопросы резидентности данных и аудита остаются простыми
Отправка: выгрузка, контрольная сумма, передача
# edi-outbound.yaml
schedule: "30 18 * * 1-5"
max_active_runs: 1

ssh:
  user: edi
  host: sftp.partner.example.com
  key: ~/.ssh/edi_key

steps:
  - id: extract
    run: /opt/core/export-invoices.sh ./outgoing/invoices.csv
    retry_policy:
      limit: 2
      interval_sec: 120

  - id: checksum
    run: |
      cd ./outgoing
      sha256sum invoices.csv > invoices.csv.sha256
    depends: extract

  - id: send_file
    action: sftp.upload
    with:
      source: ./outgoing/invoices.csv
      destination: /inbound/invoices.csv
    depends: checksum
    retry_policy:
      limit: 3
      interval_sec: 60

  - id: send_checksum
    action: sftp.upload
    with:
      source: ./outgoing/invoices.csv.sha256
      destination: /inbound/invoices.csv.sha256
    depends: send_file

handler_on:
  failure:
    run: /opt/edi/notify-failure.sh

mail_on:
  failure: true
05

Сохраняйте свидетельства, а не только файл

После инцидента спрашивают редко о содержимом файла. Спрашивают, когда он пришёл, был ли полным и кто его перезапускал.

  • Каждый запуск хранит пошаговые логи, статус, тайминги и число повторов
  • Архивация в объектное хранилище как шаг рабочего процесса превращает хранение из привычки в расписание
  • Перезапуски идут тем же записываемым путём, поэтому ручное восстановление видно так же, как автоматический запуск
06

Цена за сервер, а не за соединение

Продукты управляемой передачи файлов обычно лицензируются за соединение, за партнёра или за передающий сервер — поэтому счёт растёт с каждым новым контрагентом.

  • Community-версия для самостоятельного размещения бесплатна, число серверов и воркеров не ограничено
  • Лицензируемый уровень тарифицируется за сервер Dagu и добавляет SSO, разделение ролей и журнал аудита
  • Добавить партнёра — значит добавить файл рабочего процесса, число лицензий при этом не меняется
07

Когда продукт управляемой передачи файлов подходит лучше

Dagu планирует передачи и следит за ними. Он не является полноценной MFT-платформой, и часть требований действительно требует именно её.

  • Широта протоколов: если нужны AS2, OFTP2 или сертифицированное подключение к EDI VAN, берите продукт, созданный для этого
  • Порталы самообслуживания для партнёров, ротация учётных данных по каждому партнёру и квитанции о неотказуемости — это функции MFT, а не планировщика
  • Режимы соответствия, требующие сертифицированного продукта передачи, не примут универсальный оркестратор, что бы он технически ни умел

FAQ

Practical questions before adopting

Заменяет ли Dagu продукт управляемой передачи файлов?

Для SFTP по расписанию и файловой интеграции обычно да: он выполняет передачу, ждёт поступления, проверяет, повторяет, оповещает и хранит историю. Для AS2, OFTP2, сертифицированного подключения к EDI VAN, партнёрских порталов самообслуживания и квитанций о неотказуемости — нет. Это функции MFT-платформы, и планировщику не следует делать вид, что они у него есть.

Как запускаться по факту прихода файла, а не по расписанию?

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

Какие протоколы поддерживаются?

SFTP поверх SSH встроен как sftp.upload и sftp.download, передача в объектные хранилища встроена для S3-совместимых точек. Всё остальное выполняется обычным командным шагом, поэтому существующие инструменты для FTPS, rsync или клиент поставщика продолжают работать, будучи обёрнутыми в расписание и надзор.

Как обрабатываются учётные данные?

По умолчанию используется аутентификация SSH по ключу, а если партнёр находится за бастионом, поддерживается и он. Секреты объявляются на уровне рабочего процесса и разрешаются из провайдера: переменных окружения, файла, Vault или облачного менеджера секретов, а их значения скрываются в логах запуска.

Работает ли это без доступа в интернет?

Да. Dagu — самодостаточный бинарник, которому не нужны внешняя база данных или брокер, поэтому он работает локально и в закрытых сетях. Распределённое выполнение использует координатор и воркеры по gRPC внутри вашей собственной сети.

Next step

Start with one workflow.

Install Dagu, move one script that runs on cron today into YAML, and decide from a real run history.