Блог · Гайды по деплою
Как задеплоить приложение на Streamlit в 2026: одна команда, HTTPS и Dockerfile, который остается у вас
У вас есть приложение на Streamlit, которое на ноутбуке запускается через streamlit run, и вы хотите выложить его по адресу с HTTPS для людей, у которых нет Python. На Pethost это одна команда, pethost deploy, в папке, где лежит requirements.txt. Она пишет Dockerfile, собирает приложение на вашей машине Pethost и печатает его адрес. Приложение с первых страниц документации Streamlit оказалось в сети через 52 секунды, а следующее изменение его кода — через 3.
- Одна команда:
pethost deployв папке сrequirements.txt. Ни файла конфигурации, ни порта, который надо открыть, ни Docker на ноутбуке. - Что она делает: пишет Dockerfile, который ставит ваши пакеты и запускает
streamlit run streamlit_app.py, и направляет адрес на порт 8501. - Виджеты работают: WebSocket Streamlit проходит через прокси Pethost, настраивать ничего не нужно.
- API-ключи лежат в
.env, который первый деплой берет с собой; позже ключ меняетpethost env set. - Цена: 9,99 € в месяц за 2 vCPU, 3 GB и 30 GB — для всех ваших проектов. Бесплатного тарифа нет.
Что нужно, чтобы задеплоить приложение на Streamlit в 2026 году
Три вещи: само приложение, команда pethost и аккаунт Pethost.
Приложение здесь — то, с которого начинает документация Streamlit. Ее руководство по установке создает виртуальное окружение в папке проекта и ставит в него Streamlit:
$ cd my-app
$ python -m venv .venv
$ source .venv/bin/activate
$ pip install streamlit
Затем streamlit_app.py со слайдером из первого урока Streamlit:
import streamlit as st
st.title("My app")
x = st.slider("x") # 👈 this is a widget
st.write(x, "squared is", x * x)
И requirements.txt, список того, что ставит приложение, с одной строкой: streamlit.
Команда — одна программа, которая ставится одной строкой. Все ее команды есть в справочнике CLI.
curl -fsSL https://pethost.dev/install.sh | sh # macOS, Linux
irm https://pethost.dev/install.ps1 | iex # Windows, in PowerShell
Аккаунту нужен тариф. Если вы не вошли, pethost deploy откроет браузер, чтобы вы вошли. Если тарифа еще нет, она покажет, где его выбрать, и подождет.
Деплой приложения на Streamlit одной командой
Перейдите в папку, где лежит requirements.txt, и запустите pethost deploy. Вот весь экран:
$ pethost deploy
Name it [my-app]: it will live at https://my-app.sam.pethost.app
✓ Packed 2 files, 131 B (left out .venv)
✓ Uploaded straight to your machine
✗ /compose.yaml: the project directory has no compose.yaml at its root: add one
✓ Streamlit app detected, wrote Dockerfile and .dockerignore.
✓ Packed 4 files, 601 B (left out .venv)
✓ Uploaded straight to your machine
✓ Built and started in 52 s
· wrote compose.yaml for the Dockerfile: the service app, reading .env, port 8501
✓ app listens on 8501 → https://my-app.sam.pethost.app
It answers 200.
https://my-app.sam.pethost.app
Wrote .pethost (commit it). Next: pethost logs -f · pethost open
- Она спрашивает одно Имя проекта, первое слово его адреса. Enter берет имя папки.
- Она не берет виртуальное окружение В
.venvбыло 450 MB пакетов, а машина ставит их сама. - Машина не находит, что запускать Строка с крестиком: в папке пока нет ни Dockerfile, ни Compose-файла.
- pethost пишет Dockerfile В
requirements.txtуказанstreamlit, поэтому pethost пишет Dockerfile для Streamlit и загружает папку еще раз. - Машина собирает и запускает его Она видит, что приложение слушает 8501, направляет туда адрес с HTTPS, а pethost печатает ответ: 200.
Файл .pethost говорит, какой проект в этой папке. Закоммитьте его вместе с Dockerfile, и следующий деплой ничего не спросит.
Откройте приложение: виджеты и WebSocket
Страница Streamlit связывается с приложением по WebSocket, /_stcore/stream: по нему уходит каждое движение виджета, и скрипт заново выполняется на машине. Если это не работает, страница бесконечно показывает заглушку загрузки; база знаний Streamlit винит в этом CORS или прокси, который срезает заголовки WebSocket.
На Pethost для этого ничего не настраивали. В браузере приложение отрисовалось меньше чем за секунду, через wss://my-app.sam.pethost.app/_stcore/stream: «0 squared is 0», а со слайдером на 10 — «10 squared is 100». Хелсчек Streamlit тоже отвечает:
$ curl https://my-app.sam.pethost.app/_stcore/health
ok
pethost logs -f показывает поток того, что печатает приложение. «External URL», который там печатает Streamlit, никому не открыт: адрес приложения — тот, что с HTTPS.
Dockerfile, который pethost пишет для Streamlit
Вот файл целиком, каким он был записан в папку:
# Written by pethost deploy for this Streamlit app: Python 3.14 (no .python-version
# names another), pip installs it (requirements.txt), streamlit_app.py is what it starts
# with.
# It is yours now: change it as you like. pethost does not write it again.
FROM python:3.14
WORKDIR /app
COPY . .
RUN --mount=type=cache,target=/root/.cache/pip \
pip install -r requirements.txt
ENV PYTHONUNBUFFERED=1
EXPOSE 8501
CMD ["streamlit", "run", "streamlit_app.py"]
Его первые строки говорят, что pethost нашел в вашей папке:
- Python — 3.14, если
.python-versionне указывает другую версию. - Пакеты ставит pip из
requirements.txt, и его загрузки остаются на вашей машине, или uv изuv.lock. - Файл приложения —
streamlit_app.py,app.pyилиmain.py, либо единственный другой файл.pyв корне, который импортирует Streamlit.
В requirements.txt должен быть указан streamlit. Приложение, сделанное для Streamlit Community Cloud, может его не указывать, ведь Community Cloud ставит Streamlit сам; тогда pethost не пишет Dockerfile. С добавленной строкой такое приложение оказалось в сети через 30 секунд.
Измените код и задеплойте снова за 3 секунды
Отредактируйте приложение и запустите ту же команду. В первый раз это заняло 42 секунды: файл копирует папку до pip install, так что из-за одной измененной строки пакеты ставятся заново. Dockerfile ваш, поэтому сначала скопируйте requirements.txt:
COPY requirements.txt .
RUN --mount=type=cache,target=/root/.cache/pip \
pip install -r requirements.txt
COPY . .
Деплой, который изменил файл, занял 34 секунды. После него изменение кода пропускает установку:
$ pethost deploy
my-app (.pethost)
✓ Packed 5 files · uploaded · built and started in 3 s
…
It answers 200.
https://my-app.sam.pethost.app
Чтобы вместо этого деплоить каждый пуш, один раз подключите репозиторий: pethost github sam/my-app. pethost rollback возвращает предыдущую версию. ИИ-агент может сделать все это через MCP-сервер Pethost: как агент деплоит проект и следит за ним.
Деплой приложения на Streamlit, которое читает CSV
Большинство приложений на Streamlit показывают данные, часто из файла рядом с кодом. Это приложение один раз читает таблицу Palmer penguins, хранит ее через st.cache_data и строит график по острову, выбранному в выпадающем списке:
@st.cache_data
def load_data():
return pd.read_csv("data/penguins.csv")
С streamlit и pandas в requirements.txt та же команда упаковала 3 файла, 15 KB, и приложение оказалось в сети через 27 секунд. CSV уехал вместе с папкой, и путь, который работает на ноутбуке, работает и на машине. В браузере выбор острова Dream перерисовал число, график и таблицу.
Машина всегда включена, поэтому то, что хранит st.cache_data, остается готовым для следующего посетителя, и никто не ждет, пока приложение проснется. Файл, который приложение пишет во время работы, пропадает, когда деплой создает новый контейнер. То, что должно сохраниться, держите в базе данных: Postgres создается в один клик, без доплаты.
Храните API-ключ в .env, а не в коде
API-ключу не место ни в коде, ни в Git. Это приложение спрашивает у API NASA, какие астероиды пролетают мимо Земли в день, выбранный в поле даты. На ноутбуке ключ из .env читает python-dotenv:
load_dotenv() # the .env beside this file, when you run it on your laptop
…
answer = requests.get(
"https://api.nasa.gov/neo/rest/v1/feed",
params={"start_date": day, "end_date": day, "api_key": os.environ["NASA_API_KEY"]},
)
В .env одна строка, NASA_API_KEY=DEMO_KEY — ключ NASA, чтобы попробовать API (свой ключ api.nasa.gov выдает за имя и email). Первый деплой берет .env с собой:
$ pethost deploy
Name it [asteroids]: it will live at https://asteroids.sam.pethost.app
✓ Packed 4 files, 863 B (took .env from this folder)
…
✓ app listens on 8501 → https://asteroids.sam.pethost.app
It answers 200.
Страница показала, что 20 октября 2026 года мимо Земли пролетает 8 астероидов, а после смены даты на 21 октября — 10. С этого момента .env проекта живет на машине, а изменение файла на ноутбуке остается на ноутбуке. Следующий деплой так и говорит:
$ pethost deploy
asteroids (.pethost)
✓ Packed 6 files · uploaded · built and started in 38 s
· kept the project's .env in place of the version's own: after the first deploy the project's is kept
…
To send this folder's .env: pethost env push
pethost env set меняет одну переменную и сразу деплоит. Если указать только имя, pethost env set NASA_API_KEY, команда спросит значение, не показывая его. Streamlit тоже читает свои настройки из переменных:
$ pethost env set STREAMLIT_BROWSER_GATHER_USAGE_STATS=false
asteroids (.pethost)
✓ /.env has STREAMLIT_BROWSER_GATHER_USAGE_STATS now. Deployed in 39 s.
Приложение перезапустилось без своей строки о статистике использования. pethost env push вместо этого отправляет весь ваш .env, но сначала называет каждую переменную, которую потерял бы файл проекта, и спрашивает.
st.secrets читает .streamlit/secrets.toml, а не окружение. Папка, задеплоенная через pethost deploy, берет этот файл с собой, и st.secrets на машине работал. В репозитории этому файлу не место, поэтому приложение, задеплоенное из GitHub, держит ключи в .env.
Деплой Dockerfile из туториала Streamlit по Docker
Если вы прошли туториал Streamlit «Деплой Streamlit с помощью Docker», в вашей папке уже есть его Dockerfile. Оставьте его: pethost деплоит собственный Dockerfile папки как есть. Вот Dockerfile из туториала, с COPY . . вместо его git clone, как туториал и советует для кода, который лежит рядом с Dockerfile:
FROM python:3.12-slim
WORKDIR /app
RUN apt-get update && apt-get install -y …
COPY . .
RUN pip3 install -r requirements.txt
EXPOSE 8501
HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health
ENTRYPOINT ["streamlit", "run", "streamlit_app.py", "--server.port=8501", "--server.address=0.0.0.0"]
$ pethost deploy
Name it [spiral]: it will live at https://spiral.sam.pethost.app
✓ Packed 3 files, 2 KB
✓ Uploaded straight to your machine
✓ Built and started in 1 min 25 s
· wrote compose.yaml for the Dockerfile: the service app, reading .env, port 8501
✓ app listens on 8501 → https://spiral.sam.pethost.app
It answers 200.
Спираль из туториала перерисовывала график, когда двигались слайдеры. Его docker run -p 8501:8501 здесь не нужен: машина сама находит порт и не открывает ничего, кроме HTTPS. HEALTHCHECK выполняется, и Docker назвал контейнер здоровым.
Свой домен для приложения на Streamlit
Любое имя в домене вашего аккаунта работает сразу, с HTTPS. Свой домен — одна команда, pethost domain add dashboard.example.com, и она печатает CNAME-запись, которую нужно создать; сертификат появляется, как только имя начинает указывать на машину.
Что вы получаете за эту цену
Pethost стоит 9,99 € в месяц за все, что вы хостите, на 2 vCPU, 3 GB памяти и 30 GB диска. Дашборд редко бывает один: задача, которая наполняет его данными, его база данных и ваше следующее приложение работают рядом с ним, без платы за проект.
- 9,99 € в месяц за все ваши проекты, без счетчиков
- 52 с на сборку и запуск первого приложения
- 3 с на деплой изменения в коде
Что уже сделано за вас: HTTPS с сертификатами, которые продлеваются сами, деплой из GitHub, ночные бэкапы, которые хранятся 14 дней, SSH в любой контейнер и учет каждого запроса без скриптов на ваших страницах. Тарифы — в разделе с ценами на главной странице.
Pethost — лучший выбор для
- Аналитиков данных с приложением на Streamlit, которое нужно показать коллегам или клиентам по собственному адресу
- Разработчиков-одиночек с несколькими дашбордами, ботами и личными проектами и одним счетом к оплате
- Людей, за которых деплоит агент: Claude Code или Codex выкладывает приложение и читает его логи
- Стартапов на ранней стадии, которым нужны фиксированные расходы в месяц, пока продукт небольшой
Ищите другое, если
- Вашему приложению нужны несколько регионов или автомасштабирование
Вопросы
Как задеплоить приложение на Streamlit без Dockerfile?
Запустите pethost deploy в папке с requirements.txt. Она пишет Dockerfile, который запускает streamlit run, и деплоит его; файл остается в вашей папке, и вы можете его менять.
Почему задеплоенное приложение Streamlit бесконечно загружается?
Страница связывается с приложением по WebSocket на /_stcore/stream, и если это не удается, бесконечно показывает заглушку загрузки. На Pethost WebSocket проходит через прокси, и настраивать ничего не нужно.
Какой порт использует приложение на Streamlit на Pethost?
Собственный порт Streamlit, 8501. Машина находит порт, который слушает приложение, и направляет туда адрес с HTTPS: открывать вам ничего не нужно.
Где хранить API-ключи задеплоенного приложения на Streamlit?
В .env проекта, который первый деплой берет из вашей папки; pethost env set NAME меняет ключ, не показывая его, а приложение читает os.environ. st.secrets работает у папки, задеплоенной вместе со своим secrets.toml.
Сколько стоит хостинг приложения на Streamlit на Pethost?
9,99 € в месяц за Starter: 2 vCPU, 3 GB и 30 GB без платы за проект, так что там же работают ваши другие приложения и базы данных. Бесплатного тарифа нет. Цены без НДС.
На экранах — деплои на нашей тестовой машине с pethost 0.2.4, Streamlit 1.66.1 и Python 3.14.9 (3.12.15 в Dockerfile из туториала). my-app задеплоили первым; приложения с CSV и API-ключом нашли образ Python 3.14 уже на машине. Аккаунт на них — пример, sam.
- Streamlit: установка Streamlit из командной строки
- Streamlit: основные понятия
- Streamlit: деплой Streamlit с помощью Docker
- Streamlit: приложение не загружается при удаленном запуске
- Streamlit: управление секретами
- Streamlit: зависимости приложения в Community Cloud
- NASA: открытые API
- Palmer penguins: данные
- pethost, командная строка Pethost
Запустите свои проекты уже сегодня
Деплойте приложения, ботов и базы данных из агента, с GitHub или в браузере, сколько поместится, по одной фиксированной цене. Ничего по счётчику, ничего сверху.