RSK Node Setup Guide

Installing Firewall (Optional)

We usually need to use some kind of firewall to set some rules for the access to de node. In this case we decided to use UFW for simplicity.

Install UFW

Usually it came installed with most OS, but if it isn't, simply run sudo apt update && sudo apt install ufw

Configure UFW

Set default rules:

sudo ufw default deny incoming
sudo ufw default allow outgoing

Allow access through ssh:

sudo ufw allow ssh

Allow access through http (if using firewall):

sudo ufw allow in from ${allowed_ip} to any port 80 proto tcp  

Usually allowed_ip is the server ip where the backend is running.

Allow access throw the 'inter-node communication' port:

For Mainnet:

sudo ufw allow 5050/tcp  

For Testnet:

sudo ufw allow 50505/tcp  

Enable ufw with sudo ufw enable

Installing Proxy (Optional)

Install haProxy with sudo apt install -y haproxy

Configure haProxy

For this case of use, we only use the proxy to redirect all the incoming requests from 80/tcp to the 4444 port.

Go to /etc/haproxy and modify haproxy.cfg in this way:

global
    log /dev/log    local0
    log /dev/log    local1 notice
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
    stats timeout 30s
    user haproxy
    group haproxy
    daemon

    # Default SSL material locations
    ca-base /etc/ssl/certs
    crt-base /etc/ssl/private

    # See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
        ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
        ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
        ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets

defaults
    log global
    mode    http
    option  httplog
    option  dontlognull
        timeout connect 5000
        timeout client  50000
        timeout server  50000
    errorfile 400 /etc/haproxy/errors/400.http
    errorfile 403 /etc/haproxy/errors/403.http
    errorfile 408 /etc/haproxy/errors/408.http
    errorfile 500 /etc/haproxy/errors/500.http
    errorfile 502 /etc/haproxy/errors/502.http
    errorfile 503 /etc/haproxy/errors/503.http
    errorfile 504 /etc/haproxy/errors/504.http

frontend ${frontend_name}
    bind *:80
    mode http
    default_backend ${backend_name}

backend ${backend_name}
    balance roundrobin
    option forwardfor
    http-request set-header X-Forwarded-Port %[dst_port]
    option httpchk HEAD / HTTP/1.1\r\nHost:localhost
    server node1 127.0.0.1:4444

replacing '${backend_name}' and '${frontend_name}'.

Restart haProxy with sudo systemctl restart haproxy

Installing RSK Node

Install RSK node

Follow the documentation of RSK and install, for simplicity we install it with DOCKER without executing the last docker run command (We use docker-compose).

Add docker-compose

Install docker-compose

Follow this documentation.

Add the docker-compose.yml file

Inside the node folder (where the DockerFile and supervisord file are), add the below file:

  • For Mainnet:
version: '3'

services:
  rsk-mainnet:
    image: mainnet
    ports:
      - "127.0.0.1:4444:4444"
      - "127.0.0.1:5050:5050"
    container_name: rsk-mainnet
    volumes:
      - /opt/rsk/database:/var/lib/rsk/database
  • For Testnet:
version: '3'

services:
  rsk-testnet:
    image: testnet
    ports:
      - "127.0.0.1:4444:4444"
      - "127.0.0.1:50505:50505"
    container_name: rsk-testnet
    volumes:
      - /opt/rsk/database:/var/lib/rsk/database

Add pre-synced databases:

Download (in the server) the pre-synced databases.

Extract the database

tar zxvf downloaded_file -C /opt/rsk

Run the container

Inside the node folder, run:

docker-compose up -d

Add the server ip to the node configuration.

Inside the container, modify /etc/rsk/node.conf and add the server ip to the host array like so:

rpc {
providers : {
    web: {
        cors: "localhost",
        http: {
            enabled: true,
            bind_address = "0.0.0.0",
            hosts = ["localhost", "${your_server_ip}"]
            port: 4444,
            }
        ws: {
            enabled: false,
            bind_address: "0.0.0.0",
            port: 4445,
            }
        }
    }

...