Despliega tu app del Chatfuel wizard: Vercel, Node.js o Docker
Despliega la app del Chatfuel wizard en Vercel, tu servidor Node.js o Docker, decide quién accede y corrige las dos configuraciones que el servidor rechaza.
Última actualización
La app que escribe el Chatfuel wizard funciona en Vercel, en tu propio servidor Node.js o en Docker, con el mismo código. El host decide quién gestiona TLS y cuánto tiempo permanece abierto un WebSocket; no decide quién puede usar la app. Esa segunda pregunta va primero, porque la app se comunica con Chatfuel con tu token de API personal: quien llegue a la app actúa con el acceso de ese token, salvo que el módulo auth le pida iniciar sesión.
Cómo desplegar en Vercel
El wizard ofrece un despliegue en Vercel al final de su ejecución. Más adelante, ejecútalo desde el directorio de la app:
npm run deployEl script de despliegue (scripts/deploy-vercel.mjs en tu app) usa la CLI de Vercel: comprueba que hayas iniciado sesión, vincula el proyecto, envía las variables de tu .env al proyecto de Vercel, despliega y le pregunta al nuevo despliegue si quedó configurado. Tu archivo .env local nunca se sube; las variables viven en el proyecto de Vercel.
- Solicitudes: el proxy se ejecuta como una función de Vercel detrás de una reescritura de
/chatfuel/*. - Actualizaciones en tiempo real: un WebSocket dura lo mismo que la duración máxima de la función; después, la app se vuelve a conectar sola.
- Ruta: la app se sirve desde la raíz del dominio; una subruta como
/app/necesita un servidor Node.js o Docker.
Cómo ejecutar la app en tu propio servidor Node.js
npm run build && npm startnpm run build compila la app del navegador y el servidor. npm start ejecuta un solo servidor Node.js que sirve la app compilada y el proxy /chatfuel/* en el puerto 3000 (define PORT para cambiarlo y HOST para elegir la interfaz). Pon delante un proxy inverso con TLS, como nginx o Caddy.
Cómo ejecutar la app en Docker
La app incluye un Dockerfile que compila la app e inicia el mismo servidor Node.js en el puerto 3000. Pasa los valores públicos VITE_* como argumentos de compilación y todos los secretos en tiempo de ejecución, por ejemplo con docker run --env-file .env. Nunca pases CHATFUEL_TOKEN ni otro secreto como argumento de compilación: los argumentos de compilación siguen siendo legibles en la imagen.
Quién puede acceder a la app desplegada
Sin el módulo auth, la app no tiene inicio de sesión: el proxy reenvía cada solicitud que recibe con tu token de API personal. Cualquiera que abra la URL puede leer conversaciones y contactos, enviar mensajes como el bot y cambiar la configuración, aunque el token en sí nunca sale del servidor. Esa configuración sirve para una herramienta de tu propio equipo, fuera del internet público:
- en una VPN, una red de Tailscale o WireGuard, o detrás de una lista de IP permitidas de la oficina;
- detrás del control de acceso de tu host, como Vercel Deployment Protection,
auth_basicde nginx o Cloudflare Access; - solo en
localhost, que es lo que te danpm run dev.
Una app que clientes o empleados abren desde internet necesita el módulo auth: cada persona inicia sesión con tu proyecto de Supabase antes de que el proxy reenvíe nada. Agrégalo con npx @chatfuel/wizard --embed. Módulos del wizard describe auth.
Qué configuraciones se niega a ejecutar el servidor
El servidor rechaza dos configuraciones en lugar de advertir sobre ellas. npm start muestra REFUSING TO SERVE y no se inicia, el servidor de desarrollo de Vite con --host se detiene antes de montar el proxy, y la función de Vercel responde 503 con el código ProxyRefusedToServe a todo excepto a la comprobación de estado.
- Sin inicio de sesión en un host que no es loopback. El servidor escucha en todas las interfaces de forma predeterminada y, sin
auth, cualquiera que pueda llegar a él usa tu token. Corrígelo de una de tres formas: instala el móduloauth, vincula el servidor a loopback conHOST=127.0.0.1o, cuando algo delante de la app ya autentica a cada visitante, defineCHATFUEL_OPEN_PROXY=1para confirmar que la configuración abierta es intencional. ALLOWED_ORIGINS=*en un host que no es loopback, con o sin inicio de sesión. DefineALLOWED_ORIGINScon los orígenes que sirven la app, separados por comas, por ejemplohttps://app.example.com.CHATFUEL_OPEN_PROXYno cubre este caso.
Cómo comprobar un despliegue y proteger el panel de administración
/chatfuel/healthz responde en todos los hosts. Devuelve {"ok":true} con el estado 200 cuando el servidor está configurado, o {"ok":false} con 503 cuando la configuración tiene un problema. Si recibes una página HTML como respuesta, la ruta es incorrecta.
El módulo admin agrega un panel en /admin que puede cambiar toda la cuenta detrás del token. ADMIN_PASSWORD es su única protección y debe tener al menos 16 caracteres; si no, el panel se niega a funcionar. Con el módulo auth instalado, define también SUPABASE_SERVICE_ROLE_KEY para que todas las instancias del servidor compartan un mismo conteo de contraseñas incorrectas; en Vercel, donde puede responder cualquier instancia activa, de lo contrario el conteo se lleva por separado en cada instancia.
Reglas que debe cumplir todo host
- Las rutas desconocidas responden con
index.html. Cada pantalla tiene una dirección real, como/deals, y al recargar se debe volver a ella. El servidor Node.js y elvercel.jsonincluido ya lo hacen; en nginx usatry_files $uri /index.html;. - Las variables
VITE_*se fijan en tiempo de compilación; todas las demás variables las lee el servidor en tiempo de ejecución. Después de cambiar un valorVITE_*, vuelve a compilar. Una app del navegador compilada con la configuración de Supabase y un servidor iniciado sin ella, o al revés, falla al iniciar sesión conProxyAuthMisconfiguredoAuthSessionRequired. - Los secretos se quedan en el servidor. Nada con nombre
VITE_*puede guardar un secreto, porque esos valores se compilan dentro del código del navegador.
Problemas comunes
REFUSING TO SERVE: open mode on a host that is not loopback
El servidor se ejecuta sin el módulo auth en una dirección a la que otros pueden llegar. Instala auth, define HOST=127.0.0.1 o define CHATFUEL_OPEN_PROXY=1 cuando tu propio control de acceso ya está delante de la app.
REFUSING TO SERVE: ALLOWED_ORIGINS is '*'
Reemplaza * por los orígenes exactos de tu app, por ejemplo ALLOWED_ORIGINS=https://app.example.com, y reinicia el servidor.
ADMIN_PASSWORD must be at least 16 characters. Set a longer one and restart.
El panel de administración rechaza una contraseña corta. Define un ADMIN_PASSWORD más largo en el entorno del servidor, o en el proyecto de Vercel, y reinicia o vuelve a desplegar.
Módulos del Chatfuel wizard: qué hace cada parte de la app
Los módulos que puede instalar el Chatfuel wizard, qué agrega cada uno a tu app, cuáles tienes que pedir y cómo elegirlos con --modules.
Agentes de programación y skills en una app del Chatfuel wizard
El Chatfuel wizard instala una skill por módulo para Claude Code o Codex, crea CLAUDE.md o AGENTS.md y pasa la app a tu agente con una lista de verificación.