diff --git a/docker-compose.yml b/docker-compose.yml index c77ab35..a753a4a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -65,7 +65,7 @@ services: NODE_ENV: production PORT: 4100 CROWDLENDING_API_URL: http://crowdlending-backend:4000/api/v1 - MCP_ALLOWED_HOSTS: mcp.crowdlending.croguennec.net + MCP_ALLOWED_HOSTS: mcp.crowdlending.croguennec.net,localhost depends_on: crowdlending-backend: condition: service_healthy diff --git a/mcp-server/http-server.js b/mcp-server/http-server.js index 3fc4e85..75aa0c1 100644 --- a/mcp-server/http-server.js +++ b/mcp-server/http-server.js @@ -42,7 +42,13 @@ const PORT = Number(process.env.PORT || 4100); const API_BASE = (process.env.CROWDLENDING_API_URL || 'http://crowdlending-backend:4000/api/v1').replace(/\/$/, ''); // Nom(s) d'hôte public(s) attendus dans l'en-tête Host — protection anti // DNS-rebinding. Séparés par des virgules si plusieurs (ex. dev + prod). -const ALLOWED_HOSTS = (process.env.MCP_ALLOWED_HOSTS || 'mcp.crowdlending.croguennec.net') +// `localhost` est inclus par défaut pour que le HEALTHCHECK Docker (qui +// interroge http://localhost:4100/health depuis l'intérieur du container) +// ne soit pas lui-même bloqué par ce middleware — sans risque côté externe, +// puisque Traefik ne route déjà vers ce service que les requêtes portant le +// Host public configuré sur son router (une requête Host: localhost envoyée +// depuis l'extérieur n'atteint jamais ce container). +const ALLOWED_HOSTS = (process.env.MCP_ALLOWED_HOSTS || 'mcp.crowdlending.croguennec.net,localhost') .split(',').map((h) => h.trim()).filter(Boolean); // Durée d'inactivité au-delà de laquelle une session orpheline est fermée // (client parti sans DELETE explicite — évite une fuite mémoire lente).