Cloudflare Load Balancer es excelente, pero es un producto de pago. Si tu caso de uso es "Tengo dos réplicas detrás de Cloudflare Tunnel y solo quiero failover si una falla", puedes implementar un balanceador de carga simple en el edge usando un Cloudflare Worker en el nivel gratuito.
La idea central es:
- Expón dos nombres de host diferentes, uno por túnel (primario y réplica).
- Expón un tercer nombre de host (el que compartes con los usuarios) que apunte al Worker.
- El Worker realiza comprobaciones de salud y redirige cada solicitud al mejor destino.
Arquitectura (recomendada)
Normalmente, querrás 3 nombres de host:
servicio.tudominio.com:- Apunta al Worker (esta es la URL pública).
servicio-principal.tudominio.com:- Cloudflare Tunnel que apunta a tu servidor principal.
servicio-replica.tudominio.com:- Cloudflare Tunnel que apunta a tu servidor réplica.
Esto soluciona una limitación común de Cloudflare Tunnel: no puedes vincular el mismo nombre de host a múltiples túneles, pero sí puedes vincular diferentes nombres de host y colocar un Worker frente a ellos.
Cómo funciona el Worker
- Mantiene un mapa en memoria
serverHealthcon:healthy: último estado de salud conocido.lastCheck: marca de tiempo de la última comprobación de salud.
- En cada solicitud entrante:
- Actualiza el estado de salud si la caché es más antigua que
HEALTH_CHECK_INTERVAL. - Elige el primer servidor saludable.
- Si ninguno está saludable, retrocede al primer servidor.
- Actualiza el estado de salud si la caché es más antigua que
- Agrega un encabezado
X-Served-Bypara depuración. - Si la solicitud
fetchdel proxy falla, reintenta una vez contra el otro servidor.
Detalle importante: la caché se almacena en la memoria aislada del Worker. Eso significa que no es una caché global garantizada (puede reiniciarse en arranques en frío). Para un failover simple, esto suele estar bien.
El código
Reemplaza las URLs de los túneles a continuación con las tuyas.
Configuración (paso a paso)
-
Crea dos nombres de host para los túneles
- Nombre de host del túnel principal:
servicio-principal.tudominio.com - Nombre de host del túnel réplica:
servicio-replica.tudominio.com
- Nombre de host del túnel principal:
-
Crea un Worker
- Panel de control de Cloudflare
- Workers & Pages
- Crear Worker
- Pega el código y actualiza la lista
SERVERS
-
Dirige tu nombre de host público al Worker
Agrega una ruta (o un dominio personalizado) para que
servicio.tudominio.com/*sea manejado por este Worker. -
Prueba qué servidor está atendiendo las solicitudes
Busca
X-Served-Byen los encabezados de la respuesta. -
Prueba el failover
Detén temporalmente el túnel principal y vuelve a intentar la misma solicitud. El encabezado debería cambiar a tu réplica.
Notas y limitaciones
- Aplicaciones con estado: si tu servicio almacena estado en disco (sesiones, cargas, historial de chat, etc.), probablemente querrás almacenamiento compartido o sincronización entre el servidor principal y la réplica.
- Endpoint de comprobación de salud: prefiere un endpoint ligero (o
/) y evita lógica pesada. - WebSockets / conexiones de larga duración: dependiendo de tu plan de Cloudflare y del comportamiento de tu aplicación, las conexiones de larga duración pueden requerir atención adicional.
- Alcance de la caché:
serverHealthes memoria aislada, no un almacén de datos global. Si necesitas un estado de salud compartido más confiable, considera KV, Durable Objects o monitoreo externo.
Otra forma de hacerlo
Podrías usar el mismo Tunnel en dos servidores/servicios, por lo que podrías tener un Tunnel llamado "Servicios" y conectarlo a "Servidor A" y "Servidor B". Algunas personas piensan que esta solución es mejor, y en términos de simplicidad, lo es. Pero si quieres separar los Tunnels, Cloudflare Worker Load Balancer es mejor.
Pero si aún quieres un Tunnel en todos tus servidores, aquí está lo que noté sobre tener 1 Tunnel en todas las máquinas: Si usas un Tunnel compartido en todas las máquinas:
Problema: Cloudflare redirigirá jellyfin.dominio.com a CUALQUIER servidor (A, B, C o D aleatoriamente), ¡pero Jellyfin solo está en el Servidor A! 💥 Resultado:- El 75% de las solicitudes resultarán en el error 502 (caerán en el servidor incorrecto)
- Pierdes el control de dónde se ejecuta cada servicio
- Un desastre total
Funciona, pero no se recomienda.
En este caso, LA FORMA CORRECTA de usar réplicas con un solo Tunnel sería compartir un Tunnel solo cuando el MISMO servicio esté replicado en MÁQUINAS MÚLTIPLES:
Escenario 1: Quieres failover desde Open WebUI
Funciona, porque Open WebUI está en los dos servidores.
Escenario 2: Jellyfin solo está en 1 servidor
✅ ¡Correcto! Tunnel dedicado porque Jellyfin solo está en un lugar.
Resumen:
- 1 túnel por máquina: Servicios diferentes en máquinas diferentes.
- 1 túnel en múltiples máquinas: Mismo servicio replicado (failover).
- 1 túnel en todas las máquinas: Nunca (a menos que todos los servicios estén en todas las máquinas).
Recuerda amablemente
No olvides que los datos compartidos deben ser accesibles por todos los servidores, de lo contrario tendrás inconsistencias en los datos. Y hasta que las configuraciones diverjan, o tengas que configurar cada uno de manera diferente.