Skip to content

Cómo ejecutar aplicaciones Streamlit en el puerto 80

Streamlit es una herramienta potente que permite a los desarrolladores crear aplicaciones web interactivas con poco problema. Sin embargo, no está exenta de desafíos, especialmente cuando se trata de la configuración. Uno de los problemas que se encuentran con frecuencia es la ejecución de aplicaciones en el puerto 80. En esta guía exhaustiva, profundizamos en el tema, basándonos en experiencias de usuario, conocimientos de expertos y ejemplos prácticos para ayudarte a enfrentar este desafío con confianza.

¿Quieres crear de forma gratuita una aplicación de análisis de datos y visualización de datos con Streamlit?

PyGWalker (opens in a new tab) es una biblioteca de Python que te ayuda a incrustar fácilmente una interfaz similar a Tableau en tu propia aplicación de Streamlit sin esfuerzo. ¡Mira este increíble video producido por Cómo explorar datos con PyGWalker en Python (opens in a new tab) que demuestra los pasos detallados para potenciar tu aplicación de Streamlit con esta potente biblioteca de visualización de datos en Python!


¡Un agradecimiento especial a Sven y su gran contribución (opens in a new tab) a la comunidad de PyGWalker!

Además, también puedes visitar la página de GitHub de PyGWalker (opens in a new tab) para obtener más ejemplos de PyGWalker.

Parte 1: El desafío de configurar Streamlit para ejecutarse en el puerto 80

En mayo de 2022, un usuario de la comunidad de Streamlit, llamado Nom_ji, encontró un problema al intentar ejecutar una aplicación en el puerto 80. A pesar de seguir los pasos de configuración adecuados, como se detalla en la documentación oficial de Streamlit, Nom_ji se encontró con un PermissionError: [Errno 13] al implementar la aplicación en el puerto 80.

Curiosamente, la aplicación se ejecutaba perfectamente en los puertos 8051 y 8080. Esto nos lleva al primer punto clave:

  • No todos los puertos son iguales. Los puertos por debajo de 1024, incluido el puerto 80, se consideran privilegiados en sistemas operativos tipo Unix y generalmente requieren acceso de superusuario (o root).

En respuesta al problema de Nom_ji, Randyzwitch, el antiguo responsable de relaciones con desarrolladores en Streamlit, sugirió asegurarse de que el puerto 80 no estuviera ocupado por otra instancia. Se puede verificar si hay instancias existentes en un puerto utilizando el comando netstat en la terminal:

sudo netstat -tuln | grep :80

Este comando mostrará cualquier servicio que se esté ejecutando actualmente en el puerto 80. Si el comando devuelve alguna salida, significa que el puerto 80 ya está en uso y deberás detener el otro servicio antes de poder ejecutar tu aplicación Streamlit en este puerto.

Parte 2: Explorando más a fondo la asignación de puertos en Streamlit

Otro problema que pueden enfrentar los usuarios de Streamlit es ejecutar múltiples aplicaciones Streamlit al mismo tiempo, cada una que requiere su propio puerto único. BeyondMyself, moderador de la comunidad de Streamlit, proporcionó una solución sencilla a esto: especificar el parámetro --server.port al iniciar la aplicación.

Por ejemplo, el comando streamlit run myapp.py --server.port 8080 ejecutará la aplicación Streamlit definida en myapp.py en el puerto 8080. Puedes utilizar cualquier número de puerto disponible en lugar de 8080, siempre que no esté en uso.

Por lo tanto, al planificar ejecutar múltiples aplicaciones Streamlit, asegúrate de:

  • Asignar números de puerto únicos a cada aplicación.
  • Asegurarte de que el puerto elegido no esté ya en uso por otro servicio.

Parte 3: Hacer que las aplicaciones Streamlit parezcan ejecutarse en puertos estándar

Si bien puedes elegir ejecutar tus aplicaciones Streamlit en cualquier puerto disponible, puede haber situaciones en las que desees que la aplicación parezca ejecutarse en un puerto estándar (como el 80) al acceder a través de un dominio. Aquí es donde entra en juego el concepto de proxy inverso.

Un proxy inverso puede redirigir las solicitudes de un servidor web, como Apache o Nginx, al puerto donde se está ejecutando tu aplicación Streamlit. Esto se puede configurar de varias formas:

  • Redirigir todas las solicitudes de tu dominio a tu aplicación Streamlit.
  • Configurar tu servidor web para redirigir solicitudes de subdirectorios específicos a diferentes aplicaciones Streamlit.

Por ejemplo, si tienes múltiples aplicaciones Streamlit en ejecución en diferentes puertos, podrías redirigir mydominio.com/app1 a la aplicación Streamlit que se ejecuta en el puerto 8000 y mydominio.com/app2 a la aplicación en el puerto 8080. Esta configuración hace que parezca que las aplicaciones se están ejecutando en el puerto 80 desde la perspectiva del usuario.

Parte 4: Establecer un número de puerto fijo para las aplicaciones Streamlit

Por último, es posible que desees fijar el número de puerto para tus aplicaciones Streamlit, lo que te permitirá compartir un enlace estable con los miembros de tu equipo o usuarios. Aquí es donde entra en juego el archivo ./streamlit/config.toml.

En el archivo config.toml, puedes especificar el número de puerto fijo. Por ejemplo:

