Skip to content
Q
QuoteNode

Wiki

QuoteNode Architecture

Technical overview of the QuoteNode system architecture — backend, frontend, database, and deployment model.

QuoteNode Architecture

QuoteNode is a single-tenant application designed for self-hosted deployment. Each instance is isolated and contains its own database, file storage, and application processes.

System Overview

Client Browser


Caddy (Reverse Proxy, HTTPS)

     ├── /api/*    → Spring Boot Backend (Java 25)
     ├── /offer/*  → Spring Boot Backend (public offer pages)
     └── /*        → Vue 3 Frontend (Vite, SPA)


                   PostgreSQL 16

Backend

The backend is a Java 25 application built with Spring Boot 4. It handles:

  • REST API — all business logic exposed through versioned endpoints
  • Authentication — session-based with encrypted cookies, 2FA (TOTP)
  • Authorization — role-based access control with per-endpoint checks
  • Database access — Spring Data JPA with Flyway migrations
  • PDF generation — Thymeleaf templates rendered to HTML, converted to PDF via Gotenberg
  • Email — async SMTP integration with retry and logging
  • Public offer pages — server-rendered HTML for client-facing offer links
  • Audit logging — append-only mutation tracking
  • Scheduling — background jobs for offer expiration, IP anonymization, notification digests

Key design decisions:

  • No multi-tenancy — the application serves exactly one organization. This eliminates tenant isolation complexity and simplifies security reasoning.
  • Flyway migrations — schema changes are additive only. Columns are never dropped; they are renamed with a deprecated_ prefix.
  • Immutable snapshots — offer data is captured as a JSON snapshot at send time. PDFs are always rendered from snapshots, never from live data.
  • Deterministic pricing — all calculations follow a defined order with configurable rounding. Results are stored for audit purposes.

Frontend

The frontend is a Vue 3 single-page application built with Vite:

  • UI framework — PrimeVue 4 component library
  • Styling — Tailwind CSS 4
  • State — Pinia 3 stores
  • Routing — Vue Router 5 with role-based route guards
  • i18n — vue-i18n with English and Polish locales
  • API client — typed HTTP client calling the backend REST API

The frontend is served as static assets by Caddy. It communicates with the backend exclusively through the REST API.

Database

PostgreSQL 16 is the only supported database:

  • Schema management — Flyway migrations, auto-run on backend startup
  • Key entities — customers, contacts, offers, offer items, products, pricing rules, users, audit logs, notifications
  • Denormalization — offer totals are stored in a dedicated table for fast querying
  • Views — offer pipeline view with lateral join to latest FX rates

PDF Generation

PDF generation uses a two-stage pipeline:

  1. Thymeleaf renders the offer snapshot into an HTML document with inline CSS
  2. Gotenberg (a Chromium-based container) converts the HTML to a print-ready PDF

Two modes are supported:

  • Synchronous — for offers with fewer than 50 items, PDF is generated inline (< 3 seconds)
  • Asynchronous — for large offers, a background job processes the PDF and notifies the user when ready

Deployment

QuoteNode is deployed using Docker Compose:

  • Backend container — Java 25 (Eclipse Temurin)
  • Frontend container — Node 24 + Vite dev server (development) or static build (production)
  • Database container — PostgreSQL 16
  • Reverse proxy — Caddy 2 with automatic HTTPS
  • PDF engine — Gotenberg
  • Mail testing — Mailpit (development only)

The entire stack runs as a single Docker Compose project with no external service dependencies. It can operate in air-gapped environments.

Licensing

Licenses are Ed25519-signed files verified offline. The system checks:

  • Edition (Free, Pro, Business, Enterprise)
  • Maximum user count
  • Expiration date
  • Feature flags (white-label, advanced templates)

No external license server is contacted. Expired licenses do not disable any functionality — the only effect is a “Powered by QuoteNode” badge on client-facing surfaces and a renewal reminder in the UI.

Last reviewed: Recently