Блог · Гайди з деплою
Як задеплоїти застосунок на 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, які астероїди пролітають повз Землю в день, обраний у полі дати. На ноутбуці python-dotenv читає ключ із .env:
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.
Сторінка показала 8 астероїдів, що пролітають повз Землю 20 жовтня 2026 року, і 10 — 21-го, коли дату змінили. Відтоді .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 або в браузері, скільки поміститься, за однією фіксованою ціною. Нічого за лічильником, нічого зверху.