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.

Estableciendo tu Propio Nostr Relay Server. Una guía para el principiante inexperto

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:

  1. Comprar un dominio de internet o tener un dominio de internet. Puedes comprar un dominio utilizando Namecheap.com u otro servicio.
  2. Tener en ejecución una instalación de Ubuntu/Debian.
  3. Logearse con ssh en su servidor.
  4. Instalar Cargo
  5. Instalar Rust
  6. 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.

  1. Si no tienes instalado pm2 en tu servidor instala pm2 con el siguiente comando:
sudo npm install pm2@latest -g
  1. 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

  1. Ahora configura pm2 para que se ejecute de forma automatica.

sudo pm2 startup

  1. Manten los procesos que deseas que se inicien

sudo pm2 save

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

Websocket King

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