Nicht nur Dateien prüfen, sondern eine Lieferung sicher übernehmen

SFTP-Lieferungen automatisch testen: Dateien korrelieren, sicher übernehmen und archivieren

Eine SFTP-Datei kann technisch erreichbar und trotzdem fachlich die falsche Lieferung sein. Vielleicht liegt eine Begleitdatei noch nicht im Eingang, vielleicht prüft ein zweiter Lauf dieselbe Datei erneut oder ein gültiger Datensatz bleibt nach dem Test im Eingang liegen. Ein verlässlicher Qualitätstest braucht deshalb neben dem Inhalt auch eine klare Besitz- und Lebenszyklusregel.

In dieser Ausbaustufe von ZEUS Interface Quality werden die bisher getrennten Schritte zusammengeführt: Eine Lieferung wird im SFTP-Verzeichnis eindeutig ausgewählt, über eine gemeinsame Kennung korreliert, in einen geschützten Claim-Bereich übernommen, validiert und anschließend entweder archiviert oder in Quarantäne verschoben. Die zuvor separat geplante Verzeichnisauswahl ist dabei kein eigener veröffentlichter Artikel, sondern Teil dieses zusammenhängenden Meilensteins.

Wichtig zur Einordnung: Wir fassen hier bewusst zwei fachlich zusammengehörende Iterationen in einem Artikel zusammen – die Verzeichnisauswahl aus Iteration 5 und den korrelierten SFTP-Lieferzyklus aus Iteration 6.

Die übergeordnete Idee steht im Hauptartikel zur automatischen Schnittstellenqualität. Die veröffentlichten Serienartikel zeigen den Weg über JSON Schema, CSV und Fixed-Width, HTTP-Verträge und den stabilen SFTP-Ein-Datei-Ablauf. Dieser Artikel erklärt, wie aus dem SFTP-Eingang ein nachvollziehbarer Delivery-Lifecycle wird.

KI-generierte Illustration: Ein geschütztes SFTP-Verzeichnis führt eine korrelierte Lieferung zur Validierungsstation
KI-generierte Illustration für tiny-tool.de: Ein geschütztes SFTP-Verzeichnis führt eine eindeutig korrelierte Lieferung zur zentralen Prüfung; gültige Daten gehen ins Archiv, fehlerhafte in Quarantäne.

Vom Dateitreffer zur Lieferung

Die Auswahl eines passenden Dateinamens war der notwendige Zwischenschritt. Für einen betrieblichen Prüfpunkt reicht sie allein aber noch nicht aus: Zwei Dateien können zusammengehören, und ein Test muss erkennbar machen, wann er die Verantwortung für diese Lieferung übernimmt.

  • Eindeutig: Das Profil trennt primäre Datei, optionale Begleitdatei und gemeinsame Liefer-ID.
  • Vollständig: Ein unvollständiges Paar, ein Waisenobjekt oder mehrere Kandidaten wird nicht geraten.
  • Wiederanlaufbar: Ein atomarer Rename in den Claim-Bereich markiert die Übernahme.
  • Fail-closed: Erst wenn alle Dateien gültig sind, darf die Lieferung ins Archiv.
  • Nachvollziehbar: Der JSON-Report kann Liefer-ID, Dateianzahl und Lifecycle-Zustand ausgeben.

Das v3-Profil als expliziter Vertrag

Version 3 baut auf der Verzeichnisauswahl von Version 2 auf. filePattern beschreibt die primäre Datei. companionPattern beschreibt eine Begleitdatei. Beide Muster werden nur gegen Basenames geprüft. deliveryIdPattern enthält eine benannte Gruppe deliveryId, die in beiden Dateinamen denselben Wert liefern muss.

sftp-correlated-lifecycle-profile.json · Version 3
{
  "format": "sftp",
  "version": 3,
  "host": "sftp.example.test",
  "port": 22,
  "username": "quality-reader",
  "remoteDirectory": "/incoming",
  "filePattern": "^delivery-[A-Z0-9-]+[.]json$",
  "companionPattern": "^delivery-[A-Z0-9-]+[.]meta[.]json$",
  "deliveryIdPattern": "^delivery-(?<deliveryId>[A-Z0-9-]+)(?:[.]meta)?[.]json$",
  "claimRemoteDirectory": "/claim",
  "archiveRemoteDirectory": "/archive",
  "knownHosts": "known_hosts",
  "privateKey": "id_ed25519",
  "contentFormat": "json",
  "contentProfile": "delivery.schema.json",
  "quarantineRemoteDirectory": "/quarantine",
  "stabilityChecks": 2,
  "stabilityDelaySeconds": 1,
  "maxAttempts": 2,
  "retryDelaySeconds": 1,
  "connectTimeoutSeconds": 10
}

