Skip to main content

Todo bot

Runtime

  • Node.js 22 o superior, y tu app es ESM ("type": "module" en el package.json, o archivos .mjs). Los paquetes no traen build de CommonJS.
  • Un gestor de procesos reinicia el bot cuando termina: PM2, systemd, restart: unless-stopped de Docker o tu orquestador. Ver Despliegue.
  • Apagado ordenado: ante SIGTERM/SIGINT, llama a await bot.stop({ drain: true, timeout: '15s' }) para que las respuestas en vuelo se envíen y se registren antes de que el proceso termine (Apagado ordenado).
  • Fija las versiones (commitea el lockfile). Mientras los paquetes estén en beta, lee las páginas de migración antes de cada actualización.

Estado

  • Un store persistente. El MemoryStore por defecto guarda todo en RAM. Usa SQLiteStore para un proceso o RedisStore para varios (Store persistente).
  • Pasa la instancia del store: store: new SQLiteStore({ file }). Un string como store: 'sqlite' se acepta por compatibilidad, pero sigue creando un MemoryStore.
  • Los flujos de varios pasos son .persistent(), para que un usuario a mitad de un flujo lo retome tras un reinicio (Flujos).
  • En Node.js 24.19 o superior, usa better-sqlite3 13 con SQLiteStore (por qué).
  • Volúmenes y copias de seguridad: la carpeta de la sesión de WhatsApp (sessions/) y la de datos (data/) están en disco persistente y se respaldan juntas (Copias de seguridad).

Secretos

  • Los tokens, claves de API y secretos de webhook salen del entorno (o de tu gestor de secretos), nunca del código. El framework no lee ninguna variable de entorno por su cuenta: tú las pasas a las opciones del provider (Variables de entorno).
  • sessions/, .env, *.db y *.qr.png están en .gitignore y nunca se copian a una imagen de Docker.

Webhooks (Cloud API, webhook de Telegram, Twilio…)

  • Servidos por HTTPS y con la verificación de firma del canal configurada (appSecret, webhookSecret…). Nunca pongas allowUnsignedWebhooks: true en producción (Seguridad).
  • La firma se comprueba sobre el body crudo: no pongas un parser de JSON delante de la ruta del webhook (Servidor de webhooks).

Observabilidad

  • Logs: pasa tu propio logger de pino (o deja el integrado, que registra desde warn). Los ids de chat y de remitente van hasheados en los logs por defecto (logIds: 'hash'); déjalo así fuera de la depuración local.
  • Errores: escucha bot.on('error', …) y envíalos a tu sistema de seguimiento de errores.
  • Salud y métricas: expón un endpoint de liveness/readiness y bot.metrics() en formato Prometheus (Comprobaciones de salud, Operación).

Límites de los canales

  • WhatsApp con Baileys: deja activado el rate limiter del provider y evita los envíos masivos no solicitados (Rate limiting).
  • Cloud API: respuestas libres solo dentro de la ventana de 24 horas; fuera de ella, plantillas (Ventana de 24 h de WhatsApp).
  • Crecimiento del log de mensajes: los stores persistentes guardan todos los mensajes salvo que pongas maxMessagesPerChat (Store persistente).

Cuando necesitas más

Todo esto es opt-in: sin la opción, el bot funciona exactamente igual que antes.

Qué paquetes están publicados

Los 36 paquetes públicos están en npm; algunas páginas describen además paquetes privados que solo viven en el monorepo (el canal de TikTok, @botmesh/manager, el sandbox…), y cada una lo indica. La lista completa, con los tags de npm y cómo instalarlos, está en Paquetes y versiones. Planifica un despliegue de producción sobre los publicados.

Antes de cada versión de tu bot

  • Los tests pasan con createTestBot / MockProvider (Testing).
  • Los archivos o bases de datos del store tienen copia antes de actualizar @botmesh/sqlite-store: una versión anterior no puede abrir un esquema más nuevo (Versiones del esquema).
  • Con réplicas, todas corren una versión que entiende las opciones que activas (por ejemplo coordination.handover.flows: 'forward').