FENCODE
Self-Hosted
Inteligencia Artificial

Cómo instalamos nanobot en Coolify con GLM, MCP, SFTP y reconocimiento de voz: la guía que no existe

Guía real de cómo hacer fork de nanobot, desplegarlo en Coolify con Docker, conectarlo a Discord y Telegram, agregar Brave Search, MCP con Stripe, SFTP para archivos y reconocimiento de voz local con Faster Whisper.

Jesús Blanco

Jesús Blanco

Autor

13 min
Cómo instalamos nanobot en Coolify con GLM, MCP, SFTP y reconocimiento de voz: la guía que no existe

Probamos OpenClaw primero. Tardamos horas configurándolo, falló dos veces en el deploy y nunca terminó de funcionar bien en Coolify. El proyecto es enorme: más de 430,000 líneas de código, una imagen Docker que pesa varios gigabytes y un proceso de setup que asume que tienes pantalla frente al servidor.

Luego encontramos nanobot: 4,000 líneas de Python, imagen ligera, configuración en un JSON y deploy en minutos. Con un fork propio le agregamos lo que necesitábamos: Brave Search para búsquedas reales en internet, MCP conectado a Stripe para monitorear las suscripciones de nuestros clientes en Saleshow, un servidor SFTP para intercambiar archivos con el agente, reconocimiento de voz local con Faster Whisper para mandar notas de voz por Telegram y Discord, y GLM4.7 de Zhipu como modelo principal por $10 al mes.

El fork está en github.com/Blancochuy/nanobot y es completamente público. Este artículo documenta cómo funciona y cómo replicarlo.


Por qué nanobot le ganó a OpenClaw

Si ya leíste nuestra comparativa de AI agents en 2026, el contexto general ya lo tienes. Pero la experiencia práctica en un servidor real con Coolify añade matices que los artículos teóricos no capturan.

OpenClaw en Coolify es problemático porque su proceso de configuración inicial requiere una interfaz web interactiva. En un servidor headless eso significa hacer malabares con port forwarding para completar el setup. El build cache solo puede ocupar más de 10GB.

Nanobot no tiene ninguno de esos problemas. Es Python puro, el onboard es un comando, y si algo sale mal el error es legible. Para modificarlo no necesitas entender un monolito de TypeScript: cualquier desarrollador puede leer el código fuente en una tarde.


Qué tiene el fork que no tiene nanobot base

El fork en github.com/Blancochuy/nanobot agrega cuatro cosas principales:

Deploy automático en Coolify. El docker-compose.yml usa un contenedor init-config que genera el config.json automáticamente al hacer deploy, inyectando todas las variables de entorno desde el dashboard de Coolify. No tienes que editar ningún archivo dentro del contenedor manualmente.

Brave Search integrado. El agente busca en internet real usando la API de Brave Search. No DuckDuckGo scraping sino una API oficial con resultados frescos y límites generosos en el tier gratuito.

MCP con Stripe. El agente tiene acceso al servidor MCP oficial de Stripe para consultar el estado de suscripciones en tiempo real, cuántas están activas, cuáles son anuales o mensuales y cuáles están próximas a expirar.

Reconocimiento de voz local. Faster Whisper corre dentro del contenedor Docker. Le mandas un voice note por Telegram o Discord y el agente lo transcribe localmente, sin mandarlo a ningún servicio externo.


El docker-compose.yml completo

La parte más interesante del fork es cómo resuelve la configuración. En lugar de requerir que edites archivos dentro del contenedor, usa un servicio init-config con la imagen busybox que genera el config.json automáticamente en el primer deploy:

yaml
      version: '3.8'
