Dateiübertragung und EDI

Die Datei kam nicht an, und bis Montag hat es niemand gemerkt.

Dateiübertragung ist der älteste Job im Haus und meist der am wenigsten beaufsichtigte: ein Shell-Skript im Cron, ohne Wiederholung, ohne Alarm, ohne Nachweis, was übertragen wurde. Dagu behält die Übertragungsbefehle und ergänzt darum herum das Warten auf den Eingang, die Prüfung, Wiederholungen und Historie.

Auf eine Datei zu warten ist ein Schritt, keine selbst gepflegte Polling-Schleife
Wiederholungen und Fehlermeldungen bei jeder Übertragung
Läuft im eigenen Netz, Dateien nehmen keinen Umweg über einen Cloud-Dienst
Selbst-Hosting kostenlos, ohne Lizenz je Verbindung
01

Die Integration, die niemand modernisiert

Bestelldateien, Rechnungen, Lohnabzüge, Bankdaten und Bestandsfeeds bewegen sich weiterhin als Dateien nach Zeitplan. Die Übertragung selbst ist ein gelöstes Problem. Was fehlt, ist meist alles andere darum herum.

  • Das Skript weiß, wie es die Datei sendet. Es weiß nicht, was zu tun ist, wenn die Gegenstelle ausgefallen ist
  • Den Fehler entdeckt jemand weiter unten im Prozess, oft Tage später, denn eine fehlende Datei sieht aus wie ein ruhiger Tag
  • Niemand kann sagen, welche Datei wann übertragen wurde und ob sie vollständig war, weil nichts es festgehalten hat
02

Auf eine Datei zu warten ist ein Schritt

Die meisten Scheduler zwingen dazu, eine Polling-Schleife mit Sleep und Zähler zu schreiben und dauerhaft zu pflegen. Dagu hat eine Warteaktion: Das Eingangsfenster wird deklariert statt programmiert, und eine Datei, die nie eintrifft, lässt den Lauf fehlschlagen, statt ihn hängen zu lassen.

  • wait.file prüft im gewählten Intervall, ob ein Pfad erscheint oder verschwindet
  • Ein Timeout macht aus einer ausgebliebenen Lieferung einen fehlgeschlagenen Lauf mit Alarm statt eines Jobs, der hängt, bis jemand nachsieht
  • Die Prüfung läuft als eigener Schritt, sodass eine abgeschnittene oder beschädigte Datei den Import stoppt, statt ihn zu füttern
Eingehend: warten, prüfen, importieren, archivieren
# 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

Stille ist der Fehlerfall

Eine Übertragung, die laut scheitert, ist ein kleines Problem. Eine Übertragung, die leise scheitert, wird zum Abstimmungsprojekt. Die Betriebsschicht ist der Teil, der sich zu ergänzen lohnt.

  • retry_policy deckt die kurzzeitige Nichterreichbarkeit der Gegenstelle ab, und das sind die meisten Übertragungsfehler
  • mail_on.failure und handler_on.failure bringen eine ausgebliebene Lieferung noch in derselben Stunde zu jemandem
  • max_active_runs: 1 verhindert, dass eine langsame Übertragung den nächsten Lauf überlappt und dieselbe Datei zweimal sendet
04

Beide Enden bleiben innerhalb Ihrer Grenze

Dateien, die das Netz nicht verlassen dürfen, sind im Finanzwesen, im Gesundheitswesen und im öffentlichen Sektor der Normalfall. Eine einzelne Binärdatei auf dem eigenen Host erreicht den Partner per SFTP und das Kernsystem lokal, ohne Drittdienst im Pfad.

  • sftp.upload und sftp.download übertragen mit Schlüsselauthentifizierung und optional über einen Bastion-Host
  • Derselbe Workflow erreicht ein System vor Ort per SSH und einen Objektspeicher für die Archivkopie
  • Nichts wird über die Cloud eines Anbieters geleitet, dadurch bleiben Fragen zu Datenresidenz und Audit einfach
Ausgehend: extrahieren, Prüfsumme, senden
# 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

Bewahren Sie den Nachweis, nicht nur die Datei

