Develop with pleasure!

福岡でCloudとかBlockchainとか。

c-lightningをRaspberry PiにセットアップしてUmbrelのBitcoin Coreと連携してみる

Diamond Handsに参加するのにUmbrel on Raspberry Pi 4を使ってフルノードのBitcoin CoreとLightningノードのLNDを家庭内LAN環境で稼働し始めたんだけど、1台Raspberry Pi 3が余っていたので、それを使って追加でc-lightningのノードを立ててみた。

f:id:techmedia-think:20211027153617j:plain

Umbrelの設定変更

Umbrelには、1TBの外部SSDをつないで、フルノードを動かしているけど、c-lightningのノード側でもフルノードを稼働するのは冗長的でスペック的にもしんどそうなので、c-lightningが連携するフルノードはUmbrel上で稼働しているものにしたい。

Umbrelでは、Bitcoin CoreやLNDを含め各ソフトウェアはDockerコンテナで起動するようになっていて、これらのアプリケーションの構成は、/home/umbrel/umbrel/docker-compose.ymlに定義されてる。

まず、同一LAN内にあるRaspberry Piからumbrel上のBitcoin CoreへのRPCを叩けるようにするため、docker-compose.ymlbitcoinの設定で、RPCのポートを公開するよう編集する↓

  bitcoin:
        container_name: bitcoin
        image: lncm/bitcoind:v22.0@sha256:37a1adb29b3abc9f972f0d981f45e41e5fca2e22816a023faa9fdc0084aa4507
        depends_on: [ tor, manager, nginx ]
        volumes:
            - ${PWD}/bitcoin:/data/.bitcoin
        restart: on-failure
        stop_grace_period: 15m30s
        ports:
            - "$BITCOIN_P2P_PORT:$BITCOIN_P2P_PORT"
            - "$BITCOIN_RPC_PORT:$BITCOIN_RPC_PORT" # ←この行を追加
        networks:
            default:
                ipv4_address: $BITCOIN_IP

続いて、Bitcoin Coreの設定ファイル/home/umbrel/bitcoin/bitcoin.confを編集し、LAN内のマシンからRPCアクセスを許可するためのIPの設定を追加する↓

rpcallowip=192.168.50.1/24 # 自分の環境に合わせてIPの範囲を指定

↑の設定を変更して、Umbrelを再起動すれば、LAN内のマシンからRPCアクセスができるようになる。

bitcoin.confdocker-compose.ymlに加えた変更は、Umbrelのバージョンを上げると上書きされて消えてしまうと思うので要注意。

Raspberry Piのセットアップ

ここから64 bitのRaspi osをダウンロードする(まだ公式には64 bit版は公式にリストされてないのね)。ダウンロードしたらRaspberry Pi Imagerを使ってSDカードにOSイメージを書き込む。

デフォだとSSHは無効化されているので、書き込みが終わったディスクのルートディレクトリ(/boot直下)にsshという名前の空ファイルを作っておく。これでSSH接続できるようになる(モニターやキーボード繋げてセットアップするのが面倒なので)。

LANケーブルを繋いで電源を入れると、あとはSSHでつないで作業できる。Raspberry Piに割り当てられたIPは、arp-scanとかで調べる。

$ sudo arp-scan -l
...
192.168.50.227  b8:27:eb:24:67:e0   Raspberry Pi Foundation

初期ユーザーとパスワードはpi/raspberry

Dockerのセットアップ

Umbrelと同様、Raspberry Pi上にDockerでノードを起動するようにするため、Docker環境をインストールしておく。

まずリポジトリの設定↓

$ sudo apt-get update
$ sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

続いてDockerのインストール↓

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

sudoしなくても実行できるようにpiユーザーをdockerグループに入れておく↓

$ sudo usermod -aG docker $USER

続いて、Docker Composeのインストール。1.x系はリポジトリにARM用のバイナリが公開されてないので、pipでインストールする。

$ sudo apt-get install libffi-dev
$ sudo pip3 install docker-compose

c-lightningのセットアップ

c-lightningとTorをRapberry Pi上で動かすためのdocker-compose.ymlを用意したので↓を使ってLNノードをセットアップする。

https://github.com/azuchi/c-lightning-on-raspberry-pi

Rapberry Pi上で↑のリポジトリをクローンする。

$ git clone https://github.com/azuchi/c-lightning-on-raspberry-pi.git

続いて、初期セットアップ。

$ cd c-lightning-on-raspberry-pi.git
$ cp cp .env.sample .env

.envの設定値を自分の環境に合わせて設定する↓

# Bitcoin
BITCOIN_NETWORK=bitcoin
BITCOIN_RPC_HOST=<ロカールネットワークでumbrelが動作しているマシンのIP>
BITCOIN_RPC_PORT=8332
BITCOIN_RPC_USER=<umbre上のbitcoindのRPCユーザー>
BITCOIN_RPC_PASSWORD=<umbre上のbitcoindのRPCパスワード>

# c-lightning
LIGHTNING_ALIAS=<LNノードのエイリアス>
LIGHTNING_RGB=<LNノードのカラー(Hex値)>

続いて初期化処理のシェルを実行↓

$ ./setup.sh

一通り設定が終わったら、c-lightningとtorのサービスを起動する↓

$ docker-compose up -d

と、これでumbrel上のBitcoin Coreを連携するRaspberry Pi上にc-lightningが稼働し始める。

lighting-cliの実行

コンテナ上で実行されているc-lightiningに対してlightning-cliの実行がでるよう、binディレクトリ以下にlightning-cliを用意している。

$ cd bin
$ ./lightning-cli help

のように実行できる。このファイル自体は、内部でコンテナで動作するc-lightningに対してdocker-compose execしているだけ。

補足

セットアップは↑で終わりだけど、今回↑のdocker-composeを構成するにあたり、c-lightningのDockerイメージを新たに作成した↓

※ 作成したイメージは、DockerHubで公開しているので、基本的に↑のdokcer-composeを使うのであれば、以下の作業をする必要はない。

c-lightningのDockerイメージの作成

lndについては、Lightning LabsがDocker Hub上にイメージを公開しているc-lightningもElements Projectでコンテナイメージが公開されているんだけど、残念ながらamd64アーキテクチャのイメージしかなく、arm64のイメージは公開されていない。

Raspberry Piで使用する場合、armアーキテクチャに対応したイメージが必要なので、まずはc-lightningのarm64用のDockerイメージを作成する。c-lightningのリポジトリにもarm64用のイメージのビルドファイルがある↓

https://github.com/ElementsProject/lightning/blob/v0.10.1/contrib/linuxarm64v8.Dockerfile

ので、これを使ってビルドする。今回はリポジトリをcloneして、タグv0.10.1のコードを使ってビルドする。

ちなみにamd64環境でビルドする際は、事前に以下を実行しておく必要がある。

$ docker run --rm --privileged multiarch/qemu-user-static:register --reset

続いて、イメージのビルド

$ docker build -t azuchi/lightningd:v0.10.1 -f contrib/linuxarm64v8.Dockerfile .

DockerHubにプッシュしておく↓

$ docker push azuchi/lightningd:v0.10.1

以降は、Docker Hubから入手可能↓

https://hub.docker.com/repository/docker/azuchi/lightningd