nostr-rs-relay

This is a nostr relay, written in Rust. It currently supports the entire relay protocol, and persists data with SQLite. There is experimental support for Postgresql.

The project master repository is available on sourcehut, and is mirrored on GitHub.

builds.sr.ht status

Github CI

Features

NIPs with a relay-specific implementation are listed here.

Quick Start

The provided Dockerfile will compile and build the server application. Use a bind mount to store the SQLite database outside of the container image, and map the container's 8080 port to a host port (7000 in the example below).

The examples below start a rootless podman container, mapping a local data directory and config file.

```console $ podman build -t nostr-rs-relay .

$ mkdir data

$ podman unshare chown 100:100 data

$ podman run -it --rm -p 7000:8080 \ --user=100:100 \ -v $(pwd)/data:/usr/src/app/db:Z \ -v $(pwd)/config.toml:/usr/src/app/config.toml:ro,Z \ --name nostr-relay nostr-rs-relay:latest

Nov 19 15:31:15.013 INFO nostrrsrelay: Starting up from main Nov 19 15:31:15.017 INFO nostrrsrelay::server: listening on: 0.0.0.0:8080 Nov 19 15:31:15.019 INFO nostrrsrelay::server: db writer created Nov 19 15:31:15.019 INFO nostrrsrelay::server: control message listener started Nov 19 15:31:15.019 INFO nostrrsrelay::db: Built a connection pool "event writer" (min=1, max=4) Nov 19 15:31:15.019 INFO nostrrsrelay::db: opened database "/usr/src/app/db/nostr.db" for writing Nov 19 15:31:15.019 INFO nostrrsrelay::schema: DB version = 0 Nov 19 15:31:15.054 INFO nostrrsrelay::schema: database pragma/schema initialized to v7, and ready Nov 19 15:31:15.054 INFO nostrrsrelay::schema: All migration scripts completed successfully. Welcome to v7. Nov 19 15:31:15.521 INFO nostrrsrelay::db: Built a connection pool "client query" (min=4, max=128) ```

Use a nostr client such as noscl to publish and query events.

console $ noscl publish "hello world" Sent to 'ws://localhost:8090'. Seen it on 'ws://localhost:8090'. $ noscl home Text Note [81cf...2652] from 296a...9b92 5 seconds ago hello world

A pre-built container is also available on DockerHub: https://hub.docker.com/r/scsibug/nostr-rs-relay

Build and Run (without Docker)

Building nostr-rs-relay requires an installation of Cargo & Rust: https://www.rust-lang.org/tools/install

The following OS packages will be helpful; on Debian/Ubuntu: console $ sudo apt-get install build-essential cmake protobuf-compiler pkg-config libssl-dev

Clone this repository, and then build a release version of the relay:

console $ git clone -q https://git.sr.ht/\~gheartsfield/nostr-rs-relay $ cd nostr-rs-relay $ cargo build -q -r

The relay executable is now located in target/release/nostr-rs-relay. In order to run it with logging enabled, execute it with the RUST_LOG variable set:

console $ RUST_LOG=warn,nostr_rs_relay=info ./target/release/nostr-rs-relay Dec 26 10:31:56.455 INFO nostr_rs_relay: Starting up from main Dec 26 10:31:56.464 INFO nostr_rs_relay::server: listening on: 0.0.0.0:8080 Dec 26 10:31:56.466 INFO nostr_rs_relay::server: db writer created Dec 26 10:31:56.466 INFO nostr_rs_relay::db: Built a connection pool "event writer" (min=1, max=2) Dec 26 10:31:56.466 INFO nostr_rs_relay::db: opened database "./nostr.db" for writing Dec 26 10:31:56.466 INFO nostr_rs_relay::schema: DB version = 11 Dec 26 10:31:56.467 INFO nostr_rs_relay::db: Built a connection pool "maintenance writer" (min=1, max=2) Dec 26 10:31:56.467 INFO nostr_rs_relay::server: control message listener started Dec 26 10:31:56.468 INFO nostr_rs_relay::db: Built a connection pool "client query" (min=4, max=8)

You now have a running relay, on port 8080. Use a nostr client or websocat to connect and send/query for events.

Configuration

The sample config.toml file demonstrates the configuration available to the relay. This file is optional, but may be mounted into a docker container like so:

console $ docker run -it -p 7000:8080 \ --mount src=$(pwd)/config.toml,target=/usr/src/app/config.toml,type=bind \ --mount src=$(pwd)/data,target=/usr/src/app/db,type=bind \ nostr-rs-relay

Options include rate-limiting, event size limits, and network address settings.

Reverse Proxy Configuration

For examples of putting the relay behind a reverse proxy (for TLS termination, load balancing, and other features), see Reverse Proxy.

Dev Channel

For development discussions, please feel free to use the sourcehut mailing list. Or, drop by the Nostr Telegram Channel.

To chat about nostr-rs-relay on nostr itself; visit our channel on anigma or another client that supports NIP-28 chats: * 2ad246a094fee48c6e455dd13d759d5f41b5a233120f5719d81ebc1935075194

License

This project is MIT licensed.

External Documentation and Links