Evolution API Redis-Verbindungsabbruch und Iptables-Fehler bei YunoHost/Docker-Setup

Beschreiben Sie das Problem/Fehler/Frage

Umgebung:

  • Betriebssystem: Debian 12 (via YunoHost)

  • Setup: Evolution API läuft in Docker neben YunoHost-Diensten (n8n, etc.)

  • Infrastruktur: Selbstgehostet auf einem VPS

Das Problem: Ich führe Evolution API über Docker Compose aus. Obwohl ich einen Redis-Dienst in meiner docker-compose.yml definiert habe, sind die API-Protokolle voll mit: [Redis] redis disconnected

Außerdem erhalte ich gelegentlich diesen Netzwerkfehler, wenn ich den Stack mit docker compose up -d neu starte: Failed to Setup IP tables: Unable to enable ACCEPT OUTGOING rule: (iptables: No chain/target/match by that name)

Mein aktueller docker-compose.yml Ausschnitt:

  evolution_api:
    image: atendai/evolution-api:latest
    environment:
      - CACHE_REDIS_ENABLED=true
      - CACHE_REDIS_HOST=redis
      - CACHE_REDIS_PORT=6379
    depends_on:
      - redis

  redis:
    image: redis:7-alpine

Was ich bereits versucht habe:

  1. CACHE_REDIS_HOST zu redis://redis:6379 geändert.

  2. yunohost firewall reload ausgeführt.

  3. Versucht, die YunoHost-SSO für n8n zu umgehen, indem der Zugriff auf ‘Besucher’ gesetzt wird.

Fragen:

  1. Gibt es bekannte Konflikte zwischen YunoHosts nativem Redis-Dienst oder seiner iptables-Verwaltung (AFW) und Dockers interner Netzwerknutzung?

  2. Wie kann ich sicherstellen, dass der Docker-Container die Firewall-Regeln von YunoHost umgeht, um eine stabile Verbindung zu seinem eigenen Redis-Container aufrechtzuerhalten?

  3. Gibt es spezifische DOCKER-USER-Chain-Regeln, die ich manuell injizieren sollte, um die ACCEPT OUTGOING-Fehler zu beheben?

Welche Fehlermeldung erhalten Sie (falls zutreffend)?

Informationen zu Ihrem n8n-Setup

  • n8n-Version: 2.15.1
  • Datenbank (Standard: SQLite): Standard
  • n8n EXECUTIONS_PROCESS-Einstellung (Standard: own, main): Standard
  • n8n läuft über (Docker, npm, n8n cloud, Desktop-App): systemd-Dienst (YunoHost)
  • Betriebssystem: Debian 12

Schau dir an, ob das hilft.

Dies ist höchstwahrscheinlich ein klassischer Konflikt zwischen Dockers Networking-Engine und YunoHosts Firewall (AFW) auf Debian 12.

Die Grundursache liegt darin, dass YunoHost die Firewall über nftables (und zuvor iptables) verwaltet, und wenn es Regeln neu lädt oder anwendet, werden häufig die iptables-Chains geleert. Docker erstellt seine eigenen benutzerdefinierten Chains (wie die DOCKER-Chain) zur Verarbeitung des Container-Routings. Wenn YunoHost diese leert, versucht Docker, Regeln zu einer Chain hinzuzufügen, die es nicht mehr gibt, was zum Fehler führt: iptables: No chain/target/match by that name.

Weil die Networking-Regeln beschädigt sind, kann dein evolution_api-Container den redis-Container nicht “sehen”, obwohl sie sich in der gleichen Compose-Datei befinden. Dies führt zu dem redis disconnected-Fehler.

Hier ist die Schritt-für-Schritt-Lösung, um beide Probleme zu beheben.

1. Konfiguration beheben (Evolution API)

