見出し画像

仮想通貨botの環境&ソース管理方法紹介

こんにちは。バジル(@kkngo_crypto)です。

今回は、私のbotの環境やソース管理について紹介しようと思います。

始めに断っておくと、私はbotの環境についてはスクリプトが動きさえすればよく、バックアップも意識したくない(勝手にできていてほしい)という考え方です。

環境構築をやりこむ楽しさや開発環境の再利用性を高める利点もわかるのですが、余暇で行う個人のbot開発においてはあまり労力をかける場所ではないなと思っています。

そんなわけで、これは環境構築の細かい手順書的な記事でもなく、新しいクラウドサービスやかっこいい開発環境を紹介するような記事でもありません。自分の考えややっていることを文章としてまとめておきたいという記事であることをご留意ください😉🙏

それではいってみましょう!

開発環境について(Python)

まず、開発環境のパターンとしては、

  • ローカルPCに普通にPythonをインストールして利用

    • IDEとしてVisual Studio Code(VS Code)を使ったり、実行環境にJupyter Notebookを使ったり、開発に関連するツール類のパターンは割愛

  • コンテナ化した開発環境を利用

    • Dockerなど

  • クラウドサービスのサーバにPythonをインストールして利用

    • AWSのEC2やWorkSpaces、レンタルサーバなど

  • クラウドサービスの開発環境を利用

    • Cloud9やGitHub Codespacesなど

といったものがあるかと思います。

私はというと、ローカルPC(Windows)に普通にPythonをインストールしています。IDEはVS Codeを使っていて、テスト実行もVS Code上で行っています。

なぜこうしたローカルPC環境なのかと言うと、別に困っていないからです。

botの内容にもよるかもしれませんが、私の場合、開発環境の構築といってもPythonとTa-Libをインストールして必要なライブラリをpip installするだけですので、新しい環境もすぐに構築が可能です。

また、趣味のゲームのためにゲーミングPCを持っていたので、安価なクラウドサービスを利用するよりはスペックが高いという理由もあります。

botの実行環境について

AWSのEC2(Linux)でt2.smallが2台です。こちらの環境構築もローカルと同様にPythonとTa-Libをインストールして必要なライブラリをpip installするだけなので、こちらも現状は特に課題は感じていません。

機械学習を使っているbotでモデルの作成が重めのものは、定期的にローカルでモデルを作成するようにしています。

また、各種データの保存にはsqlite3を使っています。一時期はRDS(MySQL)を使っていたのですが、sqlite3の方がDBごとにファイルで管理できて取り回しがしやすいと思います。無料で使えるのも良いです。SQLで集計したりもしたいので、KVSよりはRDBMSが好みです。

ソース管理について