services:
  init-config:
    image: busybox
    volumes:
      - nanobot_data:/root/.nanobot
    environment:
      - ZAI_API_KEY=${ZAI_API_KEY}
      - LLM_MODEL=${LLM_MODEL}
      - TELEGRAM_TOKEN=${TELEGRAM_TOKEN}
      - TELEGRAM_ALLOWED_USERS=${TELEGRAM_ALLOWED_USERS}
      - DISCORD_TOKEN=${DISCORD_TOKEN}
      - DISCORD_ALLOWED_USERS=${DISCORD_ALLOWED_USERS}
      - BRAVE_API_KEY=${BRAVE_API_KEY}
      - STRIPE_SECRET_KEY=${STRIPE_SECRET_KEY}
    command:
      - sh
      - -c
      - |
        echo '{
          "providers": {
            "custom": {
              "apiKey": "${ZAI_API_KEY}",
              "apiBase": "https://api.z.ai/api/coding/paas/v4"
            }
          },
          "agents": {
            "defaults": {
              "model": "${LLM_MODEL}"
            }
          },
          "channels": {
            "telegram": {
              "enabled": true,
              "token": "${TELEGRAM_TOKEN}",
              "allowFrom": ${TELEGRAM_ALLOWED_USERS}
            },
            "discord": {
              "enabled": true,
              "token": "${DISCORD_TOKEN}",
              "allowFrom": ${DISCORD_ALLOWED_USERS}
            }
          },
          "tools": {
            "web": {
              "search": {
                "apiKey": "${BRAVE_API_KEY}",
                "maxResults": 5
              }
            },
            "mcpServers": {
              "stripe": {
                "url": "https://mcp.stripe.com/",
                "headers": {
                  "Authorization": "Bearer ${STRIPE_SECRET_KEY}"
                }
              }
            }
          }
        }' > /root/.nanobot/config.json

  nanobot-gateway:
    container_name: nanobot-gateway
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - nanobot_data:/root/.nanobot
    command:
      - gateway
    restart: always
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: 1G

volumes:
  nanobot_data:
    

El flujo es simple: Coolify hace deploy, init-config corre primero y escribe el JSON en el volumen compartido, luego nanobot-gateway arranca y encuentra el config ya listo. Sin pasos manuales, sin entrar al contenedor.

El límite de cpus: '1' y memory: 1G es intencional. En una mini PC con Ryzen 4500U con otros servicios corriendo, esas restricciones evitan que nanobot consuma todo el sistema durante picos de uso.


Las variables de entorno en Coolify

En el dashboard de Coolify, en Environment Variables del servicio, agrega estas variables:

VariableDescripción
ZAI_API_KEYAPI key de Zhipu AI
LLM_MODELNombre del modelo, por ejemplo glm-4.7
TELEGRAM_TOKENToken del bot de Telegram de @BotFather
TELEGRAM_ALLOWED_USERSArray JSON de IDs: [123456789]
DISCORD_TOKENToken del bot de Discord
DISCORD_ALLOWED_USERSArray JSON de IDs de Discord
BRAVE_API_KEYAPI key de Brave Search
STRIPE_SECRET_KEYSecret key de Stripe

Un detalle importante: TELEGRAM_ALLOWED_USERS y DISCORD_ALLOWED_USERS deben ser arrays JSON válidos, por ejemplo [123456789, 987654321]. Si pones el número sin corchetes el config.json queda malformado y el gateway no arranca.


GLM de Zhipu: el modelo que reemplazó a Kimi K2

Al principio usamos Kimi K2 de Moonshot vía Groq. Es un modelo excelente para razonamiento y contexto largo, pero el problema es el tier gratuito de Groq, no el modelo.

En uso real de agente, cada mensaje del usuario genera múltiples llamadas al modelo: una para analizar la instrucción, otras para planear y ejecutar tools, y una final para redactar la respuesta. Un mensaje que parece simple puede consumir 4 o 5 requests. Con Discord y Telegram activos, los 1,000 requests diarios del tier gratuito se agotan antes del mediodía.

Zhipu AI resuelve eso con dos modelos complementarios:

GLM4.7 es el modelo principal para texto, razonamiento y ejecución de tareas. Tiene muy buen soporte de español y seguimiento de instrucciones largas. Se configura con "model": "glm-4.7" en las variables de entorno.

GLM4.6V es la variante con visión. Cuando alguien manda una imagen por Telegram, el agente puede analizarla con este modelo específicamente.

El plan Code de Zhipu cuesta $10 USD al mes con rate limits muy superiores a cualquier tier gratuito de la competencia. Para uso de agente personal o equipo pequeño es la mejor relación calidad-precio disponible hoy. Para obtener la API key ve a open.bigmodel.cn, crea una cuenta con email internacional y genera la key en el dashboard.


Brave Search: el agente que sabe lo que pasa hoy

La diferencia entre un agente con Brave Search y uno sin acceso a internet es enorme en la práctica. Sin búsquedas, el agente responde con su conocimiento de entrenamiento, que puede tener meses de antigüedad. Con Brave Search, cuando le preguntas sobre el precio actual de algo o una noticia reciente, busca y trae la información fresca.