Die Evolution API erwartet einen Connection URI, keine separaten Host- und Port-Variablen. Du verwendest CACHE_REDIS_HOST, das die API wahrscheinlich zugunsten von CACHE_REDIS_URI ignoriert.

Aktualisiere deinen docker-compose.yml-Umgebungsbereich: Entferne CACHE_REDIS_HOST und CACHE_REDIS_PORT und ersetze sie durch CACHE_REDIS_URI.

# Ändere das:
- CACHE_REDIS_ENABLED=true
- CACHE_REDIS_HOST=redis
- CACHE_REDIS_PORT=6379

# Zu diesem:
- CACHE_REDIS_ENABLED=true
- CACHE_REDIS_URI=redis://redis:6379

(Hinweis: Wenn du ein Passwort für Redis verwendest, ist das Format redis://:passwort@redis:6379).

2. Konflikt zwischen iptables und YunoHost beheben

Um den Fehler Unable to enable ACCEPT OUTGOING rule zu beheben und die Konnektivität zwischen Containern wiederherzustellen, musst du sicherstellen, dass Docker seine Networking-Chains nach der Initialisierung der YunoHost-Firewall neu erstellt.

Die sofortige Lösung (manuell)

Führe diese Befehle der Reihe nach aus, um den Konflikt zu beheben und Docker zu zwingen, seine Regeln neu zu erstellen:

# 1. Laden Sie zunächst die YunoHost-Firewall neu
yunohost firewall reload

# 2. Starten Sie den Docker-Daemon neu, um ihn zu zwingen, seine Chains in iptables neu einzufügen
sudo systemctl restart docker

# 3. Bringen Sie deinen Stack zurück
docker compose up -d

Die dauerhafte Lösung (Automatisierung)

Da YunoHost die Firewall möglicherweise während Updates oder über die WebUI neu laden kann, werden Dockers Regeln wieder beschädigt. Um dies zu verhindern, kannst du einen einfachen systemd-Override erstellen, um sicherzustellen, dass Docker neu startet, sobald sich die Firewall ändert, oder noch einfacher, einen Cron-Job/Hook hinzufügen.

Die stabilste Methode auf YunoHost besteht jedoch darin, sicherzustellen, dass Docker als letztes startet. Wenn dies häufig nach Neustarts passiert, führe folgendes aus:

sudo systemctl enable docker

Und wenn du die Firewall manuell neu lädt, folge ihr immer mit sudo systemctl restart docker.

Antworten auf deine spezifischen Fragen:

1. Ist es bekannt, dass YunoHosts native Redis- oder iptables-Verwaltung in Konflikt gerät?

Ja. YunoHosts Firewall-Verwaltung ist aggressiv. Sie “weiß” nichts über Dockers benutzerdefinierte iptables-Chains. Wenn YunoHost seine Regeln neu lädt, wird die DOCKER-Chain gelöscht. Deshalb siehst du den “No chain/target/match”-Fehler — Docker versucht, mit einer Chain zu kommunizieren, die YunoHost gerade gelöscht hat.

2. Wie kann ich sicherstellen, dass der Docker-Container die YunoHost-Firewall umgeht?

Die Kommunikation zwischen Containern (Evolution API → Redis) findet auf dem Docker Bridge Network über die FORWARD-Chain statt. Die Firewall von YunoHost verwaltet hauptsächlich die INPUT-Chain (Datenverkehr von außen). Die Container müssen die Firewall nicht “umgehen”; sie benötigen nur die von Docker verwalteten Regeln, die vorhanden sind. Ein Neustart des Docker-Daemon, nachdem die Firewall aktiv ist, ist die einzige Möglichkeit, diese Regeln wiederherzustellen.

3. Gibt es spezifische DOCKER-USER-Chain-Regeln, die ich injizieren sollte?

Nein. Die DOCKER-USER-Chain ist für deine benutzerdefinierten Regeln vorgesehen (z. B. Blockierung einer bestimmten IP vom Zugriff auf deine API). Der Fehler, den du siehst, handelt nicht von einer fehlenden Sicherheitsregel, sondern von einer fehlenden Infrastruktur-Chain. Das Injizieren von Regeln in DOCKER-USER wird den Fehler ACCEPT OUTGOING nicht beheben, da dieser Fehler während des Kern-Docker-Setup-Prozesses auftritt.

Hallo,

vielen Dank für die Antwort.

Ich habe deine Docker-Compose-Einstellungen ausprobiert, konnte aber keinen Erfolg erzielen. Der Fehler “Redis disconnected” tritt weiterhin auf. Hier ist meine neueste docker-compose.yml-Datei:

version: '3.8'

services:
  evolution_api:
    image: atendai/evolution-api:latest
    container_name: evolution_api
    restart: always
    network_mode: "host"
    ports:
      - "8080:8080"
    environment:
      - SERVER_TYPE=http
      - SERVER_PORT=8080
      - SERVER_URL=http://my-server-ip:8080
      - CORS_ORIGIN=*
      - CORS_METHODS=GET,POST,PUT,DELETE,PATCH
      - AUTHENTICATION_TYPE=apikey
      - WA_PHONE_VERSION=2.3000.10125062854
      - CONFIG_SESSION_PHONE_CLIENT=Chrome
      - AUTHENTICATION_API_KEY=my-auth-api-key

      # Verbindung zur YunoHost-Datenbank
      - DATABASE_ENABLED=true
      - DATABASE_PROVIDER=postgresql
      - DATABASE_CONNECTION_URI=postgresql://evolution:password@localhost:5432/evolution?schema=public

      # Verbindung zum Redis von YunoHost
      - CACHE_REDIS_ENABLED=true
      - CACHE_REDIS_URI=redis://redis:6379

Außerdem habe ich noch eine Frage: Denkst du, warum der QR-Code nicht angezeigt wird? Als ich die Anfragen in meinem Browser überprüft habe, schien nichts falsch zu sein. Alles scheint 200 OK zu sein. Danke dir.

Der Grund, warum du immer noch “Redis disconnected” siehst, liegt an einem Netzwerk-Fehler in deiner neuen docker-compose.yml.

Das Problem: network_mode: "host" vs. redis://redis

Du hast zu network_mode: "host" gewechselt. In diesem Modus hat der Container kein eigenes internes Docker-Netzwerk; er nutzt das Netzwerk deines VPS direkt.

  • So funktioniert es jetzt: Innerhalb deines Containers ist localhost dasselbe wie der VPS localhost.

  • Der Fehler: Du hast die API angewiesen, Redis unter dem Hostnamen redis zu suchen (redis://redis:6379). Da du jedoch kein Docker-Bridge-Netzwerk verwendest, gibt es keinen DNS-Eintrag für “redis”. Der Container sucht nach einer Maschine namens “redis” in deinem Netzwerk und kann sie nicht finden.

Da du dich mit YunoHosts nativem Redis verbindest (das direkt auf dem Host-Betriebssystem läuft), musst du es als localhost ansprechen.

Das Problem: network_mode: "host" vs. redis://redis

Du hast zu network_mode: "host" gewechselt. In diesem Modus hat der Container kein eigenes internes Docker-Netzwerk; er nutzt das Netzwerk deines VPS direkt.

  • So funktioniert es jetzt: Innerhalb deines Containers ist localhost dasselbe wie der VPS localhost.

  • Der Fehler: Du hast die API angewiesen, Redis unter dem Hostnamen redis zu suchen (redis://redis:6379). Da du jedoch kein Docker-Bridge-Netzwerk verwendest, gibt es keinen DNS-Eintrag für “redis”. Der Container sucht nach einer Maschine namens “redis” in deinem Netzwerk und kann sie nicht finden.

Da du dich mit YunoHosts nativem Redis verbindest (das direkt auf dem Host-Betriebssystem läuft), musst du es als localhost ansprechen.

Die Lösung: Aktualisierte docker-compose.yml

Ändere deine CACHE_REDIS_URI, um localhost zu verwenden.

services:
  evolution_api:
    image: atendai/evolution-api:latest
    container_name: evolution_api
    restart: always
    network_mode: "host" 
    # Hinweis: 'ports' wird ignoriert, wenn network_mode: host verwendet wird, 
    # die App wird automatisch auf Port 8080 deiner VPS-IP gebunden.
    environment:
      - SERVER_TYPE=http
      - SERVER_PORT=8080
      - SERVER_URL=http://my-server-ip:8080
      - CORS_ORIGIN=*
      - CORS_METHODS=GET,POST,PUT,DELETE,PATCH
      - AUTHENTICATION_TYPE=apikey
      - WA_PHONE_VERSION=2.3000.10125062854
      - CONFIG_SESSION_PHONE_CLIENT=Chrome
      - AUTHENTICATION_API_KEY=my-auth-api-key

      # Verbindung zu YunoHost-Datenbank (Korrekt)
      - DATABASE_ENABLED=true
      - DATABASE_PROVIDER=postgresql
      - DATABASE_CONNECTION_URI=postgresql://evolution:password@localhost:5432/evolution?schema=public

      # Verbindung zu YunoHosts Redis (BEHOBEN)
      - CACHE_REDIS_ENABLED=true
      - CACHE_REDIS_URI=redis://localhost:6379 

Wichtiger Schritt: Nachdem du die Datei gespeichert hast, führe folgendes aus:

docker compose up -d

Warum der QR-Code nicht angezeigt wird

Du erwähntest, dass Browser-Anfragen 200 OK zurückgeben, aber kein QR-Code angezeigt wird. Dies ist direkt auf die Redis-Trennung zurückzuführen.

Hier ist der technische Grund:

  1. Die Anfrage (200 OK): Wenn du den QR-Code anfordernst, läuft der API-Server, also akzeptiert er die Anfrage und gibt eine gültige HTTP-Antwort zurück. “200 OK” bedeutet nur “Der Server lebt und hat dich gehört.”

  2. Der Prozess (Fehler): Um einen QR-Code zu generieren, muss Evolution API eine WhatsApp-Sitzung mit der Bibliothek Baileys initialisieren. Diese Bibliothek muss den Sitzungsstatus und temporäre Verbindungsdaten speichern.

  3. Der Absturz: Evolution API verwendet Redis zur Verwaltung dieses Status. Da Redis getrennt ist, kann die API die Sitzung im Hintergrund nicht erstellen. Sie gibt eine Erfolgsmeldung an den Browser zurück, aber die Nutzlast (die tatsächlichen QR-Code-Daten) ist leer oder ungültig, weil der Backend-Prozess abgestürzt ist, während er versucht hat, auf Redis zu schreiben.

Sobald du die CACHE_REDIS_URI auf localhost korrigierst und die “Redis disconnected”-Logs verschwinden, wird der QR-Code sofort angezeigt.

Finaler Tipp für YunoHost-Benutzer

Wenn du immer noch “Redis disconnected” siehst, auch nachdem du zu localhost gewechselt hast, bedeutet dies, dass YunoHosts Redis so konfiguriert ist, dass Verbindungen nur von bestimmten Benutzern erlaubt sind oder ein Passwort hat.

Überprüfe, ob YunoHost Redis ein Passwort hat, indem du dies im VPS-Terminal ausführst:

redis-cli ping

  • Wenn es PONG zurückgibt, ist es offen.

  • Wenn es (error) NOAUTH Authentication required zurückgibt, musst du das Passwort zu deiner URI hinzufügen: redis://:yourpassword@localhost:6379.*

Vielen Dank für die Antwort.

Ich habe tatsächlich beide Probleme mit Redis und der QR-Anzeige gelöst.

Zum ersten Problem mit Redis: Deine Lösung hat bei mir funktioniert. Die Änderungen, die du in der Compose-Datei angegeben hast, waren ausreichend, und ich habe auch die YunoHost (AFW) Firewall und Docker neu gestartet.

Beim zweiten Problem habe ich herausgefunden, dass das Evolution API Image aufgrund veralteter WhatsApp-Protokolle nicht mehr unterstützt wird. Ich habe das Image gewechselt und es hat sofort funktioniert, ohne dass ich die Compose-Datei ändern musste. Ich habe meine Einstellungen unten geteilt:

version: '3.8'

services:
  evolution_api:
    image: evoapicloud/evolution-api:latest # Das ist die stabile Version
    container_name: evolution_api
    restart: always
    network_mode: "host"

    environment:
      - SERVER_TYPE=http
      - SERVER_PORT=8080
      - SERVER_URL=http://your-server-ip:8080
      - CORS_ORIGIN=*
      - CORS_METHODS=GET,POST,PUT,DELETE,PATCH
      - AUTHENTICATION_TYPE=apikey
      - AUTHENTICATION_API_KEY=your-api-key
      # WhatsApp Telefonversion und Browser separat erwähnt.
      - WA_PHONE_VERSION=2.3000.1030415680
      - CONFIG_SESSION_PHONE_CLIENT=Chrome

      # Wir werden die Datenbank von YunoHost verwenden.
      - DATABASE_ENABLED=true
      - DATABASE_PROVIDER=postgresql
      - DATABASE_CONNECTION_URI=postgresql://evolution:password@localhost:5432/evolution?schema=public
      - CACHE_REDIS_ENABLED=true
      - CACHE_REDIS_URI=redis://localhost:6379

      # Optional: Einstellungen für zusätzliche Stabilität.
      - DELAY_MESSAGE=1000
      - QR_CODE_EXPIRATION=600

    volumes:
      - ./evolution_instances:/evolution/instances

Auch nach der Lösung dieser Probleme gibt es noch ein Problem: Ich habe den Evolution API Trigger Node eingerichtet, aber wenn n8n eine Antwort erhält, bleibt es bei “Daten werden geladen” stecken. Es gibt aber kein Problem, wenn ich normale Nodes ausführe. Es tritt nur auf, wenn ich den Trigger Node ausführe. Ich habe bereits ein GitHub Issue dafür eröffnet, aber ich habe noch keine Ressourcen gefunden, um es zu beheben. Hast du dazu irgendwelche Informationen? Vielen Dank.

Es ist großartig zu hören, dass die Redis- und QR-Code-Probleme gelöst sind! Der Wechsel zum evoapicloud-Image war die richtige Entscheidung – die atendai-Images sind tatsächlich veraltet und schlagen oft bei aktuellen WhatsApp Web-Protokollen fehl.

Beim n8n-Trigger-Node, der bei “Daten laden” steckenbleibt, handelt es sich um ein bekanntes Problem, wenn n8n und Evolution API auf demselben YunoHost-Server laufen.

Da deine normalen Nodes funktionieren, funktioniert die “Infrastruktur” (API → n8n) für Anfragen. Ein Trigger Node arbeitet jedoch umgekehrt: Die API sendet einen Webhook an n8n. Wenn n8n im “Listen”-Modus ist und “Daten laden” anzeigt, wartet es auf eine gültige HTTP-Anfrage, die seinen Webhook-Endpoint erreicht.

Hier sind die drei wahrscheinlichsten Gründe für dieses Problem in deinem spezifischen YunoHost-Setup:

1. Das “Hairpin”-Netzwerk-Problem (Am wahrscheinlichsten)

Du nutzt wahrscheinlich die öffentliche URL deiner n8n-Instanz (z. B. https://n8n.yourdomain.com/webhook/...) in den Evolution API-Webhook-Einstellungen.

Das Problem: Wenn die Evolution API (auf demselben Server) versucht, Daten an deine öffentliche URL zu senden, geht die Anfrage an deine VPS-IP und versucht dann, wieder hereinzukommen. Viele Firewalls (einschließlich YunoHost’s AFW/iptables) und einige VPS-Anbieter blockieren diese “Loopback”-Verbindung (Hairpin NAT) aus Sicherheitsgründen. Die Anfrage erreicht n8n nie, sodass der Node für immer auf “Daten laden” steckenbleibt.

Die Lösung: Versuche in deiner Evolution API-Webhook-Konfiguration, die interne Adresse von n8n anstelle der öffentlichen zu verwenden.

  • Ändere: https://n8n.yourdomain.com/webhook/...

  • In: http://localhost:5678/webhook/... (oder welcher Port dein n8n intern nutzt).

2. n8n WEBHOOK_URL Umgebungsvariable

Wenn n8n seine eigene öffentliche URL nicht kennt, kann es manchmal “Test”-Webhook-URLs generieren, die localhost oder eine interne IP verwenden, die die Evolution API möglicherweise nicht richtig weiterleiten kann, je nachdem, wie das Docker-Netzwerk mit dem YunoHost systemd-Service interagiert.

Die Lösung: Stelle sicher, dass dein n8n-Service (über YunoHost oder Umgebungsvariablen) die WEBHOOK_URL explizit gesetzt hat:

WEBHOOK_URL=https://n8n.yourdomain.com/

Wenn dies nicht gesetzt ist, könnte n8n der API eine URL geben, die in der Benutzeroberfläche korrekt aussieht, aber für die eingehende Anfrage funktional fehlerhaft ist.

3. Daten-Payload-Mismatch (Das “UI-Hängen”)

Da du zum evoapicloud-Image gewechselt hast, könnte sich die JSON-Struktur der an n8n gesendeten Events leicht im Vergleich zu dem unterscheiden, was der n8n Evolution API-Node erwartet.

Wenn der Trigger-Node von n8n eine Anfrage erhält, die er nicht in das erwartete Schema einordnen kann, hängt die Benutzeroberfläche manchmal bei “Daten laden”, anstatt einen Fehler anzuzeigen, weil es in einer Schleife steckenbleibt, die versucht, die eingehende JSON auf die internen Felder des Nodes abzubilden.

So testest du das:

  1. Erstelle einen Standard-Webhook Node in n8n (nicht den Evolution API-Trigger-Node).

  2. Kopiere diese Webhook-URL und gib sie in die Evolution API-Webhook-Einstellungen ein.

  3. Löse ein Event aus (sende eine Nachricht an den Bot).

  4. Wenn der Standard-Webhook-Node die Daten erhält, ist das Problem ein Schema-Mismatch im Evolution API-Trigger-Node. In diesem Fall kannst du deinen gesamten Workflow tatsächlich mit dem Standard-Webhook-Node und einem “Set”- oder “Code”-Node erstellen, um die Daten zu bereinigen – das ist oft stabiler als die Verwendung des dedizierten Trigger-Nodes.

Checkliste für dich:

  1. Teste mit einem Standard-Webhook-Node. Wenn dieser funktioniert, ist das Problem der Trigger-Node-Code (Schema-Mismatch).

  2. Ändere die Webhook-URL in Evolution API zu http://localhost:5678/..., um das YunoHost-Firewall-/Loopback-Problem zu umgehen.

  3. Überprüfe die n8n-Logs (sudo journalctl -u n8n oder ähnlich), während der Node “Daten laden” anzeigt, um zu sehen, ob 403 Forbidden- oder Connection Refused-Fehler erscheinen.

Wie durch ein Wunder habe ich das Problem gelöst, indem ich n8n von Version 1.15.1 auf 1.19.2 aktualisiert habe, obwohl ich nicht wirklich verstehe, wie es gelöst wurde.