2021-12-11 22:19:49 -06:00
|
|
|
# [nostr-rs-relay](https://git.sr.ht/~gheartsfield/nostr-rs-relay)
|
2021-12-11 15:58:45 -06:00
|
|
|
|
2022-11-19 09:32:26 -06:00
|
|
|
This is a [nostr](https://github.com/nostr-protocol/nostr) relay,
|
|
|
|
written in Rust. It currently supports the entire relay protocol, and
|
2023-01-27 20:25:24 -06:00
|
|
|
persists data with SQLite. There is experimental support for
|
|
|
|
Postgresql.
|
2021-12-11 15:58:45 -06:00
|
|
|
|
|
|
|
The project master repository is available on
|
|
|
|
[sourcehut](https://sr.ht/~gheartsfield/nostr-rs-relay/), and is
|
|
|
|
mirrored on [GitHub](https://github.com/scsibug/nostr-rs-relay).
|
|
|
|
|
2022-09-10 22:53:41 -05:00
|
|
|
[](https://builds.sr.ht/~gheartsfield/nostr-rs-relay/commits/master?)
|
2022-09-10 22:48:23 -05:00
|
|
|
|
2024-10-04 08:34:42 -05:00
|
|
|

|
2023-01-22 21:40:43 +01:00
|
|
|
|
|
|
|
|
2022-01-16 08:16:42 -06:00
|
|
|
## Features
|
|
|
|
|
2022-09-18 17:30:25 +02:00
|
|
|
[NIPs](https://github.com/nostr-protocol/nips) with a relay-specific implementation are listed here.
|
|
|
|
|
|
|
|
- [x] NIP-01: [Basic protocol flow description](https://github.com/nostr-protocol/nips/blob/master/01.md)
|
|
|
|
* Core event model
|
|
|
|
* Hide old metadata events
|
|
|
|
* Id/Author prefix search
|
|
|
|
- [x] NIP-02: [Contact List and Petnames](https://github.com/nostr-protocol/nips/blob/master/02.md)
|
|
|
|
- [ ] NIP-03: [OpenTimestamps Attestations for Events](https://github.com/nostr-protocol/nips/blob/master/03.md)
|
|
|
|
- [x] NIP-05: [Mapping Nostr keys to DNS-based internet identifiers](https://github.com/nostr-protocol/nips/blob/master/05.md)
|
|
|
|
- [x] NIP-09: [Event Deletion](https://github.com/nostr-protocol/nips/blob/master/09.md)
|
|
|
|
- [x] NIP-11: [Relay Information Document](https://github.com/nostr-protocol/nips/blob/master/11.md)
|
|
|
|
- [x] NIP-12: [Generic Tag Queries](https://github.com/nostr-protocol/nips/blob/master/12.md)
|
|
|
|
- [x] NIP-15: [End of Stored Events Notice](https://github.com/nostr-protocol/nips/blob/master/15.md)
|
|
|
|
- [x] NIP-16: [Event Treatment](https://github.com/nostr-protocol/nips/blob/master/16.md)
|
2022-11-12 09:22:43 -06:00
|
|
|
- [x] NIP-20: [Command Results](https://github.com/nostr-protocol/nips/blob/master/20.md)
|
2022-09-19 19:34:11 -05:00
|
|
|
- [x] NIP-22: [Event `created_at` limits](https://github.com/nostr-protocol/nips/blob/master/22.md) (_future-dated events only_)
|
2023-01-04 16:54:52 -06:00
|
|
|
- [ ] NIP-26: [Event Delegation](https://github.com/nostr-protocol/nips/blob/master/26.md) (_implemented, but currently disabled_)
|
2022-12-24 10:14:43 -06:00
|
|
|
- [x] NIP-28: [Public Chat](https://github.com/nostr-protocol/nips/blob/master/28.md)
|
2023-01-27 20:25:24 -06:00
|
|
|
- [x] NIP-33: [Parameterized Replaceable Events](https://github.com/nostr-protocol/nips/blob/master/33.md)
|
2023-02-25 14:29:52 -06:00
|
|
|
- [x] NIP-40: [Expiration Timestamp](https://github.com/nostr-protocol/nips/blob/master/40.md)
|
2023-02-14 19:17:48 -08:00
|
|
|
- [x] NIP-42: [Authentication of clients to relays](https://github.com/nostr-protocol/nips/blob/master/42.md)
|
2022-01-16 08:16:42 -06:00
|
|
|
|
2021-12-11 22:19:49 -06:00
|
|
|
## Quick Start
|
|
|
|
|
2021-12-31 14:08:04 -06:00
|
|
|
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).
|
2021-12-11 22:19:49 -06:00
|
|
|
|
2022-11-19 09:32:26 -06:00
|
|
|
The examples below start a rootless podman container, mapping a local
|
|
|
|
data directory and config file.
|
2021-12-31 15:28:26 -06:00
|
|
|
|
2022-11-19 09:32:26 -06:00
|
|
|
```console
|
2023-12-02 09:27:27 -06:00
|
|
|
$ podman build --pull -t nostr-rs-relay .
|
2022-11-19 09:32:26 -06:00
|
|
|
|
|
|
|
$ 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 nostr_rs_relay: Starting up from main
|
|
|
|
Nov 19 15:31:15.017 INFO nostr_rs_relay::server: listening on: 0.0.0.0:8080
|
|
|
|
Nov 19 15:31:15.019 INFO nostr_rs_relay::server: db writer created
|
|
|
|
Nov 19 15:31:15.019 INFO nostr_rs_relay::server: control message listener started
|
|
|
|
Nov 19 15:31:15.019 INFO nostr_rs_relay::db: Built a connection pool "event writer" (min=1, max=4)
|
|
|
|
Nov 19 15:31:15.019 INFO nostr_rs_relay::db: opened database "/usr/src/app/db/nostr.db" for writing
|
|
|
|
Nov 19 15:31:15.019 INFO nostr_rs_relay::schema: DB version = 0
|
|
|
|
Nov 19 15:31:15.054 INFO nostr_rs_relay::schema: database pragma/schema initialized to v7, and ready
|
|
|
|
Nov 19 15:31:15.054 INFO nostr_rs_relay::schema: All migration scripts completed successfully. Welcome to v7.
|
|
|
|
Nov 19 15:31:15.521 INFO nostr_rs_relay::db: Built a connection pool "client query" (min=4, max=128)
|
2021-12-11 22:19:49 -06:00
|
|
|
```
|
|
|
|
|
2021-12-31 14:08:04 -06:00
|
|
|
Use a `nostr` client such as
|
|
|
|
[`noscl`](https://github.com/fiatjaf/noscl) to publish and query
|
|
|
|
events.
|
2021-12-11 22:19:49 -06:00
|
|
|
|
|
|
|
```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
|
|
|
|
```
|
|
|
|
|
2022-01-01 12:27:09 -06:00
|
|
|
A pre-built container is also available on DockerHub:
|
2022-01-20 22:02:42 -06:00
|
|
|
https://hub.docker.com/r/scsibug/nostr-rs-relay
|
2022-01-01 12:27:09 -06:00
|
|
|
|
2022-12-26 10:34:09 -06:00
|
|
|
## Build and Run (without Docker)
|
|
|
|
|
|
|
|
Building `nostr-rs-relay` requires an installation of Cargo & Rust: https://www.rust-lang.org/tools/install
|
|
|
|
|
2023-05-07 19:33:10 -05:00
|
|
|
The following OS packages will be helpful; on Debian/Ubuntu:
|
|
|
|
```console
|
2023-06-10 23:08:48 -04:00
|
|
|
$ sudo apt-get install build-essential cmake protobuf-compiler pkg-config libssl-dev
|
2023-05-07 19:33:10 -05:00
|
|
|
```
|
|
|
|
|
2024-08-12 06:55:06 -07:00
|
|
|
On OpenBSD:
|
|
|
|
```console
|
|
|
|
$ doas pkg_add rust protobuf
|
|
|
|
```
|
|
|
|
|
2022-12-26 10:34:09 -06:00
|
|
|
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.
|
|
|
|
|
2021-12-31 14:08:04 -06:00
|
|
|
## Configuration
|
|
|
|
|
2022-01-15 11:41:31 -06:00
|
|
|
The sample [`config.toml`](config.toml) file demonstrates the
|
2021-12-31 14:08:04 -06:00
|
|
|
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 \
|
2024-09-02 11:03:06 +02:00
|
|
|
--mount src=$(pwd)/index.html,target=/usr/src/app/index.html,type=bind \
|
2021-12-31 15:28:26 -06:00
|
|
|
nostr-rs-relay
|
2021-12-31 14:08:04 -06:00
|
|
|
```
|
|
|
|
|
|
|
|
Options include rate-limiting, event size limits, and network address
|
|
|
|
settings.
|
|
|
|
|
2022-01-15 11:41:31 -06:00
|
|
|
## Reverse Proxy Configuration
|
|
|
|
|
|
|
|
For examples of putting the relay behind a reverse proxy (for TLS
|
|
|
|
termination, load balancing, and other features), see [Reverse
|
2023-02-15 10:28:42 +02:00
|
|
|
Proxy](docs/reverse-proxy.md).
|
2022-01-15 11:41:31 -06:00
|
|
|
|
2022-01-17 20:05:13 +05:30
|
|
|
## Dev Channel
|
2022-02-28 17:19:24 -06:00
|
|
|
|
|
|
|
For development discussions, please feel free to use the [sourcehut
|
|
|
|
mailing list](https://lists.sr.ht/~gheartsfield/nostr-rs-relay-devel).
|
2022-09-10 19:45:23 -05:00
|
|
|
|
2021-12-11 15:58:45 -06:00
|
|
|
License
|
|
|
|
---
|
|
|
|
This project is MIT licensed.
|
2023-01-09 21:33:50 -06:00
|
|
|
|
|
|
|
External Documentation and Links
|
|
|
|
---
|
|
|
|
|
|
|
|
* [BlockChainCaffe's Nostr Relay Setup Guide](https://github.com/BlockChainCaffe/Nostr-Relay-Setup-Guide)
|