Fanstía
Volver a proyectos
Vivo2026

Public URL (Cloudflare)

App nativa Electron + Express que envuelve cloudflared para exponer cualquier puerto local a internet. Multi-túnel, persistencia, QR, bandeja del sistema, detección Docker y named tunnel (credenciales).

RolSolo builder
AutoresRuFFyGTLP
Captura de Public URL (Cloudflare)

Descripción

Aplicación de escritorio que descarga y orquesta el binario cloudflared con una GUI moderna. Pensada para developers que necesitan exponer un puerto local a internet sin tocar la línea de comandos. Cada túnel es un proceso cloudflared independiente, con estado propio, auto-restart con backoff, puerto de métricas auto-asignado, QR por túnel, notificación nativa al arrancar y bandeja del sistema con menú contextual. Detecta automáticamente servers en localhost:3000/3456/8080 y contenedores Docker con cloudflared corriendo, e importa túneles externos con un click. Persiste túneles y settings en userData, se restauran al reabrir. La integración con cuenta Cloudflare (named tunnel) aprovisiona credenciales vía API; el modo tunnel run con URL propia queda pendiente.

La historia

Nació de la fricción de arrancar el stack de Fantasía a mano cada vez: editar el .bat, ejecutarlo como admin, esperar la URL trycloudflare.com, copiarla. Y cuando algo cambiaba (un reinicio, una caída), vuelta a empezar. La app nació para eliminar esa fricción: arranca sola, detecta el server, levanta el túnel, lo persiste, lo muestra en la bandeja, te lo notifica, y hasta te genera el QR para abrirlo en el móvil. El valor real no es el túnel (eso lo hace cloudflared), es toda la orquestación alrededor: descarga del binario, asignación de puertos de métricas, auto-restart, persistencia, detección de túneles externos, y el multi-túnel (puedes tener 10 túneles a la vez, uno por puerto). El siguiente paso lógico es el named tunnel real con tu dominio, ya tienes la integración API hecha. Cuando Cloudflare asigne URL fija por tunnel, la app pasa de ser útil a ser indispensable.

Cómo se construyó

Electron con main process en src/main.js y renderer en renderer/ (HTML+CSS+JS vanilla, sandbox). IPC seguro vía preload.js con contextBridge. El orquestador delega: bootstrap.js inicializa stores y managers, ipc-handlers.js registra todos los ipcMain.handle(), y los managers (TunnelManager, CloudflaredManager, TrayManager, WindowManager) encapsulan su responsabilidad. TunnelManager mantiene un Map de TunnelInstance; cada instancia spawna su cloudflared con ['tunnel', '--no-autoupdate', '--url', target, '--metrics', 'localhost:N'] y parsea stdout/stderr con readline + regex TRYCF_RE hasta que aparece la URL. cloudflared-manager.js descarga el binario por SO al primer arranque. state-store.js persiste túneles a <userData>/state/state.json. external-detector.js escanea procesos del host + contenedores Docker con cloudflared. server-detector.js auto-detecta servers en puertos comunes.

Resultados

  • Multi-túnel: hasta N procesos cloudflared simultáneos, aislados, con estado individual
  • Persistencia: túneles, etiquetas, auto-arranque y URL pública de externos en <userData>/state/state.json
  • Auto-restart con backoff: el túnel se recupera solo si cloudflared cae (maxRestarts configurable)
  • QR por túnel: abre la URL en el móvil en 1 segundo sin escribirla
  • Bandeja del sistema con menú contextual: list de túneles activos, abrir/cerrar, salir
  • Notificaciones nativas al arrancar/caer (sin duplicados, lastNotifiedUrl map)
  • Auto-detección: server-detector busca servers en :3000/:3456/:8080, external-detector escanea cloudflared del host + Docker
  • Importar túneles externos (los que tú no controlas) y mostrar su URL si la exponen
  • Configuración opcional con cuenta Cloudflare: lista/crea named tunnels vía API, guarda credenciales en userData
  • Empaquetable: portable .exe (Windows), .dmg (Mac), AppImage (Linux) con electron-builder
  • Docker: Xvfb + X11 para correr en contenedor headless, nginx demo incluído

Stack

Electron 31Express 4.19qrcode 1.5cloudflared (binario, descarga automática por SO)Docker detectionvanilla HTML/CSS/JS (sin framework)electron-builder (portable .exe / .dmg / AppImage)

Enlaces