Bot

開発記録#202(2025/4/28)MMbot開発ログ10「Makefile + .env で開発を進めるメリットとそのやり方」—— 個人開発でも“運用コスト激減”を実感できる環境分離術

前回の記事に引き続き、今回も仮想通貨botの開発状況をまとめていきます。

この記事では、私が 仮想通貨トレード Bot(MMBot) を作る過程で
実際に導入して効果を感じた Makefile環境変数ファイル(.env) の組み合わせを、
“完全初心者でも今日から真似できる” レベルで解説します。


対象読者

  • 「動くスクリプトは出来たけど、テスト/本番を切り替えるたびに書き換えが面倒」
  • 「 API キーや URL をハードコードしていて怖い」
  • 「将来 CI/CD やチーム開発も見据えて整えておきたい」

1. Makefile と .env の役割を 1 分でつかむ

何をするもの?例え
.env**変わりやすい値(キー・URL・パラメータ)**をファイルで切り替える家の
(玄関は同じでも人によって持つ鍵が違う)
Makefile手順書をコマンド化する調理家電の プリセットボタン

つまり

  • レシピ(Python コード)は触らずに
  • 材料(.env に書いた変数)ボタン(make コマンド) を変えるだけで
    テストモード⇆本番モードを即切替えできる仕組み、というわけです。

2. .env.test / .env.prod を用意してみよう

# .env.test — テストネット用 (例)
MODE=test
SYMBOLS=ETHUSDT,BTCUSDT
BYBIT_KEY_TEST=xxxxxxxx
BYBIT_SECRET_TEST=yyyyyyyy
DEFAULT_LEVERAGE=10
SLACK_WEBHOOK_URL=https://hooks.slack.com/services/XXXX/...
# .env.prod — 本番用 (Git管理しない!!)
MODE=main
SYMBOLS=BTCUSDT,ETHUSDT
BYBIT_KEY_MAIN=********
BYBIT_SECRET_MAIN=********
DEFAULT_LEVERAGE=10
SLACK_WEBHOOK_URL=https://hooks.slack.com/services/YYYY/...
  • .env.prod.gitignore に必ず追加
echo ".env.prod" >> .gitignore
  • どちらも キーバリューペア をシェルスクリプト形式で書くだけ。

Python 側は特に変更不要。従来どおり os.getenv("BYBIT_KEY_TEST") などで取得できます。


3. Makefile で「コマンド丸ごと一行化」

# Makefile(プロジェクト直下)

SHELL := /bin/bash

run-loop = \
  set -a && source $(1) && set +a && \
  ./run_loop.sh          # ← 既存の Bash スクリプトを呼び出す

.PHONY: testnet-loop mainnet-loop keycheck

testnet-loop:
	@$(call run-loop,.env.test)

mainnet-loop:
	@$(call run-loop,.env.prod)

keycheck:
	@grep -E "BYBIT_KEY_|BYBIT_SECRET_" .env.* | sed 's/=.*/=<hidden>/'

ポイントは 3 行だけ。

  1. set -a && source $(1)
    .env.* を「export 付き」で読み込み、Python 側に渡す
  2. run_loop.sh に長いオプションを全部書いておく
  3. ターゲット名=運用モード
    make testnet-loop / make mainnet-loop で環境が切り替わる

4. 実戦投入:テストネット→本番切替え

make keycheck       # キーが入っているかマスク表示で確認
make testnet-loop   # テストネットでぐるぐる検証
# └ Slack通知 / trades.db に fill が入るか見る

make mainnet-loop   # 本番最小ロットで稼働開始!

コードは 1 行も触っていません。
変えたのは .env.* と Makefile の呼び出し先だけ。


5. よくあるハマりどころ & デバッグ術

症状原因 & 対策
No such file or directory: .env.testMakefile と .env.* が別フォルダ → 相対パスを合わせる
Permission denied ./run_loop.shchmod +x run_loop.sh を忘れがち
Slack がエラー invalid_webhookURL がダミー/空。make keycheck で再チェック
本番で API key invalid.env.prod にテスト用キーを入れていた → キーを差し替えて再実行