Nach einem Vorfall geht die Frage selten um den Inhalt der Datei. Sie geht darum, wann sie ankam, ob sie vollständig war und wer sie erneut ausgeführt hat.

  • Jeder Lauf behält Logs je Schritt, Status, Zeiten und Anzahl der Wiederholungen
  • Die Archivierung in einen Objektspeicher als Workflow-Schritt macht aus Aufbewahrung einen Zeitplan statt einer Gewohnheit
  • Wiederholungen laufen über denselben aufgezeichneten Pfad, dadurch ist eine manuelle Wiederherstellung genauso sichtbar wie der automatische Lauf
06

Preis je Server, nicht je Verbindung

Managed-File-Transfer-Produkte werden meist je Verbindung, je Partner oder je übertragendem Server lizenziert. Deshalb wächst die Rechnung mit jedem neuen Geschäftspartner.

  • Community-Selbst-Hosting ist kostenlos, mit unbegrenzt vielen Servern und Workern
  • Die lizenzierte Stufe wird je Dagu-Server berechnet und ergänzt SSO, Rollentrennung und Audit-Log
  • Einen Partner hinzuzufügen heißt, eine Workflow-Datei hinzuzufügen, die Lizenzanzahl ändert sich dadurch nicht
07

Wann ein MFT-Produkt die bessere Antwort ist

Dagu plant und überwacht Übertragungen. Es ist keine vollständige MFT-Plattform, und manche Anforderungen verlangen wirklich eine.

  • Protokollbreite: Wenn Sie AS2, OFTP2 oder eine zertifizierte EDI-VAN-Anbindung brauchen, nehmen Sie ein dafür gebautes Produkt
  • Self-Service-Portale für Partner, Rotation der Zugangsdaten je Partner und Nichtabstreitbarkeitsquittungen sind MFT-Funktionen, keine Scheduler-Funktionen
  • Compliance-Regime, die ein zertifiziertes Übertragungsprodukt verlangen, akzeptieren keinen Allzweck-Orchestrator, was immer er technisch kann

FAQ

Practical questions before adopting

Ersetzt Dagu ein Managed-File-Transfer-Produkt?

Für geplantes SFTP und dateibasierte Integration meist ja: Es führt die Übertragung aus, wartet auf Eingänge, prüft, wiederholt, alarmiert und hält Historie vor. Für AS2, OFTP2, zertifizierte EDI-VAN-Anbindung, Self-Service-Portale für Partner oder Nichtabstreitbarkeitsquittungen nein. Das sind Funktionen einer MFT-Plattform, und ein Scheduler sollte nichts anderes vorgeben.

Wie löse ich beim Eintreffen einer Datei aus statt nach Zeitplan?

Führen Sie den Workflow in kurzem Takt aus und beginnen Sie ihn mit einem wait.file-Schritt, der den Pfad prüft und fortfährt, sobald die Datei erscheint. Geben Sie dem Schritt ein Timeout, damit eine nie eintreffende Lieferung fehlschlägt und alarmiert, statt endlos zu warten. Ein Lauf lässt sich auch extern per Webhook starten, wenn die sendende Seite einen aufrufen kann.

Welche Protokolle werden unterstützt?

SFTP über SSH ist als sftp.upload und sftp.download eingebaut, Übertragungen in Objektspeicher sind für S3-kompatible Endpunkte eingebaut. Alles andere läuft als gewöhnlicher Befehlsschritt, sodass vorhandene Werkzeuge für FTPS, rsync oder ein Anbieter-Client weiterhin funktionieren, umgeben von Planung und Überwachung.

Wie werden Zugangsdaten behandelt?

Schlüsselbasierte SSH-Authentifizierung ist die Voreinstellung, ein Bastion-Host wird unterstützt, wenn der Partner dahinter liegt. Secrets werden auf Workflow-Ebene deklariert und aus einem Provider aufgelöst, etwa Umgebungsvariablen, Datei, Vault oder ein Cloud-Secret-Manager; ihre Werte werden in den Laufprotokollen maskiert.

Funktioniert das ohne Internetzugang?

Ja. Dagu ist eine eigenständige Binärdatei ohne zwingend erforderliche externe Datenbank oder Broker und läuft daher vor Ort und in geschlossenen Netzen. Verteilte Ausführung nutzt Koordinator und Worker über gRPC innerhalb Ihres eigenen Netzes.

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.