Estableciendo tu Propio Nostr Relay Server. Una guía para el principiante inexperto
Este artículo proporciona una guía detallada sobre cómo configurar y mantener su propio servidor Nostr Relay. A través de estos pasos, podrá ayudar a preservar la integridad de los nodos de la red y fortalecer la naturaleza descentralizada de esta plataforma de redes sociales.
Nostr es un protocolo que permite crear redes sociales descentralizadas sin censura incluyendo pagos a través de la red Lightning de Bitcoin.
Esta instalación del Nostr Relay server comprende el uso de un servidor Ubuntu/Debian ya sea personal o que se esté ejecutando en cualquier servidor VPS.
Requisitos necesarios:
- Comprar un dominio de internet o tener un dominio de internet. Puedes comprar un dominio utilizando Namecheap.com u otro servicio.
- Tener en ejecución una instalación de Ubuntu/Debian.
- Logearse con ssh en su servidor.
- Instalar Cargo
- Instalar Rust
- Tener muchos deseos de aprender.
Comenzamos por instalar los paquetes necesarios:
Instalamos Cargo
sudo apt install cargo
Luego procedemos a realizar la instalacion de Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Cuando se nos pregunte elegimos la opción 1
Una vez que haya finalizada la instalación de Rust vamos a activar el servicio
source /root/.cargo/env
y verificamos que estén instaladas de forma correcta tanto Rust como Cargo
rustc --version
cargo --version
En seguida, procedemos a la instalación de Protobuf en el sistema. Protobuf es un formato de serialización de datos estructurados desarrollado por Google, utilizado en la comunicación entre servicios y en el almacenamiento de datos. Para instalarlo, sigue los siguientes pasos.
Primero, asegúrate de tener instalado el paquete unzip, que nos permitirá extraer el archivo ejecutable protoc de un archivo ZIP:
sudo apt update
sudo apt install -y unzip
Obtén la última versión de protoc y asígnala a una variable:
PROTOC_VERSION=$(curl -s "https://api.github.com/repos/protocolbuffers/protobuf/releases/latest" | grep -Po '"tag_name": "v\K[0-9.]+')
Descarga el archivo ZIP de la página de lanzamientos del repositorio de protoc:
curl -Lo protoc.zip "https://github.com/protocolbuffers/protobuf/releases/latest/download/protoc-${PROTOC_VERSION}-linux-x86_64.zip"
Luego, extrae el archivo ejecutable del archivo ZIP:
sudo unzip -q protoc.zip bin/protoc -d /usr/local
A continuación, establece el permiso de ejecución:
sudo chmod a+x /usr/local/bin/protoc
En este punto, el comando protoc ya está disponible para todos los usuarios como un comando global del sistema. Puedes verificar la versión de protoc con:
Podemos verificar la versión de protoc:
protoc --version
Ya no necesitaremos el archivo ZIP, así que lo eliminamos:
rm -rf protoc.zip
Ahora vamos a instalar todas las dependencias necesarias para la instalación de nuestro servidor nostr
sudo apt-get install certbot build-essential sqlite3 libsqlite3-dev libssl-dev pkg-config nginx git -y
sudo apt-get install net-tools whois -y
Luego realizamos la compitación de nostr.
cd /opt
sudo mkdir nostr-data
sudo git clone -q https://git.sr.ht/\~gheartsfield/nostr-rs-relay
cd nostr-rs-relay
sudo cargo build -q -r
Este proceso puede llegar a demorar hasta unos 10 minutos. Tenga calma y espere que se realice completamente.
Instalamos el servidor nostr en la carpeta bin
sudo install target/release/nostr-rs-relay /usr/local/bin
Si has seguido todos los pasos ya tendrás nuestro relay server casi listo, ahora puedes descargar el archivo de configuración de prueba.
sudo wget https://raw.githubusercontent.com/scsibug/nostr-rs-relay/master/config.toml
Abrimos el archivo con el editor de texto de tu preferencia, en mi caso nano.
sudo nano config.toml
Modificamos las siguientes variables.
relay_url : nostr.domainname.com ( ⚠️ reemplaza con el nombre que le quieras dar a tu relay server)
name : Nombre que va a tener el relay
description : Escribe de que se trata tu relay server, no te limites, escribe todo lo que quieras para que los usuarios conozcan acerca de ti.
pubkey : Tu clave publica en formato hex, esto es para que otros usuarios puedan comunicarse contigo
contact : [email protected] (Es la direccion de correo administrativo de este relay server)
tracing : ⚠️ Mantenlo comentado de otra forma el relay server puede dar error
data_directory : /opt/nostr-data/ (Donde se van a guardar los datos de nuestro relay server)
address : 127.0.0.1 utilizaremos esta ya que vamos a usar nginx como servidor proxy
remote_ip_header : "x-forwarded-for" para permitir el logeo real de clientes
Si has seguido los pasos podemos verificar si nuestro relay server se encuentra en ejecución y para hacerlo podemos utilizar el siguiente comando en el terminal.
sudo RUST_LOG=warn,nostr_rs_relay=info /usr/local/bin/nostr-rs-relay
Si todo marcha de forma correcta nos mostrara la salida del servidor con los datos que esta procesando.
Ahora vamos a proceder a crear el servicio que permitirá el funcionamiento de nuestro relay server incluso si se reinicia nuestro servidor.
Para ello vamos a crear el archivo /etc/systemd/system/nostr-relay.service
sudo nano /etc/systemd/system/nostr-relay.service
Dentro del archivo vamos a pegar el siguiente codigo
[Unit]
Description=Nostr Relay
After=network.target
[Service]
Type=simple
User=TuUsuario
WorkingDirectory=/home/TuUsuario
Environment=RUST_LOG=info,nostr_rs_relay=info
ExecStart=/usr/local/bin/nostr-rs-relay
Restart=on-failure
[Install]
WantedBy=multi-user.target
Debes Cambiar TuUsuario por el nombre del usuario real que estas utilizando.
Ahora habilitamos el servicio, y lo ejecutamos para que se mantenga encendido
sudo systemctl daemon-reload
sudo systemctl enable nostr-relay.service
sudo systemctl start nostr-relay.service
Verificamos si el servicio se está ejecutando en el sistema
sudo systemctl status nostr-relay.service
Si vas hasta aqui deberías ver el servicio en ejecución sin errores. Para salir de la ventana preciona Ctrol + C
Verificamos si el servicio esta escuchando en el puerto 8080 utilizando el siguiente comando
sudo netstat -tnap | grep nostr
y Deberías obtener una respuesta parecida a la siguiente
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 81180/nostr-rs-relay
Configuración del proxy inverso Nginx para el acceso de nuestro relay service a través del dominio deseado.
Para ello primero vamos a entrar en la carpeta cd /etc/nginx/sites-available
cd /etc/nginx/sites-available
sudo mkdir -p /var/www/nostr/.well-known/acme-challenge/
sudo chown -R 33:33 /var/www/nostr
Creamos el archivo de configuracion nostr-relay.conf
sudo nano nostr-relay.conf
Vamos a pegar el siguiente contenido
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream websocket {
server 127.0.0.1:8080;
}
server {
listen 80;
server_name relay.example.com; ## <<=== Cambia esto
location /.well-known/acme-challenge/ {
root /var/www/nostr;
allow all;
}
location / {
proxy_pass http://websocket;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
En el, basicamente estamos dandole acceso a nuestro relay a través del dominio que hemos escogido. Recuerda que debes cambiar el valor en server_name con el nombre real del dominio que deseas utilizar. Hasta aqui solo estamos utilizando http sin certificado SSL.
Cuando hayas realizado las modificaciones y salvado el archivo de configuración vas a activar y habilitar el sitio para comprobar que efectivamente se esta ejecutando de forma correcta nuestro relay server y escuchando a través de nuestro dominio.
sudo ln -s /etc/nginx/sites-available/nostr-relay.conf /etc/nginx/sites-enabled/.
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t
Si todo marcha bien y has realizado los pasos vas a obtener el siguiente mensaje
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Ahora debemos mandar a ejecutar los cambios en nginx
sudo nginx -s reload
Realizar una prueba externa.
Para comprobar que todo esta funcionando bien podemos abrir una nueva ventana Terminal en otra computadora y ejecutar
wget relay.example.com
Donde relay.example.com se refiere al dominio que has destinado para tu relay server y que es el mismo que has utilizado en la configuración de nginx.
Como resultado deberias obtener un archivo index.html al cual le puedes hacer un cat para leer el contenido.
cat index.html
y debería mostrar el siguiente mensaje
Please use a Nostr client to connect.
Hasta aquí vemos que nuestro servidor esta funcionando. Ahora le vamos a añadir un certificado SSL.
Para nuestro siguiente paso vamos a utilizar DHParams
Primero vamos a crear la carpeta donde ubicaremos el certificado.
sudo mkdir /etc/nginx/ssl
y luego vamos a crear el DHParams (deberia tomarnos solo un minuto)
sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 4096
Ahora vamos a solicitar el certificado
cd /var/www/nostr
sudo certbot certonly --webroot -w . -d relay.example.com --dry-run --agree-tos
Deberías haber obtenido la siguiente respuesta.
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Simulating a certificate request for relay.example.com
The dry run was successful.
Recuerda cambiar relay.example.com por el dominio tuyo si esta prueba fue satisfactoria entonces puedes proceder a solicitar el certificado SSL utilizando el siguiente comando.
cd /var/www/nostr
sudo certbot certonly --webroot -w . -d relay.example.com
Así, vas a obtener información tal como la ruta en la que se guardó el certificado SSL para tu dominio etc.
Y estamos listos para reemplazar la configuración de nginx con la que va a tener el certificado SSL de nuestro servidor.
cd /etc/nginx/sites-available
sudo nano nostr-relay.conf
Actualizamos el archivo de la siguiente forma
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream websocket {
server 127.0.0.1:8080;
}
server {
listen 80;
server_name relay.example.com; ## <<=== CHANGE THIS
location /.well-known/acme-challenge/ {
root /var/www/nostr;
allow all;
}
location / {
return 301 https://relay.example.com;
}
}
server {
listen 443 ssl;
server_name relay.example.com;
location / {
proxy_pass http://websocket;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
#### SSL ####
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam ssl/dhparam.pem;
ssl_ecdh_curve secp384r1;
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header Referrer-Policy same-origin;
add_header Feature-Policy "geolocation none;midi none;notifications none;push none;sync-xhr none;microphone none;camera none;magnetometer none;gyroscope none;speaker self;vibrate none;fullscreen self;payment none;";
ssl_certificate /etc/letsencrypt/live/relay.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/relay.example.com/privkey.pem;
}
Recuerda cambiar todas las ocurrencias de relay.example.com por tu dominio real.
Verificamos que la configuración de nginx este correcta.
sudo nginx -t
Si todo es correcto ejecutas
sudo nginx -s reload
Verificamos que nginx + http y el servidor se están ejecutando correctamente
sudo netstat -tnap | grep 'nginx\|nostr'
Si la respuesta es la siguiente
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 53252/nginx: master
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 53252/nginx: master
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 81180/nostr-rs-rela
Significa que esta funcionando de forma correcta nuestro servidor.
Modificación
En mi caso con la utilización del servicio no me funcionó correctamente así que utilice pm2 para mantener el relay en ejecución. Para ello has lo siguiente.
- Si no tienes instalado pm2 en tu servidor instala pm2 con el siguiente comando:
sudo npm install pm2@latest -g
- Inicia el servicio con pm2 utilizando sudo.
sudo pm2 start /usr/local/bin/nostr-rs-relay --name nostr-rs-relay -- --config /opt/nostr-rs-relay/config.toml
- Ahora configura pm2 para que se ejecute de forma automatica.
sudo pm2 startup
- Manten los procesos que deseas que se inicien
sudo pm2 save
- Verifica que el servicio esta ejecutandose correctamente
sudo pm2 status
En caso de que desees obtener un informe de estado de tu relay server puedes utilizar siempre que así lo desees
journalctl -f | grep --line-buffered nostr_rs_relay | cut -d' ' -f 10,12-100
Ahí podrás obtener un informe de errores en caso de ser necesario.
Si deseas comprobar la conexión con el Relay server puedes utilizar el siguiente enlace que aquí te proveo.
En resumen, Nostr es una plataforma que proporciona una red de noticias en tiempo real, libre y descentralizada. Nostr Relay Server es una herramienta que nos permite unirnos a esta red y compartir noticias y eventos con el resto del mundo. Mediante la instalación y configuración de Nostr Relay en un servidor Ubuntu, podemos contribuir al crecimiento y desarrollo de esta emocionante nueva plataforma de comunicación.
Quieres utilizar mis relay servers? Si es así puedes conectarte a
wss://relay.bitransfer.org
wss://relay.bitransfermedia.com
Espero que esta guía les sea de ayuda.
Búscame en Nostr: npub1nm9mpe60ve0zd2qjcs2j2ruhrq44sqdjvz9zat80wucgyp4t0sys0dmsfn