Gnost-relay
Gnost-relay is an Nostr relay written in Go.
Setting up
You need to have Golang, git and PostgreSQL installed in your machine:
~ # pkg_add golang postgresql gjt
Setting up Database
Let's make the PostgreSQL database first, Then start PostgreSQL:
# su -l _postgresql $ initdb -D data -U postgres -E utf-8 $ exit # rcctl start postgresql
If needed, Make PostgreSQL start after boot:
# rcctl enable postgresql
Now make gnost_relay user and it is database:
# psql -U postgres psql (15.2) Type "help" for help. postgres=# CREATE USER 'gnost_relay' WITH ENCRYPTED PASSWORD 'wJ3v49LPP'; CREATE USER postgres=# CREATE DATABASE 'gnost_relay' OWNER 'gnost_relay'; CREATE ROLE postgres=# \q #
Change wJ3v49LPP with your preferred password.
Setting up Gnost
Now let's make _nostr user then login:
# useradd -m _nostr # su -l _nostr
Clone the repository and enter into the directory:
$ git clone https://github.com/barkyq/gnost-relay $ cd gnost-relay
Modify the listen address if needed. By default, it is localhost:8080. For chroot environment, It should be 127.0.0.1:8080:
$ sed -i "s/localhost:8080/127.0.0.1:8080/g" main.go
Then start compiling:
$ go build
Once done, There should be gnost-relay bin inside the directory:
$ stat gnost-relay 1024 32073755 -rwxr-xr-x 1 _nostr _nostr 128184144 13579046 "May 27 07:04:28 2023" "May 27 07:04:01 2023" "May 27 07:04:01 2023" 32768 26624 0 gnost-relay
You may modify config.json accordingly.
Setting up the chroot environment
Exit and go back as root, Then go to /home/_nostr/, and make jail folder:
$ exit # cd /home/_nostr # mkdir jailbox
Copy gnost-relay bin and config.json into the jailbox directory
# cp gnost-relay/gnost-relay gnost-relay/config.json jailbox
cd into the jailbox folder, ldd the gnost-relay bin and copy the required libs:
# cd jailbox
# ldd gnost-relay
gnost-relay:
Start End Type Open Ref GrpRef Name
0000000000400000 0000000000d63000 exe 2 0 0 gnost-relay
0000000201305000 00000002013fb000 rlib 0 1 0 /usr/lib/libc.so.97.0
00000002a1aef000 00000002a1afb000 rlib 0 1 0 /usr/lib/libpthread.so.27.0
0000000268f2d000 0000000268f2d000 ld.so 0 1 0 /usr/libexec/ld.so
# mkdir -p usr/lib{exec,}
# cp /usr/libexec/ld.so usr/libexec
# cp /usr/lib/libc.so.97.0 /usr/lib/libpthread.so.27.0 usr/lib
Go back to the previous folder (Should be /home/_nostr), Start editing start.sh:
# cd /home/_nostr # vi start.sh
start.sh:
#!/bin/sh export DATABASE_URL='postgres://gnost_relay:YOURDBPASS@[::1]:5432/gnost_relay' chroot -u _nostr /home/_nostr/jailbox/ /gnost-relay --config /config.json | tee -a /home/_nostr/logfile
Replace YOURDBPASS with the database password that you provide for gnost_relay before.
Save it, and make it executeable:
# chmod +x start.sh
You may like to test whenever you have a working set up by running ./start.sh.
Setting up rc.d service
Edit /etc/rc.d/nostr:
#!/bin/ksh daemon="/home/_nostr/start.sh" daemon_logger=daemon.info . /etc/rc.d/rc.subr pexp="/gnost-relay.*" rc_stop_signal=KILL rc_usercheck=NO rc_reload=NO rc_bg=YES rc_cmd $1
Save it, then make it as executeable:
# chmod +x /etc/rc.d/nostr
Then try start it:
# rcctl start nostr nostr(ok) #
If needed, You could make gnost to start after boot:
# rcctl enable nostr
Configuring relayd
Relayd will be used for reverse proxy. Edit /etc/relayd.conf and insert the following:
# $OpenBSD: relayd.conf,v 1.4 2018/03/23 09:55:06 claudio Exp $
ext_inet="<IPv4 address>"
ext_inet6="<IPv6 address>"
table <nostr_server> { 127.0.0.1 }
http protocol honk { # Protocol for upstream honk server
#tcp { nodelay, sack, socket buffer 65536, backlog 128 } # Uncomment and adjust as you see fit
tls { keypair example.com }
# Append a bunch of headers
match request header append "X-Forwarded-For" value "$REMOTE_ADDR"
match request header append "X-Forwarded-By" value "$SERVER_ADDR:$SERVER_PORT"
http websockets
}
relay www {
listen on $ext_inet port https tls # Comment to disable listening on IPv4
protocol nostr
forward to <nostr_server> port 8080
}
relay www6 {
listen on $ext_inet6 port https tls # Comment to disable listening on IPv6
protocol nostr
forward to <nostr_server> port 8080
}
Change example.com with your domain address.
And change <IPv4 address> and <IPv6 address> to your server's address(es) and comment one of the two listen options if needed.
Check the configuration with relayd -n, if it is OK, enable and start relayd (as root):
# rcctl enable relayd # rcctl start relayd
Also read
- Relayd.Acceleration - TLS Acceleration with relayd
