supervisor
Bitcoin
Monacoin

暗号通貨用Webサービスを立ち上げるためのmonacoind(bitcoind)のビルドと運用

More than 3 years have passed since last update.

概要

Monacoin(もしくはBitcoin)を利用したWebサービスを新しく立ちあげたい場合、最初の問題はどのようにMonacoinをやりとりするためのプログラムであるmonacoindをビルドするのか分からないことです。また、暗号通貨関連のWebサービスは特にセキュリティに気を付ける必要がありますし、monacoindのプロセスを監視するためのスクリプトも欲しいところです。本記事では、暗号通貨用のWebサービスを立ち上げるために必要なmonacoindのビルド方法と、その簡易的な運用方法について解説します。

これらの情報は海外のサイトを漁れば見つけられますが、情報が分散していて若干面倒です。この記事はこれらの情報を簡単にまとめることで、読者がすぐに実際の開発へ取り組めるようになることを期待しています。なお、今回は使用するディストリビューションにUbuntu server 12.04 LTSを選択しましたが、他のディストリも方法はほぼ同じです。

monacoindのビルド

monacoindのビルド自体はaptなどのパッケージ管理システムを使えば比較的簡単に行えます。まずはビルドに必要な各種パッケージを次のコマンドでインストールします。

$ sudo apt-get install git git-core build-essential libssl-dev libdb++-dev libminiupnpc-dev libboost-dev libboost-system-dev libboost-filesystem-dev libboost-program-options-dev libboost-thread-dev

次に、githubのリポジトリからmonacoindのソースコードを取り込みます。なお、本家のmonacoinは元のlitecoinに含まれる履歴を全部消去してしまったため、どのような変更が行われたのか直接確認することは困難です。ソースコードを読み解きたい場合は、Naohiro Aotaさんが公開してくれたMonacoinのパッチ分割を参照してください。

monacoindの場合、一般的なソフトウェアのビルドに必要なconfigureは必要なく、単純にmonacoin/src/makefile.unixを叩くだけで完了します。

$ git clone https://github.com/monacoinproject/monacoin.git
$ cd monacoin/src
$ make -f makefile.unix

なお、Monacoinを含む多くの暗号通貨は、コンパイルを劇的に遅くすることに定評のあるBoost.Spiritを使用しています(boostを使うことでコンパイルが遅くなる現象は一般に Boooooooost と呼ばれる)ので、辛抱強く待ちましょう。

ビルドが完了すれば、monacoin/srcディレクトリ内にmonacoindが生成されます。これを/usr/bin/usr/local/binあたりに移して、試しに実行してみます。

$ monacoind
Error: To use monacoind, you must set a rpcpassword in the configuration file:
/path/to/user/.monacoin/monacoin.conf
It is recommended you use the following random password:
rpcuser=monacoinrpc
rpcpassword=4LTbb7JnUP6waLXMrZFUr6T6ngLDAXqEnVFftYdXKkuV
(you do not need to remember this password)
The username and password MUST NOT be the same.
If the file does not exist, create it with owner-readable-only file permissions.
It is also recommended to set alertnotify so you are notified of problems;
for example: alertnotify=echo %s | mail -s "Monacoin Alert" admin@foo.com

エラーが出たので、指示通りに設定してみます。まず、ホームディレクトリ内に.monacoinディレクトリを作ります。

$ cd $HOME
$ mkdir -m 700 .monacoin
$ touch .monacoin/monacoin.conf

.monacoinディレクトリの中には、monacoindの動作に必要な各種データベースファイルが含まれます。次に、.monacoin/monacoin.confファイルを次のように書き換えます。

rpcuser=monacoinrpc
rpcpassword=4LTbb7JnUP6waLXMrZFUr6T6ngLDAXqEnVFftYdXKkuV

最後にもう一度monacoindを実行すれば、特に何もエラーが発生せずに実行されると思います。なお、最初の実行にはやたらCPUを消費しますが、数分程度待機すれば収まります。

supervisordによる運用と監視

monacoind-daemonオプションを入れることでデーモン化する機能が組み込まれていますが、monacoindを起動時に毎回立ち上げるのは面倒ですし、万が一ダウンした際には自動的に立ち上がるような設定も必要です。一般にはinitスクリプトやsystemdなどを利用してサービス登録を行いますが、面倒ですので今回はsupervisorを利用して気軽にmonacoindの運用と監視を行うようにします。まず、aptを利用してsupervisorをインストールします。

$ sudo apt-get install supervisor

debian系列のsupervisorは、/etc/supervisor/conf.dディレクトリ内にデーモン化したいプログラムの.confファイルを入れることでサービスを登録します。/etc/supervisor/conf.d/monacoin.confを作成し、次のような形でmonacoindのサービスを登録します。

/etc/supervisor/conf.d/monacoin.conf
[program:monacoin]
user=monacoin
autostart=true
autorestart=true
command=/usr/bin/monacoind -server -rpcallowip=127.0.0.1 -rpcuser=USERNAME -rpcpassword=PASSWORD -rpcport=PORT -datadir=/path/to/datadir/monacoin

$HOME/monacoin/monacoin.confに設定を書くのもいいですが、情報が散乱するので今回はsupervisorのファイルに直接monacoindのオプションを記入しています。最後に、supervisorctlを利用して設定ファイルのリロードと起動を行います。

$ sudo supervisorctl reload
Restarted supervisord
$ sudo supervisorctl status
monacoin                        STOPPED    Feb 20 02:44 AM
$ sudo supervisorctl start monacoin
monacoin: started
$ sudo supervisorctl status
monacoin                        RUNNING    pid 4357, uptime 0:00:10

無事にmonacoindの起動が確認できました。

運用に関するセキュリティ上の設定

これは実際に運用している方にとっては一般的かもしれませんが、一応補足します。

  • wallet.datなどの重要なファイルを含むdatadirのパーミッションは慎重に設定する必要があります。具体的には、datadirが他のユーザから見えるような設定は避ける事が望ましいです。同様に、supervisordconf.d/*.confroot以外には読めないように設定してください。
  • monacoindを動かすための専用のユーザ(monacoinなど)を作成し、権限を限定した上でmonacoindを起動するべきです。特に、Webアプリケーションを起動しているユーザからmonacoindの設定ファイルが読めるような設定になることは避けるべきです。
  • rpcpasswordはランダムな文字列を使用すべきであり、推測されやすい単語で構成されるべきではありません。
  • rpcpasswordを記入しているWebアプリケーションの設定ファイルは絶対に外部に公開されないよう気をつける必要があります。
  • 特定のIPからのみの通信を許可するrpcallowipは必ず設定してください。