Go to file
Raj 179928378e
refactor: add strictly typed tags
* Add custom error variant

This can be useful to propagate errors not conforming to available
variants. Also to convert other errors in `crate::Error` without having
explicit conversion defined, with `error.to_string()`

* Implement `Tag` and define protocol serialization

A Tag structure have been implemented with dedicated field types. Then
custom serde serialization is derived to map the structure to current
protocol json array as per NIP01.

This adds compile and run time type checking to always ensure wrong
string data are never stored or processed. With strict typed fields and
custom serde derivation this checks can be done at time of serialization,
saving work for internal handling of the actual data.

tests for possible data violations are added, and gives good example of
kind of errors it will through for different cases.

* Use String for URL
2022-01-19 07:42:58 -06:00
src refactor: add strictly typed tags 2022-01-19 07:42:58 -06:00
.gitignore feat: store events in SQLite and allow querying 2021-12-11 15:48:59 -06:00
Cargo.lock build: bump version to 0.3.3 2022-01-03 22:07:15 -05:00
Cargo.toml build: bump version to 0.3.3 2022-01-03 22:07:15 -05:00
config.toml feat: replace email with contact field in relay info. 2022-01-16 08:34:19 -06:00
Dockerfile fix: docker run references the correct database file 2021-12-31 14:05:11 -06:00
LICENSE docs: add MIT license 2021-12-11 15:52:25 -06:00
README.md docs: update readme to include the new discord server 2022-01-17 08:35:13 -06:00
reverse-proxy.md docs: rename example relay server 2022-01-15 11:43:12 -06:00
rustfmt.toml feat: cargo build files and expected dependencies 2021-12-05 08:42:28 -06:00

nostr-rs-relay

This is a nostr relay, written in Rust. It currently supports the entire relay protocol, and has a SQLite persistence layer.

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

Features

NIPs with relay-specific implementation requirements are listed here.

  • NIP-01: Core event model
  • NIP-01: Hide old metadata events
  • NIP-02: Hide old contact list events
  • NIP-03: OpenTimestamps
  • NIP-09: Event deletion
  • NIP-11: Relay information document

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).

$ docker build -t nostr-rs-relay .

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

[2021-12-31T19:58:31Z INFO  nostr_rs_relay] listening on: 0.0.0.0:8080
[2021-12-31T19:58:31Z INFO  nostr_rs_relay::db] opened database "/usr/src/app/db/nostr.db" for writing
[2021-12-31T19:58:31Z INFO  nostr_rs_relay::db] DB version = 2

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

$ 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/repository/docker/scsibug/nostr-rs-relay

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 \
  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

The current dev discussions for this project is happening at https://discord.gg/AEG5Z8AP. Drop in to query any development related questions.

License

This project is MIT licensed.