Wiki
QuoteNode Architektur
Technischer Überblick über die Systemarchitektur von QuoteNode — Backend, Frontend, Datenbank und Deployment-Modell.
QuoteNode Architektur
QuoteNode ist eine Single-Tenant-Anwendung für self-hosted Deployments. Jede Instanz ist isoliert und besitzt ihre eigene Datenbank, ihren eigenen Dateispeicher und ihre eigenen Anwendungsprozesse.
Systemüberblick
Client-Browser
│
▼
Caddy (Reverse Proxy, HTTPS)
│
├── /api/* → Spring Boot Backend (Java 25)
├── /offer/* → Spring Boot Backend (öffentliche Angebotsseiten)
└── /* → Vue 3 Frontend (Vite, SPA)
│
▼
PostgreSQL 16
Backend
Das Backend ist eine Java-25-Anwendung auf Basis von Spring Boot 4. Es übernimmt:
- REST API — die gesamte Geschäftslogik über versionierte Endpoints
- Authentifizierung — sessionsbasiert mit verschlüsselten Cookies und 2FA (TOTP)
- Autorisierung — rollenbasierte Zugriffskontrolle mit Prüfung pro Endpoint
- Datenbankzugriff — Spring Data JPA und Flyway-Migrationen
- PDF-Erzeugung — Thymeleaf-Templates, die zu HTML gerendert und über Gotenberg in PDF umgewandelt werden
- E-Mail — asynchrone SMTP-Integration mit Retry und Logging
- Öffentliche Angebotsseiten — serverseitig gerendertes HTML für kundenorientierte Angebotslinks
- Audit Logging — append-only Nachverfolgung aller Mutationen
- Scheduling — Hintergrundjobs für Angebotsablauf, IP-Anonymisierung und Benachrichtigungs-Digests
Wichtige Designentscheidungen:
- Kein Multi-Tenancy — die Anwendung bedient genau eine Organisation. Das eliminiert Komplexität in der Mandantentrennung und vereinfacht Sicherheitsargumentation.
- Flyway-Migrationen — Schemaänderungen sind ausschließlich additiv. Spalten werden nicht entfernt, sondern mit dem Präfix
deprecated_umbenannt. - Unveränderliche Snapshots — Angebotsdaten werden beim Versand als JSON-Snapshot eingefroren. PDFs werden immer aus Snapshots und nie aus Live-Daten gerendert.
- Deterministische Preislogik — alle Berechnungen folgen einer festen Reihenfolge mit konfigurierbaren Rundungen. Ergebnisse werden zu Audit-Zwecken gespeichert.
Frontend
Das Frontend ist eine Vue-3-Single-Page-Application, gebaut mit Vite:
- UI-Framework — PrimeVue 4
- Styling — Tailwind CSS 4
- State — Pinia-3-Stores
- Routing — Vue Router 5 mit rollenbasierten Guards
- i18n — vue-i18n mit aktivem Support fuer Englisch, Polnisch, Deutsch, Franzoesisch, Spanisch, Italienisch und Portugiesisch
- API-Client — ein typisierter HTTP-Client für das Backend-REST-API
Das Frontend wird als statisches Asset-Bundle über Caddy ausgeliefert. Es kommuniziert mit dem Backend ausschließlich über die REST-Schnittstelle.
Datenbank
PostgreSQL 16 ist die einzige unterstützte Datenbank:
- Schema-Management — Flyway-Migrationen, automatisch beim Start des Backends ausgeführt
- Zentrale Entitäten — customers, contacts, offers, offer items, products, pricing rules, users, audit logs, notifications
- Denormalisierung — Angebotsgesamtsummen werden in einer separaten Tabelle für schnelle Queries gespeichert
- Views — eine Pipeline-View für Angebote mit lateral join auf die neuesten FX-Kurse
PDF-Erzeugung
Die PDF-Erzeugung folgt einer zweistufigen Pipeline:
- Thymeleaf rendert den Angebots-Snapshot zu einem HTML-Dokument mit inline CSS
- Gotenberg wandelt dieses HTML in ein druckfähiges PDF um
Unterstützt werden zwei Modi:
- Synchron — für Angebote mit weniger als 50 Positionen, typischerweise unter 3 Sekunden
- Asynchron — für große Angebote, die über einen Hintergrund-Worker abgearbeitet werden
Deployment
QuoteNode wird über Docker Compose bereitgestellt:
- Backend-Container — Java 25 (Eclipse Temurin)
- Frontend-Container — Node 24 + Vite-Dev-Server in Development oder statischer Build in Produktion
- Datenbank-Container — PostgreSQL 16
- Reverse Proxy — Caddy 2 mit automatischem HTTPS
- PDF-Engine — Gotenberg
- Mail-Testing — Mailpit nur in Entwicklungsumgebungen
Der gesamte Stack läuft als ein Docker-Compose-Projekt ohne externe Service-Abhängigkeiten. Auch air-gapped Umgebungen sind möglich.
Lizenzierung
Lizenzen sind mit Ed25519 signierte Dateien, die offline verifiziert werden. Das System prüft:
- Edition (Free, Pro, Business, Enterprise)
- maximale Benutzeranzahl
- Ablaufdatum
- Feature-Flags wie White-Label und Advanced Templates
Es wird kein externer Lizenzserver kontaktiert. Abgelaufene Lizenzen deaktivieren keine Funktion — die einzige Auswirkung ist ein “Powered by QuoteNode”-Badge auf kundenorientierten Flächen und eine Verlängerungserinnerung in der UI.