Die beiden lokalen Dateien für Host-Key und Private Key bleiben unterhalb des Profilverzeichnisses. Das Profil enthält keine Passphrase. Falls der Schlüssel geschützt ist, kommt die Passphrase ausschließlich aus der dafür vorgesehenen Umgebungsvariable. Die Remote-Verzeichnisse sind bewusst getrennt: Der Produzent schreibt nach /incoming, der Validator besitzt /claim und /archive.

Mehrere Dateien, eine Liefer-ID

Eine Lieferung ist nicht automatisch vollständig, nur weil eine passende Datei vorhanden ist. Der v3-Selektor bildet Kandidaten nach ihrer Liefer-ID. Genau eine primäre Datei und genau eine Begleitdatei müssen dieselbe ID tragen. Die Auswahl bleibt dadurch deterministisch, ohne eine fachliche Entscheidung in „nimm die neueste Datei“ zu verstecken.

Entscheidungen für korrelierte SFTP-Lieferungen
Remote-Situation Entscheidung Folge
Keine vollständige Lieferung innerhalb der Grenze erneut beobachten Nach dem letzten Versuch INVALID
Eine Primär- und eine Begleitdatei mit derselben ID eindeutig ausgewählt Claim, Stabilität, Download und Inhalt prüfen
Nur Primärdatei oder nur Begleitdatei unvollständig Nichts herunterladen, Lieferung ablehnen
Mehrere vollständige Lieferungen nicht raten Sofort INVALID mit fileCount

🟢 Korrelation ist eine Sicherheitsgrenze

Ein Name wie delivery-D-200.json sagt noch nicht, ob delivery-D-200.meta.json dazugehört. Erst die gemeinsame Liefer-ID macht die Beziehung explizit. Ein unvollständiges Set wird nicht durch weiteres Vertrauen in Serverreihenfolge oder Änderungszeit „repariert“.

Claim und sicherer Wiederanlauf

Der Claim-Bereich ist die Besitzgrenze des Validators. Sobald genau eine vollständige Lieferung gefunden wurde, werden alle zugehörigen Dateien per Remote-Rename aus /incoming nach /claim verschoben. Erst danach beginnt der Download. Ein paralleler Lauf sieht die Lieferung im Eingangsverzeichnis nicht mehr und kann sie nicht noch einmal auswählen.

  1. Den Claim-Bereich zuerst nach einer bereits übernommenen Lieferung durchsuchen.
  2. Wenn dort nichts Passendes liegt, Eingang auf eine vollständige, eindeutige Lieferung prüfen.
  3. Alle Dateien der Lieferung atomar in den Claim-Bereich umbenennen.
  4. Bei einem Verbindungsabbruch den Claim beim nächsten Lauf aus dem Claim-Bereich wieder aufnehmen.

Damit wird aus „noch einmal prüfen“ ein definierter Wiederanlauf. Ein fehlgeschlagener Claim ist ein technischer Fehler mit Exit-Code 2. Wenn nur ein Teil des Claims gelingt, versucht der Adapter die bereits verschobenen Dateien zurückzusetzen; die ursprüngliche Transferstörung bleibt der maßgebliche Befund.

Stabilität, Integrität und Inhalt

Der Claim ersetzt die fachliche Prüfung nicht. Er schützt nur den Übergang vom Produzentenbereich zur laufenden Validierung. Danach bleibt die bewährte SFTP-Pipeline erhalten:

  1. Host-Key und Private-Key-Zugang strikt prüfen.
  2. Typ, Größe und Änderungszeit für jede Datei als stabilen Snapshot beobachten.
  3. Alle Bytes in ein temporäres lokales Verzeichnis laden.
  4. Den optionalen SHA-256-Hash auf der primären Datei gegen das Profil prüfen.
  5. Primär- und Begleitdatei mit dem konfigurierten JSON-, CSV- oder Fixed-Width-Vertrag validieren.

