Installation
Systemressourcen & Tuning
Minimaler und empfohlener RAM/CPU für eine QuoteNode-Bereitstellung, wie Container-Limits funktionieren, wie man sie anpasst und wie man Out-of-Memory-Probleme vermeidet.
Systemressourcen & Tuning
QuoteNode läuft als kleine Gruppe von Docker-Containern. Die Compose-Dateien werden mit Speicherlimits ausgeliefert, die für eine VM mit 4 GB RAM abgestimmt sind, ohne standardmäßige CPU-Begrenzung, und jedes Limit lässt sich über eine Umgebungsvariable überschreiben, sodass Sie den Stack passend für Ihre Maschine dimensionieren können.
Minimum und Empfehlung
| Stufe | Host-RAM | Host-CPU | Hinweise |
|---|---|---|---|
| Minimum | 4 GB | 2 Kerne | Standardprofil. Komfortabel für ein kleines Team (≈10 Benutzer / ≈1 000 Produkte). |
| Empfohlen | 8 GB | 4 Kerne | Spielraum für gleichzeitige Importe/Exporte und PDF-Spitzen. |
| Ausgelastet | 8–16 GB | 4–8 Kerne | ≈100 Benutzer / ≈20 000 Produkte mit parallelen Massenoperationen. |
Der Stack ist im Leerlauf genügsam: in Ruhe verbraucht der gesamte Stack etwa 1,5 GiB RAM, unabhängig davon, wie viele Daten in der Datenbank liegen (es gibt keinen Entity-Cache in der JVM — die Daten liegen in PostgreSQL). RAM skaliert mit der Parallelität von Massenoperationen (Import/Export/PDF), nicht mit der Anzahl der Benutzer oder Datensätze.
Wie Container-Limits funktionieren
mem_limit ist eine harte Obergrenze, keine Reservierung. Ein Container nutzt nur, was er tatsächlich anfasst, bis zum Limit; ein Container, der sein Limit überschreitet, wird per OOM beendet. Ein höheres Limit kostet keinen Speicher — es hebt nur die Sicherheitsgrenze an.
Das Standardprofil summiert sich auf etwa 3 520 MiB an Obergrenzen, was auf einen 4-GB-Host passt und ~575 MiB für das Betriebssystem übrig lässt. Da die reale Leerlaufnutzung weit niedriger ist (~1,5 GiB), sind die Obergrenzen Spielraum für Lastspitzen, nicht der erwartete Verbrauch.
cpus ist ebenfalls eine Obergrenze, aber CPU ist im Leerlauf kostenlos, daher ist standardmäßig keine CPU-Obergrenze gesetzt: Jeder Dienst darf alle Kerne des Hosts nutzen, und ungenutzte CPU kostet nichts. Wenn Sie eine *_CPUS-Obergrenze setzen, bleiben Sie bei oder unter der Kernanzahl des Hosts — Docker verweigert den Start eines Containers, dessen cpus die verfügbaren Kerne übersteigt.
Standard-Limits pro Dienst (4-GB-Profil)
| Dienst | Speicher | CPU | Rolle |
|---|---|---|---|
| backend | 1536m | alle Kerne | API-/Web-Server (JVM-Heap skaliert automatisch auf 70 % davon) |
| postgres | 512m | alle Kerne | Datenbank |
| backup-worker | 832m | alle Kerne | Geplante Backups (pg_dump) |
| gotenberg | 448m | alle Kerne | Chromium-PDF-Rendering |
| frontend | 96m | alle Kerne | Caddy, das den statischen Build ausliefert |
| caddy | 96m | alle Kerne | TLS-/Reverse-Proxy-Ingress — CADDY_MEM_LIMIT bei starkem TLS-Verkehr erhöhen |
RAM anpassen
Jedes Limit ist eine optionale Umgebungsvariable. Setzen Sie sie dort, wo Ihre Installation ihre Einstellungen hält:
- Release-Paket (Server, LAN, Laptop oder ein NAS-Ordner): die Datei
.envnebendocker-compose.yml; führen Sie danachdocker compose up -daus, das die geänderten Container neu erstellt. - Portainer: die Umgebungsvariablen des Stacks (
stack.env); aktualisieren Sie danach den Stack. - Coolify: Dessen Compose-Datei setzt keine Limits pro Dienst, daher haben diese Variablen dort keine Wirkung.
# Example: an 8 GB machine with more concurrent load
BACKEND_MEM_LIMIT=3g
POSTGRES_MEM_LIMIT=1g
GOTENBERG_MEM_LIMIT=768m
Der Java-Heap des Backends skaliert automatisch auf 70 % von BACKEND_MEM_LIMIT (über MaxRAMPercentage), sodass ein höheres Limit den Heap automatisch erhöht — keine JVM-Flags zu bearbeiten. Dasselbe gilt proportional für den backup-worker (der 45 % nutzt).
Verfügbare Variablen: BACKEND_MEM_LIMIT, BACKEND_CPUS, POSTGRES_MEM_LIMIT, POSTGRES_CPUS, WORKER_MEM_LIMIT, WORKER_CPUS, GOTENBERG_MEM_LIMIT, GOTENBERG_CPUS, FRONTEND_MEM_LIMIT, FRONTEND_CPUS, CADDY_MEM_LIMIT, CADDY_CPUS.
CPU
Begrenzen Sie die CPU nur, wenn eine andere Last auf dem Host geschützt werden muss. Der einzige Punkt, an dem CPU in der Praxis zählt, ist der Kaltstart: das JVM-basierte Backend und der Worker booten einen großen Anwendungskontext, was CPU-gebunden ist. Auf einem einzelnen Kern kann ein Kaltstart Minuten dauern; mit 2+ Kernen liegt er deutlich unter einer Minute. Die Healthcheck-Karenzzeit des Workers berücksichtigt langsame Starts bereits, sodass sich eine eingeschränkte Maschine von selbst erholt, ohne Restart-Schleife.
Out-of-Memory-Probleme vermeiden
- Verkleinern Sie
WORKER_MEM_LIMITnicht unter ~768m. Ein Backup-Lauf (pg_dump+tar+gzip+ die JVM) erreicht eine Spitze von etwa 607 MiB; mit weniger Spielraum kann er mitten im Backup beendet werden. - Auf einer 2-GB-VM ist das Standardprofil zu groß — senken Sie die Limits (z. B.
BACKEND_MEM_LIMIT=768m,POSTGRES_MEM_LIMIT=384m), damit die Summe unter dem physischen RAM bleibt. Der Backend-Heap folgt dem Limit automatisch. - Behalten Sie den Host im Blick, nicht nur die Container. Wenn auf dem Host andere Workloads laufen, zählen Sie deren Speicher mit — Docker erzwingt nur Obergrenzen pro Container, nicht die Gesamtnutzung des Hosts.
- Ein Container, der wiederholt mit Exit-Code 137 neu startet, deutet auf einen OOM-Kill hin; erhöhen Sie das
*_MEM_LIMITdieses Dienstes.