Das Fundament

Gebaut für
Produktion.
Nicht für Demos.

Wasabi Works ist kein Monolith verkleidet als Microservices. Jedes Modul ist unabhängig — deshalb macht eine neue Anforderung nichts kaputt, deshalb vergisst das System keine Nuance, deshalb ist ein schneller Go-Live statt monatelangem Beraterprojekt kein Versprechen, sondern Realität.

SYSTEM-ARCHITEKTUR · WASABI WORKS MES · Quarkus + NATS + Angular
UI
Angular 21 Frontend
Nx Monorepo · 9 Modul-Apps · Standalone Components
Terminal / BDE Kiosk
PWA · Offline-fähig · Badge-Scan
Shopfloor Display
TV-optimiert · Kein Login · Auto-Refresh
↓ REST / OIDC
EDGE
Edge Service
Quarkus · Protokoll-Bridge · Event-Enrichment
NATS Edge Node
Leaf Node · Enriched-Stream · Offline-Puffer
ERP Connector
Bulk-Import REST · Outbox → SAP/Infor/Custom
↓ NATS JetStream · Hub-Spoke
BUS
NATS JetStream · 6 Streams
PX_BDE · PX_ORDER · PX_PLANNING · PX_PEP · PX_FLOW · PX_MASTERDATA
Durable Consumers At-least-once Dedup via Processed Events Transactional Outbox
↓ Events · Service-to-Service
SERVICES
ESTS Service
BDE Core · :8081
Order Service
Aufträge · :8082
Planning / APS
Timefold · :8083
Reporting
KPI Engine · :8089
PEP
Personalplanung · :8085
Flow / QS
Flowable · :8086
Masterdata
Stammdaten · :8087
Management
Admin · :8088
↓ JDBC / reactive PgPool
INFRA
PostgreSQL 16
1 DB · schema-getrennt · max_connections 300
InfluxDB 2.7
machine_state · machine_throughput · Grafana
Redis 7
Session · OEE Cache · Gantt Cache · Pub/Sub
Authentik OIDC
8 MES-Rollen · JWT · CORS Proxy
Jäger
OTLP · Distributed Tracing · Badger-Backend
Elastic + Kibana
Filebeat · Log Aggregation · 8.12
Prometheus + Grafana
Metrics · Dashboards · 30d Retention
8
unabhängige Module
0
direkte Service-Abhängigkeiten
0
verlorene Events — by design
100%
Open-Source Stack — volle Transparenz

Jedes Modul – eine Mission

Kein Modul ruft ein anderes direkt auf. Jede Kommunikation läuft über Events. Das bedeutet: neue Funktionen kommen hinzu, ohne dass bestehende brechen — und jedes Modul kann einzeln weiterentwickelt werden.

ESTS Service :8081

Die BDE-Kernmaschine. Nimmt rohe Terminal-Events entgegen, löst Konflikte bi-temporal auf, berechnet Zeitscheiben (Slices) und materialisiert BookingFacts für ERP-Export. Event-Sourced, append-only.

Bi-temporal Conflict Resolution BookingFacts ERP Export (Clear-on-ACK) DST-safe UTC
📋 Order Service :8082

Verwaltet Produktionsaufträge, Kundenaufträge und Projekte mit vollständigem Lifecycle (DRAFT → RELEASED → IN_PROGRESS → DONE). Nimmt Mengen und Status-Updates aus ESTS via Events entgegen. ERP-Bulk-Import via REST.

Status-Machine Op-Dependencies (FS/FF/SS) ERP-Import REST Optimistic Locking
🧮 Planning / APS :8083

Advanced Planning & Scheduling auf Basis von Timefold Solver 1.31. 18 Constraints (10 Hard, 2 Medium, 6 Soft). Optimiert Reihenfolge, Ressourcenzuteilung und Startzeiten auf 15-Minuten-Raster. Gantt via Redis Cache.

Timefold 1.31.0 18 Constraints Rüstoptimierung Frozen Zone Gantt WebSocket
📊 Reporting Service :8089

CQRS Read-Side. Konsumiert Events aller 6 anderen Services via durable NATS Consumer, materialisiert 14 Faktentabellen (rpt_*), berechnet OEE/MTBF/MTTR/Termintreue on-read mit Redis Cache. Schreibt Zeitreihen in InfluxDB für Grafana.

6 Durable Consumer 12 Materializer 14 Faktentabellen InfluxDB Zeitreihen Redis OEE Cache (60s)
👥 PEP Service :8085

Personalplanung (PEP): Schichtkalender, Wochenplanung, Qualifikationszuordnung. Der integrierte ArbZG-Validator prüft Ruhezeiten und Höchstarbeitszeiten. Timefold-Solver für automatische Optimierung.

Schichtkalender ArbZG-Validator Qualifikationsmatrix Solver-Integration
🔄 Flow / QS Service :8086

