Evolution API Déconnexion Redis et erreurs Iptables sur installation YunoHost/Docker

Décrivez le problème/l’erreur/la question

Environnement :

  • OS : Debian 12 (via YunoHost)

  • Configuration : Evolution API s’exécutant sur Docker aux côtés des services YunoHost (n8n, etc.)

  • Infrastructure : Auto-hébergé sur un VPS

Le problème : J’exécute Evolution API via Docker Compose. Malgré la présence d’un service Redis défini dans mon docker-compose.yml, les logs de l’API sont inondés de : [Redis] redis disconnected

De plus, lorsque j’essaie de redémarrer la pile avec docker compose up -d, je rencontre occasionnellement cette erreur réseau : Failed to Setup IP tables: Unable to enable ACCEPT OUTGOING rule: (iptables: No chain/target/match by that name)

Mon extrait docker-compose.yml actuel :

  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

Ce que j’ai essayé :

  1. Changer CACHE_REDIS_HOST en redis://redis:6379.

  2. Exécuter yunohost firewall reload.

  3. Tenter de contourner le SSO YunoHost pour n8n en le définissant sur l’accès « Visitor ».

Questions :

  1. Le service Redis natif de YunoHost ou sa gestion des iptables (AFW) sont-ils connus pour entrer en conflit avec la mise en réseau interne de Docker ?

  2. Comment puis-je m’assurer que le conteneur Docker contourne les règles de pare-feu de YunoHost pour maintenir une connexion stable à son propre conteneur Redis ?

  3. Y a-t-il des règles de chaîne DOCKER-USER spécifiques que je devrais injecter manuellement pour arrêter les défaillances ACCEPT OUTGOING ?

Quel est le message d’erreur (le cas échéant) ?

Informations sur votre configuration n8n

  • version de n8n : 2.15.1
  • Base de données (par défaut : SQLite) : par défaut
  • paramètre n8n EXECUTIONS_PROCESS (par défaut : own, main) : par défaut
  • Exécution de n8n via (Docker, npm, n8n cloud, application de bureau) : service systemd (YunoHost)
  • Système d’exploitation : Debian 12

Vérifiez si ce qui suit peut vous aider.

Ceci est très probablement un conflit classique entre le moteur de réseau de Docker et le pare-feu de YunoHost (AFW) sur Debian 12.

La cause profonde est que YunoHost gère le pare-feu à l’aide de nftables (et précédemment iptables), et lorsqu’il recharge ou applique des règles, il vide souvent les chaînes iptables. Docker crée ses propres chaînes personnalisées (comme la chaîne DOCKER) pour gérer le routage des conteneurs. Lorsque YunoHost les vide, Docker essaie d’ajouter des règles à une chaîne qui n’existe plus, ce qui entraîne l’erreur : iptables: No chain/target/match by that name.

Parce que les règles de réseau sont cassées, votre conteneur evolution_api ne peut pas « voir » le conteneur redis, même s’ils se trouvent dans le même fichier compose. Cela conduit à l’inondation redis disconnected.

Voici la solution étape par étape pour corriger les deux problèmes.

1. Corriger la Configuration (Evolution API)

L’Evolution API attend une URI de connexion, et non des variables Host et Port séparées. Vous utilisez CACHE_REDIS_HOST, que l’API ignore probablement au profit de CACHE_REDIS_URI.

Mettez à jour la section environnement de votre docker-compose.yml : Supprimez CACHE_REDIS_HOST et CACHE_REDIS_PORT et remplacez-les par CACHE_REDIS_URI.

# Changez ceci :
- CACHE_REDIS_ENABLED=true
- CACHE_REDIS_HOST=redis
- CACHE_REDIS_PORT=6379

# En ceci :
- CACHE_REDIS_ENABLED=true
- CACHE_REDIS_URI=redis://redis:6379