La API de Brave Search tiene un tier gratuito de 2,000 consultas al mes sin tarjeta de crédito, lo que da para meses de uso personal antes de necesitar el plan de pago. La key se obtiene en api.search.brave.com y se agrega a Coolify como BRAVE_API_KEY.


MCP con Stripe: el agente que monitorea Saleshow

Uno de los casos de uso que más valor nos da en el día a día es el MCP de Stripe conectado a Saleshow, nuestro SaaS. En lugar de abrir el dashboard de Stripe cada vez que queremos revisar el estado de las suscripciones, simplemente le preguntamos al agente por Discord o Telegram.

Le podemos preguntar cuántas suscripciones activas hay en total, cuántas son anuales y cuántas mensuales, o qué suscripciones están próximas a expirar en los próximos 7 días. El agente consulta Stripe directamente vía el MCP y responde con los datos reales, y además nos avisa proactivamente cuando detecta renovaciones próximas o suscripciones en riesgo.

La configuración en el docker-compose usa el servidor MCP oficial de Stripe vía HTTP. Solo necesita el STRIPE_SECRET_KEY como header de autorización y nanobot se conecta al servidor remoto automáticamente, sin instalar nada adicional en el contenedor.

Si no usas Stripe, el bloque mcpServers puede apuntar a cualquier otro servidor MCP que necesites. En nuestro artículo sobre cómo crear tu primer servidor MCP explicamos cómo construir uno propio desde cero.


SFTP: intercambio de archivos sin complicaciones

El agente tiene acceso a un servidor SFTP en nuestra infraestructura. La integración no requirió ninguna configuración especial en el fork: simplemente le dimos al agente su usuario, contraseña y host en el contexto de la conversación, y él recuerda esas credenciales para usarlas cuando las necesita.

Le creamos una ruta específica en el servidor a la que solo él tiene acceso, así no puede tocar nada más del sistema. Dentro de esa ruta puede subir archivos, eliminar los que ya no necesita y dejar scripts que le hayamos pedido que genere.

En la práctica funciona así: le pedimos que genere un reporte o escriba un script, lo sube al SFTP automáticamente y nosotros lo descargamos desde cualquier cliente SFTP cuando lo necesitamos. Simple, sin tener que copiar y pegar bloques de código desde el chat.


Reconocimiento de voz con Faster Whisper

Faster Whisper corre dentro del contenedor Docker y funciona tanto en Telegram como en Discord. Cuando mandas un voice note, el flujo completo es:

  1. El canal recibe el archivo de audio y lo pasa al gateway de nanobot
  2. Faster Whisper transcribe el audio a texto completamente local, sin llamadas externas
  3. El texto transcrito llega al modelo GLM4.7 como si fuera un mensaje escrito
  4. El agente responde normalmente

El audio nunca sale del servidor. Sin API key de transcripción, sin costo adicional, sin latencia de red para transcribir.

El modelo base de Faster Whisper transcribe audio de 30 segundos en 2 a 4 segundos en el Ryzen 4500U. Para notas de voz conversacionales es prácticamente instantáneo y el español funciona muy bien. El modelo small tiene mejor precisión con acentos regionales y términos técnicos, pero consume más RAM, y para uso conversacional el base es suficiente.


El deploy paso a paso en Coolify

Con el fork clonado o forkeado en tu GitHub, el proceso en Coolify es directo:

  1. New Resource → Docker Compose en tu proyecto
  2. En Source conecta tu repositorio de GitHub con el fork
  3. Coolify detecta el docker-compose.yml automáticamente
  4. En Environment Variables agrega todas las variables de la tabla de arriba
  5. Haz clic en Deploy

El build inicial tarda entre 5 y 10 minutos porque incluye la descarga del modelo de Faster Whisper. En los logs verás 🐈 Starting nanobot gateway cuando el agente esté listo.

Si el deploy falla con un error de JSON malformado, casi siempre es por el formato de TELEGRAM_ALLOWED_USERS o DISCORD_ALLOWED_USERS. Verifica que sean arrays JSON válidos con corchetes: [123456789].

Artículos relacionados

Tags:

#LLM
#MCP
#Nanobot IA
#Inteligencia Artificial
#Coolify
#OpenClaw
#Agentes de IA
#Automatización
#Nanobot

¿Listo para Transformar tu Proyecto?

Si este artículo te ha sido útil y buscas llevar tu presencia digital al siguiente nivel, nuestro equipo de expertos está preparado para ayudarte.

Preguntas Frecuentes del Artículo

Resolvemos las dudas específicas sobre este tema.

Artículos relacionados