Skip to main content

Run Full Node

Setup and operate a Selendra full node

Full nodes provide direct blockchain access without third-party RPC dependencies. Suitable for dApp backends, development, and private infrastructure.

Specs: Recent blockchain state with pruning (~200GB storage). Sync time: 4-8 hours.

Prerequisites

Ubuntu 22.04 LTS or Debian 12, 8GB RAM minimum, 200GB SSD, 50 Mbps internet, sudo access.


Installation

Build from Source

Prebuilt node binaries are not published per release. Build from source.

# Install Rust and dependencies
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env
sudo apt update && sudo apt install -y build-essential git clang curl libssl-dev llvm libudev-dev protobuf-compiler

# Clone and build (30-60 min). rust-toolchain.toml pins the toolchain.
git clone https://github.com/selendra/selendra.git
cd selendra
git submodule update --init --recursive
cargo build --release

sudo install target/release/selendra-node /usr/local/bin/
selendra-node --version

Configuration

Service User

sudo useradd -r -s /bin/false selendra
sudo mkdir -p /var/lib/selendra
sudo chown selendra:selendra /var/lib/selendra

Systemd Service

Create /etc/systemd/system/selendra.service:

[Unit]
Description=Selendra Full Node
After=network.target

[Service]
Type=simple
User=selendra
Group=selendra
WorkingDirectory=/var/lib/selendra
ExecStart=/usr/local/bin/selendra-node \
  --base-path /var/lib/selendra \
  --chain mainnet \
  --name "YourNodeName" \
  --pruning 256 \
  --state-cache-size 4 \
  --rpc-cors all \
  --rpc-methods safe \
  --port 30333 \
  --rpc-port 9933 \
  --ws-port 9944 \
  --prometheus-port 9615 \
  --prometheus-external

Restart=on-failure
RestartSec=10
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

Key parameters:

  • --pruning 256: Keep last 256 blocks (reduces storage)
  • --state-cache-size 4: Cache 4GB (adjust based on RAM)
  • --rpc-methods safe: Read-only RPC (security)
  • --rpc-cors all: Allow cross-origin (restrict in production: --rpc-cors https://yourdapp.com)

Firewall

sudo ufw allow 30333/tcp  # P2P (required)
sudo ufw allow 30333/udp
sudo ufw allow 9933/tcp   # HTTP RPC (if public)
sudo ufw allow 9944/tcp   # WebSocket RPC (if public)
sudo ufw allow from 10.0.0.0/24 to any port 9615  # Prometheus (restrict to monitoring)
sudo ufw enable

Start Node

sudo systemctl daemon-reload
sudo systemctl enable --now selendra
sudo systemctl status selendra

Monitor Sync

# Follow logs
sudo journalctl -u selendra -f

# Check sync status
curl -H "Content-Type: application/json" \
  -d '{"id":1, "jsonrpc":"2.0", "method":"system_health"}' \
  http://localhost:9933

Logs: "Syncing X bps" → catching up. "Idle (X peers)" → fully synced.
RPC: "isSyncing": false confirms sync complete.


RPC Access

Local: http://localhost:9933 (HTTP), ws://localhost:9944 (WebSocket)

Remote (secure): Use nginx reverse proxy with SSL:

server {
    listen 443 ssl;
    server_name rpc.yourdomain.com;
    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;

    location / {
        proxy_pass http://localhost:9933;
        proxy_set_header Host $host;
    }

    location /ws {
        proxy_pass http://localhost:9944;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Rate limiting: Add to systemd service:

--rpc-max-connections 100
--ws-max-connections 100
--rpc-max-request-size 15

Testnet Node

For development/testing:

ExecStart=/usr/local/bin/selendra-node \
  --base-path /var/lib/selendra-testnet \
  --chain testnet \
  --name "YourTestnetNode" \
  --pruning 256 \
  --rpc-cors all \
  --rpc-methods safe

Faster sync, useful for contract testing.


Maintenance

Disk Space

df -h /var/lib/selendra  # Monitor regularly
# Pruned nodes: ~5-10GB/month growth

Log Rotation

Create /etc/systemd/journald.conf.d/selendra.conf:

[Journal]
SystemMaxUse=1G
SystemMaxFileSize=100M
MaxRetentionSec=604800
sudo systemctl restart systemd-journald

Updates

sudo systemctl stop selendra
cd ~/selendra && git pull && git submodule update --init --recursive
cargo build --release
sudo install target/release/selendra-node /usr/local/bin/
selendra-node --version
sudo systemctl start selendra

Troubleshooting

IssueDiagnosticSolution
Won't startjournalctl -u selendra -xeCheck port availability, permissions, dependencies
Slow syncCheck peer count via RPCVerify port 30333 open, check firewall
High CPUNormal during syncAfter sync: increase RAM/cache, upgrade to NVMe, add rate limiting
CorruptionLogs show DB errorsStop node, rm -rf /var/lib/selendra/chains/selendra/db, restart (resync)

Performance Optimization

More cache:

--state-cache-size 8  # Use 25-50% of available RAM

Faster storage:

# Move to NVMe
sudo systemctl stop selendra
sudo mv /var/lib/selendra /mnt/nvme/selendra
sudo ln -s /mnt/nvme/selendra /var/lib/selendra
sudo systemctl start selendra

Network tuning: Add to /etc/sysctl.conf:

net.core.rmem_max=26214400
net.core.wmem_max=26214400
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216

Apply: sudo sysctl -p


Hardware Requirements | Run Validator | Run Archive Node | Monitoring | Troubleshooting

Community

Telegram: t.me/selendranetwork | X: @selendranetwork | GitHub: github.com/selendra/selendra

Run Full Node - Selendra