【ILP 連載 - 1】ilp-kit を自分のサーバーで立ち上げる

# 前書き
この記事は連載の一部となっています。連載インデックスは [【ILP 連載】自分で ILP を実装してみよう！](https://qiita.com/dora-gt/items/51774984953c82912b13) をご覧下さい。

さて早速連載の第1回ですが、ILP には公式のサンプル実装のようなものがあり、実際にレジャー・コネクタを走らせる事ができる Docker のイメージとその使い方が公開されています。今回はこれを実際にサーバーで動かすためにセットアップする所までを書いてみたいと思います。

必要とされる前提知識は下記の様なものです。

- Unix 系 OS をいじれる
- VPS などを使ってサーバーを立てる事ができる
- zone を自分で設定できる
- git が操作できる
- Docker が何者かは理解している

これくらいができれば、とりあえずセットアップは問題ないのではないでしょうか。これらについての知識がない方は、下記などを参考に勉強される事をおすすめします。この記事ではこれらについての詳細には触れません。前提知識の差を短時間で埋める事が大変困難なため、「まぁだいたいエンジニアならこの辺は分かるだろう」という部分は端折っています。ご容赦下さい。

- Unix
    - [UNIX/Linux入門](https://ja.wikibooks.org/wiki/UNIX/Linux%E5%85%A5%E9%96%80)
- VPS
    - [さくらのVPS](https://vps.sakura.ad.jp/)
    - [Google GCE](https://cloud.google.com/compute/?hl=ja)
    - [Amazon EC2](https://aws.amazon.com/jp/ec2/)
    - [Microsoft Azure](https://azure.microsoft.com/ja-jp/)
- zone (DNS)
    - [DNS](https://technet.microsoft.com/ja-jp/library/cc730921(v=ws.11).aspx)
    - [DNSの仕組みと運用](http://www.atmarkit.co.jp/ait/series/2257/)
- git
    - [こっそり始めるGit／GitHub超入門](http://www.atmarkit.co.jp/ait/series/3190/)
- Docker
    - [超入門Docker](http://www.atmarkit.co.jp/ait/series/5086/index.html)
    - [Get Started](https://docs.docker.com/get-started/)

この記事では、これ以外に個人的に自分がハマった所などをシェアさせて頂ければと思いますが、個人的にはこれをやってみるだけでとても勉強になりました。まず Docker 自体が存在は知ってはいたけれども自分で触った事がなかったのでとてもいい機会になったのと、[Let's Encrypt](https://letsencrypt.org/) という面白いプロジェクトを知る事ができたためです。どちらも、知っておいて損のないものだと思います。

# 流れ
全体の流れをざっくり言うと、だいたいこの様な感じです。

- ilp 用のドメインでサーバーを立てる
- Docker で ilp-kit を立ち上げる
- コネクタの設定をする

ilp-kit というのは、サーバー上に ilp での支払いをできる様なインターフェースを提供してくれる node のウェブアプリケーションです。レジャー自体の実装やそのアカウント管理、コネクタの実装などが含まれたトータルなキットです。

では個別に見ていきましょう。

# 自分のドメインでサーバーを立ち上げる
前提知識の所でも書きましたが、自分でサーバーを立てる方法などはここでは解説しません。要件としては、下記の様な感じになりますので、そんな感じで立ててみて下さい。

- Docker で Unix のコンテナが動く事
- 自分のドメインが割り当てられる事
- 80, 443, 3010 のポートが空いている事

私はたまたま別の用途に使っていたサーバーがさくらの VPS 上にあったので、それを使いました。また、ドメインに関しても `xxx.jp` のドメインを持っていたので、新たにサブドメインを切って `ilp.xxx.jp` としました。`ilp-kit.` としている人もいる様です。好みでいいのではないでしょうか。外部から `nslookup` や `ping` などを使って疎通を確認しておきましょう。

# Docker で ilp-kit を立ち上げる
## Docker のインストール
私の VPS は Docker 自体が入っていなかったので、インストールしました。OS は CentOS 7.4 です。
[VPSにdocker環境構築](https://qiita.com/t-mimura/items/c206d46f3af771292f89) こちらの記事も参考になります。

```:install-docker
$ su

# yum update
# yum install docker-io
# systemctl start docker
# docker --version
Docker version 1.12.6, build 85d7426/1.12.6
```
ここまででインストール自体はできていますが、自分のユーザーでも実行できる様にしておきます。ここでは `dora-gt` というユーザーの例です。

```:apply-privilege
# groupadd docker
# gpasswd -a dora-gt docker
# systemctl restart docker

$ docker info
Docker version 1.12.6, build 85d7426/1.12.6
```

「？docker っていうグループ作っただけじゃん。何でこれで動くの？」となると思いますが（私もなりました）、[公式ドキュメント（Manage Docker as a non-root user）](https://docs.docker.com/engine/installation/linux/linux-postinstall/)によると、自動的に docker というグループが使われる様になっている様です。

## Docker Compose のインストール
Docker のコンテナを依存関係を気にしながら起動したりするのは面倒なので、それをよしなにやってくれる Docker Compose という仕組みがあります。これをインストールします。やり方は公式サイトの [Install Compose on Linux systems](https://docs.docker.com/compose/install/#install-compose) が参考になるので、こちらの通りやってみます。

なお、`1.17.1` という部分が最新バージョンになっている事を確認した方がよいです。最新バージョンは [Docker のリポジトリ](https://github.com/docker/compose/releases/latest)から確認できます。

```:install-docker-compose
$ sudo curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose --version
docker-compose version 1.17.1, build 6d101fb
```
公式の記事には bash-completion のインストール方法も書かれていますので、必要なら参照してみて下さい。

## ilp-kit を立ち上げる
先ずは、`ilp-kit` まわりのイメージをまとめて実行してくれる [ilp-kit-docker-compose](https://github.com/interledgerjs/ilp-kit-docker-compose) をクローンしてきます。

```:clone
$ git clone git@github.com:interledgerjs/ilp-kit-docker-compose.git
```

次に、ILP 用のパスワードを取得します。

```:generate-secret
$ openssl rand 32 | base64 | sed 's/[+=/]//g'
S1zOLm91Wi7H3GYvuqXhsvwT0H5Yy1TIDXEgBNHoQP4
```

こんな感じの何かが出力されますが、その時その時で違うはずなので、どこかにメモっておいて下さい。`ilp-kit` に管理者ログインする時にこれが使われたりします。なお、公式ドキュメントでは `+=/` を置き換える様な記述はありませんが、**これはやっておいた方がいい**です。場合によっては `postgres` が立ち上がらなくなってハマります。私は数時間ハマりました。

なお、間違ったパスワードを設定してしまい postgres が起動しなくなってしまった場合には、`ilp-kit-docker-compose/data` ディレクトリも削除する必要があります。これは、Docker がコンテナとは別にローカルの data ディレクトリをマウントしているためで、**ここを削除しないと postgres のデータが削除できない**ためです。滅茶苦茶ハマりました…。

では実際に docker-compose で実行してみます。

```:docker-compose
# ILP_DOMAIN = 用意した ILP 用のドメインを指定します
# ILP_EMAIL = 上記のドメイン以外のメールアドレスを指定します
# ILP_CURRENCY = レジャーの通貨の単位を大文字で指定します
# ILP_SECRET = 上記で生成しておいたパスワードを指定します

$ cd ilp-kit-docker-compose
$ ILP_DOMAIN='ilp.xxx.jp' \
ILP_EMAIL='hoge@fuga.jp' \
ILP_CURRENCY='JPY' \
ILP_SECRET='S1zOLm91Wi7H3GYvuqXhsvwT0H5Yy1TIDXEgBNHoQP4' \
docker-compose up -d
```

なお、公式ドキュメントによると `ILP_DOMAIN` がおかしいというのがエラーになる主な原因の様です。スペルミスなどは十分注意して下さい。通貨の単位に関しては、大文字で記入する様に注意して下さい。コード自体は、[fixer.io](http://fixer.io/) が対応しているものである必要があります。

```:output
Creating postgres ... 
Creating postgres ... done
Creating ilp-kit ... 
Creating ilp-kit ... done
Creating letsencrypt ... 
Creating letsencrypt ... done
```

最終的にこんなものが表示されたら、準備オッケーです。

# コネクタの設定をする
ここまでできたら、`ilp-kit` にログインができるはずです。自分のドメインに https 経由でアクセスして下さい。http ではない事に注意です。どういう理屈かはいまいち分かっていないのですが、多分プロキシ関係で先に http にアクセスしてしまうと何かまずいのだと思います。

もし何かエラーが出ている様なら、下記コマンドを実行してログをチェックしてみて下さい。何か分かるかもしれません😂 ちなみに私はハマった時、これを見て postgres が接続する時におかしなアドレスで接続しているな？という所から色々調べて、解決できました。

```:check-log
$ docker-compose logs -f ilp-kit
```
正常にアクセスできたら、こんな感じの画面が見れるはずです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/71179/a20a974e-bb5d-2a8a-ddbb-9263b8998658.png)

先ずは接続先のコネクタの情報を入力しなければならないので、`admin` でログインしましょう。`username` に `admin` を、`password` には先ほど生成してメモっておいたパスワードを入力します。ログインできたら、下記の様な画面が表示されるはずです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/71179/11145383-83f4-746c-779a-522caab3e085.png)

`Connect with other ledgers` をクリックし、接続先情報入力画面を表示します。出てきた画面に接続先の情報を入力するのですが、公開されたものは現状ないので（開発者によると、今テストネットを作る事を検討しているとの事です）自分で２つ以上立てて遊ぶか、もしくはご連絡を頂ければ私のサーバーと接続する事も可能です（攻撃などされると面倒なので公開は控えたいと思います）。`limit` には、その接続先をどれだけ信用するか、の値を自分のレジャーの単位で入力しておきます。開発者によるとそういう事の様ですが、これの詳しい意味については内部的なコードを確認して後日検証してみようと思います。

# 削除したくなったら
色々遊んでみて削除したくなったら、下記の様に削除することができます。

```:remove
# ilp-kit-docker-compose ディレクトリにて

$ docker-compose stop

$ docker-compose rm
Are you sure? [yN] y # 本当にいい？と聞かれるので yes

$ docker-compose ps
Name   Command   State   Ports
------------------------------
# 何も表示されなければ OK です
```

# 終わり
今回は、いったんインストールができて `ilp-kit` が起動できる所までの確認をしました。次回はより詳細な使い方について書いてみようと思っています。いつになるかは未定です！！😂 ゆるーく、お待ち下さい。