[server]
port = 8501

Esta configuración le indica a Streamlit que siempre use el puerto 8501 al ejecutar tu aplicación. Ten en cuenta que este puerto no debe estar en uso por otro servicio, o la aplicación no se ejecutará correctamente.

Para resumir:

  • Asegúrate de tener acceso de superusuario para los puertos privilegiados.
  • Verifica si hay instancias existentes en un puerto utilizando netstat.
  • Utiliza el parámetro --server.port para ejecutar múltiples aplicaciones.
  • Emplea proxies inversos para que las aplicaciones parezcan ejecutarse en el puerto 80.
  • Usa el archivo config.toml para fijar el número de puerto.

Parte 5: Solución de errores comunes

Aunque sigas los pasos detallados, es posible que aún encuentres errores, como el error "el puerto está reservado". Este error suele aparecer cuando otro proceso no se ha cerrado correctamente o cuando hay algo más ejecutándose en el puerto que estás intentando utilizar.

Para investigar si un puerto está ocupado, puedes utilizar el comando netstat. A continuación, se muestra un fragmento de código sencillo que te permite comprobar si se está utilizando un puerto específico (en este caso, el puerto 80):

netstat -tuln | grep :80

En la salida, si ves el número de puerto deseado en la lista, significa que el puerto está ocupado. En los sistemas Linux, también puedes utilizar el comando lsof para averiguar qué proceso está utilizando un puerto específico:

sudo lsof -i :80

Una vez que identifiques el proceso, puedes finalizarlo utilizando el comando kill:

kill -9 PID

Reemplaza PID por el ID del proceso que obtuviste del comando anterior.

Si estás seguro de que nada más está utilizando el puerto y sigues encontrando el error, puede que sea debido a un problema con la configuración de red de tu sistema operativo. En este caso, considera buscar ayuda de un profesional de TI o de la comunidad de Streamlit.

Parte 6: Mantener actualizadas las aplicaciones Streamlit

Otro desafío al que te puedes enfrentar es asegurarte de que tu aplicación de Streamlit siempre muestre datos actualizados. Esto es especialmente importante si tu aplicación muestra datos en vivo o se actualiza con frecuencia. La solución a este desafío se encuentra en la caché de Streamlit.

El mecanismo de caché de Streamlit permite que tu aplicación almacene datos en memoria, por lo que no es necesario cargarlos desde el disco o buscarlos en un servidor remoto cada vez que se ejecuta la aplicación.

Al utilizar el decorador @st.cache en tus funciones de carga de datos, puedes mejorar significativamente la velocidad y capacidad de respuesta de tu aplicación. Por ejemplo, si tienes una función que obtiene datos de un servidor remoto, puedes agregar el decorador @st.cache encima de la función de esta manera:

@st.cache
def obtener_datos():
    # obtener datos del servidor remoto
    return datos

Con esto, Streamlit almacenará los datos devueltos en su caché. Cuando se vuelva a llamar a la función, Streamlit primero comprobará si los datos están en su caché. Si es así, Streamlit utilizará los datos en caché en lugar de llamar a la función nuevamente.

Además, Streamlit proporciona el parámetro ttl que puedes usar para especificar cuánto tiempo deben ser almacenados en caché los datos. Si estableces ttl en cierto número de segundos, Streamlit actualizará automáticamente los datos en caché después de esa duración.

Aquí tienes un ejemplo de cómo usar el parámetro ttl en tu función:

@st.cache(ttl=60*60*2)
def obtener_datos():
    # obtener datos del servidor remoto
    return datos

En este ejemplo, el ttl se establece en dos horas (60 segundos * 60 minutos * 2), lo que significa que Streamlit actualizará automáticamente los datos cada dos horas.

Conclusión

Ejecutar aplicaciones de Streamlit en el puerto 80 no es tan sencillo como podría parecer, debido a la naturaleza privilegiada del puerto y otros problemas potenciales como puertos ocupados o permisos. Pero con las ideas que hemos discutido en esta guía, deberías estar bien preparado para enfrentar estos desafíos.

Recuerda, cuando te encuentres con dificultades, no dudes en recurrir a la comunidad de Streamlit. Está llena de personas conocedoras que probablemente hayan enfrentado problemas similares y estarán más que dispuestas a ayudar.

Preguntas frecuentes

1. ¿Por qué no puedo ejecutar mi aplicación de Streamlit en el puerto 80?

Los puertos por debajo de 1024, incluyendo el puerto 80, se consideran privilegiados en sistemas operativos similares a Unix y normalmente requieren acceso de superusuario (o root). Asegúrate de tener los permisos necesarios y de que el puerto no esté ocupado.

2. ¿Cómo puedo ejecutar múltiples aplicaciones de Streamlit simultáneamente?

Puedes ejecutar múltiples aplicaciones de Streamlit especificando diferentes números de puerto para cada aplicación utilizando el parámetro --server.port al iniciar la aplicación.

3. ¿Cómo puedo mantener actualizados los datos de mi aplicación de Streamlit?

Puedes utilizar el decorador @st.cache en tus funciones de carga de datos para almacenar los datos en memoria, mejorando la velocidad y capacidad de respuesta de tu aplicación. Streamlit también proporciona el parámetro ttl para especificar cuánto tiempo deben ser almacenados en caché los datos.