Der gemeinsame Inhaltspfad ist bewusst eine erste, begrenzte Korrelation: Beide Dateien verwenden dasselbe Content-Profil. Unterschiedliche Formate oder fachliche Regeln wie „Summe in Datei A muss Datei B entsprechen“ brauchen einen eigenen späteren Vertrag. Das macht die aktuelle Lösung kleiner und im Fehlerfall verständlich.

Archiv oder Quarantäne

Ein gültiges Ergebnis ist jetzt nicht mehr nur ein Status im Terminal. Wenn Claim und Archiv konfiguriert sind, werden alle geprüften Dateien erst nach erfolgreicher Validierung in das Archiv verschoben. Bei einem Hash- oder Inhaltsfehler geht die gesamte geclaimte Lieferung – sofern Quarantäne aktiviert ist – in den Quarantänebereich.

Die Zielnamen erhalten UTC-Zeitstempel und einen kurzen Kollisionsschutz. Das verhindert, dass ein späterer Lauf ein vorhandenes Ergebnis still überschreibt. Ein Fehler beim finalen Verschieben ist kein fachlicher Finding, sondern ein operativer Fehler mit Exit-Code 2.

Der operative Prüfbericht

Der gemeinsame Report behält status, valid und findings. Für einen v3-Lifecycle kann zusätzlich ein metadata-Objekt erscheinen. Es enthält keine Nutzdaten und keine Secrets, sondern nur die Informationen, die den Übergang nachvollziehbar machen:

VALID · operativer Lifecycle-Bericht
{
  "status": "VALID",
  "valid": true,
  "findings": [],
  "metadata": {
    "deliveryId": "D-200",
    "filesValidated": 2,
    "lifecycle": "ARCHIVED",
    "archivedFiles": [
      "/archive/delivery-D-200.json.20260928180000-ab12cd34.validated",
      "/archive/delivery-D-200.meta.json.20260928180000-ef56ab78.validated"
    ]
  }
}

Ältere Adapter und v1/v2-SFTP-Läufe behalten die kompakte Report-Form, weil leere Metadaten nicht ausgegeben werden. Automatisierung kann weiterhin über Status und Findings entscheiden; die Lifecycle-Metadaten helfen zusätzlich bei Audit, Betrieb und manueller Nachverfolgung.

Der lokale Nachweis

Für ein Erfolgserlebnis braucht niemand einen öffentlichen SFTP-Dienst. Die Unit-Tests prüfen Korrelation, unvollständige Lieferungen, Claim-Wiederaufnahme und Zielbewegungen mit einem kontrollierten Transport-Fake. Der Integrationstest startet einen eingebetteten Apache-MINA-SSHD-Server und lässt den produktiven JSch-Transport damit arbeiten.

PowerShell · fokussierte SFTP-Tests
mvnw.cmd -B -Dtest=SftpValidatorTest,SftpValidatorIntegrationTest test
PowerShell · vollständiger Clean-Build
mvnw.cmd -B clean package

🟢 Grün heißt hier: reproduzierbar

Der vollständige Build endet in dieser Iteration mit 86 Tests, 0 Fehlern und 2 erwarteten Skips. Die Skips betreffen weiterhin bestehende Windows-Fälle für symbolische Links, wenn die lokale Berechtigung fehlt. Der Package-Schritt erzeugt anschließend das ausführbare JAR.

Bewusste Grenzen

  • kein „neueste Datei gewinnt“ und keine Auswahl nach Serverreihenfolge;
  • genau eine Primärdatei und optional genau eine Begleitdatei je korrelierter Lieferung;
  • beide Dateien verwenden aktuell dasselbe Content-Profil;
  • keine Passwort-Authentifizierung, kein SSH-Agent und keine automatische OpenSSH-Konfiguration;
  • keine fachlichen Cross-File-Regeln und kein dauerhafter Directory-Watcher.

Diese Grenzen sind Teil des Vertrags. Sie verhindern, dass aus einem nachvollziehbaren Qualitätstest unbemerkt ein allgemeiner SFTP-Orchestrator wird. Die nächste fachliche Erweiterung kann deshalb gezielt entscheiden, wie unterschiedliche Formate und echte Cross-File-Regeln modelliert werden sollen.

Fazit: Eine Lieferung braucht einen Lebenszyklus

