Saltar al contenido
Chatbots de WhatsApp desde cero
Temario Ir al ejercicio →

Despliegue en Cloudflare

  • ⏱ 55 minutos
  • 📶 Nivel: intermedio
  • 🧩 Incluye ejercicio

💡 🎯 Al terminar esta lección podrás…

  • Crear una cuenta de Cloudflare y autenticar Wrangler en tu computadora.
  • Leer y adaptar wrangler.toml (nombre, KV, cron y variables) sin exponer secretos.
  • Crear el namespace KV y cargar VERIFY_TOKEN, WA_TOKEN y APP_SECRET con wrangler secret put.
  • Comprobar el empaquetado con wrangler deploy --dry-run y describir qué hará el despliegue real.
  • Observar el bot en producción con wrangler tail y revertir con wrangler rollback.

⚠️ INFO REFERENCIAL: revisa los sitios oficiales

Los precios, planes, límites y tarifas de esta lección son solo una referencia (revisados en octubre de 2026) y cambian con frecuencia. Antes de decidir o cobrar a un cliente, confirma siempre en los sitios oficiales de cada proveedor (enlaces al final de la lección).

1.Qué significa «desplegar»

Tu Worker ya corre en tu computadora (lección 10). Desplegar es subirlo a Cloudflare para que viva en una dirección pública con HTTPS, lista para que Meta la llame las 24 horas aunque tu computadora esté apagada.

El proceso tiene cuatro piezas, que ordenaremos en este orden porque cada una depende de la anterior:

CuentaCloudflare
→wrangler login
KV y secretosBOT_KV, tokens
→wrangler deploy
Worker públicoworkers.dev
→wrangler tail
Observarlologs en vivo

⚠️ Importante · Alcance de esta lección

Aquí aprenderás y practicarás todo lo que no gasta ni arriesga nada: instalar, autenticar, revisar la configuración y ejecutar wrangler deploy --dry-run (que empaqueta sin subir). El despliegue real lo harás cuando tengas tus credenciales de Meta (lecciones 12 y 13); los comandos están explicados para que ese día sea mecánico. En el proyecto de referencia, el dry-run se ejecutó y funciona, pero no se ha desplegado contra la nube real.

2.La cuenta de Cloudflare

  1. Entra a dash.cloudflare.com y crea una cuenta con tu correo (es gratuita; no se pide tarjeta para el plan gratuito de Workers, pero verifica las condiciones actuales).
  2. Confirma tu correo.
  3. No necesitas comprar un dominio: Cloudflare te asigna una dirección gratuita del tipo https://nombre-del-worker.tu-subdominio.workers.dev.

⚠️ Importante · Verifica este dato

Los planes, límites y requisitos de la cuenta de Cloudflare (por ejemplo, qué incluye el plan gratuito de Workers y KV) cambian con el tiempo. Revisa Workers: Pricing, Workers: Limits y KV: Pricing antes de decidir.

La primera vez que despliegues, Cloudflare te pedirá elegir un subdominio de workers.dev (el «tu-subdominio» de arriba). Se hace una sola vez por cuenta y forma parte de la URL pública de todos tus Workers, así que elige uno neutro y profesional; si trabajas para clientes, no pongas el nombre de un cliente.

3.Wrangler: instalar y autenticar

Wrangler es la línea de comandos oficial de Cloudflare para Workers. En el proyecto de referencia ya viene como dependencia de desarrollo (devDependencies), así que basta:

Terminal
cd codigo
npm install
npx wrangler --version
Salida esperada
 ⛅️ wrangler 4.148.0

Usamos npx wrangler (la copia local del proyecto) para que todos usen la misma versión. Después autentica tu cuenta:

Terminal
npx wrangler login

Se abre el navegador, inicias sesión en Cloudflare y autorizas a Wrangler (usa OAuth: no copias contraseñas ni claves). Wrangler guarda un token en una carpeta de configuración de tu usuario. Para comprobar con quién estás conectado:

Terminal
npx wrangler whoami

Verás tu correo, el nombre de la cuenta y su Account ID (un identificador, no un secreto, pero tampoco hace falta publicarlo). Para cerrar sesión, npx wrangler logout.

📌 Nota · Computadoras compartidas

Si trabajas en un equipo que no es tuyo, cierra la sesión al terminar (wrangler logout). El token de Wrangler permite desplegar en tu cuenta.

4.Leer wrangler.toml

wrangler.toml es el archivo donde le dices a Cloudflare qué es tu Worker. Este es el del proyecto, con sus comentarios:

wrangler.toml
name = "bot-minimarket"
main = "src/worker.js"
compatibility_date = "2026-09-01"

# KV: guarda sesiones, pedidos y los ids de mensajes ya procesados.
[[kv_namespaces]]
binding = "BOT_KV"
id = "00000000000000000000000000000000"          # id de EJEMPLO: reemplázalo
preview_id = "11111111111111111111111111111111"  # id de EJEMPLO para wrangler dev

# Cron: cada 15 minutos corre scheduled() (recordatorios).
[triggers]
crons = ["*/15 * * * *"]

