Zum Inhalt springen
Q
QuoteNode

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:

  1. Thymeleaf rendert den Angebots-Snapshot zu einem HTML-Dokument mit inline CSS
  2. 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.

Last reviewed: Recently