Relayium

Relayium を常時稼働の受信サービスとして実行する

最終更新: 2026-08-06

relayium serve --once は1回の受信を処理して終了します——たまに1回だけ pull する用途には十分です。しかし、あるマシンを常駐の受け皿にしたい場合——毎晩バックアップが届くホームサーバー、CI がビルド成果物をプッシュするビルドマシン、スマートフォンからいつでも写真を送れる NAS——には、毎回手動で起動するのではなく、serve をずっと動かし続けたいはずです。

本ガイドでは、長時間稼働するリスナーの起動、誰にプッシュを許可するかの承認、端末の前に誰もいない場合のためのピア事前承認、systemd 下での実行、そして sync --delete を使う送信側に削除をミラーさせる方法を扱います。

始める前に

以下はすべて relayium CLI なので、未インストールならまず入れてください。macOS または Linux では、1つのコマンドでビルド済みバイナリが PATH に入ります:

curl -fsSL https://relayium.com/install.sh | sh

リスナーを起動する

手順1の前に必要なもの

  • 両方のマシンに CLI。relayium version はそれぞれでバージョン文字列を表示します。command not found と返るなら、そのマシンにはまだ入っていません。
  • このマシン上の受信用ディレクトリと、そこに届くものを収めるだけのディスク容量。
  • 送信側から到達できるアドレスと、開いた受信ポート。--port を渡さない限り serve は 9031 で待ち受けます。
  • このマシンを端末なしで動かすつもりなら——サービス化の目的はまさにそこです——送信側のフィンガープリントを事前に用意してください。専用の節が下にあります。常時稼働の受信側がすべてを拒否する原因として、これが群を抜いて多いものです。

