Zurück zum Blog

Server-Wartung Juni 2026: RAM-Optimierung, Fixes & Updates

Server-Wartung Juni 2026: RAM-Optimierung, Fixes & System-Updates

Datum 15. Juni 2026
Kategorie Infrastruktur
Lesezeit 8 Minuten

Ausgangslage: RAM-Alarm

Beim heutigen Blick auf den Server bot sich ein beunruhigendes Bild: Von 15 GB RAM waren 14,8 GB belegt – und kein einziges Byte Swap konfiguriert. Das bedeutet: Bei einem einzigen größeren Prozess hätte der OOM-Killer wahllos Container abgeschossen.

$ free -h
               total        used        free      shared  buff/cache   available
Mem:            15Gi        14Gi       431Mi       219Mi       1.2Gi       1.1Gi
Swap:             0B          0B          0B
Kritisch: Kein Swap + 431 MB freier RAM = ein OOM-Kill-Ereignis war nur eine Frage der Zeit.

Ein Blick auf die größten RAM-Verbraucher zeigte die Ursachen sofort:

Container RAM-Verbrauch Ursache
webapp 2,3 GB Next.js Speicherleck (3 Monate Uptime)
wazuh-indexer 2,5 GB JVM-Heap auf 2 GB gesetzt
wazuh-manager 886 MB SIEM-Manager
docling 904 MB PDF-Verarbeitung (selten benötigt)
clamd (Mailcow) 1 GB ClamAV Virenscanner

RAM-Optimierung

1. Swap erstellen

Als erstes wurde ein 4 GB Swapfile als Sicherheitsnetz angelegt und dauerhaft in /etc/fstab eingetragen:

fallocate -l 4G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab

2. webapp-Speicherleck beheben

Der Next.js-Server des Webauftritts hatte nach drei Monaten ohne Neustart 2,3 GB RAM angehäuft – klassisches V8-Heap-Wachstum ohne obere Grenze. Nach einem Neustart waren es noch 68 MB. Um künftiges unkontrolliertes Wachstum zu verhindern, wurde ein Node.js-Heap-Limit gesetzt:

environment:
  NODE_ENV: production
  NODE_OPTIONS: "--max-old-space-size=512"  # Max 512 MB Heap
Ergebnis: webapp RAM: 2,3 GB → 68 MB direkt nach Neustart, dauerhaft auf max. 512 MB begrenzt.

3. Wazuh-Indexer JVM-Heap reduzieren

Der OpenSearch-Indexer von Wazuh war mit einem 2 GB JVM-Heap konfiguriert – für eine Single-Node-Installation deutlich mehr als nötig. Die Anpassung auf 1 GB spart knapp 1 GB RAM ohne Funktionseinbußen:

# Vorher
- "OPENSEARCH_JAVA_OPTS=-Xms2g -Xmx2g"

# Nachher
- "OPENSEARCH_JAVA_OPTS=-Xms1g -Xmx1g"

4. Docling deaktivieren

Docling ist ein leistungsstarker PDF-Extraktor, der für n8n-Workflows verwendet wird – aber nur gelegentlich. Den Dienst dauerhaft laufen zu lassen kostete 904 MB RAM. Er wurde gestoppt und auf restart: "no" gesetzt, kann bei Bedarf per docker start docling reaktiviert werden.

Wichtig: Die depends_on-Abhängigkeit von n8n auf Docling wurde ebenfalls entfernt, damit n8n beim Serverstart nicht blockiert wird.

Docker Build-Cache bereinigen

Ein weiterer Quick-Win: Der Docker Build-Cache hatte sich auf 4,5 GB angesammelt und wurde vollständig bereinigt:

docker builder prune -f
# Total: 4.538GB freigegeben

Weitere Fixes

Traefik: ForwardAuth-Sicherheitswarnung beheben

Die Traefik-Logs zeigten wiederkehrende Warnungen für alle ForwardAuth-Middlewares (die Authentik-Authentifizierung für interne Dienste):

