diff --git a/.env.example b/.env.example index 3f3b307..c1aeecd 100644 --- a/.env.example +++ b/.env.example @@ -21,6 +21,9 @@ APP_NAME=mi-app # Dominio donde se desplegará la aplicación APP_DOMAIN=miapp.ejemplo.com +# Dominio para el servidor MCP Docker (sin autenticación) +MCP_DOMAIN=mcp.ejemplo.com + # =========================================== # APPLICATION # =========================================== diff --git a/README.md b/README.md index 940511b..df3025a 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,21 @@ Este repositorio contiene la documentación del funcionamiento del sistema Nucle - ✅ CI/CD con Gitea Actions - ✅ Traefik para proxy reverso y SSL - ✅ Claude Code hooks para monitoreo de Actions +- ✅ MCP Server Docker para gestión de contenedores + +## Servicios + +### Aplicación Principal (`app`) +Aplicación Nuxt 4 con la documentación del sistema Nucleo, expuesta mediante Traefik con autenticación Authentik. + +### MCP Docker Server (`mcp-docker`) +Servidor MCP oficial de Docker (`docker:cli`) que permite gestionar contenedores Docker mediante lenguaje natural. Este servicio: +- Usa el MCP Gateway en modo streaming (puerto 8080) +- Tiene acceso al socket de Docker del host (solo lectura) +- Se ejecuta en las redes `principal` y `traefik-network` +- **Expuesto públicamente a través de Traefik SIN autenticación Authentik** +- Accesible en el dominio configurado en `MCP_DOMAIN` +- Incluye soporte para WebSocket y streaming ## Desarrollo Local diff --git a/docker-compose.yml b/docker-compose.yml index 099fd89..bc49858 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -48,6 +48,35 @@ services: - "traefik.http.middlewares.${APP_NAME}-cors.headers.accesscontrolmaxage=100" - "traefik.http.middlewares.${APP_NAME}-cors.headers.addvaryheader=true" + mcp-docker: + image: docker:cli + container_name: ${APP_NAME}-mcp-docker + restart: unless-stopped + command: mcp gateway run --port 8080 --transport streaming + volumes: + # Montar el socket de Docker para acceso al daemon + - /var/run/docker.sock:/var/run/docker.sock:ro + networks: + - principal + - traefik-network + labels: + # Traefik labels - Exposición sin autenticación + - "traefik.enable=true" + - "traefik.docker.network=traefik-network" + + # Service + - "traefik.http.services.${APP_NAME}-mcp.loadbalancer.server.port=8080" + + # Router sin autenticación + - "traefik.http.routers.${APP_NAME}-mcp.rule=Host(`${MCP_DOMAIN}`)" + - "traefik.http.routers.${APP_NAME}-mcp.entrypoints=websecure" + - "traefik.http.routers.${APP_NAME}-mcp.tls.certresolver=letsencrypt" + - "traefik.http.routers.${APP_NAME}-mcp.service=${APP_NAME}-mcp" + + # Headers personalizados para WebSocket y streaming + - "traefik.http.middlewares.${APP_NAME}-mcp-headers.headers.customrequestheaders.X-Forwarded-Proto=https" + - "traefik.http.routers.${APP_NAME}-mcp.middlewares=${APP_NAME}-mcp-headers" + networks: principal: external: true