Umbrelでチャネルバックアップを自動化する(2024年版)

# 始めに
オライリーのライトニングネットワークを読み、自宅にあったラズパイでノード運用をはじめました。[ラビット忍者](https://amboss.space/node/034943f7c73ee7463fece392886532b87edeb2d62d6b60212f089941a0435b8f80)というノードです。

知らない方のために説明いたしますと、ライトニングネットワークはBitcoinを少額決済で利用できるようにするLayer2の技術です。

https://coinpost.jp/?p=355637

ライトニングネットワークではノード（ネットワークを構成するサーバー）を立てた後、他のノードとチャネルを開いて運用します。
チャネルとは自ノードと他ノードをつなぐ送信用の通信トンネルであり、複数のノードとチャネルを開くことで効率的な送金が可能になります。

チャネルを開くに当たって、ある日ノードがぶっ壊れたときに復旧ができるようにどのノードとどのチャネルを開いていたかを事前にバックアップしておくと安心です。今回の記事はそのような人のために役立つ内容となっています。

昨年10月にLNの開発者によって重大な欠陥が報告された（[置き換えサイクリング攻撃](https://jp.cointelegraph.com/news/bitcoin-core-developer-antoine-riard-steps-back-lightning-network-dilemma)）ばかりなのですが、一応の対策方法も出ているため気にせず行きます。

## 対象読者
- Umbrlを使ったライトニングネットワークのノード運用を始めたばかりの初心者
- チャネルバックアップを昔に設定していたがこの機会に最新版へアップデートしたい人

# チャネルバックアップを自動化する
### 基本的な手順
基本的な設定方法はtoshihrさんが書かれているこちらの記事を参照します。

https://spotlight.soy/detail?article_id=vqf25l8yf

DropboxのAPI仕様が変わったため、現在は上記記事のままでは動きませんでした。
そのため、今回私はDropboxの代わりにStorjを使用しました。

:::note info
Storjは分散型のクラウドストレージサービスで、Amazon S3やGoogle Cloud Storageとの互換性を提供しています。IPFSとBlockchain技術を使用しており、高セキュリティかつ高い可用性、そして非常に安価に利用できます。
同様のサービスにFilecoinがあり、こちらもおすすめです。
:::

以後は上記記事を参考にshスクリプトのダウンロードやインストール設定が済んでいる状態とします。

### Storjのアカウントを用意する
[Storjの公式ページ](https://www.storj.io)に行き、アカウント登録を行います。25GBまで無料で利用可能です。

https://www.storj.io

### アップロード用のAccess Grant Keyを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605179/83ee0d0e-3b47-61a9-bfcd-1c01899b5531.png)
作成したいプロジェクトのAccessタブから、新しいAccess Keyを作成できます。

https://docs.storj.io/learn/tutorials/quickstart-uplink-cli/uploading-your-first-object/create-first-access-grant

### UmbrelにStorj CLIを導入する
ラズパイなのでARM64をインストールしました。
```console
$ curl -L https://github.com/storj/storj/releases/latest/download/uplink_linux_arm64.zip -o uplink_linux_arm64.zip
$ unzip -o uplink_linux_arm64.zip
$ sudo install uplink /usr/local/bin/uplink
```
https://docs.storj.io/dcs/api/uplink-cli/installation

### Access Grantの設定ファイルを読み込む。
```console
$ uplink access import main accessgrant.txt
```
### Bucketを作成する
StorjではBucketと呼ばれるファイルよりも大きな単位で仮想的なグループを作成できます。
```console
$ uplink mb sj://UmbrelLNBackUP
```

### shファイルのファイルアップロード処理を修正する
バックアップファイルのDropboxへのアップロード処理をStorjへのアップロード処理に修正します。
```sh
# UPLOAD
# --------------

upload_to_storj () {
        uplink cp $1 sj://UmbrelLNBackUP
        if [ $? -eq 0 ]; then
                echo "Successfully uploaded!"
        else
                echo "Unknown error when uploading..."
        fi
}

run_storj_backup () {
        upload_to_storj $1
}
```
script実行処理を`run_storj_backup`に置き換えます。
```sh
run_backup_on_change () {
~~~snip~~~
    run_storj_backup $BACKUPFILE_TIMESTAMPED
~~~snip~~~
    run_storj_backup $BACKUPFILE_TIMESTAMPED.md5
~~~snip~~~
}
```
### ファイルアップロードのトリガー条件を修正する
従来のままでは監視ファイルの全てのイベントに反応してしまうため、inotifywaitのトリガー条件を修正して書き込み終了時のみを検知するようにします。
```diff_shell
-       inotifywait $SOURCEFILE
+       inotifywait -e close_write $SOURCEFILE
```
### テストアップロードを試す
systemdサービスを実行します。
```terminal
$ sudo systemctl start lnd-channel-remote-backup
```
### 完了！
無事にテストが成功すれば、常駐としてデーモン化します。
```terminal
$ sudo systemctl enable lnd-channel-remote-backup
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605179/969e370b-96dc-d33b-594f-51fed08d20c8.png)

これで無事にチャネルバックアップができるようになりました。
よきノード運用を！
# 参考
https://spotlight.soy/detail?article_id=vqf25l8yf

https://spotlight.soy/detail?article_id=ivyqxwema

https://spotlight.soy/detail?article_id=zr2qho4jn