Skip to content

lexe-app/nostr-rs-relay

 
 

Repository files navigation

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

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

Fork Modifications

This fork includes the following modifications:

  • Removed PostgreSQL support: Simplified dependencies by removing experimental PostgreSQL support and maintaining only SQLite
  • Upgraded to Rust 1.90: Updated Rust toolchain and dependencies
  • Database seeding on startup: Relay runs stateless with data seeded from config on each startup; all other messages are ephemeral
  • NIP-42 authentication for /lexe endpoint: Added authentication support for the custom Lexe endpoint
  • Enhanced scraper filtering: Improved bot/scraper detection, including filtering connections without P or E tags
  • CI workflow integration: Bridged CI workflows from the Lexe repository
  • Code cleanup: Removed unused code and fixed Clippy warnings

builds.sr.ht status

Github CI

Features

NIPs with a relay-specific implementation are listed here.

Quick Start

Local Development

Run the relay locally with default settings:

just run-dev

Production Deployment

For production use with the /lexe endpoint, specify authorized pubkeys:

$ ./target/release/nostr-rs-relay --lexe-pubkeys <pubkey1>,<pubkey2>,<pubkey3>

The --lexe-pubkeys flag accepts a comma-separated list of pubkeys that are authorized to use the NIP-42 authenticated /lexe endpoint.

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:

$ sudo apt-get install build-essential cmake protobuf-compiler pkg-config libssl-dev

On OpenBSD:

$ doas pkg_add rust protobuf

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

$ 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:

$ 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:

$ 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 \
  --mount src=$(pwd)/index.html,target=/usr/src/app/index.html,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.

License

This project is MIT licensed.

External Documentation and Links

About

Lexe's slim fork for NWC support

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Rust 95.8%
  • Shell 3.4%
  • Other 0.8%