Ein SFTP-Test ist belastbarer, wenn er nicht nur den Inhalt einer Datei prüft, sondern die Lieferung als Ganzes erkennt. Korrelation beantwortet die Frage „Welche Dateien gehören zusammen?“. Der Claim beantwortet „Wer prüft sie gerade?“. Archiv und Quarantäne beantworten „Was ist danach passiert?“.

Der neue Meilenstein bleibt bewusst klein: eindeutige Auswahl, gemeinsame Liefer-ID, sicherer Wiederanlauf, stabiler Prüfpfad und maschinenlesbarer Lifecycle-Bericht. Damit entsteht ein praktischer Baustein für CI/CD, ohne die Unsicherheit eines impliziten „latest file“-Workflows.

Die Project-Page hält die Gesamtentwicklung fest; die veröffentlichten Artikel 1 bis 4 bleiben die Einstiegspunkte für die einzelnen Adapter.

Code und Quellen

Technischer und redaktioneller Stand: 29. September 2026. Die Verzeichnisauswahl und der neue Lifecycle aus Iteration 5 + 6 sind in diesem Meilenstein zusammengefasst; ein separater Iteration-5-Artikel ist nicht veröffentlicht.

Transparenzhinweis


Transparenzhinweis:
Die Inhalte auf tiny-tool.de werden sorgfältig recherchiert, redaktionell geprüft und regelmäßig aktualisiert. Quellen und Zitate werden möglichst nachvollziehbar angegeben. Dennoch übernehmen wir keine Garantie für Richtigkeit, Vollständigkeit oder Aktualität der bereitgestellten Informationen. Irrtümer sind nicht ausgeschlossen.

Redaktion und Einsatz von KI: Bei der Erstellung von Inhalten können digitale Werkzeuge – darunter auch KI-basierte Assistenzsysteme – unterstützend eingesetzt werden, etwa bei Recherche, Strukturierung, sprachlicher Überarbeitung, Übersetzung, Codeanalyse oder visueller Gestaltung. Veröffentlichte Inhalte werden redaktionell geprüft, bearbeitet und von Guido Zeuner freigegeben. Auswahl, Einordnung und Veröffentlichung liegen beim Menschen. KI-Ausgaben gelten nicht als eigenständige Quellen. KI-Systeme sind keine verantwortlichen Autoren oder Redakteure. Weitere Informationen zu Texten, Bildern, Videos und digitalen Personas findest du auf unserer Seite Transparenz beim Einsatz von Künstlicher Intelligenz.

Reichweitenmessung (VG WORT / METIS): Zur Ermittlung der Reichweite einzelner Texte können Zählmarken der VG WORT eingesetzt werden. Im Rahmen der METIS-Zugriffszählung kann eine Client-ID gebildet und ein sogenanntes „METIS Session Cookie“ gesetzt werden. Die Messung dient der statistischen Ermittlung von Textzugriffen und als Grundlage für mögliche Ausschüttungen der VG WORT. Nach Angaben der VG WORT werden dabei keine personenbezogenen Nutzungsprofile erstellt; die Messung dient nicht der Werbung oder dem Marketing-Tracking. Weitere Informationen findest du in unseren Datenschutzhinweisen.

Bitte beachte: Die Inhalte dienen ausschließlich der allgemeinen Information und stellen keine fachliche Beratung dar, insbesondere keine rechtliche, steuerliche, medizinische, technische oder finanzielle Beratung. Die Nutzung der Inhalte erfolgt auf eigene Verantwortung.

Werbung und Affiliate-Links: Einige Beiträge können werbliche Hinweise oder sogenannte Affiliate-Links enthalten. Diese werden entsprechend gekennzeichnet. Beim Klick entstehen dir keine zusätzlichen Kosten; wir erhalten gegebenenfalls eine kleine Provision.

Markenrechtlicher Hinweis: Alle Markennamen, Logos und Produktbezeichnungen sind Eigentum der jeweiligen Rechteinhaber und werden ausschließlich zur Identifikation und Beschreibung verwendet. Eine Verbindung zu den genannten Unternehmen besteht nur, wenn dies ausdrücklich angegeben wird.

Externe Links: Diese Website enthält Verweise auf externe Websites Dritter. Trotz sorgfältiger Prüfung übernehmen wir keine Verantwortung für deren Inhalte. Bei Bekanntwerden rechtswidriger Inhalte werden entsprechende Links geprüft und gegebenenfalls entfernt.