Desplegar una app de Streamlit
Lizard (lizard.build) ejecuta una app de Streamlit con el mismo comando que usas localmente, streamlit run app.py. Ponlo en una línea web: de un Procfile con --server.address 0.0.0.0 y un puerto fijo como 8501, y luego despliega con lizard up --port 8501. Sin el Procfile, lizardpack inicia python app.py, que imprime una advertencia y termina en lugar de servir la app.
Estado de las pruebas: el ejemplo de abajo funcionó localmente con Streamlit 1.65.0, y la versión con base de datos, con psycopg 3.3.5 contra PostgreSQL 14. Revisamos su plan de compilación con lizardpack, el planificador de compilación que ejecuta Lizard. Todavía no lo hemos desplegado de principio a fin. El navegador mantiene un WebSocket abierto con Streamlit, y todavía no hemos comprobado esa conexión a través del enrutamiento de Lizard.
Antes de empezar
- Python 3 en tu equipo para probar la app.
- Lizard CLI, con la sesión iniciada mediante
lizard login, en Pro o en la prueba de Pro de 7 días (se requiere tarjeta). Consulta los precios.
Una app mínima
app.py:
import streamlit as st
st.title("Hello from Streamlit on Lizard")
name = st.text_input("Your name", "world")
st.write(f"Hello, {name}!")requirements.txt:
streamlit==1.65.0.python-version:
3.13Procfile:
web: streamlit run app.py --server.port 8501 --server.address 0.0.0.0Ejecútala localmente:
python -m venv .venv && . .venv/bin/activate
pip install -r requirements.txt
streamlit run app.pyStreamlit se abre en http://localhost:8501. Añade .venv/, .env y .streamlit/secrets.toml a .gitignore.
Qué compila lizardpack
| Paso | Qué ocurre |
|---|---|
| Detección | requirements.txt, pyproject.toml, Pipfile o cualquier archivo .py |
| Versión de Python | .python-version, luego .tool-versions, luego requires-python en pyproject.toml; solo major y minor, sobre python:<x.y>-slim. Predeterminada: 3.13. |
| Instalación | pip install -r requirements.txt; uv, Poetry o Pipenv cuando está su archivo de bloqueo o de configuración |
| Inicio | La línea web: del Procfile |
| Ejecución | PYTHONUNBUFFERED=1, así que la salida de print llega a los logs al momento |
El puerto del servicio viene de --port y debe coincidir con --server.port en el Procfile. Consulta versiones del entorno de ejecución para ver las reglas de versión y sus casos límite.
Desplegar
Desde la carpeta de la app:
lizard init --name streamlit-app
lizard add --service web
lizard up --service web --port 8501lizard up sube la carpeta, la compila en Lizard e imprime la URL. Dentro de un repositorio git omite lo que aparece en .gitignore; fuera de git sube los archivos .env. Para usar git push to deploy, conecta un repositorio de GitHub y configura el puerto con lizard port 8501 --service web.
Secretos y configuración
st.secrets lee .streamlit/secrets.toml, un archivo que no deberías subir. En Lizard, guarda los secretos como variables del servicio y léelos del entorno:
lizard secrets set OPENAI_API_KEY=sk-... --service webimport os
api_key = os.environ["OPENAI_API_KEY"]Un cambio de variable reinicia la app sin volver a compilar. Consulta variables y secretos.
Añadir Managed Postgres
lizard add postgres
lizard secrets set DATABASE_URL='${{postgres.DATABASE_PRIVATE_URL}}' --service webLas comillas simples evitan que tu shell interprete ${{…}}; Lizard resuelve la referencia al desplegar. Añade psycopg[binary]==3.3.5 a requirements.txt y abre una conexión por cada proceso del servidor:
import os
import psycopg
import streamlit as st
@st.cache_resource
def get_conn():
return psycopg.connect(os.environ["DATABASE_URL"], autocommit=True)
with get_conn().cursor() as cur:
cur.execute("SELECT now()")
st.write("Database time:", cur.fetchone()[0])st.cache_resource conserva la conexión entre reejecuciones y sesiones del navegador. Guarda los datos en Managed Postgres o en Managed Object Storage: los archivos que la app escribe dentro del contenedor se pierden en el siguiente despliegue.
Comprobar que funciona
lizard logs --service web --tail 100
lizard domain --service web
curl https://<your-domain>/_stcore/healthEl log muestra You can now view your Streamlit app in your browser, y la URL de estado responde ok. Abre la URL de la app y cambia el cuadro de texto: el saludo debería actualizarse.
Problemas comunes
| Síntoma | Solución |
|---|---|
El log dice to view this Streamlit app on a browser, run it with the following command | Falta el Procfile o no tiene línea web:, así que lizardpack ejecutó python app.py. |
| El despliegue nunca alcanza el estado healthy | El puerto del servicio y --server.port no coinciden. Ejecuta lizard port --service web. Consulta el servicio nunca alcanza el estado healthy. |
ModuleNotFoundError | Añade el paquete a requirements.txt y vuelve a desplegar. |
KeyError para un secreto | Falta la variable en el servicio web: lizard secrets list --service web. |
| La página muestra un mensaje de conexión y nunca termina de cargar | El navegador no puede mantener su WebSocket con /_stcore/stream. Busca esa solicitud fallida en la consola del navegador y errores en lizard logs. |
Relacionado
Actualizado