格安VPS "Time4VPS"でBTCPayServerを動かしてみる
今回は、BTCPayServerのインスタンスを格安VPSのTime4VPSで動かす方法について書きます。ここにある記事を参考にしましたが、実際にやってみて変わっていた部分もあるので、そこは書き換えています。また、原文は冒頭に「同期が完了しなかった・身分証明書を要求されるユーザーもいる・Docker非対応のカーネルを割り当てられることがあるので、もはやTime4VPSは推奨しない」と追記を掲載しています。ですので、この手順に従う場合は自己責任でお願いします。
ちなみに自分は身分証も求められず、開始から12時間ほどでちゃんと同期完了しました。
BTCPayServerとは
ビットコインで支払いを受け取る一番簡単な方法は、ビットコインアドレスをサイトに貼ったり、紙に印刷しておくことです。しかし、同じアドレスを使い回すことはプライバシー的に問題があるほかに、どの支払いがどの注文に対応するものかがわかりにくくなります。可能なら、注文ごとに新しいビットコインアドレスを提示したいものです。
BTCPayServerは、ビットコインでの支払いを継続的に受け付ける、「自分で決済業者になれる」ソフトウェアです。内蔵機能でまるごとストアやクラウドファンディングを作ることもできるし、APIを使って自分のオンラインストアやウェブアプリの決済周りを扱うこともできます。ライトニングなどにも対応しています。
提示する金額もビットコイン建て・法定通貨建ての両方に対応しており、さらに自動的に取引所で売却するTransmuterという機能も開発中なので、ビットコイナーじゃない人にも導入しやすくなってきています。(ただし、対応している取引所はまだほとんどありません)
ただし、この手のものは常時稼働させておくためにVPSを利用することが一般的ですが、推奨スペックはRAM2GB、ストレージ80GBと、VPSとしてはなかなか高価なプランを選択する必要があります。国内のVPS業者だと一般的に月額1500円~2000円ほどはかかるスペックです。そこで、安い海外のVPS業者を探してみました。
リトアニアに拠点を置く格安VPS世界的大手のTime4VPSなら、なんと月々5.99ユーロ (年払いなら59.99ユーロ)でRAM8GB、ストレージ80GBを確保できます。このスペックならビットコイン(オンチェーン)とライトニングの両方に対応しても余裕です。
欠点としては、リトアニアにあるので、距離がある分少しレスポンスが遅いことが挙げられます。国内の利用者からの視点で少しでも遅延があると困る方は、少し高くても国内のVPSを選ぶほうが得策です。
(もちろん、後から国内のVPSも立ち上げて、切り替えるといった使い方もできるはずです。)
では、セットアップの手順を早速見ていきましょう。
手順① Time4VPSと契約する
Time4VPSの中でも安価なContainer VPSプランの安い方から4つです。
自分はストレージが80GB以上ある中で最安の、C8というプランに年払いで59.99ユーロ払いました。帯域幅も月に8TBもらえるので安心です。(7200円なので、月600円)
確認メールからアカウントの認証をし、Invoicesから支払いを完了させると、VPSのセットアップができるようになります。
赤字のURLをクリックして設定を進めます。
手順② Time4VPSのセットアップ
まずは、Install OSタブからUbuntu 16.04をインストールしましょう。(もしこの記事を読んだ時点でUbuntu 18.04や20.04が選べるようになっていたら、そちらを選んでください。2016年にリリースされた16.04のサポートは徐々に縮小されていっています。)
少し時間を置くとOSの準備ができるので、準備ができたらLogin Detailsタブのユーザー名とパスワードを利用して、Connect via SSHタブからログインしてください。ユーザー名、パスワードを順に聞かれます。
(もちろん、TerminalやPowerShellなどからSSH接続することもできます。慣れている方はそっちの方が快適です。)
ちなみに動作が変だと思ったらキーボードが日本語入力になってないか確認してみてください。反応してないように見えたりします。また、表示されている一番下の行をクリックして、カーソルが黒点滅していないと入力できません。
まず、BTCPayServerをダウンロードするためにGitをインストールします。
apt-get install -y git
次に、原文にはありませんが、Dockerに対応していないカーネルを割り当てられていないか確認するためにDockerをインストールしてみました。本来はBTCPayServerが自動的にインストールしてくれるらしいのでこの手順は不要かもしれませんが、一応行いました。
apt-get install -y docker.io
systemctl start docker
systemctl enable docker
あとは、全てのアップデートを取得して適用しておきたいので、以下のコマンドを動かしましょう。
apt-get update && apt-get upgrade
手順③ BTCPayServerのセットアップ
次に、BTCPayServerを準備します。まずは以下のコマンドでダウンロードし、フォルダに移動しましょう。
git clone https://github.com/btcpayserver/btcpayserver-docker
cd btcpayserver-docker
ここからは各種設定になります。#で始まる行は解説なので入力しないでください。
# メインネットで動かす場合はmainnet、テストネットならtestnet
export NBITCOIN_NETWORK="mainnet"
# 第一の支払い手段となる仮想通貨名を選びます。ここではbtcです
export BTCPAYGEN_CRYPTO1="btc"
# ライトニングノードを使いたい場合は、lndかclightningから選びます
# 不要ならこの設定は飛ばしてください
export BTCPAYGEN_LIGHTNING="lnd"
# ストレージが80GBしかないので、ブロックチェーンを最新の50GBしか保持しない設定にしましょう
export BTCPAYGEN_ADDITIONAL_FRAGMENTS="opt-save-storage-s"
#メモリが2GBより多い場合、メモリを多く使うよう設定することで初回同期が早くなります
export BTCPAYGEN_ADDITIONAL_FRAGMENTS="$BTCPAYGEN_ADDITIONAL_FRAGMENTS;opt-more-memory"
# ここはSSL証明書関連の設定です。Let's Encryptから証明書を取得するのに使います。
export ACME_CA_URI="https://acme-v02.api.letsencrypt.org/directory"
export LETSENCRYPT_EMAIL="myname@myemail.com"
# 割り当てられたTime4VPSのホスト名を入力します。Service Detailsタブの"Hostname"です
export BTCPAY_HOST="12345.z.time4vps.cloud"
BTCPayServerのアップデートにSSHを使用するために、鍵を生成するなどの手順を簡略化する設定をします。
export BTCPAY_ENABLE_SSH=true
とりあえずこれで十分に設定できたので、インストールしましょう。
. ./btcpay-setup.sh -i
後から設定を変更することも可能ですが、エラーが出なければとりあえず次に進んで下さい。(自分は最初はFailed to generate docker-composeというエラーが出ましたが、何もせずにもう一度最後のコマンドを実行すると成功しました)
手順④ Time4VPSの設定と、ドメインの設定
Time4VPSはCPU使用率が常に100%に張り付く用途は規約違反で、一定時間その状態が続くと無期限にCPUのクロック数上限が1/4になる制裁を受けます。これはマイニング等を意識した制約ですが、当初のブロックチェーン同期中もこのような状況となるので、間違って食らわないようにDockerの設定でCPU利用率の上限を80%に設定しておきましょう。
docker update btcpayserver_bitcoind --cpus ".8"
さて、ここまでセットアップしたので、とりあえずBTCPayServerにログインして管理者アカウントを作っておきましょう。httpsを使って上記で設定したBTCPAY_HOSTに接続しましょう。(上の例ならhttps://12345.z.time4vps.cloud)
自己署名証明書によるセキュリティ上の問題があると表示されますが、とりあえず続行してメールアドレスとパスワードを入力してアカウントを作成します。(しばらく経つと問題なくなります)
同期が完了するまで、右下にはブロックチェーンの同期の進捗状況が表示されます。
URLが12345.z.time4vps.cloudでは味気ないので、独自のドメインを設定したい方もいるかと思います。その場合はドメインを取得して、Time4VPSのService Detailsタブに表示されているMain IPアドレスを使用してAレコードを作成します。(btcpay.example.comのようにサブドメインを指定することもできます。)
Aレコードを作成する代わりに、12345.z.time4vps.cloudへのCNAMEレコードを作成することもできます。
詳細なやり方はドメインレジストラによって違うので、ご自身で調べてみて下さい。
Aレコードを設定したら、BTCPayServerにログインして、サーバー管理画面(Server Settings)からMaintenanceを選び、新しく設定したドメイン名に更新しましょう。そうすると、数分で新しいドメインからアクセスできるようになります。
おめでとうございます!これであなたもBTCPayServerユーザーです。
いろんな設定
ファイルのアップロード
BTCPayServerを使用してファイルを販売したい場合など、外部のファイル保管サービスを指定することができます。AWS S3などがお得です。
Server Settings→Files、もしくはServer Settings→Services→External storage servicesから設定します。
メールサーバー
購入者への注文確認メール、販売者への通知などに使うメールを送るためのメールサーバーを設定することができます。Gmailなどの設定を入れるのが簡単です。Server Settings→Email Serverから設定します。
3rd Party Hosting
自分でセットアップするのが面倒・コストを負担したくないというユーザーは、他のユーザーが作成したBTCPayServerを使うことができます。これを3rd Party Hostingといいます。マスター公開鍵を提出するのでプライバシー面では悪手で、受け取り用アドレスを運営者のアドレスにすり替えられないことに対してトラストが必要ですが、運営者が秘密鍵を預けるわけではありません。
この機能で他のユーザーにも自分のBTCPayServerにアカウントを開設してもらうには、Server Settings→Policiesから"Disable Registration"のチェックを外す必要があります。ライトニングノードを使わせる場合は、"Allow non-admins to use the internal lightning node in their stores"にチェックを入れる必要があります。他の設定も必要に応じてチェックしてください。
また、3rd Party Hostingを許可する場合は、メールサーバーを設定したほうが良いでしょう。
※ライトニング払いを受ける場合は、その部分はホットウォレットなので、運営者が秘密鍵を預かっている状態になります。
ThunderHub
ThunderHubはライトニングノードのモニタリングなどを行うことできる、オープンソースのブラウザUIです。自分のライトニングノードがどれだけの支払いを中継したかや、チャネルの状態などを確認できます。
ThunderHubを追加するには、サーバーに接続して以下のコマンドを入力します。
export BTCPAYGEN_ADDITIONAL_FRAGMENTS="$BTCPAYGEN_ADDITIONAL_FRAGMENTS;opt-add-thunderhub"
. btcpay-setup.sh -i
これで、あとは同期が終わってからhttps://12345.z.time4vps.cloud/thub (独自ドメインを設定した方はhttps://独自ドメイン/thub)にアクセスすればThunderHubを開くことができます。
ですが、ThunderHub側からBTCPayのノードに接続する設定をする必要があります!こちらの記事の"Connect Thunderhub to BTCPay"を参考に設定して下さい。
ストアまたはクラウドファンディングアプリの作成
Storesから新しい「ストア」(設定の集合)を作成して、Appsから新しい「アプリ」を作成します(Point-of-saleはストア、Crowdfundingはクラウドファンディング)。すると、ブログに似た簡単なインターフェイスでストアのタイトルや説明を編集したり、商品を追加することができます。クラウドファンディングもできます。
誰かがトップページ(今はBTCPayServerの管理画面が表示される12345.z.time4vps.cloudもしくは独自ドメイン)に接続したときに特定のストアまたはクラウドファンディングを表示したい場合、Server Settings→Policies→Display app on website rootからアプリを選択します。
あとがき
何か売りたいときなど、ぜひ活用しましょう。
もしこれで上手くいかなかったり、手順が足りなかったなどあれば、ツイッターまたはコメント欄からご連絡下さい。