BPMN-basierte Qualitätssicherung und Arbeitsanweisungen via Flowable 7.1. Prüfpläne werden als BPMN-Prozesse definiert, versioniert und am Terminal ausgeführt. Fotos, Messwerte, Checklisten – alles in einem Schritt.

Flowable 7.1 BPMN Prüfplan-Versionierung 6 Bausteintypen Audit-Trail
🗄 Masterdata Service :8087

Stammdatenverwaltung für Artikel, Maschinen, Arbeitspläne, Störgrundkatalog und Werker. Alle Änderungen werden als Events auf PX_MASTERDATA publiziert – alle anderen Services halten ihre eigene Read-Kopie.

Artikel & SNR Maschinen & Arbeitspläne Störgrundkatalog Event-Sync an alle Services
🔧 Edge Service :8080

Protokoll-Bridge zwischen Maschinenebene und der zentralen Plattform. Empfängt Rohdaten von Terminals, IoT-Sensoren und Maschinenschnittstellen, enriched und normalisiert Events, publiziert in den zentralen NATS Hub.

Quarkus Reactive Flyway + H2 lokal NATS Leaf Node Offline-Puffer Enriched-Stream
🏛 Management Service :8088

Admin-Portal für Systemkonfiguration, Tenant-Verwaltung, Benutzerrollen und Cross-Service-Auswertungen. Aggregiert Kennzahlen aus dem Reporting Service für Executive-Dashboards.

Tenant-Management Rollen-Administration Executive Dashboard System Health

Vom Sensor zum ERP – lückenlos

Wasabi Works verbindet die Produktionsebene (Terminals, Maschinen, IoT) mit der Planungsebene (ERP, APS) — kein Integrationsprojekt, kein manueller Datenabgleich, kein Datenverlust bei Netzwerkausfall.

EDGE / SHOPFLOOR
Wasabi Works Terminal (BDE)
Barcode / Badge-Scanner
IoT-Sensoren / OPC-UA
NATS Edge Node (Leaf)
Enriched-Stream · Offline-Puffer
Edge Service (Quarkus)
NATS Leaf Node
Hub-Spoke Sync
auch offline
PLATFORM / CLOUD / ON-PREM
NATS JetStream Hub (6 Streams)
ESTS Service → BookingFacts
Order Service (ERP-Import REST)
Planning APS (Timefold)
ERP Connector (SAP / Infor / Custom)
BookingFacts Export → ERP (Clear-on-ACK)

ERP → Wasabi Works (INBOUND)

Produktionsaufträge und Arbeitspläne werden via REST Bulk-Import in den Order Service übertragen (/api/v1/import). Idempotenz über externalId-Feld. Masterdata-Sync über separate Endpoints. Kein direkter DB-Zugriff auf ERP-Seite.

REST POST /import Idempotent JSON

Wasabi Works → ERP (OUTBOUND)

Der ESTS Service exportiert BookingFacts (Ist-Zeiten, Mengen, Maschinenstatus) über das Clear-on-ACK Pattern ans ERP. Export läuft idempotent: bei Fehler automatischer Retry, bei Erfolg ACK und Statuswechsel. Kein Datenverlust, kein Duplikat.

BookingFacts Clear-on-ACK Retry-safe

NATS JetStream – das Gedächtnis des Systems

Jeder Fachbereich hat seinen eigenen Event-Stream. Kein Modul schreibt direkt in die Datenbank eines anderen. Jedes Ereignis wird persistent gespeichert — auch wenn ein Dienst kurzzeitig nicht erreichbar ist. Kein Datenverlust, keine manuelle Nacharbeit.

EVENT-FLUSS · Terminal-Buchung bis ERP-Export
📱
Terminal
Badge + Auftrag
Edge NATS
🔌
Edge Service
Enrichment
Hub Sync
📡
NATS Hub
PX_BDE Stream
Durable
ESTS Service
Slicing + Facts
Outbox
📡
NATS Hub
ests.v1.>
Consumer
📊
Reporting
Materializer
+
parallel
🔄
ERP Export
Clear-on-ACK
Stream Subject-Filter Producer Consumer (Services) Retention
PX_BDE ests.v1.> Edge Service → ESTS Reporting, Order, Planning 7 Tage
PX_ORDER order.v1.> Order Service Reporting, Planning, ESTS 7 Tage
PX_PLANNING planning.v1.> Planning Service Reporting, Order 7 Tage
PX_PEP pep.v1.> PEP Service Reporting, Planning 7 Tage
PX_FLOW flow.v1.> Flow Service Reporting, Order 7 Tage
PX_MASTERDATA masterdata.v1.> Masterdata Service Alle Services (Read-Kopie) 7 Tage

Robustheit ist kein Zufall

