Installation
Installer sur un serveur LAN Windows
Exécuter QuoteNode avec Docker Desktop sur un PC Windows au sein d'un réseau de bureau.
Installer sur un serveur LAN Windows
Utilisez ce chemin quand un PC Windows au bureau doit héberger QuoteNode pour les utilisateurs sur le même réseau local.
Quand l’utiliser
- L’équipe commerciale travaille dans un seul LAN de bureau.
- Les clients n’ont pas besoin d’ouvrir les liens d’offre depuis internet public.
- Vous voulez une beta interne sans gérer de VPS public.
Ce qui ne fonctionnera pas
- Les liens publics d’offre et de notification fonctionneront uniquement pour les appareils sur le même LAN ou VPN. Les clients externes ne peuvent pas ouvrir une adresse LAN privée.
- Les messages email peuvent être envoyés si SMTP est configuré, mais les liens à l’intérieur pointent toujours vers l’URL LAN.
- Les veilles, redémarrages ou mises à jour de Docker Desktop peuvent interrompre le service.
Prérequis
- Docker Desktop avec Compose v2 activé.
- Une adresse IP LAN stable ou une réservation DHCP pour l’hôte Windows.
- Au moins 2 Go de RAM disponibles et 10 Go d’espace disque libre.
- Emplacement de sauvegarde régulier en dehors du volume Docker.
Vérifiez dans PowerShell ou l’invite de commandes :
docker --version # Should show 24.0+
docker compose version # Should show v2.x
Étape 1 — Créer un répertoire de projet
mkdir quotenode
cd quotenode
Étape 2 — Créer le fichier de configuration
Créez un fichier nommé .env dans le répertoire de projet. Remplacez 192.168.1.50 par l’IP réelle de l’hôte Windows (ou un nom DNS interne comme quotenode.local) :
# Database
DB_URL=jdbc:postgresql://postgres:5432/quotenode
DB_USERNAME=quotenode
DB_PASSWORD=change-me-to-something-random-32-chars
DB_NAME=quotenode
# ============================================================
# SECURITY SECRETS — UNIQUE to this installation.
# SAVE THIS FILE and keep a secure backup.
# ============================================================
DB_ENCRYPTION_KEY=0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
TIMING_TOKEN_SECRET=change-me-timing-secret-min-32-chars
PUBLIC_LINK_PASSWORD_SESSION_SECRET=change-me-session-secret-min-32
# LAN URL — replace with your PC's IP or internal DNS name
CORS_ALLOWED_ORIGINS=http://192.168.1.50
DOMAIN=192.168.1.50
# L'IP du client est détectée automatiquement derrière des proxys internes et des CDN (Cloudflare inclus) — laisser vide.
# À définir uniquement pour un proxy inhabituel dont le pair de transport est une adresse PUBLIQUE à approuver (IP/CIDR ou nom d'hôte).
SECURITY_TRUSTED_PROXIES=
# Application
LOG_LEVEL=INFO
SPRING_PROFILES_ACTIVE=prod
Sauvegardez votre fichier
.envimmédiatement. Conservez une copie en dehors de ce PC. Si vous perdezDB_ENCRYPTION_KEY, les champs chiffrés deviennent définitivement illisibles.
Étape 3 — Créer le fichier Docker Compose
Créez un fichier nommé docker-compose.yml :
services:
postgres:
image: postgres:18-alpine
cpus: 4.0
mem_limit: 512m
environment:
POSTGRES_DB: ${DB_NAME}
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_PASSWORD: ${DB_PASSWORD}
PGDATA: /var/lib/postgresql/data # required for the postgres:18 image
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_USERNAME}"]
interval: 10s
timeout: 5s
retries: 10
restart: unless-stopped
gotenberg:
image: gotenberg/gotenberg:8
cpus: 2.0
mem_limit: 448m
environment:
LOG_LEVEL: info
healthcheck:
test: ["CMD", "curl", "-fsS", "http://localhost:3000/health"]
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
backend:
image: ghcr.io/lesisty7/quotenode/quotenode-api:latest
cpus: 4.0
mem_limit: 1792m
depends_on:
postgres: { condition: service_healthy }
gotenberg: { condition: service_healthy }
env_file: .env
environment:
SPRING_PROFILES_ACTIVE: prod
JOBS_MODE: web
PDF_ENABLED: "true"
PDF_GOTENBERG_URL: http://gotenberg:3000
volumes:
- backend_uploads:/app/data/uploads
- backend_pdfs:/app/data/pdfs
healthcheck:
test: ["CMD", "curl", "-fsS", "http://localhost:8080/health"]
interval: 15s
timeout: 10s
retries: 5
start_period: 45s
restart: unless-stopped
frontend:
image: ghcr.io/lesisty7/quotenode/quotenode-frontend:latest
cpus: 2.0
mem_limit: 192m
depends_on:
backend: { condition: service_healthy }
ports:
- "80:80"
- "443:443"
healthcheck:
test: ["CMD", "curl", "-fsS", "http://localhost:80/"]
interval: 15s
timeout: 5s
retries: 3
restart: unless-stopped
volumes:
postgres_data:
backend_uploads:
backend_pdfs:
Étape 4 — Démarrer QuoteNode
docker compose up -d
Docker téléchargera les images au premier lancement. Suivez le démarrage :
docker compose logs -f backend
Attendez de voir Started QuoteNodeApplication.
Étape 5 — Ouvrir QuoteNode
Naviguez vers http://192.168.1.50 (ou l’adresse de votre PC) depuis n’importe quel appareil sur le LAN.
Identifiants de connexion par défaut :
| Champ | Valeur |
|---|---|
[email protected] | |
| Mot de passe | Admin123! |
Changez le mot de passe par défaut immédiatement après la connexion.
Pare-feu Windows
- Autorisez le TCP entrant sur le port 80 pour l’accès HTTP depuis le LAN.
- Autorisez le TCP entrant sur le port 443 uniquement si vous configurez le HTTPS.
- N’exposez pas PostgreSQL au LAN sauf si vous avez un besoin admin spécifique.
- Gardez Docker Desktop en cours d’exécution sous un compte et une politique de démarrage appropriés pour votre bureau.
Qu’est-ce qui tourne ?
| Conteneur | Rôle | Utilisation RAM |
|---|---|---|
postgres | Stocke toutes vos données | ~256 Mo |
backend | Serveur API Java, logique métier | ~512 Mo – 1,5 Go |
gotenberg | Convertit HTML en PDF (basé sur Chromium) | ~200 Mo |
frontend | Sert l’interface web + reverse proxy | ~20 Mo |
Total : environ 1,5 – 2,5 Go de RAM.
Commandes courantes
# Check service status
docker compose ps
# View logs
docker compose logs -f backend
# Stop QuoteNode
docker compose down
# Update to the latest version
docker compose pull && docker compose up -d
Sécuriser vos secrets
| Secret | Ce qu’il protège | En cas de perte |
|---|---|---|
DB_PASSWORD | Accès à la base de données | Récupérable — réinitialiser via les outils admin PostgreSQL |
DB_ENCRYPTION_KEY | Codes MFA, mot de passe SMTP, clé API FX, champs PII | Définitivement illisible |
TIMING_TOKEN_SECRET | Tokens anti-timing-attack | Régénérer — les utilisateurs se ré-authentifient |
PUBLIC_LINK_PASSWORD_SESSION_SECRET | Sessions de liens publics | Régénérer — les sessions actives expirent |
Le secret critique est
DB_ENCRYPTION_KEY. Stockez des sauvegardes de.enven dehors de ce PC. Voir Résolution de problèmes d’installation pour les étapes de récupération.
Étapes suivantes recommandées
- Configurez des sauvegardes et testez une restauration.
- Utilisez Résolution de problèmes d’installation pour les problèmes CORS ou de liens.
- Passez à Serveur public Ubuntu ou Coolify avant d’envoyer des liens publics à des clients externes.