Skip to content

Discord Bot の更新

関連: Bot の構成 / systemd / PostgreSQL

本番は systemd 常駐(finance-manager.service)。 起動の仕組み(scripts/run.sh / venv / PYTHONPATH)は Bot の構成。

変更の流れ

main へ直接 push しない。コードを変えるときは毎回 Pull Request を作る。 docs だけの修正でも同じ経路を通す。

ブランチを切る
  → 変更して commit
  → PR を作る
  → GitHub Actions の test が緑になるのを待つ
  → main へマージ
  → VM で git pull + restart

1. PR を作る

git switch -c fix-today-window
# 変更して commit
git push -u origin HEAD
gh pr create --fill

PR を開くと .github/workflows/test.yml が走る。 赤いままマージしない。 落ちた理由を直すか、PR を閉じる。

レビュアーが自分ひとりでも PR を挟む理由は次の 2 つである。

  • マージ前に CI が回る。壊れたコードが main に入らない
  • 「いつ・何を・なぜ変えたか」が PR に残る。DB の値がおかしいときに追える

2. マージする

CI が緑になってからマージする。

gh pr merge --squash --delete-branch

main を保護して直接 push を弾いておくと、この手順が事故で飛ばされなくなる。 GitHub の Settings → Branches → Add branch ruleset で main に対して 「Require a pull request before merging」と「Require status checks to pass(test)」を入れる。

3. VM に反映する

VM に SSH して:

cd ~/finance-manager
git pull
sudo systemctl restart finance-manager

Streamlit ダッシュボードを常駐させているなら、同じ git pull のあと sudo systemctl restart finance-dashboard もする。 requirements-dashboard.txt が変わっていたときは、再起動の前に pip install -r requirements-dashboard.txt する。 初回は Streamlit ダッシュボード。

スキーマ変更は Bot 起動時に sql/ が順に当たるので、通常は restart だけで足りる。

requirements.txt が変わっていたときだけ、再起動の前に依存を入れる:

cd ~/finance-manager
source .venv/bin/activate
pip install -r requirements.txt
sudo systemctl restart finance-manager

4. 確認

sudo systemctl status finance-manager
sudo journalctl -u finance-manager -n 50 --no-pager

ログに Logged in as ... が出て、Discord の DM / 指定チャンネルで返答すれば成功。

やりたいこと コマンド
再起動 sudo systemctl restart finance-manager
止める sudo systemctl stop finance-manager
ログ sudo journalctl -u finance-manager -f

初回の unit 作成は systemd。

テスト

main への push と Pull Request で GitHub Actions(.github/workflows/test.yml)が tests/ を回す。 VM で git pull する前に、GitHub 側が緑になっているかを見る。

手元や VM で回すとき:

cd ~/finance-manager
source .venv/bin/activate
PYTHONPATH=src python -m unittest discover -s tests

DB、Discord、Gemini にはつながない。純粋関数だけを見る。

ファイル 守っているもの
tests/test_time_bounds.py JST 壁時計の日付境界(「今日」の窓、任意期間の窓、paid_at の解釈)
tests/test_budget_math.py 週枠・日枠の再配分と日数按分、【明日の目安】の週の切り替わり、確定の未割当別枠の載せ直し/取り消し、期間集計の整形
tests/test_taxonomy.py 大分類・小分類の正規化

予算の数字を入れる(初回、計画を変えたとき)

スキーマ(テーブル追加)は上の restart で当たる。 固定費マスタと変動枠の 金額 は seed が必要である。

cd ~/finance-manager
sudo -u postgres psql -d finance_manager -f sql/budget_seed.example.sql
sudo systemctl restart finance-manager

詳細は 月次予算。 そのあと Discord で予算案を見て「このままで」。

初回だけ(リポジトリと .env)

まだ clone していない VM 向け。 常駐化は上の systemd へ続く。

cd ~
git clone https://github.com/nakajima923/finance-manager.git
cd finance-manager

python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

cp .env.example .env
# .env を編集してトークン類を入れる

.env の例:

DISCORD_BOT_TOKEN=...
DISCORD_CHANNEL_ID=   # 空でも可。絞るならチャンネル ID
GEMINI_API_KEY=...
GEMINI_MODEL=gemini-3.5-flash
GEMINI_MODEL_FALLBACKS=gemini-3.5-flash-lite
DATABASE_URL=postgresql://finance_app:PASSWORD@127.0.0.1:5432/finance_manager

gemini-1.5-flash は 404 になり得るのでフォールバックに置かない。 gemini-3.5-flash の無料 RPD はごく小さいことがある。尽きると lite へ落ちる。 店名 Web 検索の試行と無料枠の制約は 店名 Web 検索の試行知見。 チャンネル ID: Discord の開発者モードを ON → チャンネルを右クリック → ID をコピー