前回の記事に引き続き、今回も仮想通貨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 行だけ。
set -a && source $(1)
.env.*
を「export 付き」で読み込み、Python 側に渡すrun_loop.sh
に長いオプションを全部書いておく- ターゲット名=運用モード
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.test | Makefile と .env.* が別フォルダ → 相対パスを合わせる |
Permission denied ./run_loop.sh | chmod +x run_loop.sh を忘れがち |
Slack がエラー invalid_webhook | URL がダミー/空。make keycheck で再チェック |
本番で API key invalid | .env.prod にテスト用キーを入れていた → キーを差し替えて再実行 |
6. さらに便利にするアイデア集
アイデア | どう便利? |
---|---|
make env-check | 必須変数が空なら起動前に落とす (grep -v '=' .env.test ) |
make lint / fmt / test | コード品質ターゲットも一緒に管理 |
CI/CD で make 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)))) 等でパスを変数化 |
③ .env が ps aux に環境変数で丸見え問題 | source .env && … はプロセス環境に平文キーが載る → OS のプロセス一覧で盗み見可能 | - 本番運用は direnv allow や systemd 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 開発ではメリットの方が圧倒的に大きい、ということです。