---
title: "Streamlit アプリをデプロイする"
description: "Streamlit アプリを Lizard にデプロイします。Procfile で streamlit run app.py を 0.0.0.0:8501 で実行し、requirements.txt で Streamlit を固定し、シークレットは変数から渡します。"
url: https://lizard.build/ja/docs/framework-guides/streamlit/
updated: 2026-10-12
---

# Streamlit アプリをデプロイする

Lizard (lizard.build) は、ローカルで使うのと同じコマンド `streamlit run app.py` で Streamlit アプリを実行します。このコマンドに `--server.address 0.0.0.0` と `8501` などの固定ポートを付けて Procfile の `web:` 行に書き、`lizard up --port 8501` でデプロイします。Procfile がない場合、lizardpack は `python app.py` を起動しますが、これは警告を出して終了するだけで、アプリを配信しません。

**テスト状況:** 以下のサンプルは Streamlit 1.65.0 を使ってローカルで動作し、データベース版は psycopg 3.3.5 を使って PostgreSQL 14 に対して動作しました。ビルドプランは、Lizard が使う lizardpack で確認しました。デプロイ手順は、まだ最初から最後まで試していません。ブラウザーは Streamlit との WebSocket を開いたままにしますが、Lizard のルーティングを通したその接続はまだ確認していません。

## 始める前に

- アプリのテストに使う、手元のコンピューターの Python 3。
- `lizard login` でサインイン済みで、Pro または 7 日間の Pro トライアル（カードが必要）を利用している Lizard CLI。[料金](https://lizard.build/pricing)を参照してください。

## 最小構成のアプリ

`app.py`:

```python
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`:

```text
streamlit==1.65.0
```

`.python-version`:

```text
3.13
```

`Procfile`:

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

ローカルで実行します:

```bash
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`、次に `pyproject.toml` の `requires-python`。使われるのはメジャーとマイナーだけで、`python:<x.y>-slim` 上でビルドされます。デフォルトは `3.13`。 |
| インストール | `pip install -r requirements.txt`。uv、Poetry、Pipenv の lock ファイルや設定ファイルがある場合はそれらを使用 |
| 起動 | Procfile の `web:` 行 |
| ランタイム | `PYTHONUNBUFFERED=1`。`print` の出力がすぐにログに届きます |

サービスポートは `--port` で決まり、Procfile の `--server.port` と一致している必要があります。バージョンのルールと注意点については、[ランタイムバージョン](https://lizard.build/ja/docs/deploy/runtime-versions.md)を参照してください。

## デプロイ

アプリのフォルダーから実行します:

```bash
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 リポジトリを接続](https://lizard.build/ja/docs/deploy/github.md) し、`lizard port 8501 --service web` でポートを設定してください。

## シークレットと設定

`st.secrets` は `.streamlit/secrets.toml` を読み取りますが、このファイルはアップロードしないでください。Lizard では、シークレットをサービスの変数として保存し、環境変数から読み取ります:

```bash
lizard secrets set OPENAI_API_KEY=sk-... --service web
```

```python
import os

api_key = os.environ["OPENAI_API_KEY"]
```

変数を変更すると、再ビルドなしでアプリが再起動します。[変数とシークレット](https://lizard.build/ja/docs/variables.md)を参照してください。

## Managed Postgres を追加する

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

シングルクォートで囲むと、シェルは `${{…}}` を解釈しません。Lizard はデプロイ時に [参照](https://lizard.build/ja/docs/variables/references.md) を解決します。`requirements.txt` に `psycopg[binary]==3.3.5` を追加し、サーバープロセスごとに接続を 1 つ開きます:

```python
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](https://lizard.build/ja/docs/addons/postgres.md) か [Managed Object Storage](https://lizard.build/ja/docs/addons/storage.md) に保存してください。アプリがコンテナ内に書き込んだファイルは、次のデプロイで失われます。

## 動作を確認する

```bash
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 command` と表示される | Procfile がないか `web:` 行がないため、lizardpack が `python app.py` を実行しました。 |
| デプロイがいつまでも healthy にならない | サービスポートと `--server.port` が違います。`lizard port --service web` を実行してください。[サービスが healthy にならない](https://lizard.build/ja/docs/deploy/troubleshooting/service-never-healthy.md)を参照してください。 |
| `ModuleNotFoundError` | パッケージを `requirements.txt` に追加し、もう一度デプロイします。 |
| シークレットの `KeyError` | `web` サービスに変数がありません。`lizard secrets list --service web` で確認してください。 |
| ページに接続中のメッセージが表示されたまま読み込まれない | ブラウザーが `/_stcore/stream` への WebSocket を維持できていません。ブラウザーのコンソールで失敗したそのリクエストを探し、`lizard logs` でエラーを確認してください。 |

## 関連項目

- [フレームワークガイド](https://lizard.build/ja/docs/framework-guides.md)
- [FastAPI をデプロイする](https://lizard.build/ja/docs/framework-guides/fastapi.md)
- [ランタイムバージョン](https://lizard.build/ja/docs/deploy/runtime-versions.md)
- [Managed Postgres](https://lizard.build/ja/docs/addons/postgres.md)
- [ログ](https://lizard.build/ja/docs/observability/logs.md)