level=warning msg="maxResponseBodySize is not configured, allowing unlimited
response body size which can lead to DoS attacks and memory exhaustion."

Die Lösung: maxResponseBodySize: 1048576 (1 MB) wurde zu beiden betroffenen Middlewares hinzugefügt – dockge-auth in der Traefik-Konfigurationsdatei und umami-auth via Docker-Label.

Prometheus-Retention optimieren

Prometheus war mit einer 90-Tage-Datenhaltung konfiguriert und belegte bereits 7,7 GB Speicher. Für eine Self-Hosted-Umgebung dieser Größe sind 30 Tage völlig ausreichend:

# Vorher
- '--storage.tsdb.retention.time=90d'

# Nachher
- '--storage.tsdb.retention.time=30d'

n8n Storage-Migration vorbereiten

n8n warnte beim Start vor einer Umbennung des Speicherpfads in der kommenden Version 3: /home/node/.n8n/binaryData/home/node/.n8n/storage. Die Migration wurde mit einer Umgebungsvariable aktiviert:

N8N_MIGRATE_FS_STORAGE_PATH: "true"

System- & Container-Updates

System-Pakete (49 Pakete)

Paket Alt Neu
Docker CE 29.1.3 29.5.3
Docker Compose Plugin 5.0.0 5.1.4
containerd.io 2.2.1 2.2.4
Trivy 0.68.2 0.71.1
Tailscale 1.92.5 1.98.4
Linux Kernel 6.8.0-90 6.8.0-124
+ 43 weitere Ubuntu-Pakete AppArmor, rsyslog, snapd, netplan, openldap …
Besonderheit Trivy: Das GPG-Schlüssel des AquaSecurity-Repositories war abgelaufen. Der Key wurde neu importiert und das Repository neu eingebunden, bevor das Update durchgeführt werden konnte.
wazuh-agent zurückgehalten: Das System-Paket wazuh-agent (4.9.2 → 4.14.5) wurde bewusst nicht aktualisiert. Agent- und Manager-Version müssen übereinstimmen – ein Update des Agents ohne gleichzeitiges Update der Manager/Indexer/Dashboard-Container würde zu einem Versionskonflikt führen.

Kernel-Update & Reboot

Das Kernel-Update von 6.8.0-90 auf 6.8.0-124 erforderte einen Neustart. Alle Container sind mit restart: unless-stopped konfiguriert und starteten automatisch wieder – die gesamte Downtime betrug unter 60 Sekunden.

Container-Updates

Container Alt Neu Hinweis
Authentik SSO 2024.12 2025.6 ~18 Monate Rückstand aufgeholt
Directus CMS 11.3.3 11.17.4 Migrationen automatisch gelaufen
Gitea 1.22-rootless 1.23-rootless Neue Git-Features und Bugfixes

Die übrigen Container (n8n, Nextcloud, Traefik, Prometheus u.a.) werden durch Watchtower automatisch aktualisiert – zuletzt am 14. Juni 2026 mit 6 Updates.

Ergebnis

Metrik Vorher Nachher
RAM genutzt 14,8 GB (97%) 7,5 GB (49%)
Swap 0 GB 4 GB aktiv
Freier Speicherplatz (Disk) 47 GB ~57 GB (+10 GB durch Cache/Retention)
Docker Engine 29.1.3 29.5.3
Kernel 6.8.0-90 6.8.0-124
Traefik-Warnungen Wiederkehrend Behoben
Zusammenfassung:
  • RAM-Nutzung um 7,3 GB reduziert – Server läuft nun mit komfortablem Puffer
  • 4 GB Swap als dauerhafte Sicherheitsreserve eingerichtet
  • 49 System-Pakete + 3 Container-Versionen aktualisiert
  • Kernel-Update mit automatischem Container-Neustart in unter 60 Sekunden
  • Sicherheitswarnung in Traefik ForwardAuth behoben
  • Authentik von 2024.12 auf 2025.6 gehoben (18 Monate Rückstand)