Streamlit ダッシュボード¶
関連: Grafana で見ること / 月次予算 / パネル SQL
Grafana の置き換えではない。 同じ PostgreSQL を、自宅 LAN のブラウザで見る画面である。 パネル定義の正本は Grafana パネル SQL。
左のナビでページを切り替える。
表は st.dataframe なので、明細はスクロールできる。
各ページの「対象月」で先月などへ切り替える。
日次と週次の按分は当月だけ。過去月は月次のみ。
| ページ | 中身 |
|---|---|
| 概要 | 別枠貯金、変動の残り、収支、日次の折れ線、大分類の棒グラフ |
| 期間 | 日次 / 週次 / 月次の予算・使用・残り(Grafana パネル A と同じ按分) |
| 大分類 | 予算と使用、残予算 |
| 小分類 | コンビニなどのタグ別。棒グラフと件数 |
| 支出 | その月の明細。大分類と小分類で絞り込み |
| 収入 | その月の合計、分類別、明細 |
| 別枠貯金 | 残高と surplus_ledger |
| 固定費 | fixed_cost_items |
Cloudflare Tunnel はまだ出していない。 自宅 LAN からだけ見る。
見る URL¶
finance-manager VM(192.168.40.212)で常駐させたあと、同じ LAN のブラウザで:
ルータで 8501 をポート開放しない。 外向き公開は Access + Tunnel の話である。
VM での初回¶
Bot と同じ venv にダッシュボード用の依存を足す。
読み取り専用にするなら .env に Grafana と同じユーザーを足す(未設定なら DATABASE_URL を使う)。
unit を入れて起動する。 手順の意味は systemd と同じである。
chmod +x ~/finance-manager/scripts/run-dashboard.sh
sudo cp ~/finance-manager/deploy/finance-dashboard.service \
/etc/systemd/system/finance-dashboard.service
sudo systemctl daemon-reload
sudo systemctl enable --now finance-dashboard
sudo systemctl status finance-dashboard
active (running) なら、PC やスマホ(Wi-Fi)から http://192.168.40.212:8501 を開く。
ufw を使っていて届かないときだけ、LAN からの 8501 を許可する。
起動は scripts/run-dashboard.sh → .venv/bin/python3 dashboard/boot.py である。
systemd の PATH には python が無いので、venv の python3 を直接叩く。
boot.py は numpy と pandas を Streamlit より先に載せる。
Python 3.13 では、streamlit run を先にすると numpy の C 拡張が二重に載って落ちることがある。
コード更新後¶
Bot と同じ git pull のあと、ダッシュボードも再起動する。
requirements-dashboard.txt が変わっていたときだけ、再起動の前に入れる。
cd ~/finance-manager
source .venv/bin/activate
pip install -r requirements-dashboard.txt
sudo systemctl restart finance-dashboard
今回の本番化では pandas / numpy / Streamlit 1.44 以上が要る。
すでに PoC を動かしている VM は、再起動の前に必ず pip install する。
再起動直後に activating (auto-restart) なら、Streamlit まで届く前に落ちている。
ログは次で見る。
python: not found なら起動スクリプトが古い。
No module named 'numpy' なら pip install -r requirements-dashboard.txt がまだである。
X86_V2 なら、numpy 2.4 の wheel がこの VM の CPU フラグを要求している。
pip install 'numpy>=2.1,<2.4' してから再起動する。
手元で試す(VM 以外)¶
.streamlit/config.toml で 0.0.0.0:8501 に待ち受ける。
同じ LAN の他端末は http://<このマシンの LAN IP>:8501。
streamlit run dashboard/app.py は使わない。