Drei Muster garantieren, dass kein Event verloren geht, kein Modul seinen Nachbarn zum Ausfall bringt — und neue Anforderungen sicher integriert werden können, ohne bestehende Prozesse zu gefährden.

Transactional Outbox

Jede Datenbankschreiboperation und die dazugehörige Event-Veröffentlichung passieren atomar. Event wird zuerst in die *_outbox-Tabelle geschrieben, dann per Scheduler in NATS publiziert. Kein Event geht verloren, auch wenn NATS kurzzeitig nicht erreichbar ist.

DB TX BEGIN
INSERT INTO ord_orders (...)
INSERT INTO ord_outbox (...) ← gleiche TX
DB TX COMMIT

Scheduler (1s) →
SELECT FROM outbox WHERE published=false
NatsPublisher.publish(event)
UPDATE outbox SET published=true

Consumer Deduplication

NATS liefert at-least-once. Jeder Service-Consumer trackt verarbeitete Event-IDs in einer processed_events-Tabelle. Der Guard-Insert nutzt ON CONFLICT DO NOTHING – bei Duplikat kein Fehler, kein doppeltes Processing. Events sind idempotent verarbeitbar.

ProcessedEventsGuard.tryAcquire(
tenantId, eventId
) →
INSERT INTO processed_events
(tenant_id, event_id)
ON CONFLICT DO NOTHING
RETURNING id

→ null = Duplikat → skip
→ id = Neu → process

Resilience: Circuit Breaker + Fault Tolerance

Der NatsPublisher ist mit SmallRye Fault Tolerance abgesichert: CircuitBreaker öffnet nach N Fehlern, Retry mit Backoff, Timeout-Guard. Ein ausgefallener NATS-Server führt zum Outbox-Buffering, nicht zum Dienst-Ausfall. Alle FT-Annotationen greifen über CDI-Proxy.

@CircuitBreaker(requestVolumeThreshold=5,
failureRatio=0.5,
delay=5, delayUnit=SECONDS)
@Retry(maxRetries=3, delay=200,
delayUnit=MILLIS)
@Timeout(value=5, unit=SECONDS)
public void publish(String subject,
byte[] payload) { ... }

Bi-Temporalität im ESTS (ESTS v1.5)

Der ESTS-Service speichert jeden Event mit zwei Zeitstempeln: occurredAt (wann es in der Realität passiert ist) und recordedAt (wann es im System ankam). Verspätete Korrekturbuchungen werden korrekt in die Vergangenheit eingespielt, ohne Zeitscheiben zu zerstören. DST-Behandlung über UTC-Speicherung + plantTimezone-Auflösung.

SlotKey(tenant, resource,
type, context, bucket)
→ exactly-one-effective per Slot

Conflict Resolution:
precedence = (source, priority,
occurredAt, recordedAt)
→ Loser: effective=false (immutable log)
→ Winner: effective=true → DirtyPeriod

Alles inklusive — offener Stack, on-premise

Der gesamte Stack läuft on-premise oder auf Ihrem Hetzner-Server — als Docker Compose, auf bewährter Open-Source-Technologie. Transparent, wartbar und auf Ihrer Infrastruktur.

🐘
PostgreSQL 16
Haupt-Datenbank. Schema-Trennung pro Service (ord_*, ests_*, rpt_*, ...). Flyway-Migrationen. Reaktiver PgPool-Zugriff.
Limit: 1 GB · max_connections: 300
📡
NATS 2.10 JetStream
Message Backbone. 6 Streams, Durable Consumer, at-least-once Delivery. Leaf-Node für Edge. Persistenz via JetStream-Volumes.
Limit: 128 MB
Redis 7
Session-Cache für Authentik. OEE-Cache (60s TTL). Gantt-Cache für APS. WebSocket Pub/Sub für Live-Updates. Persistent via appendonly.
Limit: 256 MB
🔐
Authentik OIDC
Identity Provider mit 8 MES-Rollen (Admin, Werkleiter, Meister, Schichtleiter, Planer, AV, Werker). JWT-basiert. CORS Proxy via Nginx.
Limit: 768 MB · Port: 9000
📈
InfluxDB 2.7
Zeitreihen-Datenbank für machine_state und machine_throughput. Batch-Write (100 Punkte / 1s Flush). 90 Tage Retention. Grafana-Datasource.
Limit: 512 MB · Port: 8086
🔭
Jäger + OTLP
Distributed Tracing über alle Services. OTLP-Protokoll (gRPC + HTTP). Badger-Backend für persistente Traces. 7 Tage Retention.
Limit: 512 MB · Port: 16686
🔍
Elasticsearch + Kibana
Log-Aggregation via Filebeat → Elasticsearch → Kibana. Strukturierte JSON-Logs aller Services. Zentrale Fehlersuche ohne SSH-Zugriff.
Limit: 1.5 GB ES · 768 MB Kibana
📉
Prometheus + Grafana
Metrics-Scraping aller Quarkus-Services (Micrometer). Grafana-Dashboards für OEE, Service-Latenz, JVM-Metrics. 30 Tage Retention.
Limit: 512 MB je · Port: 3000

