Bring Your Own Node: Relayium のリレー&ストレージを無料で使う
最終更新: 2026-08-06
ネットワークをまたぐ転送や保存リンクは、当社にとってコストのかかるリレー帯域とディスクを使うため、無料枠の範囲内で動作し、それを超えると有料になります。それを回避する方法があります。自分のリレー/ストレージノードを立ち上げてアカウントに紐付ければ、転送は当社ではなく自分のノードを経由するようになり、従量課金も請求も一切ありません。
これは Relayium サーバー全体をセルフホストするのとは異なります。いつもの relayium.com アカウントと同じアプリをそのまま使い続け、自分のトラフィックを運ぶノードを追加するだけです。このガイドでは、まっさらな Linux マシンからオンラインのノードまで、およそ5分で到達できます。
なぜ自分のノードを立てるのか
理由は2つあります。1つ目はコストです。自分のノードはリレーとストレージのトラフィックを直接運ぶため、当社の従量課金インフラに一切触れず、請求するものが何もありません。使用量がどれだけ大きくても無料です。
2つ目はコントロールです。リレーされたバイト列や保存されたブロブは、自分で運用し、自分の運用管理下に置いたハードウェア上に存在します。リアルタイム転送は全経路でエンドツーエンド暗号化されたままなので、自分のノードでさえ常に暗号文しか見えません。
ノードをインストールしてオンラインにする
手順1の前に必要なもの
- インターネットから到達できる Linux サーバー——安価な VPS でも、自宅の常時起動マシンでも構いません。amd64 と arm64 の両方に対応しています。
- そのサーバーの root 権限、または sudo。インストール時に一度だけ必要で、ノード自体が root で動くことはありません。
- 受信ポートを開けること——ホストのファイアウォールに加え、クラウド VPS では事業者のセキュリティグループにも設定が要ります。
- サインイン済みの relayium.com アカウント。インストールコマンドはアカウントページで発行され、使い捨てのトークンを含みます。
- ディスク容量。中継だけでなく保存もさせたい場合のみ必要です。中継専用なら不要で、RELAYIUM_NODE_STORAGE_DIR を外してください。
順に4つのことをします。コマンドを発行し、実行し、ポートを開け、オンラインになったことを確認する——新しいマシンなら5分ほどです。
relayium.com にサインインし、アカウントページ /me を開きます。
「マイノード」まで進み、「ノードを追加」をクリックします。表示されたインストールコマンドはすぐにコピーしてください。含まれるトークンは一度きりの表示で、あとから再表示はできません。
それをサーバーに貼り付けて実行します。relayium-node のバイナリをダウンロードしてチェックサムを検証し、/usr/local/bin に配置し、systemd サービスを書いて起動します。
curl -fsSL https://relayium.com/install-node.sh | sudo RELAYIUM_CENTRAL_URL=https://relayium.com RELAYIUM_NODE_TOKEN=<your-token> RELAYIUM_NODE_STORAGE_DIR=/var/lib/relayium-node/blobs shサービスが起動していること、再起動後も戻ってくることを確認します。どちらの答えも重要です。active は今動いていること、enabled は再起動をまたいで残ることを意味します。
systemctl is-active relayium-nodesystemctl is-enabled relayium-nodeホストのファイアウォールで受信ポートを開けます。オンライン表示に必要なのは送信方向だけですが、ピアが中継や保存に使うのはこれらのポートです。
sudo ufw allow 3478/udp # TURN sudo ufw allow 8081/tcp # storage sudo ufw allow 49152:65535/udp # relayクラウド VPS の場合は、事業者のセキュリティグループでも同じポートを許可してください。ufw だけでは上流で塞がれたままで、しかもノードはその間ずっと健全に見えます。
/me に戻り、ノードがオンラインに変わるのを待ちます——たいてい30秒ほどです。以降、アカウントの転送は自動的にこのノードを優先します。
任意: 「自分のノードだけを中継/保存に使う」をオンにすると、共有インフラへ黙って戻る代わりに転送が失敗するようになります。
正常なノードの見え方
systemd がサービスを active かつ enabled と報告し、「マイノード」でノードがオンラインと表示されます。active だけでは不十分です——enabled になっていないノードは次の再起動で消えます。
$ systemctl is-active relayium-node
active
$ systemctl is-enabled relayium-node
enabled- <your-token> の部分はアカウントページで自動的に埋め込まれます。上のプレースホルダーをそのまま貼り付けないでください。
- RELAYIUM_NODE_STORAGE_DIR はリレーに加えてブロブストレージを有効にします。ノードをリレー専用にして保存させたくない場合は、これをオフのまま(変数を省略)にしてください。
- 起動を確認: systemctl status relayium-node(active/running と表示されるはず)。
- 起動時の永続性を確認: systemctl is-enabled relayium-node(enabled と表示されるはず)。
- ログをライブで監視: journalctl -u relayium-node -f。
- 3478/udp はピアがリレーに使う TURN ポート、8081/tcp はブロブストレージの HTTP ポート、49152–65535/udp はリレーメディアの範囲です。
- クラウド VPS では、ufw だけでなくプロバイダーのセキュリティグループ/ネットワークファイアウォールでもこれらを許可してください。
このインストーラーを root で実行しても安全ですか?
まず最初に。BYO ノードは当社自身のフリートノードとまったく同じコード、まったく同じ堅牢化で動きます — 同じ署名済みリリースの同じバイナリを、同じスクリプトで、同じ systemd ユニットの下にインストールします。違いは「そのマシンが誰のものか」だけです。以下の説明は両方に当てはまります。
インターネットから取ってきたスクリプトを root シェルにパイプするコマンドについて当然の疑問であり、「大丈夫です」ではなく具体的な答えに値します。root はインストールのためだけに使われ、その後のノードの動作には一切使われません。インストーラーは、ログインシェルもホームディレクトリも持たない relayium-node というシステムアカウントを作成し、systemd ユニットを書き、サービスを起動して終了します。ノード自体が root で動くことはありません。ユニットに User=relayium-node が書かれているため、オンラインになった瞬間から、マシン上で何も所有しない非特権アカウントです。(既定で有効な自動更新は、root で動くもう1つのユニットを追加します — 次の節はまるごと、そのユニットに何ができて何ができないかの話です。)
そのアカウントの周囲に、ユニットは systemd サンドボックスを張ります。どの行も「ノードプロセスが乗っ取られたとき、攻撃者が次に手を伸ばすもの」を狙って書かれています。隠しているものは何もありません。インストール後に cat /etc/systemd/system/relayium-node.service でユニット全体を読めます。
| ユニット内の設定 | ノードが侵害された場合に何を防ぐか |
|---|---|
User=relayium-node | 攻撃者は何も所有しない一般ユーザーであり、root ではありません。 |
ProtectHome=yes | /home と /root が見えない — SSH 秘密鍵も、他のプロジェクトのデータも盗めません。 |
ProtectSystem=strict | ファイルシステム全体が読み取り専用。システムファイルは一切変更できません。 |
ReadWritePaths= | 書き込めるのはノード自身の状態ディレクトリと、ストレージを設定した場合のそのディレクトリだけ。他の場所への書き込みはすべて失敗します。 |
NoExecPaths= | ストレージディレクトリ内のものは実行できません — アップロードされたファイルは走りません。 |
NoNewPrivileges=yes | root へ戻る道がなく、よくある権限昇格の手口が塞がれます。 |
CapabilityBoundingSet= | 空 — Linux ケーパビリティを一切与えません。 |
ProtectKernelTunables=yes、ProtectKernelModules=yes | カーネルに手が届きません。sysctl の変更もモジュールの読み込みもできず、rootkit を仕込めません。 |
- ReadWritePaths と NoExecPaths がストレージディレクトリを指すのは、実際に保存を行うノードだけです。リレー専用のノードにはどちらの行も付かず、自分の状態ディレクトリ以外どこにも書けません。
- 通常の構成ではケーパビリティ集合は空です。唯一の例外は、直接ダウンロードのリスナーを 1024 未満のポートに置く場合で、バインドに CAP_NET_BIND_SERVICE が必要になります。既定のダウンロードポートは 1024 より上の 2053 なので、何も付与されません。
- ノードは鍵を持ちません。ファイルはアップロード前に送信側で暗号化されるため、ストレージノードに届くのはそれ自身が読めない暗号文です — 自分のノードでも、自分自身でも読めません。
自動更新にできること、できないこと
インストーラーは自己更新タイマーも設定します(既定で有効)。relayium-node-update.timer が、およそ10分ごとに relayium.com へ「このノードはどのバージョンを動かすべきか」を尋ねます。これは2つ目のユニットであり、root で動きます。ですからこれ自身についても説明する義務があります。
中央がバイナリを送ることは決してありません。返ってくるのはバージョン番号と2つのフラグ(このノードは今動いてよいか、これは意図的なダウングレードか)、そして短い理由の文字列だけです — バイト列もURLもコマンドもありません。そのうえでノードが自分でそのリリースを取得し、アーカイブの SHA-256 をリリースの checksums.txt と照合し、さらに checksums.txt に対する ECDSA P-256 署名を、まさにその検証を行っているバイナリ自身に埋め込まれた公開鍵で検証します。その鍵の秘密鍵側は、これらのポーリングに答えるサーバー上にはありません。したがって中央が侵害されても、名乗れるのはバージョン番号までで、検証を通るバイナリを作り出すことはできません。
更新器とノードは、権限が正反対の2つの別プロセスです。relayium-node.service は上記のサンドボックスそのもので、ProtectSystem=strict の下では /usr/local/bin に書き込むことすらできません。つまりノードは自分のものを含め、いかなるバイナリも変更できません。relayium-node-update.service は root で動く小さな oneshot ユニットで、意図的にサンドボックスを付けていません。/usr/local/bin のファイルを置き換えるには、まさにノードのサンドボックスが与えまいとしているその権限が必要だからです。その力を、ノード本体の堅牢化を緩めるのではなく、単一目的のユニット1つに閉じ込めること — それがこの分割の要点です。root を持つプロセスはバイナリを差し替えるだけ、檻の中のプロセスはバイナリに触れられません。
更新に失敗すれば自分で元に戻します。更新器は旧バイナリを新バイナリの隣に残し、サービスを再起動し、最大10分間ハートビートを待ちます。その間に新バージョンが健全と報告しなければ、旧バイナリを戻して再起動し、その不良バージョンを記録して再試行しません。この一連の処理で保存済みファイルが読まれたり、移動されたり、削除されたりすることは一度もありません。
- 不要な場合: RELAYIUM_NODE_AUTO_UPDATE=off を付けてインストーラーを再実行します。タイマーとそのサービスは無効化され削除されます。ノードはそのまま動き続け、更新の時期は自分で決められます。
- ノードを完全にやめる場合: 下の「ノードを削除する」を参照してください。
ノードを削除する
アンインストールはスクリプト 1 本だけで、ファイルを保存するノードでもリレー専用でも同じものを使います。ユニット、バイナリ、設定、サービスアカウントを削除し、ノードが無くなったことを relayium.com にベストエフォートで伝えます。その通知が失敗しても、ターミナルに 1 行出るだけで、アンインストールが壊れたわけではありません — ノード ID が表示されるので、手動で削除済みにできます。
ダウンロードして、中身を確認してから実行してください。sh に直接パイプすると、404 やネットワークの瞬断のときにコマンド全体が何も出力せず終了コード 0 で終わり、成功したように見えます。
削除するのは把握しているものだけです。状態ディレクトリや保存ディレクトリに想定外のファイルがあれば、消さずに保持して報告します。
curl -fsSL https://relayium.com/uninstall-node.sh -o uninstall-node.sh && \
[ -s uninstall-node.sh ] && sudo sh uninstall-node.sh
- 保存ディレクトリに把握していないファイルが 1 つでも残っている間は拒否します(クリーンアップがまだ届いていない期限切れの blob も同じ扱いです)。保存ファイルは 1 台のノードにしか存在せず、レプリカが無いためです。0 になるまで待つか、それらが到達不能になることを受け入れて RELAYIUM_NODE_FORCE=1 を渡してください。
- blob の場所を特定できない場合は、推測せずに停止します。RELAYIUM_NODE_ASSUME_NO_STORAGE=1 が唯一の回避手段で、それでも把握していないものは削除しません。
- 保存ディレクトリ自体は、RELAYIUM_NODE_PURGE_STORAGE=1 を併せて渡さない限り残ります。環境変数は | sudo sh を越えないので、sudo env RELAYIUM_NODE_PURGE_STORAGE=1 sh uninstall-node.sh の形で渡してください。
- その後、systemctl status relayium-node は not-found になり、relayium-node のタイマーも一覧に出ないはずです。後で再インストールすると、アカウントに追加されるのは新しいノードです。アンインストールがノードの識別ファイルを削除するため、再インストールは旧ノードの復活ではなく新規登録になります。
うまくいかないとき
立ち上がらないノードのほぼすべては次の5つのどれかで、そのうち3つはサーバー側からは健全に見えます。サービスは動いており、違うと告げるのはアカウントページか待ち受けソケットだけです。
症状、確認、対処
- シェルが「relayium-node: command not found」と返す。
command -v relayium-node # 何も表示されないバイナリが入っていません。relayium-node を単独でインストールすることはありません——アカウントページの1行コマンドこそが、バイナリをダウンロードし、PATH に置き、サービスとして起動するものです。そちらを実行してください。
- サービスは active なのに、アカウントページでノードがオンラインにならない。
journalctl -u relayium-node -n 50 --no-pagerオンラインかどうかは送信方向のハートビートで決まるため、ここでファイアウォールが原因になることはまれで、たいていは登録の失敗です。トークンは使い捨てなので、すでに実行済みのコマンドや前回の試行で残った古いコマンドは失敗します。「ノードを追加」をもう一度押して新しいコマンドで実行し直してください。
- ノードはオンラインなのに、転送は依然として共有インフラを通る。
sudo ss -lunp | grep 3478オンラインが証明するのは送信方向のハートビートだけです。ピアが必要とするのは受信ポートです。ノードが待ち受けていることを確認したうえで、ホストのファイアウォールとクラウドのセキュリティグループの両方で 3478/udp、8081/tcp、49152-65535/udp を開けてください。黙ったフォールバックを完全に排除するには、自分のノードのみを使う設定をオンにします。
- アンインストールが何も表示せず終了コード0で終わり、サービスは残っている。
systemctl status relayium-node # active (running)失敗したダウンロードを sh にパイプしたときの見え方そのものです。404 やネットワークの瞬断は何も出力せず終了コード0で終わるため、成功と見分けがつきません。スクリプトをダウンロードし、空でないことを確かめてから実行してください。本記事のコマンドが1本のパイプではなく3つに分かれているのはそのためです。
- ストレージディレクトリにまだファイルが残っているため、アンインストールが拒否される。
sudo ls /var/lib/relayium-node/blobs | wc -l意図的な動作です。保存済みファイルはちょうど1つのノードにしか存在せず複製もないため、ノードを外すとそれらは取り出せなくなります。ブロブが期限切れになって数がゼロになるまで待つか、RELAYIUM_NODE_FORCE=1 でその損失を受け入れてください。環境変数は sudo sh へのパイプを越えられないので、sudo env RELAYIUM_NODE_FORCE=1 sh uninstall-node.sh の形で渡します。
よくある質問
「relayium-node: command not found」と表示されました — 何が問題ですか?
relayium-node バイナリをインストールする前に実行しています。アカウントページのワンライナーインストールコマンド(curl … | sudo … sh の形式)を使ってください。これがバイナリをダウンロードし、PATH に配置し、サービスとして起動します。relayium-node を個別にインストールすることは決してありません。
再起動後もノードはオンラインを維持しますか?
はい。インストーラーは、起動時に有効化され Restart=always に設定された systemd サービスを登録するため、再起動後に復帰し、クラッシュしても自動的に再起動します。追加で実行するものはありません。
これは Relayium のセルフホストとどう違うのですか?
Bring-your-own-node は、いつもの relayium.com アカウントとアプリをそのまま使い、自分のトラフィックを運ぶノードを追加するだけです。セルフホストはサーバースタック全体(アカウント、Web アプリ、シグナリング)を自分のドメインで運用します。それについては「Relayium をセルフホスト」ガイドを参照してください。
他の誰かが私のノードを使ったり、私のデータを見たりできますか?
いいえ。ノードはトークンによって自分のアカウントに紐付けられ、そのアカウントのトラフィックのみを運びます。リアルタイム転送はエンドツーエンド暗号化されており、保存されるブロブは自分のノードが読めない暗号文です。データとノード設定を利用できるのは本人だけです。
サインインしてアカウントページを開き、1分もかからず最初のノードを追加しましょう。
アカウントページを開く