Zum Inhalt springen
Marco Middeldorff — Software-Entwickler Köln, Deutschland · Remote oder hybrid Pfad /projekte/erp-system

ERP-System für einen Kunden

Case Study · 4 Abschnitte

Wie ein ERP-System mit einem Workflow-System zusammenarbeitet: Aufträge gehen per API hinaus, fertige Dokumente kommen über einen signierten Webhook zurück, und große Dateien blockieren dabei nichts mehr.

Rolle
Software-Entwickler, Hauptentwickler der Anbindung an das Workflow-System, von Abrechnung, Touren, Frontend und Deployment
Zeitraum
2024 – heute
Stack
Laravel · Vue 3 · Inertia · MySQL · Redis · Docker
Status
Produktiv
01

Ausgangslage

Das ERP-System bildet die Kernprozesse des Kunden ab: Verträge, Touren, Abrechnungsläufe und Angebote. Es läuft als Laravel-Anwendung mit Vue-3-Oberfläche (Inertia), MySQL als Datenbank und Redis für Queues und Cache, in Docker-Containern.

Dokumente wie Rechnungen, Angebote und Tourenpläne entstehen nicht im ERP, sondern in einem Workflow-System. Das ERP stößt die Workflows per API an und bekommt das Ergebnis zurück. Ich bin Hauptentwickler dieser Anbindung und außerdem von Abrechnung, Touren, Frontend und Deployment.

02

Problem

  1. 2.1Große Dateien im Webhook. Beim Sammeldruck der Tourenpläne lieferte das Workflow-System das PDF Base64-kodiert im Webhook. Der Request hing, und der Prozess lief in sein Speicherlimit.
  2. 2.2Kurzlebige API-Zugänge. Das Token des Workflow-Systems gilt nur zwei Minuten. Bei lang laufenden Prozessen wurden Anfragen abgelehnt.
  3. 2.3Manuelle Deployments. Neue Versionen wurden per git pull, composer install, yarn build und migrate direkt auf dem Server eingespielt.
03

Entscheidungen

3.1

Webhook in eine Queue auslagern

Der Webhook-Endpunkt nimmt die Anfrage nur noch entgegen und übergibt die Arbeit an einen Queue-Job (Horizon). Der Request antwortet sofort und hängt nicht mehr, auch wenn die Verarbeitung länger dauert.

3.2

Signierter Webhook

Das Workflow-System signiert jeden Aufruf mit HMAC-SHA256 über Zeitstempel und Inhalt. Das ERP prüft Signatur und Zeitstempel (30 Minuten Toleranz) und lehnt alles andere ab.

3.3

Sammeldruck per URL statt Base64

Statt große Dateien im Webhook zu verschicken, liefert das Workflow-System für den Sammeldruck jetzt eine URL, sobald alle Dokumente erzeugt sind. Der Base64-Weg ist nur noch für ältere Lieferungen im Code, dort liegt das PDF höchstens 15 Minuten im Cache.

3.4

Zugangs-Token zentral verwalten

Das Token liegt zentral im Cache und wird früher verworfen, als es abläuft. Ein Lock sorgt dafür, dass sich nur ein Prozess neu anmeldet. Wird eine Anfrage trotzdem abgelehnt, holt der Client ein frisches Token und wiederholt sie einmal.

ApiClient.phpPHP · vereinfacht
private function authenticateWithLock(): void{    // Nur ein Prozess meldet sich an, die anderen warten    Cache::lock('workflow_token_lock', 15)->block(10, function (): void {        if (! $this->loadTokenFromCache()) {            $this->requestNewToken();        }    });}
Zeilen 4–7: Hat ein anderer Prozess bereits ein Token geholt, wird es aus dem Cache genutzt. Nur wer die Sperre hält, meldet sich neu an.
3.5

Deployment per Image und Pipeline

Statt Updates von Hand auf dem Server einzuspielen, baut die Pipeline bei jeder Änderung ein Docker-Image und löst per Webhook das Deployment aus. Die Container haben getrennte Rollen für Web, Scheduler und Queue-Worker. Als Nächstes zieht das Deployment auf Coolify um.

04

Ergebnis

  1. 4.1Der Webhook antwortet sofort, die Verarbeitung läuft asynchron in der Queue.
  2. 4.2Große Sammeldrucke belasten weder Request noch Speicher, weil keine Dateien mehr im Webhook ankommen.
  3. 4.3Abgelehnte Anfragen werden einmal mit frischem Token wiederholt, statt einen lang laufenden Prozess abzubrechen.
  4. 4.4Deployments sind reproduzierbar: jede Version ist ein Image, ausgerollt per Pipeline.