# Variables NO secretas.
[vars]
WA_PHONE_ID = "000000000000000"   # id de EJEMPLO
Línea Qué hace
name Nombre del Worker; forma parte de la URL (bot-minimarket.<subdominio>.workers.dev).
main Archivo de entrada. Wrangler empaqueta worker.js y todo lo que importa.
compatibility_date Fija el comportamiento del entorno de ejecución a una fecha, para que las actualizaciones de Cloudflare no cambien tu Worker por sorpresa.
[[kv_namespaces]] Conecta la variable env.BOT_KV con un almacén KV real, identificado por su id.
[triggers] crons Programa scheduled(); */15 * * * * significa «cada 15 minutos».
[vars] Variables no secretas visibles en el panel. WA_PHONE_ID es un identificador, no una credencial.

Hay una distinción que decide la seguridad de tu bot: variables ([vars], van en el archivo y en Git) frente a secretos (se cargan con un comando y nunca se escriben en archivos que subas). Los tres secretos del bot son:

Secreto Para qué sirve
VERIFY_TOKEN Frase que acuerdas con Meta para verificar el webhook (lección 9).
WA_TOKEN Token de acceso con el que tu bot envía mensajes por la API.
APP_SECRET Secreto de la app de Meta con el que se firman los webhooks (lección 9).

⚠️ Importante · Verifica este dato

Los ids del archivo son de ejemplo (000…, 111…). El despliegue real fallará hasta que los reemplaces por los de tu cuenta. Consulta la referencia de configuración de Wrangler por si cambian los nombres de las claves (Cloudflare también admite wrangler.jsonc).

5.Crear el KV de verdad

El KV es la memoria del bot. Hasta ahora, en local, Wrangler usaba uno simulado. En la nube necesitas uno real. Un solo comando lo crea:

Terminal
npx wrangler kv namespace create BOT_KV

Wrangler crea el namespace en tu cuenta y te muestra su id (una cadena de 32 caracteres hexadecimales). Dos formas de usarlo:

Haz esto una sola vez. El preview_id de ejemplo solo importa si usas wrangler dev --remote (contra la nube); en local no hace falta.

💡 Un KV por proyecto

No reutilices el mismo namespace entre bots de clientes distintos: mezclarías sesiones y pedidos. Crea uno por proyecto (BOT_KV en cada wrangler.toml apuntando a ids distintos).

6.Cargar los secretos

Cada secreto se carga con wrangler secret put. El comando te pide el valor por teclado (no se muestra ni queda en el historial de la terminal, a diferencia de pegarlo en una línea de comando):

Terminal
npx wrangler secret put VERIFY_TOKEN
npx wrangler secret put WA_TOKEN
npx wrangler secret put APP_SECRET

Para VERIFY_TOKEN inventas una frase larga y aleatoria (por ejemplo, tres o cuatro palabras al azar más un número) y la guardas en tu gestor de contraseñas: la volverás a escribir en el panel de Meta. Para WA_TOKEN y APP_SECRET los valores vienen de Meta, y los obtendrás en las lecciones 12 y 13.

Si cargaste todo, puedes ver solo los nombres (nunca los valores):

Terminal
npx wrangler secret list

Otras dos operaciones útiles: npx wrangler secret delete NOMBRE para borrar uno y npx wrangler secret bulk archivo.json para cargar varios de una vez (hasta 100).

⚠️ Importante · Qué pasa si un secreto se filtra

Si pegas un token en un chat, lo subes a Git o lo muestras en pantalla, considéralo comprometido: revócalo o regenéralo en Meta, y vuelve a cargarlo con wrangler secret put. Cambiar un secreto no requiere cambiar el código. Más sobre esto en la lección 24.

Y en tu computadora sigues usando .dev.vars (que nunca se sube). No son lo mismo: .dev.vars es para wrangler dev en local; wrangler secret put es para la nube.

7.Probar el empaquetado: wrangler deploy --dry-run

Antes de subir nada, pídele a Wrangler que haga todo menos subir. --dry-run compila, comprueba la configuración y se detiene. No toca tu cuenta ni pide credenciales de red:

Terminal
npx wrangler deploy --dry-run
Salida esperada
 ⛅️ wrangler 4.148.0
────────────────────
Total Upload: 49.42 KiB / gzip: 13.76 KiB
Your Worker has access to the following bindings:
Binding                                                 Resource                  
env.BOT_KV (00000000000000000000000000000000)           KV Namespace              
env.WA_PHONE_ID ("000000000000000")                     Environment Variable      

--dry-run: exiting now.

Esta es la salida real del proyecto. Léela como una auditoría:

Si añades --outdir dist, Wrangler deja el paquete resultante en esa carpeta para que lo inspecciones. Con el bot de referencia se generan worker.js (unos 50 KB) y worker.js.map.

Terminal
npx wrangler deploy --dry-run --outdir dist

8.El despliegue real

Cuando tengas el KV creado con su id en wrangler.toml y los secretos cargados, desplegar es un comando (no lo ejecutes todavía; ahora solo comprende lo que hará):

