Развертывание приложения Streamlit

Lizard (lizard.build) запускает приложение Streamlit той же командой, что и у вас локально: streamlit run app.py. Поместите её в строку web: в Procfile с --server.address 0.0.0.0 и фиксированным портом, например 8501, затем разверните командой lizard up --port 8501. Без Procfile lizardpack запускает python app.py, а эта команда выводит предупреждение и завершается, не отдавая приложение.

Статус тестов: пример ниже запускался локально со Streamlit 1.65.0, а вариант с базой данных проверили с psycopg 3.3.5 и PostgreSQL 14. План сборки мы проверили в планировщике сборки lizardpack, который использует Lizard. Полный деплой мы ещё не проводили. Браузер держит открытым WebSocket к Streamlit, и это соединение через маршрутизацию Lizard мы ещё не проверяли.

Перед началом

  • Python 3 на вашем компьютере, чтобы проверить приложение.
  • Lizard CLI с выполненным lizard login и тариф Pro или 7-дневный пробный период Pro (нужна карта). См. цены.

Минимальное приложение

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.13

Procfile:

web: streamlit run app.py --server.port 8501 --server.address 0.0.0.0

Запустите локально:

python -m venv .venv && . .venv/bin/activate
pip install -r requirements.txt
streamlit run app.py

Streamlit откроется на http://localhost:8501. Добавьте .venv/, .env и .streamlit/secrets.toml в .gitignore.

Что собирает lizardpack

ШагЧто происходит
Определениеrequirements.txt, pyproject.toml, Pipfile или любой файл .py
Версия Python.python-version, затем .tool-versions, затем requires-python в pyproject.toml; только мажорная и минорная версии, на образе python:<x.y>-slim. По умолчанию 3.13.
Установкаpip install -r requirements.txt; uv, Poetry или Pipenv, если есть их lock-файл или файл конфигурации
ЗапускСтрока web: из Procfile
РантаймPYTHONUNBUFFERED=1, поэтому вывод print сразу попадает в логи

Порт сервиса берётся из --port и должен совпадать с --server.port в Procfile. Правила выбора версии и их особые случаи описаны на странице версии рантайма.

Развертывание

Из папки приложения:

lizard init --name streamlit-app
lizard add --service web
lizard up --service web --port 8501

lizard up загружает папку, собирает её на Lizard и выводит URL. Внутри git-репозитория он пропускает всё, что перечислено в .gitignore; вне git загружает файлы .env. Для git push to deploy подключите репозиторий GitHub и задайте порт командой lizard port 8501 --service web.

Секреты и настройки

st.secrets читает .streamlit/secrets.toml. Не загружайте этот файл. В Lizard храните секреты как переменные сервиса и читайте их из окружения:

lizard secrets set OPENAI_API_KEY=sk-... --service web
import os
 
api_key = os.environ["OPENAI_API_KEY"]

Изменение переменной перезапускает приложение без пересборки. См. переменные и секреты.

Подключите Managed Postgres

lizard add postgres
lizard secrets set DATABASE_URL='${{postgres.DATABASE_PRIVATE_URL}}' --service web

Одинарные кавычки не дают оболочке обработать ${{…}}; Lizard подставляет ссылку при деплое. Добавьте psycopg[binary]==3.3.5 в requirements.txt и открывайте одно соединение на серверный процесс:

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 сохраняет соединение между перезапусками скрипта и сессиями браузера. Храните данные в Managed Postgres или Managed Object Storage: файлы, которые приложение пишет внутри контейнера, пропадают при следующем деплое.

Проверьте, что всё работает

lizard logs --service web --tail 100
lizard domain --service web
curl https://<your-domain>/_stcore/health

В логе появляется You can now view your Streamlit app in your browser, а URL проверки работоспособности отвечает ok. Откройте URL приложения и измените текст в поле: приветствие должно обновиться.

Частые проблемы

СимптомЧто делать
В логе to view this Streamlit app on a browser, run it with the following commandProcfile нет или в нём нет строки web:, поэтому lizardpack запустил python app.py.
Деплой так и не становится работоспособнымПорт сервиса и --server.port различаются. Выполните lizard port --service web. См. сервис так и не становится работоспособным.
ModuleNotFoundErrorДобавьте пакет в requirements.txt и разверните снова.
KeyError для секретаВ сервисе web нет этой переменной: lizard secrets list --service web.
Страница показывает сообщение о подключении и так и не загружаетсяБраузер не может удержать WebSocket к /_stcore/stream. Найдите этот неудачный запрос в консоли браузера, а ошибки в lizard logs.

См. также

Обновлено