(Remarque : Si vous utilisez un mot de passe pour Redis, le format est redis://:password@redis:6379).

2. Résoudre le conflit iptables / YunoHost

Pour corriger l’erreur Unable to enable ACCEPT OUTGOING rule et restaurer la connectivité entre les conteneurs, vous devez vous assurer que Docker recréé ses chaînes de réseau après que YunoHost a initialisé le pare-feu.

Le correctif immédiat (manuel)

Exécutez ces commandes dans l’ordre pour effacer le conflit et forcer Docker à reconstruire ses règles :

# 1. Rechargez d'abord le pare-feu YunoHost
yunohost firewall reload

# 2. Redémarrez le daemon Docker pour le forcer à réinjecter ses chaînes dans iptables
sudo systemctl restart docker

# 3. Relancez votre stack
docker compose up -d

Le correctif permanent (automatisation)

Comme YunoHost peut recharger le pare-feu lors des mises à jour ou via l’interface Web, les règles de Docker s’effondreront à nouveau. Pour éviter cela, vous pouvez créer un simple override systemd pour vous assurer que Docker redémarre chaque fois que le pare-feu change, ou plus simplement, ajouter un cron job/hook.

Cependant, la façon la plus stable sur YunoHost est de s’assurer que Docker est la dernière chose à démarrer. Si vous trouvez que cela se produit fréquemment après un redémarrage, exécutez :

sudo systemctl enable docker

Et si vous rechargez manuellement le pare-feu, suivez toujours avec sudo systemctl restart docker.

Réponses à vos questions spécifiques :

1. Le Redis natif de YunoHost ou la gestion d’iptables est-elle connue pour causer des conflits ?

Oui. La gestion du pare-feu de YunoHost est agressive. Elle ne « connaît » pas les chaînes iptables personnalisées de Docker. Lorsque YunoHost recharge ses règles, elle efface la chaîne DOCKER. C’est pourquoi vous voyez l’erreur « No chain/target/match »—Docker essaie de communiquer avec une chaîne que YunoHost vient de supprimer.

2. Comment puis-je m’assurer que le conteneur Docker contourne le pare-feu de YunoHost ?

La communication inter-conteneurs (Evolution API →→ Redis) se produit sur le Docker Bridge Network via la chaîne FORWARD. Le pare-feu de YunoHost gère principalement la chaîne INPUT (le trafic provenant du monde extérieur). Les conteneurs n’ont pas besoin de « contourner » le pare-feu ; ils ont juste besoin que les règles gérées par Docker existent. Redémarrer le daemon Docker après que le pare-feu soit actif est le seul moyen de restaurer ces règles.

3. Y a-t-il des règles de chaîne DOCKER-USER spécifiques que je devrais injecter ?

Non. La chaîne DOCKER-USER est pour vos règles personnalisées (par exemple, bloquer une adresse IP spécifique de frapper votre API). L’erreur que vous voyez n’est pas à propos d’une règle de sécurité manquante, mais d’une chaîne d’infrastructure manquante. Injecter des règles dans DOCKER-USER ne corrigera pas l’échec ACCEPT OUTGOING car cet échec se produit dans le processus de configuration de base de Docker.

Bonjour,

Merci pour la réponse.

J’ai essayé vos paramètres docker compose mais je n’ai pas réussi. L’erreur « Redis disconnected » persiste toujours. Voici mon dernier fichier docker-compose.yml :

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

      # Connecting to YunoHost database
      - DATABASE_ENABLED=true
      - DATABASE_PROVIDER=postgresql
      - DATABASE_CONNECTION_URI=postgresql://evolution:password@localhost:5432/evolution?schema=public

      # Connecting to YunoHost's Redis
      - CACHE_REDIS_ENABLED=true
      - CACHE_REDIS_URI=redis://redis:6379

J’ai également une autre question : pensez-vous que c’est pour quelle raison que le code QR n’apparaît pas ? Quand j’ai regardé les requêtes dans mon navigateur, il n’y a rien qui semble anormal. Tout semble être en 200 OK. Merci.

La raison pour laquelle vous voyez toujours « Redis disconnected » (Redis déconnecté) est due à un problème d’appairage réseau dans votre nouveau docker-compose.yml.

Le problème : network_mode: "host" vs. redis://redis

Vous avez basculé vers network_mode: "host". Dans ce mode, le conteneur n’a pas son propre réseau Docker interne ; il partage directement le réseau de votre VPS.

  • Fonctionnement actuel : Dans votre conteneur, localhost est la même chose que localhost du VPS.

  • L’erreur : Vous avez indiqué à l’API de chercher Redis au nom d’hôte redis (redis://redis:6379). Cependant, comme vous n’utilisez pas de réseau de pont Docker, il n’existe pas d’entrée DNS pour « redis ». Le conteneur cherche une machine nommée « redis » sur votre réseau et ne la trouve pas.

Parce que vous essayez de vous connecter au Redis natif de YunoHost (qui s’exécute directement sur le système d’exploitation hôte), vous devez le désigner comme localhost.

Le problème : network_mode: "host" vs. redis://redis

Vous avez basculé vers network_mode: "host". Dans ce mode, le conteneur n’a pas son propre réseau Docker interne ; il partage directement le réseau de votre VPS.

  • Fonctionnement actuel : Dans votre conteneur, localhost est la même chose que localhost du VPS.

  • L’erreur : Vous avez indiqué à l’API de chercher Redis au nom d’hôte redis (redis://redis:6379). Cependant, comme vous n’utilisez pas de réseau de pont Docker, il n’existe pas d’entrée DNS pour « redis ». Le conteneur cherche une machine nommée « redis » sur votre réseau et ne la trouve pas.

Parce que vous essayez de vous connecter au Redis natif de YunoHost (qui s’exécute directement sur le système d’exploitation hôte), vous devez le désigner comme localhost.

La solution : docker-compose.yml mis à jour

Modifiez votre CACHE_REDIS_URI pour utiliser localhost.

services:
  evolution_api:
    image: atendai/evolution-api:latest
    container_name: evolution_api
    restart: always
    network_mode: "host" 
    # Remarque : « ports » est ignoré lors de l'utilisation de network_mode: host,
    # l'application s'attachera automatiquement au port 8080 sur l'IP de votre VPS.
    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

      # Connexion à la base de données YunoHost (Correct)
      - DATABASE_ENABLED=true
      - DATABASE_PROVIDER=postgresql
      - DATABASE_CONNECTION_URI=postgresql://evolution:password@localhost:5432/evolution?schema=public

      # Connexion au Redis de YunoHost (CORRIGÉ)
      - CACHE_REDIS_ENABLED=true
      - CACHE_REDIS_URI=redis://localhost:6379 

Étape importante : Après avoir sauvegardé le fichier, exécutez :

docker compose up -d

Pourquoi le code QR n’apparaît pas

Vous avez mentionné que les demandes du navigateur retournent 200 OK, mais aucun code QR ne s’affiche. Cela est directement causé par la déconnexion de Redis.

Voici la raison technique :

  1. La demande (200 OK) : Quand vous demandez le code QR, le serveur API est en cours d’exécution, il accepte donc la demande et retourne une réponse HTTP valide. Le « 200 OK » signifie simplement « Le serveur est actif et vous a entendu ».

  2. Le processus (échec) : Pour générer un code QR, Evolution API doit initialiser une session WhatsApp en utilisant la bibliothèque Baileys. Cette bibliothèque doit stocker l’état de la session et les données de connexion temporaires.

  3. L’écrasement : Evolution API utilise Redis pour gérer cet état. Comme Redis est déconnecté, l’API ne crée pas la session en arrière-plan. Elle retourne une réponse de succès au navigateur, mais la charge utile (les données du code QR réelles) est vide ou invalide car le processus backend s’est arrêté de manière inattendue en tentant d’écrire dans Redis.

Une fois que vous corriger le CACHE_REDIS_URI en localhost et que les journaux « Redis disconnected » s’arrêtent, le code QR apparaîtra immédiatement.

Conseil final pour les utilisateurs de YunoHost

Si vous voyez toujours « Redis disconnected » même après le changement en localhost, cela signifie que Redis de YunoHost est configuré pour n’autoriser les connexions que depuis des utilisateurs spécifiques ou qu’il a un mot de passe.

Vérifiez si Redis de YunoHost a un mot de passe en exécutant ceci sur le terminal de votre VPS :

redis-cli ping

  • S’il retourne PONG, il est ouvert.

  • S’il retourne (error) NOAUTH Authentication required (erreur : authentification requise), vous devez ajouter le mot de passe à votre URI : redis://:yourpassword@localhost:6379.

Merci pour la réponse.

J’ai en fait résolu les deux problèmes avec Redis et l’affichage du code QR.

Concernant le premier problème avec Redis, votre solution a fonctionné pour moi. Faire les modifications que vous aviez indiquées dans le fichier compose a suffi, et j’ai aussi redémarré le pare-feu YunoHost (AFW) et Docker.

Pour le deuxième problème, j’ai découvert que l’image Evolution API n’est plus supportée en raison des anciens protocoles WhatsApp. J’ai changé l’image et cela a fonctionné immédiatement, sans même avoir besoin de modifier mon fichier compose. J’ai partagé mes paramètres ci-dessous :

version: '3.8'

services:
  evolution_api:
    image: evoapicloud/evolution-api:latest # C'est celle-ci qui est stable
    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
      # Mentionner séparément la version du téléphone WhatsApp et du navigateur.
      - WA_PHONE_VERSION=2.3000.1030415680
      - CONFIG_SESSION_PHONE_CLIENT=Chrome

      # Nous allons utiliser la base de données de YunoHost.
      - 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

      # Optionnel : paramètres pour une stabilité supplémentaire.
      - DELAY_MESSAGE=1000
      - QR_CODE_EXPIRATION=600

    volumes:
      - ./evolution_instances:/evolution/instances

Même après avoir résolu ces problèmes, il y en a encore un : j’ai configuré le nœud déclencheur Evolution API, mais quand n8n reçoit une réponse, il reste bloqué sur « Chargement des données ». Cependant, il n’y a rien de mal quand j’exécute des nœuds normaux. Cela se produit seulement quand j’exécute le nœud déclencheur. J’ai déjà ouvert un problème sur GitHub pour cela, mais je n’ai pas encore trouvé de ressources pour le corriger. Avez-vous des informations à ce sujet ? Merci.

C’est super d’apprendre que les problèmes de Redis et de code QR sont résolus ! Le passage à l’image evoapicloud était le bon choix—les images atendai sont effectivement obsolètes et échouent souvent avec les protocoles WhatsApp Web actuels.

Concernant le nœud déclencheur n8n qui reste bloqué sur « Chargement des données », c’est un problème connu lorsqu’on exécute n8n et Evolution API sur le même serveur YunoHost.

Puisque vos nœuds normaux fonctionnent, la « plomberie » (API → n8n) fonctionne pour les requêtes. Cependant, un nœud déclencheur fonctionne en sens inverse : l’API envoie un Webhook à n8n. Quand n8n est en mode « Écoute » et affiche « Chargement des données », il attend qu’une requête HTTP valide frappe son point de terminaison de webhook.

Voici les trois raisons les plus probables pour lesquelles cela se produit dans votre configuration YunoHost spécifique :

1. Le problème de réseau « Hairpin » (Plus probable)

Vous utilisez probablement l’URL publique de votre instance n8n (par ex. https://n8n.votredomaine.com/webhook/...) dans les paramètres de webhook d’Evolution API.

Le problème : Quand Evolution API (sur le même serveur) essaie d’envoyer des données à votre URL publique, la requête sort vers l’IP de votre VPS et essaie ensuite de revenir. De nombreux pare-feu (y compris le pare-feu YunoHost/iptables) et certains fournisseurs VPS bloquent cette « boucle de retour » (Hairpin NAT) pour des raisons de sécurité. La requête n’atteint jamais n8n, donc le nœud reste indéfiniment sur « Chargement des données ».

La solution : Dans votre configuration de webhook d’Evolution API, essayez d’utiliser l’adresse interne de n8n au lieu de l’adresse publique.

  • Remplacer : https://n8n.votredomaine.com/webhook/...

  • Par : http://localhost:5678/webhook/... (ou quel que soit le port sur lequel n8n s’exécute en interne).

2. Variable d’environnement WEBHOOK_URL de n8n

Si n8n ne connaît pas sa propre URL publique, il peut parfois générer des URL de webhook « Test » qui utilisent localhost ou une IP interne, que l’Evolution API pourrait ne pas pouvoir router correctement selon la façon dont le réseau Docker interagit avec le service systemd YunoHost.

La solution : Assurez-vous que votre service n8n (via YunoHost ou des variables d’environnement) a la WEBHOOK_URL définie explicitement :

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

Si ce n’est pas défini, n8n pourrait donner à l’API une URL qui semble correcte dans l’interface mais qui est fonctionnellement cassée pour la requête entrante.

3. Inadéquation de charge utile de données (L’« accrochage de l’interface »)

Puisque vous avez basculé vers l’image evoapicloud, la structure JSON des événements envoyés à n8n a peut-être légèrement changé par rapport à ce que le nœud Evolution API de n8n s’attend à recevoir.

Quand le nœud déclencheur de n8n reçoit une requête qu’il ne peut pas parser en le schéma attendu, l’interface s’accroche parfois sur « Chargement des données » au lieu d’afficher une erreur, car elle est coincée dans une boucle en essayant de mapper le JSON entrant aux champs internes du nœud.

Comment tester cela :

  1. Créez un nœud Webhook standard dans n8n (pas le nœud déclencheur Evolution API).

  2. Copiez cette URL de Webhook et insérez-la dans les paramètres de webhook d’Evolution API.

  3. Déclenchez un événement (envoyez un message au bot).

  4. Si le nœud Webhook standard reçoit les données, alors le problème est une inadéquation de schéma dans le nœud déclencheur Evolution API. Dans ce cas, vous pouvez en fait construire votre flux entier en utilisant le nœud Webhook standard et un nœud « Set » ou « Code » pour nettoyer les données—ceci est souvent plus stable que l’utilisation du nœud déclencheur dédié.

Liste de vérification récapitulative pour vous :

  1. Testez avec un nœud Webhook standard. Si cela fonctionne, le problème est le code du nœud déclencheur (Inadéquation de schéma).

  2. Changez l’URL du Webhook dans Evolution API en http://localhost:5678/... pour contourner le problème de pare-feu/boucle de retour YunoHost.

  3. Vérifiez les journaux de n8n (sudo journalctl -u n8n ou similaire) tandis que le nœud « Charge les données » pour voir si des erreurs 403 Forbidden ou Connection Refused apparaissent.

Magiquement, j’ai résolu le problème en mettant à jour n8n de la version 1.15.1 à 1.19.2, bien que je ne comprenne pas vraiment comment c’a été résolu.