🌊

Nostrのリレーサーバーを建ててみた

2024/11/22に公開

はじめに

現在、弊社の社内開発でNostrを利用しています。
https://zenn.dev/astrskcojp/articles/355fe1162962c2

備忘録を兼ねてNostrについてまとめてみようと思います。

内容が多かったので、3つの記事に分けてまとめました。

  1. 用語解説
  2. リレーサーバーを建てる(今回)
  3. 簡易SNSを作る

1は開発をせずにNostrの知識周りだけをまとめています。
2と3は実践編です。

今回はリレーサーバーを建てます。
(※建てるだけで実装はしません)

対象読者

  • Nostrに興味がある人
  • 自分でリレーサーバーを建てたい人

実践

今回使用するソースはこちらにまとめています。

nostr-rs-relayというオープンソースのリレーサーバーをdockerを利用して立ち上げます。

上記のソースはdocker imageとしても配布されているのですが、最新のソースが反映されておらず不具合があったので、実際のソースコードも利用して立ち上げたいと思います。

公式のdocker imageを利用する場合

用意するのは以下の1ファイルだけです

  • docker-compose.yaml
docker-compose.yaml
version: "3.8"

services:
  nostr-relay-sample:
    container_name: nostr-relay-sample
    image: scsibug/nostr-rs-relay:latest
    ports:
      - 8080:8080
    # config.tomlを変更する場合
    # volumes:
    #   - ./config.toml:/usr/src/app/config.toml

以下のコマンドで立ち上がります。

docker compose up -d

http://localhost:8080にアクセスできれば問題ありません。

クライアントアプリを持っているのであれば、ws://localhost:8080でリレーに接続できるはずです。

実際のソースコードを利用

こちらのgitプロジェクトを、作業するディレクトリにクローンします。

git clone https://github.com/scsibug/nostr-rs-relay

クローンしたら同じディレクトリに

  • docker-compose.yaml
  • Dockerfile

を追加します。

docker-compose.yaml
version: "3.8"

services:
  nostr-relay-sample:
    container_name: relay
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - 8080:8080
    # config.tomlを変更する場合
    # volumes:
    #   - ./config.toml:/usr/src/app/config.toml
Dockerfile
FROM docker.io/library/rust:1-bookworm as builder
RUN apt-get update \
  && apt-get install -y cmake protobuf-compiler \
  && rm -rf /var/lib/apt/lists/*
RUN USER=root cargo install cargo-auditable
RUN USER=root cargo new --bin nostr-rs-relay

COPY ./nostr-rs-relay/Cargo.toml ./Cargo.toml
COPY ./nostr-rs-relay/Cargo.lock ./Cargo.lock
# build dependencies only (caching)
RUN cargo auditable build --release --locked
# get rid of starter project code
RUN rm src/*.rs

# copy project source code
COPY ./nostr-rs-relay/src ./src
COPY ./nostr-rs-relay/proto ./proto
COPY ./nostr-rs-relay/build.rs ./build.rs

# build auditable release using locked deps
RUN rm ./target/release/deps/nostr*relay*
RUN cargo auditable build --release --locked

FROM docker.io/library/debian:bookworm-slim

ARG APP=/usr/src/app
ARG APP_DATA=/usr/src/app/db
RUN apt-get update \
  && apt-get install -y ca-certificates tzdata sqlite3 libc6 \
  && rm -rf /var/lib/apt/lists/*

EXPOSE 8080

ENV TZ=Etc/UTC \
  APP_USER=appuser

RUN groupadd $APP_USER \
  && useradd -g $APP_USER $APP_USER \
  && mkdir -p ${APP} \
  && mkdir -p ${APP_DATA}

COPY --from=builder /nostr-rs-relay/target/release/nostr-rs-relay ${APP}/nostr-rs-relay

RUN chown -R $APP_USER:$APP_USER ${APP}

USER $APP_USER
WORKDIR ${APP}

ENV RUST_LOG=info,nostr_rs_relay=info
ENV APP_DATA=${APP_DATA}

CMD ./nostr-rs-relay --db ${APP_DATA}

以下のコマンドで立ち上がります。

docker compose up -d

http://localhost:8080にアクセスできれば問題ありません。

クライアントアプリを持っているのであれば、ws://localhost:8080でリレーに接続できるはずです。

リレーサーバーの設定を変更

nostr-rs-relayは、config.tomlというファイルで設定を色々いじれます。

https://github.com/scsibug/nostr-rs-relay/blob/master/config.toml

docker-compose.yaml
    # config.tomlを変更する場合
    # volumes:
    #   - ./config.toml:/usr/src/app/config.toml

docker-compose.yamlでコメントアウトされているのを解除すれば、自身のconfig.tomlを利用できます。

どういう設定ができるかは、お手数ですがconfig.toml内をご参照ください!

デプロイ

デプロイ方法は色々あると思いますが、renderが個人的におすすめです。
無料で簡単にデプロイできました。(実際に運用するとなると無料だと厳しそうです)

Web Serviceとして、dockerを使ってすぐ公開できるかと思います。

詳しい手順は、こちらをご参照ください!

まとめ

今回はリレーサーバーを建てました。次回は、nostrを利用した簡易SNSアプリを作りたいと思います。

https://zenn.dev/astrskcojp/articles/d85132668028af

ASTRSK

Discussion