El problema.
Por defecto, Docker abre puertos ignorando las reglas del cortafuegos interno del servidor (como ufw). La solución habitual es establecer reglas de cortafuegos externas a través de tu proveedor de VPS. Pero algunos proveedores no ofrecen este tipo de protección (o te la cobran a precio de oro).

Desde luego eso no es lo que quieres.
La solución
Hay varias opciones. Una es impedir por completo que Docker abra puertos por su cuenta, escribiendo las reglas de iptables de docker antes de instalar docker.
sudo mkdir -p /etc/docker
sudo nano /etc/docker/daemon.json✅ Añade el siguiente contenido y guarda el archivo:
{
"iptables": false
}Pero esto a mí no me funcionó, Docker + Coolify son demasiado tozudos. La mejor forma de avanzar es la siguiente.
Solución alternativa para evitar exponer la IP pública: enrutar a la IP interna.
Una vez que hayas configurado tu dominio para acceder a la interfaz gráfica de Coolify. Puedes editar estos archivos docker compose para enrutarlos a tu IP interna.
Tienes que editar el archivo docker-compose.prod.yml para añadir el enlace a 127.0.0.1.
-
Asegúrate de estar en el directorio
/data/coolify/source. -
Abre el archivo de configuración de producción para editarlo:
nano docker-compose.prod.yml -
Ve a la sección
ports:. Actualmente tiene este aspecto:ports: - "${APP_PORT:-8000}:8080" -
Modifica esa línea añadiendo
127.0.0.1:justo al principio, dentro de las comillas. La variable${APP_PORT:-8000}seguirá funcionando perfectamente.ports: - "127.0.0.1:${APP_PORT:-8000}:8080"
Usar Tailscale
Si prefieres acceder a tu instancia de Coolify a través de una VPN mallada como Tailscale (mi recomendación), tienes que añadir esta línea:
> For Tailscale Access (Primary remote access)
- "1xx.8x.2xx.2x:${SOKETI_PORT:-8000}:8080"- Deja la sección
expose:completamente sin cambios.

- Lo mismo se aplica a los mapeos de puertos del servicio en tiempo real
ports:
# ---- Soketi WebSocket Port (the main one) ----
# For Localhost Access (Emergency)
- "127.0.0.1:${SOKETI_PORT:-6001}:6001"
# For Tailscale Access (Primary remote access)
- "1xx.8x.2xx.2x:${SOKETI_PORT:-6001}:6001"
# ---- Soketi Metrics/API Port (secondary) ----
# For Localhost Access (Emergency)
- "127.0.0.1:6002:6002"
# For Tailscale Access (Primary remote access)
- "1xx.8x.2xx.2x:6002:6002"
# I still keep local route even using Tailscale, in the (very unlikelly) case Tailscale network fails.
-
Guarda el archivo y sal (
Ctrl+X,Y,Enter). -
Reinicia los servicios usando el comando que carga ambos archivos. Esto aplicará tu cambio.
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d --force-recreateACTUALIZACIÓN: durante 2025 I moved to create my own Docker Swarm.