serve は証明書ピンニング付き TLS 1.3 接続上でデーモン直結のプッシュ(relayium://host:port)を待ち受け、受け取った内容をあるディレクトリへ書き込みます。起動するのに事前共有は何も必要ありません——コピーしておくフィンガープリントも、登録しておくサーバーもありません:

relayium serve --dir ~/inbox
relayium serve --dir /srv/drop --port 9040   # デフォルト以外のポート
relayium serve --dir ~/inbox --allow-delete  # sync --delete を使う送信側に削除をミラーさせる
  1. ファイルの着地先を決めて、リスナーを起動します。ここまでに事前共有が必要なものはありません。

    relayium serve --dir ~/inbox
  2. 送信側のマシンから、relayium:// アドレスでこのホストに向けて push します。

    relayium push ./report.pdf relayium://drop.example.com:9031
  3. 受信側に戻り、承認プロンプトに答えます。y と答えるとそのフィンガープリントが authorized_fingerprints に書かれ、以降の同じマシンからの push では二度と尋ねられません。

  4. ファイルが serve を起動したディレクトリではなく、--dir に実際に届いたことを確認します。

    ls -l ~/inbox

正常なリスナーの見え方

serve はまず承認済みピアがないことを明示し、新しいマシンからの最初の push でプロンプトを出し、それ以降は何も言いません。送信側は終了コード0で終わり、ファイルは --dir にあります。

$ relayium serve --dir ~/inbox
no authorized peers yet — you'll be asked to approve each new peer on its first push.
Incoming push from 203.0.113.7:54021
  fingerprint: 74318e3b…
Accept and remember this peer? [y/N] y

誰にプッシュを許可するか承認する

新しいピアが初めてプッシュすると、serve がターミナルで動いていれば、そのプッシュがどこから来たか、フィンガープリントは何かを表示し、承認するかどうかを尋ねます——SSH が初めての接続先を尋ねるのと同じ要領です:

Incoming push from 203.0.113.7:54021
  fingerprint: 74318e3b…
Accept and remember this peer? [y/N] y

非対話的な環境のためにピアを事前承認する

serve がプロンプトを出せる端末を持たない場合——systemd サービス、バックグラウンドプロセス、パイプなど——尋ねることができないため、まだ認識していないフィンガープリントはすべて拒否します。代わりに事前にピアを承認しておきます。プッシュする側のマシンで relayium id を実行してフィンガープリントを表示し、受信側では最初のプッシュが届く前にそれを追加します:

# プッシュする側のマシンで: フィンガープリントを表示する
relayium id

# この常時稼働の受信側で: 事前に承認しておく
relayium authorize 74318e3b...
  1. push する側のマシンでフィンガープリントを表示します。64桁の16進数で、アドレスではなくそのマシンを識別します。

    relayium id
  2. この受信側で承認します。サービスが動くときと同じ --config-dir を使ってください。別のユーザーで実行したり、ユニットが別のパスを使っているのに既定のパスで承認したりすると、フィンガープリントはサービスが決して読まないファイルに書かれます。

    relayium authorize 74318e3b… --config-dir /etc/relayium

systemd の下で実行する

再起動やクラッシュをまたいで生き残るサービスにするには、serve を systemd に任せます。--config-dir を固定パスに向けて、ホストのアイデンティティとピア許可リストが再起動をまたいでも維持されるようにします:

# /etc/systemd/system/relayium-serve.service
[Unit]
Description=Relayium always-on receiver
After=network-online.target

[Service]
ExecStart=/usr/local/bin/relayium serve --dir /srv/drop --port 9031 --config-dir /etc/relayium --allow-delete
Restart=always
User=relayium

[Install]
WantedBy=multi-user.target
  1. サービスを作る前に、push を許すピアをすべて承認しておきます。サービスはプロンプトを出せないため、すでに信頼されていないものはすべて拒否されます。

  2. 上のユニットファイルを /etc/systemd/system/relayium-serve.service に書きます。--config-dir は、いま承認に使ったのと同じ固定パスを指すようにします。

  3. systemd を再読み込みしてサービスを起動し、再起動後も戻るよう有効化します。

    sudo systemctl daemon-reload
    sudo systemctl enable --now relayium-serve
  4. 動作していること、そして「すべて拒否」の警告がログにないことを確認します。この構成に固有なのは後者だけです。

    systemctl is-active relayium-serve
    journalctl -u relayium-serve -n 20 --no-pager

正常なサービスの見え方

is-active は active と答え、承認済みピアがないという起動時の警告は出ません。この警告は、どの送信者が苦情を言うより先に「このサービスはすべての push を拒否する」と教えてくれる唯一の一行です。

$ systemctl is-active relayium-serve
active
$ journalctl -u relayium-serve -n 20 --no-pager | grep -c 'all pushes will be rejected'
0

macOS で起動時に実行する (launchd)

macOS に systemd はありません——サービスマネージャーは launchd です。Mac 上で serve を動かし続けるには(受け取り口として常時稼働させる Mac mini など)、LaunchDaemon としてインストールし、誰もログインしていない起動時から開始させます。UserName を設定して root ではなく自分のユーザーとして実行し、--dir と --config-dir には絶対パスを指定して、アイデンティティと信頼のファイルが自分の ~/.config/relayium に残るようにします:

<!-- /Library/LaunchDaemons/com.relayium.serve.plist  (replace YOU with your macOS username) -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>              <string>com.relayium.serve</string>
  <key>UserName</key>           <string>YOU</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/bin/relayium</string>
    <string>serve</string>
    <string>--dir</string>         <string>/Users/YOU/inbox</string>
    <string>--port</string>        <string>9031</string>
    <string>--config-dir</string>  <string>/Users/YOU/.config/relayium</string>
    <string>--allow-delete</string>
  </array>
  <key>RunAtLoad</key>   <true/>
  <key>KeepAlive</key>   <true/>
  <key>StandardOutPath</key>    <string>/Users/YOU/relayium-serve.log</string>
  <key>StandardErrorPath</key>  <string>/Users/YOU/relayium-serve.log</string>
</dict>
</plist>
# 1) authorize each pusher first — launchd gives serve no terminal to prompt on:
relayium authorize <fingerprint>     # get the fingerprint from the pusher's  relayium id

# 2) save the plist above to that path, then load it (root-owned, starts at boot):
sudo chown root:wheel /Library/LaunchDaemons/com.relayium.serve.plist
sudo launchctl bootstrap system /Library/LaunchDaemons/com.relayium.serve.plist

# check it's running / follow logs / stop it:
sudo launchctl print system/com.relayium.serve | grep state
tail -f ~/relayium-serve.log
sudo launchctl bootout system/com.relayium.serve

sync --delete を使う送信側に削除をミラーさせる

デフォルトでは serve はファイルの追加・更新しか行いません——送信側が sync --delete を実行しても、新規・変更ファイルはコピーされますが、要求された削除はスキップされ、受信側に警告がログ出力されます。真のミラーリングを有効にするには --allow-delete を付けて serve を起動します。これにより送信側で削除されたファイルはこちらでも削除されます:

relayium serve --dir /srv/mirror --allow-delete

うまくいかないとき

この5つのうち4つは、サービスが動いたまま健全に見えます——すべてを拒否するリスナーもまたリスナーです。どれにも、読めば分かる1行か、実行すれば決着がつくコマンドがあります。

症状、確認、対処

サービスは起動して動き続けているのに、push がすべて拒否される。
journalctl -u relayium-serve -n 20 --no-pager
# warning: no authorized peers and no terminal to approve on; all pushes will be rejected.

サービスには端末がないため、初回 push の承認プロンプトを実行することができず、見えるのは見知らぬフィンガープリントだけです。各送信側を事前に承認してください。送信側で relayium id、こちらで relayium authorize <フィンガープリント> を、ユニットと同じ --config-dir で実行します。この警告は起動時に出るので、ログの最初から載っています。

id.key の権限が安全でないと言われ、サービスがまったく起動しない。
stat -c '%a %U %n' /etc/relayium/id.key
# 400 relayium /etc/relayium/id.key

鍵の権限はちょうど 0600 でなければなりません。0644 は当然として、見落としがちなのは 0400 も駄目だという点です。緩めるのと同じくらい確実に、締めすぎてもサービスは起動しません。鍵に chmod 600 を当て、ユニットの User= が所有者になっていることを確認してください。

送信側が「接続を拒否された」と報告する。
relayium push ./build relayium://drop.example.com:9031
# hint: if the peer refused the connection, it may not have authorized this host.

受信側がこの送信側を認識していません。送信側で relayium id を実行し、そのフィンガープリントを受信側で relayium authorize してください。すでに実行済みなら、ユニットの --config-dir の下で行ったかを確認します。信頼ファイルはディレクトリごとなので、~/.config/relayium に承認したフィンガープリントは /etc/relayium を読むサービスからは存在しないのと同じです。

手で serve を動かすと push できるのに、サービス経由や別マシンからだとできない。
sudo ss -tlnp | grep 9031

原因は2つですが、確認は1つで足ります。何も待ち受けていなければユニットが有効化されていません——systemctl is-enabled relayium-serve で確認します。待ち受けているならポートが塞がれています。ホストのファイアウォールとクラウドのセキュリティグループで 9031 を開けてください。既定以外の --port を使う場合は、送信側の relayium://host:N のポートと一致している必要があります。

sync --delete の送信側が求めた削除が、このマシンでは決して起きない。
journalctl -u relayium-serve | grep -i delete

削除は受信側のオプトインで、既定では無効です。新規・変更されたファイルは通常どおりコピーされ、スキップされた削除はこちらに警告として記録されます。ユニットの ExecStart に --allow-delete を足して再起動してください。送信側が求めるだけでは足りず、この非対称は意図的です——受信側が、よそで打たれたフラグのせいでファイルを失うことはありません。

よくある質問

serve はデフォルトでどのポートを待ち受けますか?

9031 です。リスナー側(serve --port N)と送信側の宛先(relayium://host:N)の両方を --port で変更できます。

すべてのプッシュを手動で承認する必要がありますか?

あるフィンガープリントの最初のプッシュだけです。しかもそれは serve が端末付きで動いているときだけ表示されます。それ以降は記憶されます。serve を非対話的(systemd、パイプ)に動かす場合、プロンプトはまったく出ず未知のピアは拒否されます——その場合は relayium authorize で事前に承認してください。

送信側は私の常時稼働の受信機上のファイルを削除できますか?

serve を --allow-delete 付きで起動し、かつ送信側が sync --delete を実行している場合に限ります。--allow-delete がなければ削除は静かにスキップされ、それ以外は通常どおり転送されます。

常時稼働の受信サービスを動かすのは無料ですか?

はい。relayium serve は無料でセルフホスト可能な CLI の一部です——接続のどちら側もアカウントは不要で、有料プランもありません。

serve はアイデンティティとピアリストをどこに保存しますか?

デフォルトでは ~/.config/relayium です(id.key/id.crt はこのホストのアイデンティティ、authorized_fingerprints は許可リスト)。systemd サービスの場合は --config-dir を /etc/relayium のような固定の場所に向けてください。

macOS で起動時に serve を実行するには?

macOS に systemd はありません——launchd を使います。serve を /Library/LaunchDaemons に LaunchDaemon としてインストールする(起動時に開始。UserName を設定して自分のユーザーとして実行)か、~/Library/LaunchAgents に LaunchAgent としてインストールします(ログイン時に開始)。このガイドには編集してすぐ使える plist があります。Homebrew サービスはありません。launchd は serve にプロンプト用のターミナルを与えないため、先に relayium authorize でプッシュ元を事前認可してください。

所有しているマシンならどれでも、無料の常時稼働受信機にできます——証明書ピンニング付き TLS 上の直接プッシュで、リレーは一切介在しません。

CLI を入手する

続けて読む