Terminal
npx wrangler deploy

Wrangler va a:

  1. empaquetar el Worker (como en el dry-run),
  2. subirlo a tu cuenta,
  3. publicarlo en https://bot-minimarket.<tu-subdominio>.workers.dev,
  4. registrar el cron */15 * * * *,
  5. imprimir la URL final y un id de versión (anótalo: sirve para revertir).

📌 Nota · Variables al desplegar

Por defecto, wrangler deploy reemplaza las variables del panel por las de wrangler.toml. Si editaste variables a mano en el panel de Cloudflare y no quieres perderlas, existe la opción --keep-vars. Los secretos no se ven afectados.

Con la URL en mano, repetirás con el Worker real las pruebas de la lección 10:

Terminal
curl -s https://bot-minimarket.<tu-subdominio>.workers.dev/salud

La respuesta esperada es {"ok":true}. Después, la verificación del webhook con tu token real (cambia los datos):

Terminal
curl -s -w ' [%{http_code}]\n' "https://bot-minimarket.<tu-subdominio>.workers.dev/webhook?hub.mode=subscribe&hub.verify_token=TU_FRASE&hub.challenge=1158201444"

La respuesta esperada es 1158201444 [200]. Esa misma URL, terminada en /webhook, es la que pegarás en el panel de Meta en la lección 13.

9.Ver qué pasa: wrangler tail

Un Worker en producción no tiene «terminal». Para ver sus console.log y console.error mientras funciona, usas tail, que transmite los registros en vivo a tu terminal:

Terminal
npx wrangler tail bot-minimarket

Mientras llegan mensajes verás cada petición y los errores que ya conoces: Mensaje fallido ..., Error procesando webhook: .... Algunas opciones de tail (están en npx wrangler tail --help):

Opción Para qué
--format pretty o json Cómo se muestra cada registro.
--status error Solo las invocaciones con error.
--method POST Solo las peticiones POST.
--search "texto" Solo los registros cuyo console.log contiene ese texto.

💡 Qué registrar y qué no

En los registros escribe identificadores (el wamid, el id de pedido), nunca el texto completo de la conversación ni datos personales. Los registros pueden ser vistos por varias personas y tienen su propia retención. Ya lo hace el bot: console.error('Mensaje fallido', evento.id, evento.errores).

Cloudflare también ofrece un panel de Observability (registros históricos) en su sitio web; sus opciones cambian con frecuencia, así que consúltalo en la documentación de Workers Logs cuando lo necesites.

10.Volver atrás: versiones y rollback

Todo despliegue crea una versión nueva. Si publicaste un cambio y el bot empezó a fallar, no hace falta correr a editar código: vuelve a la versión anterior.

Terminal
npx wrangler deployments list
npx wrangler rollback <id-de-version>

deployments list muestra los 10 despliegues más recientes con sus ids. rollback publica de nuevo la versión que le indiques (sin ella, vuelve a la anterior). Es tu botón de pánico mientras investigas con calma.

Un hábito sano antes de cada despliegue:

  1. npm test (las 113 pruebas del proyecto en verde).
  2. npx wrangler deploy --dry-run.
  3. npx wrangler deploy.
  4. curl a /salud y un vistazo a wrangler tail.

11.Errores frecuentes

12.Apuntes para llevar

13.Glosario

Término Significado
Desplegar Publicar una nueva versión de tu programa en el servidor para que los usuarios la usen.
workers.dev Dominio gratuito de Cloudflare donde se publica tu Worker.
Binding Conexión entre tu Worker y un recurso (KV, variable, secreto) accesible por env.
Namespace de KV Un «espacio» de almacén clave-valor, con su propio id.
Secreto Valor sensible cargado con wrangler secret put, que no queda en archivos.
Variable Valor no sensible definido en [vars] de wrangler.toml.
--dry-run Ejecuta todo el proceso de empaquetado sin subir nada.
wrangler tail Comando que transmite en vivo los registros del Worker.
Rollback Volver a publicar una versión anterior del Worker.
compatibility_date Fecha que fija la versión del comportamiento del entorno de ejecución.

🧠 Comprueba lo aprendido

Elige una respuesta en cada pregunta. Verás al instante si acertaste y por qué.

¿Dónde debe vivir el valor de APP_SECRET en producción?

¿Qué hace npx wrangler deploy --dry-run?

Ejecutaste el dry-run con los ids de ejemplo del KV y pasó sin errores. ¿Qué pasará con un wrangler deploy real?

¿Para qué sirve npx wrangler tail?

Un despliegue nuevo rompió el bot. ¿Qué haces primero para recuperar el servicio?

📚 Para profundizar (fuentes oficiales)

Este material lo hace un estudiante con ayuda de IA: ante cualquier duda, manda la documentación oficial.

Tu progreso se guarda en este navegador y se refleja en el índice del curso.

💡 🚀 ¡Ahora te toca!

La práctica fija lo aprendido. Pasa al ejercicio de esta lección.

Ir al ejercicio