Wiki
Architecture de QuoteNode
Vue d'ensemble technique de l'architecture QuoteNode : backend, frontend, base de donnees et modele de deploiement.
Architecture de QuoteNode
QuoteNode est une application single-tenant concue pour un deploiement self-hosted. Chaque instance est isolee et dispose de sa propre base de donnees, de son propre stockage de fichiers et de ses propres processus applicatifs.
Vue d’ensemble du systeme
Navigateur client
│
▼
Caddy (Reverse Proxy, HTTPS)
│
├── /api/* → Backend Spring Boot (Java 25)
├── /offer/* → Backend Spring Boot (pages d'offres publiques)
└── /* → Frontend Vue 3 (Vite, SPA)
│
▼
PostgreSQL 16
Backend
Le backend est une application Java 25 construite avec Spring Boot 4. Il gere :
- API REST — toute la logique metier exposee via des endpoints versionnes
- Authentification — basee sur des sessions avec cookies chiffres et 2FA (TOTP)
- Autorisation — controle d’acces par role avec verifications par endpoint
- Acces base — Spring Data JPA avec migrations Flyway
- Generation PDF — templates Thymeleaf rendus en HTML puis convertis en PDF via Gotenberg
- Email — integration SMTP asynchrone avec retry et logging
- Pages d’offres publiques — HTML rendu cote serveur pour les liens d’offre client
- Journal d’audit — tracking append-only des mutations
- Scheduling — jobs de fond pour expiration des offres, anonymisation IP et digests de notifications
Decisions de conception importantes :
- Pas de multi-tenant — l’application sert exactement une seule organisation. Cela elimine la complexite d’isolation tenant et simplifie le raisonnement securite.
- Migrations Flyway — les changements de schema sont uniquement additifs. Les colonnes ne sont jamais supprimees ; elles sont renommees avec un prefixe
deprecated_. - Snapshots immuables — les donnees d’offre sont capturees sous forme de snapshot JSON au moment de l’envoi. Les PDF sont toujours rendus a partir de snapshots, jamais a partir de donnees vivantes.
- Tarification deterministe — tous les calculs suivent un ordre defini avec un arrondi configurable. Les resultats sont stockes pour audit.
Frontend
Le frontend est une application single-page Vue 3 construite avec Vite :
- Framework UI — bibliotheque de composants PrimeVue 4
- Styling — Tailwind CSS 4
- Etat — stores Pinia 3
- Routage — Vue Router 5 avec route guards bases sur les roles
- i18n — vue-i18n avec support actif pour l’anglais, le polonais, l’allemand, le francais, l’espagnol, l’italien et le portugais
- Client API — client HTTP type appele contre la REST API backend
Le frontend est servi comme assets statiques par Caddy. Il communique exclusivement avec le backend via l’API REST.
Base de donnees
PostgreSQL 16 est la seule base de donnees prise en charge :
- Gestion du schema — migrations Flyway, lancees automatiquement au demarrage du backend
- Entites clefs — clients, contacts, offres, lignes d’offre, produits, regles de prix, utilisateurs, journaux d’audit, notifications
- Denormalisation — les totaux d’offre sont stockes dans une table dediee pour des requetes rapides
- Vues — vue pipeline d’offre avec lateral join sur les derniers taux FX
Generation PDF
La generation PDF suit un pipeline a deux etapes :
- Thymeleaf rend le snapshot d’offre en document HTML avec CSS inline
- Gotenberg (conteneur base sur Chromium) convertit ce HTML en PDF pret a l’impression
Deux modes sont pris en charge :
- Synchrone — pour les offres avec moins de 50 lignes, le PDF est genere inline (moins de 3 secondes)
- Asynchrone — pour les grosses offres, un job de fond traite le PDF et notifie l’utilisateur une fois pret
Deploiement
QuoteNode est deploye avec Docker Compose :
- Conteneur backend — Java 25 (Eclipse Temurin)
- Conteneur frontend — Node 24 + serveur Vite en developpement ou build statique en production
- Conteneur base — PostgreSQL 16
- Reverse proxy — Caddy 2 avec HTTPS automatique
- Moteur PDF — Gotenberg
- Tests mail — Mailpit (developpement uniquement)
L’ensemble de la stack tourne comme un seul projet Docker Compose sans dependance a des services externes. Elle peut fonctionner dans des environnements air-gapped.
Licences
Les licences sont des fichiers signes avec Ed25519 et verifies hors ligne. Le systeme controle :
- l’edition (Free, Pro, Business, Enterprise),
- le nombre maximal d’utilisateurs,
- la date d’expiration,
- les feature flags (white-label, advanced templates).
Aucun serveur de licence externe n’est contacte. Une licence expiree ne desactive aucune fonctionnalite. Le seul effet visible est l’apparition du badge “Powered by QuoteNode” sur les surfaces visibles par le client et d’un rappel de renouvellement dans l’interface.