Українська

Блог · Гайди з деплою

Як задеплоїти застосунок на Streamlit у 2026: одна команда, HTTPS і Dockerfile, що лишається у вас

Команда Pethost · · 10 хв читання

У вас є застосунок на 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
  1. Вона питає одне Назву проєкту, перше слово його адреси. Enter бере назву папки.
  2. Вона не бере віртуальне середовище У .venv було 450 MB пакетів, які машина встановлює сама.
  3. Машина не знаходить, що запускати Рядок із хрестиком: у папці ще немає ні Dockerfile, ні файлу Compose.
  4. pethost пише Dockerfile requirements.txt називає streamlit, тож pethost пише Dockerfile для Streamlit і завантажує папку ще раз.
  5. Машина збирає й запускає застосунок Вона бачить, що він слухає 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 прочитав у вашій папці:

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 диска. Дашборд рідко буває сам: поруч працюють задача, що наповнює його даними, його база даних і ваш наступний застосунок, без плати за проєкт.

Що вже зроблено за вас: HTTPS із сертифікатами, які поновлюються самі, деплої з GitHub, щонічні бекапи, що зберігаються 14 днів, SSH у будь-який контейнер і підрахунок кожного запиту без жодного скрипту на ваших сторінках. Тарифи є в розділі з цінами на головній сторінці.

Кожен проєкт підписано. Сім проєктів на одній машині Starter: застосунки з їхніми адресами й запитами за останню добу, бази даних із застосунками, які ними користуються.
Перша сторінка панелі Pethost: CPU, пам’ять і диск машини та її проєкти у вигляді карток.

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.

  1. Streamlit: встановлення Streamlit через командний рядок
  2. Streamlit: основні концепції
  3. Streamlit: деплой Streamlit за допомогою Docker
  4. Streamlit: застосунок не завантажується, коли запущений віддалено
  5. Streamlit: керування секретами
  6. Streamlit: залежності застосунку для Community Cloud
  7. NASA: відкриті API
  8. Palmer penguins: дані
  9. pethost, командний рядок Pethost

Запустіть свої проєкти вже сьогодні

Деплойте застосунки, ботів і бази даних з агента, з GitHub або в браузері, скільки поміститься, за однією фіксованою ціною. Нічого за лічильником, нічого зверху.

Хостити всі проєкти за 9,99 €/міс