Installation
Auf einem Windows LAN-Server installieren
QuoteNode mit Docker Desktop auf einem Windows-PC innerhalb eines Büronetzwerks ausführen.
Auf einem Windows LAN-Server installieren
Verwenden Sie diesen Pfad, wenn ein Windows-PC im Büro QuoteNode für Benutzer im selben lokalen Netzwerk hosten soll.
Wann Sie diesen Pfad verwenden
- Das Vertriebsteam arbeitet innerhalb eines Büro-LANs.
- Kunden müssen keine Angebotslinks aus dem öffentlichen Internet öffnen.
- Sie möchten eine interne Beta ohne Verwaltung einer öffentlichen VPS.
Was nicht funktionieren wird
- Öffentliche Angebots- und Benachrichtigungslinks funktionieren nur für Geräte im selben LAN oder VPN. Externe Kunden können eine private LAN-Adresse nicht öffnen.
- E-Mail-Nachrichten können gesendet werden, wenn SMTP konfiguriert ist, aber Links darin verweisen weiterhin auf die LAN-URL.
- Windows-Schlafmodus, Neustarts oder Docker Desktop-Updates können den Dienst unterbrechen.
Voraussetzungen
- Docker Desktop mit aktiviertem Compose v2.
- Eine stabile LAN-IP-Adresse oder DHCP-Reservierung für den Windows-Host.
- Mindestens 2 GB RAM verfügbar und 10 GB freier Festplattenspeicher.
- Regelmäßiger Backup-Speicherort außerhalb des Docker-Volumes.
Überprüfen Sie in PowerShell oder Eingabeaufforderung:
docker --version # Should show 24.0+
docker compose version # Should show v2.x
Schritt 1 — Projektverzeichnis erstellen
mkdir quotenode
cd quotenode
Schritt 2 — Konfigurationsdatei erstellen
Erstellen Sie eine Datei namens .env im Projektverzeichnis. Ersetzen Sie 192.168.1.50 durch die tatsächliche IP des Windows-Hosts (oder einem internen DNS-Namen wie 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
# Die Client-IP wird hinter internen Proxys und CDNs (auch Cloudflare) automatisch erkannt — leer lassen.
# Nur für ein ungewöhnliches Proxy setzen, dessen Transport-Peer eine ÖFFENTLICHE Adresse ist (IP/CIDR oder Hostname).
SECURITY_TRUSTED_PROXIES=
# Application
LOG_LEVEL=INFO
SPRING_PROFILES_ACTIVE=prod
Speichern Sie Ihre
.env-Datei sofort. Verwahren Sie eine Kopie außerhalb dieses PCs. Wenn SieDB_ENCRYPTION_KEYverlieren, werden verschlüsselte Felder dauerhaft unlesbar.
Schritt 3 — Docker-Compose-Datei erstellen
Erstellen Sie eine Datei namens 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:
Schritt 4 — QuoteNode starten
docker compose up -d
Docker lädt die Container-Images beim ersten Start herunter. Beobachten Sie den Startvorgang:
docker compose logs -f backend
Warten Sie, bis Sie Started QuoteNodeApplication sehen.
Schritt 5 — QuoteNode öffnen
Navigieren Sie zu http://192.168.1.50 (oder Ihrer PC-Adresse) von einem beliebigen Gerät im LAN.
Standard-Anmeldedaten:
| Feld | Wert |
|---|---|
[email protected] | |
| Passwort | Admin123! |
Ändern Sie das Standardpasswort sofort nach dem Einloggen.
Windows-Firewall
- Erlauben Sie eingehendes TCP auf Port 80 für HTTP-Zugriff aus dem LAN.
- Erlauben Sie eingehendes TCP auf Port 443 nur, wenn Sie HTTPS konfigurieren.
- Stellen Sie PostgreSQL nicht dem LAN aus, es sei denn, Sie haben einen spezifischen Admin-Bedarf.
- Halten Sie Docker Desktop unter einem Konto und einer Startrichtlinie, die für Ihr Büro angemessen sind.
Was läuft gerade?
| Container | Aufgabe | RAM-Verbrauch |
|---|---|---|
postgres | Speichert alle Ihre Daten | ~256 MB |
backend | Java-API-Server, Geschäftslogik | ~512 MB – 1,5 GB |
gotenberg | Konvertiert HTML zu PDF (Chromium-basiert) | ~200 MB |
frontend | Stellt die Web-UI bereit + Reverse Proxy | ~20 MB |
Gesamt: ungefähr 1,5 – 2,5 GB RAM.
Häufige Befehle
# 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
Secrets sicher aufbewahren
| Secret | Was es schützt | Bei Verlust |
|---|---|---|
DB_PASSWORD | Datenbankzugang | Wiederherstellbar — über PostgreSQL-Admintool zurücksetzen |
DB_ENCRYPTION_KEY | MFA-Codes, SMTP-Passwort, FX-API-Schlüssel, PII-Felder | Dauerhaft unlesbar |
TIMING_TOKEN_SECRET | Anti-Timing-Angriff-Tokens | Neu generieren — Benutzer authentifizieren sich neu |
PUBLIC_LINK_PASSWORD_SESSION_SECRET | Sitzungen für öffentliche Links | Neu generieren — aktive Sitzungen laufen ab |
Das kritische Secret ist
DB_ENCRYPTION_KEY. Verwahren Sie.env-Backups außerhalb dieses PCs. Weitere Wiederherstellungsschritte finden Sie unter Installations-Fehlerbehebung.
Empfohlene nächste Schritte
- Konfigurieren Sie Backups und testen Sie eine Wiederherstellung.
- Verwenden Sie Installations-Fehlerbehebung bei CORS- oder Link-Problemen.
- Wechseln Sie zu Ubuntu-Oeffentlichserver oder Coolify, bevor Sie öffentliche Links an externe Kunden senden.