6. さらに便利にするアイデア集

アイデアどう便利?
make env-check必須変数が空なら起動前に落とす (grep -v '=' .env.test)
make lint / fmt / testコード品質ターゲットも一緒に管理
CI/CDmake testnet-loop -n-n (dry-run) でコマンド生成だけテスト
シェル変数で上書きLOT=0.01 make mainnet-loop ← 一時的ロット変更

7. まとめ:スクリプトを“資産化”する第一歩

  • .env で「環境依存値」を切り離す
    → キー漏えい防止・モード切替が 1 行
  • Makefile で「手順書」をボタン化
    → 再現性と可読性が飛躍的アップ
  • コードはそのまま運用だけ柔軟に
    → 機能追加や CI/CD 対応時の修正コストが激減

これを導入しただけで、
テストネット検証 ⇒ 本番デプロイ を“1 行+ファイル切替”で回せるようになりました。
初心者ほど効果を感じやすいので、ぜひ明日の開発から取り入れてみてください。

おまけ:Makefile + .env 分離方式 ― 想定しておくべきデメリットと注意点

デメリットどういう場面で表面化する?最小限に抑えるコツ
① “Makefile 依存” が増え、他 OS/ツールの人が戸惑うWindows 環境には make が入っていないことが多い- make が無い場合は GNU make バイナリを同梱するか、justfile / npm scripts など代替を提示
- README 冒頭で「まず --> make install」と書く
② 行頭タブ・パスの落とし穴タブをスペースに置換 → “Missing separator” エラー
相対パスを動かすたびに修正が必要
- VS Code などで「Makefile はタブ保存」を設定
- PROJECT_ROOT=$(dir $(abspath $(lastword $(MAKEFILE_LIST)))) 等でパスを変数化
.envps aux に環境変数で丸見え問題source .env && …プロセス環境に平文キーが載る → OS のプロセス一覧で盗み見可能- 本番運用は direnv allowsystemd EnvironmentFile= に切り替え
- 重要キーは KMS / Secret Manager へ移し、起動時にインジェクション
.env.prod を誤って Git に push しうるチーム開発者が .gitignore を削除/別名で作成 → 秘密漏えい- CI でシークレット文字列を自動スキャン(truffleHog など)
- .env.prod.example(中身空)を置き、実ファイルは別名にする運用
⑤ 変数の型・桁数チェックが手動例:LOT=0.1a と書いても make は通る → 実行時に API で落ちる- make env-check ターゲットを作り、正規表現でバリデーション
- Python 起動前に bash -eu で必須項目と数値範囲を assert
**⑥ プロセスごとに .env を source するため fork/exec が遅くなる1 秒未満だが超高頻度バッチだと無駄オーバーヘッド- Bot のような長時間プロセスでは問題になりにくい
- もし気になるなら systemd 環境変数で一度だけ読み込む
⑦ “環境ファイルが増えすぎ問題”ステージ・地域・テストケース… .env.stg.sgp など乱立- 3 層程度に留める(dev / test / prod)
- それ以上は dotenv + CLI 引数 で上書き or Secrets Manager を採用

どう判断すればいい?

  • 個人〜小規模開発
    • Makefile+.env は 導入コスト<得られる時短効果 が大きい。
    • 上のデメリットも「自分だけが触るサーバー」ならほぼ気にならない。
  • チーム開発・長期運用
    • セキュリティ運用(秘密管理)CI/CD と整合 を追加検討。
    • Makefile は「ローカル便利ツール」と割り切り、本番は systemd + Ansible で流すなど役割分担を明確にする。

要するに
Makefile+.env は「スクリプトを壊さず環境だけ変える最短の仕組み」ですが、
秘密の扱いタブ/パスの罠にだけ注意すれば、
初学〜中規模の Bot 開発ではメリットの方が圧倒的に大きい、ということです。

-Bot