- scripts/Invoke-CloudflareApi.ps1: control de tunnel/DNS via API - scripts/Install-CoolifyAutostart.ps1 + scripts/host/: autostart de LXC 102 + tunnel tras corte - scripts/Apply-ChatwootEnterprisePatch.ps1: parche enterprise (autodetecta creds) - Deploy-SoloLeveling.ps1: deploy build-on-server verificado - docs/runbooks/cloudflare-tunnel.md y autostart-coolify.md - docs/casos/chatwoot-enterprise-patch.md (credenciales redactadas) - docs/AGENTS-coolify-apps.md + issues y reportes - deploy_skill/references/coolify-4.1.2-notes.md: hallazgos verificados (seccion 7) - package.json para verify-online.mjs del coolify-deploy skill - .gitignore: excluye .claude/ y .opencode/ (config local de herramientas)
5.5 KiB
ISSUE: cloudflare-tunnel · routing · websocket-tls-handshake
ID: cloudflare-tunnel_routing_websocket-tls-handshake
Tags: cloudflare-tunnel routing websocket tls coolify terminal realtime 6001 6002
Severidad: Alta — terminal de Coolify inoperativa, websockets de la UI rotos
Fecha: 2026-04-11
Síntoma
- La terminal dentro de Coolify muestra
Terminal websocket connection lost - La UI de Coolify se comporta de forma inestable (reconexiones constantes)
- Los logs de
cloudflaredmuestran:
tls: first record does not look like a TLS handshake
originService=https://192.168.0.117:6001
tls: first record does not look like a TLS handshake
originService=https://192.168.0.117:6002
Causa Raíz
Las rutas del Cloudflare Tunnel para los puertos 6001 (realtime/websocket) y 6002 (terminal/websocket) están configuradas con https:// como prefijo del servicio de origen.
Estos puertos no hablan HTTPS — solo HTTP plano. Cloudflared intenta establecer un handshake TLS con un servicio que responde en texto plano, causando el error.
Dónde vive la configuración (importante)
El túnel está gestionado desde el dashboard de Cloudflare (remotely-managed),
no por el config.yml local. El /etc/cloudflared/config.yml dentro del contenedor
solo tiene el UUID del túnel, las credenciales y el comodín *.urieljareth.org:
tunnel: 5f0e5c5b-a180-46f2-a090-44d151006a62
credentials-file: /etc/cloudflared/credentials.json
ingress:
- hostname: "*.urieljareth.org"
service: https://192.168.0.117:443
- service: http_status:404
Las rutas de coolify.urieljareth.org (incluidas 6001/6002) NO están en ese
archivo — vienen del dashboard/API. La firma de esto en los logs es la línea
INF Updated to new configuration version=N. Consecuencia práctica: este problema
no se arregla editando archivos en el servidor, sino en el dashboard (rápido) o
por la API de Cloudflare (control total — ver runbook).
Configuración Correcta del Tunnel (coolify-tunnel)
El orden importa: Cloudflare evalúa las rutas de arriba hacia abajo. Las rutas específicas deben ir ANTES del comodín.
| # | Dominio | Ruta | Servicio | Protocolo |
|---|---|---|---|---|
| 1 | coolify.dominio.com |
/build/* |
http://192.168.0.117:8000 |
HTTP |
| 2 | coolify.dominio.com |
/app/* |
http://192.168.0.117:6001 |
HTTP ⚠️ |
| 3 | coolify.dominio.com |
/terminal/ws* |
http://192.168.0.117:6002 |
HTTP ⚠️ |
| 4 | coolify.dominio.com |
* |
http://192.168.0.117:8000 |
HTTP |
| 5 | *.dominio.com |
* |
https://192.168.0.117:443 |
HTTPS |
Reglas Críticas
- Los puertos 6001 y 6002 deben usar
http://, nuncahttps:// - La ruta
/terminal/ws*se escribe sin barra final (no/terminal/ws/*) - El comodín
*.dominio.comva siempre al final - El comodín de Coolify (ruta 4) también usa
http://
Diagnóstico
Dentro del CT 102 (referencia):
# Ver errores actuales del tunnel
docker logs cloudflared --tail 30
# Confirmar configuración activa del tunnel
docker logs cloudflared --tail 50 | grep "Updated to new configuration"
Desde este repo (PowerShell, vía el path SSH habitual):
# Errores recientes del túnel
.\scripts\Invoke-ProxmoxSsh.ps1 -Command "pct exec 102 -- docker logs cloudflared --tail 40"
# Configuración activa (toma el version=N más alto)
.\scripts\Invoke-ProxmoxSsh.ps1 -Command "pct exec 102 -- docker logs cloudflared --tail 60" |
Select-String "Updated to new configuration"
En la configuración activa (línea INF Updated to new configuration version=N), verificar que los servicios de 6001 y 6002 digan http:// y no https://. El runbook
runbooks/cloudflare-tunnel.md tiene el procedimiento completo paso a paso.
Solución
- Ir a Cloudflare Zero Trust → Networks → Tunnels → coolify-tunnel → Public Hostnames
- Editar la ruta
/app/*→ cambiar servicio dehttps://IP:6001ahttp://IP:6001 - Editar la ruta
/terminal/ws*→ cambiar servicio dehttps://IP:6002ahttp://IP:6002 - Guardar — Cloudflared aplica el cambio automáticamente sin reinicio
Verificación:
docker logs cloudflared --tail 10
Debe aparecer INF Updated to new configuration version=<N> con los servicios correctos en el JSON.
Notas Adicionales
- Los errores previos en los logs son residuales de conexiones ya abiertas — desaparecen solos
- Si el orden de las rutas también está mal (comodín antes que las específicas), el tráfico de websocket nunca llega a las rutas correctas
- Este error es silencioso desde la perspectiva del usuario — solo ve que la terminal no conecta
Reincidencia verificada (2026-06-03)
El problema volvió a presentarse (Terminal websocket connection lost). Hallazgos
de esa intervención:
- Config activa (
version=14) tenía/app/*(6001) y/terminal/ws/(6002) enhttps://. - Variante observada: la ruta de terminal estaba como
/terminal/ws/(con barra final, sin comodín), además delhttps://— ambos errores juntos. - Solución aplicada desde el dashboard: 6001 y 6002 a
http://, y path de terminal corregido a/terminal/ws*. Cloudflared aplicó solo (version=14 → 15 → 16). - Resultado: terminal de Coolify operativa. Los errores TLS residuales desaparecieron solos.
- Pendiente menor:
app/*quedó sin barra inicial (/app/*sería lo ideal); no es crítico porque el protocolo ya es correcto.