8.3 KiB
sonrctl 🚀
Blazingly fast CLI for managing Sonr blockchain nodes, validators, and networks
Built with Bun - the all-in-one JavaScript runtime.
Features
- ⚡ Blazingly Fast - Built on Bun for instant startup and execution
- 🎯 Simple API - Clean, intuitive commands for node management
- 🐳 Docker Integration - Seamless container orchestration for testnets
- 💾 SQLite Config - Lightweight, fast configuration management
- 🎨 Beautiful Output - Colored, formatted CLI output
- 🔧 Node Management - Initialize, start, stop, and monitor nodes
- 🌐 Network Operations - Full testnet deployment and management
Installation
Install Bun (if not already installed)
curl -fsSL https://bun.sh/install | bash
Install sonrctl
# Clone the repository
git clone https://github.com/sonr-io/sonr.git
cd sonr
# Install dependencies
bun install
# Link the CLI globally
bun link
Install snrd binary
sonrctl install latest
Quick Start
# Show help
sonrctl help
# Initialize a validator node
sonrctl init validator val-naruto --chain-id sonrtest_1-1
# Start the entire testnet network
sonrctl start network --detach
# Check network status
sonrctl status network
# Stop the network
sonrctl stop network
Commands
sonrctl install [version]
Install or update the snrd binary.
# Install latest version
sonrctl install latest
# Install specific version (coming soon)
sonrctl install v1.0.0
sonrctl init <type> <name> [options]
Initialize a new node configuration.
Types: validator, sentry, full
Options:
--chain-id <id>- Chain ID (default: sonrtest_1-1)--home <path>- Home directory (default: ~/.sonr/)--rpc-port <port>- RPC port (default: 26657)--rest-port <port>- REST API port (default: 1317)--grpc-port <port>- gRPC port (default: 9090)--grpc-web-port <port>- gRPC-Web port (default: 9091)--json-rpc-port <port>- JSON-RPC port (default: 8545)--json-rpc-ws-port <port>- JSON-RPC WebSocket port (default: 8546)
Examples:
# Initialize a validator
sonrctl init validator val-naruto
# Initialize a sentry with custom home
sonrctl init sentry sentry-naruto --home ~/.sonr/custom-sentry
# Initialize with custom ports
sonrctl init validator my-val --rpc-port 26658 --rest-port 1318
sonrctl start <target> [options]
Start a node or the entire network.
Targets:
<node-name>- Start a specific registered nodenetwork- Start the entire testnet using docker-compose
Options:
--detach,-d- Run in background (network only)
Examples:
# Start a specific node
sonrctl start val-naruto
# Start network in foreground
sonrctl start network
# Start network in background
sonrctl start network --detach
sonrctl stop <target>
Stop a node, network, or all containers.
Targets:
<node-name>- Stop a specific containernetwork- Stop the entire testnetall- Stop all running containers
Examples:
# Stop a specific node
sonrctl stop val-naruto
# Stop the network
sonrctl stop network
# Stop all containers
sonrctl stop all
sonrctl status [target]
Check status of nodes and network.
Targets:
- (none) - Show overall status
<node-name>- Show specific node statusnetwork- Show network status
Examples:
# Show overall status
sonrctl status
# Show specific node status
sonrctl status val-naruto
# Show network status
sonrctl status network
sonrctl config <command> [args]
Manage sonrctl configuration.
Commands:
list- List all configurationget <key>- Get a specific valueset <key> <value>- Set a configuration value
Examples:
# List all configuration
sonrctl config list
# Get chain ID
sonrctl config get chain_id
# Set home directory
sonrctl config set home ~/.sonr-custom
Configuration
sonrctl stores its configuration in:
- Config Database:
~/.config/sonr/config.db - Node Home:
~/.sonr/(default)
The SQLite database stores:
- Global configuration (chain ID, binary path, etc.)
- Registered nodes
- Node metadata
Project Structure
src/
├── index.ts # Main CLI entry point
├── types.ts # TypeScript type definitions
├── commands/ # Command implementations
│ ├── install.ts # Install snrd binary
│ ├── init.ts # Initialize nodes
│ ├── start.ts # Start nodes/network
│ ├── stop.ts # Stop nodes/network
│ ├── status.ts # Check status
│ └── config.ts # Configuration management
└── lib/ # Utility libraries
├── constants.ts # Constants and defaults
├── logger.ts # Beautiful logging
├── config.ts # SQLite configuration manager
├── toml.ts # TOML file utilities
├── docker.ts # Docker operations
└── node.ts # Node operations
Architecture
sonrctl is built with a clean, modular architecture:
- Command Layer - Handles user input and command routing
- Library Layer - Provides utilities for common operations
- Storage Layer - SQLite database for configuration persistence
Key Design Decisions
- Bun Runtime - For blazingly fast execution and built-in tools
- SQLite Storage - Lightweight, fast, and portable
- No External Dependencies - Minimal deps, maximum performance
- Clean Separation - Commands, libraries, and utilities are separate
- Type Safety - Full TypeScript support
Docker Integration
sonrctl integrates seamlessly with Docker for testnet deployment:
- Start/stop docker-compose networks
- Manage individual containers
- Monitor container status
- Execute commands in containers
- View container logs
The CLI can work as a drop-in replacement for manual docker-compose operations.
Development
Prerequisites
- Bun v1.0+
- Docker (for network operations)
- Git
Running Locally
# Run directly with Bun
bun run src/index.ts help
# Run a specific command
bun run src/index.ts status
Adding New Commands
- Create a new file in
src/commands/ - Export an async function that takes
args: string[] - Import and add to the switch statement in
src/index.ts - Update the help text
Example:
// src/commands/mycommand.ts
export async function mycommand(args: string[]) {
Logger.header('My Command');
// Implementation
}
// src/index.ts
import { mycommand } from './commands/mycommand';
// Add to switch statement
case 'mycommand':
await mycommand(commandArgs);
break;
Examples
Setting Up a Testnet
# 1. Install the binary
sonrctl install
# 2. Start the testnet network
sonrctl start network --detach
# 3. Check status
sonrctl status network
# 4. View logs
docker logs -f val-naruto
# 5. Stop when done
sonrctl stop network
Creating a Custom Node
# 1. Initialize a custom validator
sonrctl init validator my-validator \
--chain-id mychain-1 \
--home ~/.sonr/my-validator \
--rpc-port 26667
# 2. Configure genesis (manual step)
# Edit ~/.sonr/my-validator/config/genesis.json
# 3. Start the node
sonrctl start my-validator
# 4. Check status
sonrctl status my-validator
Troubleshooting
Command not found
# Make sure Bun's bin directory is in your PATH
export PATH="$HOME/.bun/bin:$PATH"
# Re-link the CLI
bun link
Docker permission denied
# Add your user to the docker group
sudo usermod -aG docker $USER
# Log out and back in, or run:
newgrp docker
Binary not found after install
# Check if ~/.local/bin is in your PATH
export PATH="$HOME/.local/bin:$PATH"
# Add to your shell profile
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
Contributing
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Submit a pull request
License
Apache 2.0 - See LICENSE file for details
Links
Built with ❤️ using Bun