Installation
Installare su un server Windows LAN
Esegui QuoteNode con Docker Desktop su un PC Windows all'interno di una rete aziendale.
Installare su un server Windows LAN
Usa questo percorso quando un PC Windows in ufficio deve ospitare QuoteNode per gli utenti sulla stessa rete locale.
Quando usarlo
- Il team vendite lavora all’interno di una sola LAN aziendale.
- I clienti non devono aprire i link delle offerte da internet pubblico.
- Vuoi una beta interna senza gestire un VPS pubblico.
Cosa non funzionerà
- I link pubblici delle offerte e di notifica funzioneranno solo per i dispositivi sulla stessa LAN o VPN. I clienti esterni non possono aprire un indirizzo LAN privato.
- I messaggi email possono essere inviati se SMTP è configurato, ma i link al loro interno puntano comunque all’URL LAN.
- La sospensione di Windows, i riavvii o gli aggiornamenti di Docker Desktop possono interrompere il servizio.
Prerequisiti
- Docker Desktop con Compose v2 abilitato.
- Un indirizzo IP LAN stabile o una prenotazione DHCP per l’host Windows.
- Almeno 2 GB di RAM disponibili e 10 GB di spazio libero su disco.
- Posizione di backup regolare al di fuori del volume Docker.
Controlla in PowerShell o nel Prompt dei comandi:
docker --version # Should show 24.0+
docker compose version # Should show v2.x
Passo 1 — Creare una directory di progetto
mkdir quotenode
cd quotenode
Passo 2 — Creare il file di configurazione
Crea un file chiamato .env nella directory di progetto. Sostituisci 192.168.1.50 con l’IP reale dell’host Windows (o un nome DNS interno come 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 del client viene rilevato automaticamente dietro proxy interni e CDN (incluso Cloudflare) — lascia vuoto.
# Imposta solo per un proxy insolito il cui peer di trasporto è un indirizzo PUBBLICO da considerare attendibile (IP/CIDR o hostname).
SECURITY_TRUSTED_PROXIES=
# Application
LOG_LEVEL=INFO
SPRING_PROFILES_ACTIVE=prod
Salva il tuo file
.envimmediatamente. Conserva una copia al di fuori di questo PC. Se perdiDB_ENCRYPTION_KEY, i campi cifrati diventano permanentemente illeggibili.
Passo 3 — Creare il file Docker Compose
Crea un file chiamato 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:
Passo 4 — Avviare QuoteNode
docker compose up -d
Docker scaricherà le immagini al primo avvio. Monitora il lancio:
docker compose logs -f backend
Attendi di vedere Started QuoteNodeApplication.
Passo 5 — Aprire QuoteNode
Naviga su http://192.168.1.50 (o l’indirizzo del tuo PC) da qualsiasi dispositivo sulla LAN.
Credenziali di accesso predefinite:
| Campo | Valore |
|---|---|
[email protected] | |
| Password | Admin123! |
Cambia la password predefinita immediatamente dopo aver effettuato l’accesso.
Firewall Windows
- Consenti TCP in entrata sulla porta 80 per l’accesso HTTP dalla LAN.
- Consenti TCP in entrata sulla porta 443 solo se configuri HTTPS.
- Non esporre PostgreSQL alla LAN a meno che tu non abbia un’esigenza amministrativa specifica.
- Tieni Docker Desktop in esecuzione sotto un account e una policy di avvio appropriati per il tuo ufficio.
Cosa è in esecuzione?
| Container | Cosa fa | Utilizzo RAM |
|---|---|---|
postgres | Archivia tutti i tuoi dati | ~256 MB |
backend | Server API Java, logica di business | ~512 MB – 1,5 GB |
gotenberg | Converte HTML in PDF (basato su Chromium) | ~200 MB |
frontend | Serve l’interfaccia web + reverse proxy | ~20 MB |
Totale: circa 1,5 – 2,5 GB di RAM.
Comandi comuni
# 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
Mantenere al sicuro i tuoi segreti
| Segreto | Cosa protegge | Se perso |
|---|---|---|
DB_PASSWORD | Accesso al database | Recuperabile — reimposta tramite strumenti di amministrazione PostgreSQL |
DB_ENCRYPTION_KEY | Codici MFA, password SMTP, chiave API FX, campi PII | Permanentemente illeggibile |
TIMING_TOKEN_SECRET | Token anti-timing-attack | Rigenera — gli utenti si ri-autenticano |
PUBLIC_LINK_PASSWORD_SESSION_SECRET | Sessioni dei link pubblici | Rigenera — le sessioni attive scadono |
Il segreto critico è
DB_ENCRYPTION_KEY. Conserva backup di.enval di fuori di questo PC. Vedi Risoluzione problemi installazione per i passaggi di ripristino.
Passi successivi consigliati
- Configura i backup e testa un restore.
- Usa Risoluzione problemi installazione per problemi CORS o di link.
- Passa a Server pubblico Ubuntu o Coolify prima di inviare link pubblici a clienti esterni.