リレーを立てるのはそれほど難しくありません。ターミナルと Docker の基本が分かっていれば、多くの人にとって十分こなせる内容です。
このガイドでは、strfry(C++ で書かれたモダンで高速な Nostr リレー)と、その前段に Caddy を置いて HTTPS を自動で用意する構成を紹介します。
strfry が大げさに感じるなら、haven(inbox/outbox を組み込んだ個人向けリレー)、khatru(Go の数行でリレーを書くためのライブラリ)、nostr-rs-relay(Rust + SQLite の小さな実装)も検討してみてください。
準備するもの
- ドメイン名。 暗号通貨が使えてプライバシーに配慮している Njalla、Bitcoin が使える Namecheap、あるいは Porkbun などで購入できます。
- サーバー。 月数ユーロの小さな VPS で十分です(Netcup、Hetzner、DigitalOcean など)。プライバシー重視の選択肢は kycnot.me をどうぞ。
要件
- ハードウェア: 特別な要件はありません。イベントはテキストだけなので、ストレージはゆっくりしか増えません。1GB RAM の VPS で個人用・小規模コミュニティのリレーは十分動きます。
- OS: こだわりがなければ、最近のバージョンの Debian か Ubuntu をおすすめします。
- ソフトウェア:
git、docker、docker compose。
これらが揃えば始められます。
DNS
Caddy を触る前に、ドメインに A レコード(必要なら AAAA も)を追加してサーバーの IP に向けておいてください。relay.example.com のようなサブドメインで構いません。Caddy はこれを使って Let's Encrypt から TLS 証明書を取得します。
セットアップ
基本のセットアップ
- SSH でサーバーに接続して、リレー用のフォルダを作ります:mkdir -p ~/nostr-relay && cd ~/nostr-relay
- データと設定のフォルダを作ります:mkdir -p data strfry
次に strfry/strfry.conf を以下の内容で作ります。name、description、pubkey、contact を自分用に編集してください(pubkey は npub ではなく hex 形式の公開鍵です):
# strfry.conf、最小構成 db = "/app/strfry-db/" relay { bind = "0.0.0.0" port = 7777 info { name = "my nostr relay" description = "a personal relay" pubkey = "YOUR_HEX_PUBKEY" contact = "you@example.com" } maxWebsocketPayloadSize = 131072 autoPingSeconds = 55 enableTcpKeepalive = true writePolicy { plugin = "" # 独自フィルタを使うならスクリプトのパスを指定 } compression { enabled = true slidingWindow = true } }
全オプションを見たい場合は、完全なサンプル設定が strfry のリポジトリ にあります。
続けて ~/nostr-relay に docker-compose.yml を作ります。caddy.* ラベルがリバースプロキシにこのサービスを自動的に認識させます(プロキシは次のステップで立てます):
services:
strfry:
image: dockurr/strfry:latest
container_name: strfry
restart: unless-stopped
volumes:
- ./data:/app/strfry-db
- ./strfry/strfry.conf:/app/strfry.conf:ro
networks:
- caddy
labels:
caddy: relay.example.com
caddy.reverse_proxy: "{{upstreams 7777}}"
networks:
caddy:
external: true
relay.example.com はあなたのドメインに置き換えてください。クライアントは wss://relay.example.com で接続します。
起動します:
- 共有の Docker ネットワークを作成:docker network create caddy
- リレーを起動:docker compose up -d
- ログを確認:docker compose logs -f。
0.0.0.0:7777で strfry がリッスンしているはずです。
リレーは Docker ネットワークの中で動いていますが、まだ外部からはアクセスできません。次に前段にプロキシを立てて HTTPS にします。
リバースプロキシ(caddy-docker-proxy)
ここでは caddy-docker-proxy を使います。動いているコンテナのラベルを読んで自動設定してくれる Caddy のビルドです。Caddyfile を保守する必要はありません。あとからサービスを追加するときも、ラベルを付けるだけで済みます。
すでに自前のリバースプロキシ(nginx、素の Caddy、Nginx Proxy Manager など)があるなら、同じ Docker ネットワーク caddy に入れて strfry:7777 へ転送するだけで OK です。そうでなければ、この手順を続けてください。
nostr-relayと同じ階層に新しいフォルダを作ります:mkdir ~/caddy && cd ~/caddy- docker-compose.yml を作ります:
services:
caddy:
image: lucaslorentz/caddy-docker-proxy:ci-alpine
container_name: caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
environment:
- CADDY_INGRESS_NETWORKS=caddy
- CADDY_DOCKER_CADDYFILE_PATH=/config/Caddyfile
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- caddy_data:/data
- caddy_config:/config
networks:
- caddy
volumes:
caddy_data:
caddy_config:
networks:
caddy:
external: true
起動:
- docker compose up -d
- docker compose logs -f caddy。strfry のラベルを拾い、Let's Encrypt から証明書を取ってくる様子が見えます。
サーバーのファイアウォールで 80 番と 443 番が開いていることを確認してください。7777 番はネットに公開しないようにします。トラフィックはすべて Caddy 経由で流します。
動作確認
- ブラウザで
https://relay.example.comを開きます。リレーの情報が JSON で表示されるはずです(これが NIP-11)。 - 任意の Nostr クライアントで
wss://relay.example.comをリレーリストに追加し、ノートを1つ publish してみます。 - 統計情報:docker exec strfry strfry info
以上です。あなた専用のリレーの完成です。Nostr 上で告知して他の人に使ってもらうもよし、個人のアーカイブとしてそのまま持っておくもよし。
次の一歩
- バックアップ。 大事なものは
~/nostr-relay/data/に全部あります。スナップショットを取りましょう。 - スパム対策。 strfry は write policy のプラグインスクリプトに対応していて、ホワイトリストや web of trust によるフィルタを組めます。プラグインのドキュメントを参照してください。
- 他のリレーとの同期。 strfry は negentropy に対応していて、2つのリレー間でどのイベントが共通しているかを効率的に突き合わせられます。strfry sync wss://other-relay でミラーや補完ができます。
- リレーを登録する。 nostr.watch に登録しておくと、他の人から見つけてもらいやすくなります。