Multi-Tenant. Role-based. JWT-gesichert.

Jede API-Anfrage trägt ein JWT mit Tenant-ID und Rollen. Kein Service liefert Daten fremder Mandanten aus – auch nicht bei Implementierungsfehlern.

8 MES-Rollen

Authentik verwaltet 8 vordefinierte Rollen für typische Fertigungsorganisationen. Die Rollenzuordnung erfolgt per Blueprint automatisch beim ersten Start.

ADMIN WERKLEITER MEISTER SCHICHTLEITER PLANER AV WERKER REPORTING_READ

Tenant-Isolation

Jeder Request trägt die Tenant-ID im JWT. Der TenantFilter (JAX-RS, Priority AUTHORIZATION) injiziert den TenantContext. Alle DB-Queries fügen automatisch WHERE tenant_id = ? hinzu.

JWT Tenant-Claim Row-Level Isolation S2S Auth (Service-to-Service)

Fehlerformat: RFC 9457

Alle Services geben Fehler im standardisierten Problem Detail Format zurück (RFC 9457). Jeder Fehlercode folgt dem Schema PX-{SERVICE}-{HTTP}, z.B. PX-RPT-404. Maschinenlesbar, dokumentiert, konsistent.

RFC 9457 ProblemDetail Strukturierte Error Codes Correlation-ID Header

Observability

Jeder Service emittiert OpenTelemetry Traces (Jäger), Prometheus Metrics und strukturierte JSON-Logs (Filebeat → Elasticsearch). Correlation-IDs durchziehen jeden Request von der Antwort bis in die Datenbank.

OTel Tracing Prometheus Metrics JSON Logging MDC Correlation-ID

Jede Komponente. Begründet.

Open Source. Production-proven. Kein Vendor Lock-in. Alle Komponenten können einzeln ausgetauscht werden.

Komponente Technologie Warum
Backend RuntimeQuarkus 3.32.1 · Java 25Sub-100ms Startzeit, reactive-first, native-fähig. Ideal für containerisierte Microservices mit geringem Memory-Footprint.
FrontendAngular 21 · Nx MonorepoTypsicher, component-basiert. Nx ermöglicht Code-Sharing zwischen 9 Modul-Apps ohne Duplikation.
MessagingNATS JetStream 2.10Schnellstes persistentes Messaging-System. Native Leaf-Node-Unterstützung für Edge-Deployment. Einfacher als Kafka, mächtiger als RabbitMQ für diesen Use Case.
DatenbankPostgreSQL 16JSONB für flexible Schemas (Constraints, Capabilities). Reaktiver PgPool für Non-blocking I/O. Schema-Trennung statt Multi-DB für operationale Einfachheit.
APS SolverTimefold 1.31.0OptaPlanner-Nachfolger. HardMediumSoftScore, 18 Constraints. Einziges Open-Source APS-Framework für Java mit Produktionsreife.
Workflow EngineFlowable 7.1 (BPMN 2.0)Prüfpläne und Arbeitsanweisungen als versionierte BPMN-Prozesse. QA-Ingenieure gestalten Flows ohne Code.
IdentityAuthentik 2024.12Self-hosted OIDC. Blueprint-Bootstrapping für Demo-User. Keine externe SaaS-Abhängigkeit für Kundendaten.
ZeitreihenInfluxDB 2.7 + Telegrafmachine_state und machine_throughput als Zeitreihen für Grafana-Dashboards. Batch-Write reduziert DB-Last.
TracingJäger 1.55 + OTLPDistributed Tracing über alle Services. Badger-Backend für persistente Dev-Traces ohne Elasticsearch-Abhängigkeit.
ORM / PersistenceHibernate Reactive PanacheNon-blocking DB-Zugriff auf dem Vert.x EventLoop. Panache reduziert Boilerplate für CRUD-Operationen um ~60%.
MappingMapStruct (CDI)Compile-time Mapping ohne Reflection. Typsicher. Kein Runtime-Overhead. CDI Component Model für Quarkus native-kompatibel.
ResilienceSmallRye Fault Tolerance@CircuitBreaker, @Retry, @Timeout auf NatsPublisher. Verhindert Kaskaden-Ausfälle bei NATS-Unterbrechungen.

Das Fundament steht.
Überzeugen Sie sich selbst.

Wir zeigen Ihnen Wasabi Works live — mit echten Daten, echten Latenzen und echten Szenarien aus Ihrer Fertigung.

Demo anfragen Reporting-Modul ansehen