Raspberry PIでStorjを動かす

# はじめに

[Storj](https://storj.io/)のベータ版に参加できることになったので、手元の機材で環境構築しました。



# ハードウェア情報

- ハードウェア: Raspberry Pi 3
- OS: 2019-04-08-raspbian-stretch-full  
http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian_full/images/raspbian_full-2019-04-09/

- HDD: 最低550GB

# 環境構築

## Dockerのインストール

Raspbian StretchにDockerをインストールする。
基本的には [公式ドキュメント](https://docs.docker.com/install/linux/docker-ce/debian/)通りだが、リポジトリの追加のところはRaspbian用に変更している。

```
$ sudo apt-get remove docker docker-engine docker.io containerd runc

$ sudo apt-get update

$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg2 \
    software-properties-common

$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

$ sudo apt-key fingerprint 0EBFCD88

$ echo  "deb [arch=armhf] https://download.docker.com/linux/raspbian stretch stable" | sudo tee /etc/apt/sources.list.d/docker.list

$ cat /etc/apt/sources.list.d/docker.list
deb [arch=armhf] https://download.docker.com/linux/raspbian stretch stable

$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

$ apt-cache madison docker-ce
 docker-ce | 5:19.03.2~3-0~raspbian-stretch | https://download.docker.com/linux/raspbian stretch/stable armhf Packages

$ sudo apt-get install docker-ce=5:19.03.2~3-0~raspbian-stretch docker-ce-cli=5:19.03.2~3-0~raspbian-stretch containerd.io
```


## HDDマウント

- 今回はNASをマウントし、そこにStorjのデータを保存します。

```
$ sudo mkdir /mnt/storj
$ sudo mount -t nfs 192.168.11.17:/FS01/Storj /mnt/storj
```

- マウントパスにStorjのデータ保存領域を作ります。

```
$ mkdir /mnt/storj/data
$ sudo chmod 777 -R /mnt/storj/data/
```

## ポートフォワーディング

ルータの28967番ポートをRaspberry PIまでフォワーディングする。

# 認証ファイルの作成

- Identity Tokenを使って、認証ファイルを作成する。

- 認証用バイナリをダウンロード

```
$ mkdir storj
$ cd storj
$ wget https://github.com/storj/storj/releases/download/v0.21.1/identity_linux_arm.zip
$ unzip identity_linux_arm.zip
$ chmod +x identity_linux_arm
```

- コマンドを実行し、認証ファイルを生成する。  
コマンド実行したら完了まで結構時間掛かります。

```
$ ./identity_linux_arm create storagenode
2019-09-20T10:34:30.795+0100    INFO    running on version v0.21.1
Generating key with a minimum a difficulty of 30...
Generated 1685050 keys; best difficulty so far: 30
Found a key with difficulty 30!
Unsigned identity is located in "/home/pi/.local/share/storj/identity/storagenode"
Please *move* CA key to secure storage - it is only needed for identity management!
        /home/pi/.local/share/storj/identity/storagenode/ca.key
```

- 作成した認証ファイルはここに保存されます。

```
$ ls /home/pi/.local/share/storj/identity/storagenode/ca.key
```

- 認証ファイルに、参加登録したときにメールで受け取ったidentity tokenを使って署名をする。

```
$ ./identity_linux_arm authorize storagenode <email:characterstring>
```

- 署名した認証ファイルはバックアップしておきましょう。

## Storj Storage Node構築

- storageNode用のコンテナをダウンロード

```
$ sudo docker pull storjlabs/storagenode:beta
```

- Storjコンテナの起動

```
$ sudo docker run -d --restart unless-stopped -p 28967:28967 \
    -e WALLET="<Storj Tokenを受け取るEthereumのアドレス>" \
    -e EMAIL="<登録したメールアドレス>" \
    -e ADDRESS="<自分のドメイン名>:28967" \
    -e BANDWIDTH="60TB" \
    -e STORAGE="500GB" \
    --mount type=bind,source="<identity-dir>",destination=/app/identity \
    --mount type=bind,source="<storage-dir>",destination=/app/config \
    --name storagenode storjlabs/storagenode:beta
```

## Dashboard

- CLIでノードのステータスを見る

```
$ docker exec -it storagenode /app/dashboard.sh


Storage Node Dashboard ( Node Version: v0.20.1 )

======================

ID           <NodeID>
Last Contact 0s ago
Uptime       13h22m26s

                   Available       Used     Egress     Ingress
     Bandwidth       60.0 TB     0.8 GB        0 B      0.8 GB (since Sep 1)
          Disk      500.0 GB     4.6 MB

Bootstrap bootstrap.storj.io:8888
Internal  127.0.0.1:7778
External  <domain名>:<port番号>

Neighborhood Size 258
```

## Storjのバージョンを自動でアップデートさせる

watchtowerを使用して、storagenodeのDockerコンテナーを自動更新することができます。
Watchtowerは6時間ごとに新しいバージョンを探し、新しいバージョンが検出されるとストレージノードを自動的に更新します。

```
$ sudo docker run -d --restart=always --name watchtower -v /var/run/docker.sock:/var/run/docker.sock storjlabs/watchtower storagenode watchtower --stop-timeout 300s --interval 21600
```

# 参考資料

- Storj公式ドキュメント  
https://documentation.storj.io/