nostrのリレーサーバをM1 Mac上で動かしつつnosclでの投稿を試してみた

分散型SNSのnostrを触る中で、試しにリレーサーバを手元で動かしてみたくなり、やってみました。
2023.04.14

最近幾つかSNSが流行っている中、そのうちの1つのnostrを触っていました。

分散型で所謂中央サーバといえるものがありませんが、接続するサーバを切り替えると自身が投稿したメッセージを見れなくなる可能性があるのは新鮮ですし、フォローが同じでも接続しているサーバが完全に異なる人とは見えてくるタイムラインも全く違ってきます。

色々試しているうちに動作を見たくなり、ローカルでリレーサーバを立ててみました。尚MacOS環境であるためDockerを利用しています。

nostrの簡易解説

以下の記事を見ると大まかな概要はわかるかもしれません。

リレーサーバについて

以下の記事内にある図解からRelay Server相当を立ててみることにします。運用前提ではなく、外部公開もしません。

GitHubにミラーリングがありますが、そのミラーリングを利用したdocker-composeが収まったリポジトリを利用します。

git clone git@github.com:vdo/nostr-rs-relay-compose.git

Clone後、幾つか修正を入れます。主にdocker-composeリポジトリ内のバージョン指定が古いことと、Mac環境の都合によるものです。

リポジトリ内の.envで指定されているバージョンが古くなっており、起動時にconfig.toml参照エラーとなります。バージョンをstable版まで引き上げます。

RELAY_TAG=0.8.2

TRAEFIK_TAG=2.9.10

次に、M1 Macを利用している場合はno matching manifest for linux/arm64/v8 in the manifest list entriesと表示がでてエラーとなります。docker-composeにplatform指定を追加します。

 services:
   nostr-rs-relay:
     container_name: nostr-rs-relay
     image: scsibug/nostr-rs-relay:${RELAY_TAG}
+    platform: "linux/amd64"

これで起動には至れますが、コマンドラインベースでのnostrツールを使ったポストもやってみたいのでport指定もやっておきます。

     user: "appuser"
+    ports:
+      - 127.0.0.1:7000:8080

これで一通りの設定は完了です。起動させてみます。

% docker-compose up -d
INFO nostr_rs_relay: Starting up from main
INFO nostr_rs_relay::server: listening on: 0.0.0.0:8080
INFO nostr_rs_relay::repo::sqlite: Built a connection pool "writer" (min=1, max=2)
INFO nostr_rs_relay::repo::sqlite: Built a connection pool "maintenance" (min=1, max=2)
INFO nostr_rs_relay::repo::sqlite: Built a connection pool "reader" (min=4, max=8)
INFO nostr_rs_relay::repo::sqlite_migration: DB version = 15
INFO nostr_rs_relay::server: db writer created
INFO nostr_rs_relay::server: control message listener started

次にnosclを使ったポストをやってみます。鍵作成等はリポジトリの解説を見ることでわかるかと思われます。

ポイントはnosclに指定するリレーサーバです。SSL指定は不要で、docker-compose内に指定したportを利用します。

noscl relay add ws://127.0.0.1:7000

実際に実行すると以下のようになります。ハッシュについては今回ローカル環境のものなのでそのままにしています。

% noscl publish "hello"
Sent event 7da26ce525f87003fc164397c8df584b7aba5535b1e3deaabaec5f288a82d2e1 to 'ws://127.0.0.1:7000/'.
Seen 7da26ce525f87003fc164397c8df584b7aba5535b1e3deaabaec5f288a82d2e1 on 'ws://127.0.0.1:7000/'

あとがき

色々遊び甲斐のあるシステムですが、実際に色々触るようになった切っ掛けはBlueSkyの招待コードを受け取ったことでした。BlueSkyの中でnostrの話題が尽きないところにあります。

BlueSkyのATProtocolについては色々な実装例が既に存在しますが、軽く触ってみたい場合にはPythonのatprototoolsも良さそうです。

各SNSがオープンソースでの実装を公開しているので、興味ある人は触ってみると楽しいかもしれません。