【Umbrel】LNURLが使いたいから自分で環境つくってみた
※私の体験記です。ご自身でLNURLができる環境を構築するときの参考にしていただければ幸いです。
注意:Umbrel v0.5に対応していません。
LNURLが使いたい。できればLightning Addressも。
動機はただそれだけ。
必要なもの ※Umbrelは除く
- グローバルIPアドレス
私の場合GMOのConoHaにVPSをレンタルしていたのでこのVPSについているグローバルIPアドレスをドメイン名に割当てた。
もし宅内ホームルータにグローバルIPアドレスがついているならそれを使うこともできるようだ。その場合、宅内にラズパイ3やその他何でも良いからnginxが動くホストを用意してこいつをリバースプロキシサーバにする。ホームルータに80(http)と443(https)を転送するように設定すること。 - ドメイン名
ConoHaでは独自ドメイン名を購入することが可能なのでVPSでもお世話になっているし一番安い(年1,000円ほど)ドメイン名で取得した。ドメイン名の扱いがよく分かっていなかったのでここは苦労した。詳細はSSL証明書取得とも兼ね合うので下記に記す。 - SSL証明書
同じくConoHaで証明書を買うことができる。が、個人で試験的に運用するぐらいで使うとするとやや高い(相場がどうこうではなく、ちょっと使うだけなのにという意味で)。Let's Encryptoという承認局が無料で証明書発行をしてくれるとのことなのでこれを利用することにした。詳細は下記に記す。
※LNURLはオレオレ証明書は使えない。ブラウザ-サーバ間でLNインボイスを送るからhttpはもってのほか! - リバースプロキシサーバ
VPS(OSはubuntuをつかったが、なんでも良い)にnginxを入れてこれをリバースプロキシサーバとする。
ubuntuなら sudo apt install nginxで入れる。難しくない。
構成
インターネット <-> VPS(証明書あり、nginx、tailscale) <- tailscaleネットワーク -> ラズパイUmbrel(tailscale, LNbits, BTCPay server)
- VPS-ラズパイUmbrel間にはNAT機能を持つホームルータがあるのでNAT越えが必要で、この間が暗号通信ではないので通信内容が丸見え。tailscaleによるVPNでこれら問題をクリアできる。
- VPSにtailsaleをいれるのは難しくなかった。VPSにSSHログインしてtailscaleのダウンロードページにある「install with one command」にあるコマンドをコピペして実行。インストール終わったらtailscale up と打って実行。ログインページへのURLが出るのでWebブラウザで開き、Umbrelでログインした同じアカウントでログインするだけ。
tailscale statusで同じネットワークにいる他ホストのIPアドレスが確認できる。
各所の情報から上記構成が良いと判断したが「なんでリバースプロキシをつかうの?」と最初はイミフだった。色々いじっていく過程で気づいたのが「BTCPay serverやLNbitsは、リバースプロキシでhttpsを受けてそこから転送されてくることを前提に作られている」っぽいから。
※これらアプリにSSL証明書へのパスを設定する箇所が見つけられなかったのでそう勝手に思ってます。
ラズパイUmbrelにリバースプロキシを設けるアイディアもあるがUmbrelもnginxを使っていて既にポート番号80(http)を専有しており、これを移動させるために各種設定ファイルをいじってもUmbrelアップデートで元に戻されてしまう。つまりめんどくさい。だったら使ってないラズパイやポンコツPCをリバースプロキシ専用にしたほうがまだマシと判断した。
<詳細>
SSL証明書とドメイン名
元ネタはこれ。
元ネタにあるとおりcertbotコマンドをVPS(リバースプロキシとしてつかうnginxのあるホスト)で使って証明書を取得した。元ネタそのままのコマンドラインを使わず、サブドメイン名にも容易に対応できるようにワイルドカード指定なるものを含めて使った。
sudo certbot certonly --manual --preferred-challenges dns -d blackthunder.click -d *.blackthunder.click
途中でblackthunder.clickにTXTレコードとして_acme-challengeを追加してその値に指定された値を入れて登録しておけ!みたいに促される。ドメイン名の真の所有者か確認するためだろう。これができたらVPSに証明書が保存される。有効期間は90日だそうで、延長も可能らしい。自分のスマホカレンダーにリマインダーで入れておけば更新忘れは防げるはずだ。
証明書の保存先は以下通り。
/etc/letsencrypt/live/<ドメイン名>
サブドメイン名で接続先を切り替える
今回の運用のために独自ドメイン名 blackthunder.clickを取得した。
サブドメイン名(btcpay.blackthunder.click とか lnbtis.blackthunder.click)でBTCPay serverやLNbitsなど接続先アプリを切り替えたかったので以下のような設定をした。
1.ドメイン名に関してはConoHaのドメイン設定で、各ドメイン名に対し VPSのグローバルIPアドレスをAレコードを設定。つまりIPアドレスは全部同じ。
2.nginxでserver_nameにて振り分けてproxy_passで転送先を指定。設定できたらsudo systemctl reload nginx とやって反映する。
/etc/nginx/conf.d/server.conf
server {
listen 80;
server_name btcpay.blackthunder.click;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name btcpay.blackthunder.click;
root /usr/share/nginx/html;
index index.html;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Host $host;
location / {
proxy_pass http://<ラズパイUmbrelのtailscale IPアドレス>:3003;
}
ssl_certificate /etc/letsencrypt/live/blackthunder.click/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/blackthunder.click/privkey.pem;
※この設定ファイル、ぐぐってリバースプロキシってこうよ?みたいなのをコピペして作っただけなので知っている人からすればダメダメなんだろうけど、とりあえず動くからヨシ!(現場猫)
少なくともnginxの設定ファイルにて、ssl_certificateとss_certificate_keyで使用する証明書と秘密鍵を指定し、listen 443 sslとすることで443番ポートで待ち受けし、ここへ接続しにくる通信が来ることで暗号通信(https)が始められると分かった。
LNbits
上記のことをやっておけばBTCPay serverではWebブラウザからログインできて、支払い時のLNURLおよびLightning Addressはhttpsとなることは動作確認ずみ。しかしLNbitsの拡張機能LNURL-pで作ったLNURLではhttpsではなくhttpだった。これは本当にイミフでつらかった。
そんなことをツイートしてたらbitbankのJonathan Underwood氏から原因とその対策を教えていただいた。マジ感謝!!!!!
というわけで Umbrel LNbitsのdocker-compose.ymlに FORWARDED_ALLOW_IPS:"*"を追加すれば良い。それによってLNURLにhttpsが含まれること動作確認済み。上記要素を追加した構成ファイルは以下のようになる。
/home/umbrel/umbrel/apps/lnbits/docker-compose.yml
version: "3.7"
services:
web:
image: lnbitsdocker/lnbits-legend:0.8.0@sha256:3426e326bac347d09b4e018780cb1ecd8e5eac35851383d476076769ab4a9b2e
user: 1000:1000
init: true
restart: on-failure
stop_grace_period: 1m
ports:
- "$APP_LNBITS_PORT:$APP_LNBITS_PORT"
volumes:
- ${APP_DATA_DIR}/data:/data
- ${LND_DATA_DIR}:/lnd:ro
environment:
# Global
LNBITS_HOST: "0.0.0.0"
LNBITS_PORT: "$APP_LNBITS_PORT"
LNBITS_DATA_FOLDER: "/data"
LNBITS_FORCE_HTTPS: "true" #コレ追加したよ!
LNBITS_SERVICE_FEE: "0.0" #コレ追加したよ!
# LND
LNBITS_BACKEND_WALLET_CLASS: LndRestWallet
LND_REST_ENDPOINT: https://$LND_IP:$LND_REST_PORT/
LND_REST_CERT: "/lnd/tls.cert"
LND_REST_MACAROON: "/lnd/data/chain/bitcoin/$BITCOIN_NETWORK/admin.macaroon"
# App
LNBITS_SITE_TITLE: "blackthunder"
LNBITS_DEFAULT_WALLET_NAME: "LNbits wallet"
LNBITS_DISABLED_EXTENSIONS: "amilk"
LNBITS_ADMIN_EXTENSIONS: "ngrok"
FORWARDED_ALLOW_IPS: "*" #コレ追加したよ!コレがキモ!!
networks:
default:
ipv4_address: $APP_LNBITS_IP
※ていうかBTCPay serverはなんでこの追加が無いのにhttpsになるんだ?マジワカンネ。
メモ
- 信頼できるユーザA氏に対してリバースプロキシで接続を転送してあげるのはイケてると思う。そうすればA氏はUmbrelさえ用意すればよいから。
その場合VPSとUmbrel間をどうトンネルするかが問題。tailscaleならA氏Umbrelを私と共有化することでVPSからトンネルできるが、私からUmbrelが見えすぎる(権限ありすぎ)ような。sshでトンネル作るならA氏からVPSへSSHログインできる必要があり、これも見えすぎる。困った。 - こんな準備めんどうすぎる、本当にほんのちょっとやりたいだけという方にはngrok(えんぐろっく)をオススメする。※ラズパイ4ならARM64版をダウンロード。
SSHでngrok を実行している間は表示されているドメイン名で接続できる。一旦終了して再度実行した時はさきほどと別のドメイン名になる。
24H365D常に同じドメイン名となるLNURLが欲しいならngrokは向かない。もしくは有料プラン(2022/5/10現在 年プランで$20/月)に加入する必要あり
- VPS課金にクレカ支払い&ドメイン名課金にクレカ支払い。プライバシーというか匿名性の薄いLNノードになってしまいました。
- LNbitsでもLightning Addressがつかえるようが、条件としてcloud flareからドメイン名を買った場合のみ。設定するときcloud flareのAPIやらZoneIDが必要になるから。
- LNbitsはここでデモ機が公開されている。LNbits Legend(Python実装)がUmbrelに入っているバージョンで、infinityはGo実装。Legendを使ってLNURL-pay やwithdrawを体験することができる。LNノード(NodeID:022bd0aa893db4ac890e457cca8c83f112518d6941bf9153dab4bf904620503a78 ,alias:lnbits.com)と繋がっているので支払い&引き出しも体験できる。
dnsの設定でポート番号振り分けってどうするのと考え始めたところだったので、とてもいい情報でした。リバースプロキシ側で割り振ればいいわけですね。同じサイトを参照してて笑いました。