ソース管理のパターンとしては、ちょっと長いですが

  • 開発環境自体をバックアップしている

    • クラウドサービスを使っている場合は、スナップショット機能など

    • Dockerなどでコンテナ化している場合は、そのイメージを

  • ソースコードをバックアップしている

    • クラウドサービス(DropboxやGoogle Driveなど)

    • ローカル(NASやUSBメモリや別PCなど)

  • ソースコードをバージョン管理システムで管理している

    • gitやSVNやVSSなど

    • 特にgitの場合はGitHubやGitLabなどのクラウドサービス

  • 気が向いたときに気が向いたファイルを気が向いた場所にバックアップしている

    • いざというときはがんばって発掘すれば見つかるはず

  • バックアップを取っていない

    • すべて頭の中に入っているので不要

    • めんどくさい

    • ローカル開発環境とクラウド実行環境の二か所にソースがあるので実質バックアップできている(キリッ

といったものがあるかと思います。

私は下記のようにソース管理をしています。

  • GitHubの無料プランのプライベートリポジトリを利用

  • ローカルの開発PC(Windows)のタスクスケジューラで定期的にGitHubにソースをpush

なぜGitHubを使っているかというと、本業で利用していて、ソースコードの管理方法として自分が一番使い慣れているからです。

とはいえ個人開発なので、開発ワークフロー(GitHub Flowなど)に沿って開発しているわけではないですし、ブランチもmainのみの利用です。issueやプルリクエストなどの機能も利用していません。ブラウザでもソース差分が確認できるgitホスティングサービスといった使い方です。

バックアップ先はどこでもいいと思います。自分が使い慣れている場所が一番です。

以下に、自分がソース管理で注意している点やどんな風に自動化しているかについて詳細を記載します。

GitHubやgitの使い方については割愛します。

注意:クラウド保管用にソースコード改修

まず注意点なのですが、特に何も意識せずに書いたスクリプトの場合、取引所のAPIキーやシークレットをハードコーディングしているケースが多いかと思います。

ローカルのバックアップなら最悪そのままでもいいのですが、クラウドにバックアップを取る場合は、APIキーやシークレットはアップしないようにする必要があります。

GitHubの例ですが、全公開リポジトリを監視してAWSのアクセスキーを探しているbotが存在します。
(例:GitHub に AWS キーペアを上げると抜かれるってほんと???試してみよー!

上記はGitHubでAWSのアクセスキーを探索しているbotですが、GitHub以外も探索しているbotはあるでしょうし、AWSではなく取引所のAPIキーも探索されていると考えたほうが良いと思います。怖いですね😨

もちろん、GitHubはプライベートリポジトリで運用しているので漏れることはないのですが、操作ミスなどで公開リポジトリにしてしまうリスクもあるため、APIキーやシークレットはソースコード本体には含めないようにする必要があります。

別管理するための主な方法としては、

  • コマンドライン引数でスクリプトに渡す

  • スクリプト起動時に対話形式で標準入力に入力させる

  • 別ファイル(バックアップ対象外にする)に記載してスクリプトで読み込む

  • 環境変数に設定しておいてスクリプトで読み込む

などが考えられます。

それぞれ良し悪しがあるとは思うのですが、私は環境変数を読み込むようにしています。

# WindowsもLinuxも環境変数を読み込むコードは同一でOK
API_KEY = os.environ["FTX_API_KEY"]
API_SECRET = os.environ["FTX_API_SECRET"]

といったコードで簡単に読み込むことができます。

自動バックアップの方法

ソースコードからAPIキーやシークレットを切り離せたら、自動バックアップの設定です。

簡単に言うと、タスクスケジューラから定期的にバックアップ用のvbsファイルを実行して、ソースコードをGitHubにアップするようにしています。

■起動用vbsファイル

Set ws = CreateObject("Wscript.Shell") 
ws.run """C:\Program Files\Git\bin\sh.exe"" ""D:\bat\git_push_trade_sources.sh""", 0, True

バックアップスクリプトはshで書いているので、Git Bashで実行しています。

vbsにせずbatでもいいのですが、vbsで上記のような呼び出し方をすることでコマンドプロンプトが立ち上がらないため、タスクスケジューラからの呼び出しに向いています。

■バックアップスクリプト

#!/bin/sh

WORKSPACE_DIR=D:/trade
REPO_DIR=D:/bat/work/git-repo
REPO_NAME=trade
USER_NAME=*****

# gitリポジトリのフォルダを削除
cd $REPO_DIR
rm -rf $REPO_NAME
sleep 1

# gitリポジトリをclone
git clone git@github.com:$USER_NAME/$REPO_NAME.git
sleep 1

# バックアップ対象ファイルをgitリポジトリのフォルダに上書きコピー
cd $REPO_NAME
cp -f $WORKSPACE_DIR/super_great_bot.py       ./
cp -f $WORKSPACE_DIR/ultra_hyper_bot.py       ./
cp -f $WORKSPACE_DIR/highest_maximum_bot.py   ./
cp -f $WORKSPACE_DIR/supreme_awesome_bot.py   ./
sleep 1

# GitHubにアップ(add,commit,push)
git add .
sleep 1
git commit -m "synchronize trade scripts"
sleep 1
git push origin main
sleep 1

こんな感じのスクリプトです。

開発用のフォルダとは別にgitリポジトリ用のフォルダを用意して、毎回cloneしなおしてからソースコードを上書きコピーする運用にすることで、絶対に競合などのエラーが発生しないようにしています。この運用でも、ファイル差分があったファイルのみがコミットされますし、修正ファイルがひとつもない場合はGitHubには何もpushされません。

また、開発用のフォルダはgitリポジトリにもなっていない(=VS Codeでgit連携もしていません)ので、開発中にgitの運用に意識を裂くこともありません。

雑に開発しつつバックアップも勝手にとってほしいという観点で作っています。

※上記スクリプトは実際に動かしているものから一部抜粋していますので、もし参考にする場合は環境に合わせて修正のうえご利用下さい。rm -rf している箇所があるのでご利用にはご注意下さい。

終わりに

今回紹介したGitHubへのバックアップ方法は、私個人のナレッジや嗜好からたどり着いたものなので、あまり一般的な方法ではないかもしれません。

ただ、タスクスケジューラ(またはcron)からバックアップスクリプトを起動するという運用は非常におすすめです。

手動でバックアップなんて面倒くさくて絶対やらないですからね。自動化しておくに越したことはないです。

では、皆さんのソースコードがいつまでも無事であることを祈っています🙏

この記事が気に入ったらサポートをしてみませんか?