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.