✓ Verified 💻 Development ✓ Enhanced Data

Slv Validator

Ansible playbooks and Jinja2 templates for deploying and managing Solana validators (mainnet and tes

Rating
4 (64 reviews)
Downloads
42,724 downloads
Version
1.0.0

Overview

Ansible playbooks and Jinja2 templates for deploying and managing Solana validators (mainnet and testnet).

Complete Documentation

View Source →

SLV Validator Skill

Ansible playbooks and Jinja2 templates for deploying and managing Solana validators (mainnet and testnet).

Supported Validator Types

TypeDescription
jitoJito MEV client (default for mainnet)
jito-bamJito with Block Awareness Module
agaveStandard Agave validator
firedancer-agaveFiredancer with Agave consensus
firedancer-jitoFiredancer with Jito consensus

Directory Structure

text
ansible/
  mainnet-validator/   — Mainnet validator playbooks
  testnet-validator/   — Testnet validator playbooks
  cmn/                 — Shared common playbooks
jinja/
  mainnet-validator/   — Mainnet Jinja2 templates
  testnet-validator/   — Testnet Jinja2 templates
  cmn/                 — Shared templates

CLI Command ↔ Playbook Mapping

The slv v CLI commands map directly to these playbooks. {net} = mainnet-validator or testnet-validator.

CLI CommandPlaybookDescription
slv v deploy{net}/init.ymlFull node initialization and deployment
slv v start{net}/start_node.ymlStart validator
slv v stop{net}/stop_node.ymlStop validator
slv v restart{net}/restart_node.ymlRestart validator
slv v build:solana{net}/install_solana.ymlBuild Solana from source
slv v install:solanacmn/install_solana.ymlInstall Solana binary (deprecated, prefer build)
slv v setup:firedancer{net}/setup_firedancer.ymlSetup/update Firedancer
slv v update:firedancer{net}/update_firedancer.ymlUpdate Firedancer binary
slv v update:script{net}/update_startup_config.ymlUpdate start-validator.sh from template
slv v set:identity{net}/set_identity_key.ymlSet validator identity key
slv v set:unstaked{net}/set_unstaked_key.ymlSwitch to unstaked identity
slv v get:snapshot{net}/wget_snapshot.ymlDownload snapshot via aria2c
slv v cleanupcmn/rm_ledger.ymlRemove ledger/snapshot files
slv v switch{net}/nodowntime_migrate.ymlZero-downtime identity migration
slv v list(no playbook)List validators (CLI only)
slv v gen:vote-account(no playbook)Create vote account (solana CLI)

All Playbooks

Mainnet Validator (mainnet-validator/)

PlaybookDescription
init.ymlFull node initialization (Agave/Jito)
init-jito.ymlJito-specific initialization
init-firedancer.ymlFiredancer initialization
restart_node.ymlRestart validator
start_node.ymlStart validator
stop_node.ymlStop validator
install_solana.ymlBuild Solana from source
install_agave.ymlBuild Agave from source
install_jito.ymlBuild Jito from source
install_rust.ymlInstall Rust toolchain
setup_firedancer.ymlSetup Firedancer binary and config
update_firedancer.ymlUpdate Firedancer binary
update_startup_config.ymlUpdate start-validator.sh from Jinja template
deploy-start-validator-sh.ymlDeploy start script to remote
create-start-validator-sh.ymlGenerate start script from template
nodowntime_migrate.ymlZero-downtime identity migration between nodes
set_identity_key.ymlSet validator identity key
set_identity_to_active.ymlActivate identity key
set_unstaked_key.ymlSwitch to unstaked identity
switch_on_identity.ymlEnable identity (tower copy + key deploy)
switch_off_identity.ymlDisable identity (tower backup)
switch_on_firedancer_identity.ymlEnable Firedancer identity
switch_off_firedancer_identity.ymlDisable Firedancer identity
copy_keys.ymlCopy validator keys to node
copy_restart_sh.ymlCopy restarter script
create_overrides.ymlGenerate overrides.yml from template
setup_solv_service.ymlSetup systemd service
start-solv-service.ymlStart systemd service
setup_ufw.ymlConfigure UFW firewall
setup_fb_ufw.ymlConfigure Firedancer-specific UFW rules
setup_logrotate.ymlSetup log rotation
configure_hugetlbfs.ymlConfigure hugepages for Firedancer
fail2ban_solana_rate_limit.ymlSetup fail2ban rate limiting
run_snapshot_finder.ymlFind and download best snapshot

Testnet Validator (testnet-validator/)

PlaybookDescription
init.ymlFull initialization (Jito)
init-agave.ymlAgave-specific initialization
init-firedancer.ymlFiredancer initialization
restart_node.ymlRestart validator
start_node.ymlStart validator
stop_node.ymlStop validator
install_solana.ymlBuild Solana from source
install_agave.ymlBuild Agave from source
install_jito.ymlBuild Jito from source
install_firedancer.ymlBuild Firedancer from source
setup_firedancer.ymlSetup Firedancer
setup_firedancer_agave.ymlSetup Firedancer with Agave
setup_firedancer_jito.ymlSetup Firedancer with Jito
update_firedancer.ymlUpdate Firedancer binary
update_startup_config.ymlUpdate start script from template
deploy-start-validator-sh.ymlDeploy start script
create-start-validator-sh-agave.ymlGenerate Agave start script
create-start-validator-sh-jito.ymlGenerate Jito start script
nodowntime_migrate.ymlZero-downtime identity migration
set_identity_key.ymlSet identity key
set_identity_to_active.ymlActivate identity
set_unstaked_key.ymlSwitch to unstaked identity
switch_on_identity.yml / switch_off_identity.ymlToggle identity
switch_on_firedancer_identity.yml / switch_off_firedancer_identity.ymlToggle Firedancer identity
change_identity_and_restart.ymlChange identity and restart in one step
copy_keys.ymlCopy keys to node
rm_ledger.ymlRemove ledger data
restart_agave_with_rm_ledger.ymlRestart with ledger removal
restart_firedancer.ymlRestart Firedancer
restart_firedancer_with_rm_ledger.ymlRestart Firedancer with ledger removal
restart_solv.ymlRestart solv service
setup_agave.ymlSetup Agave
setup_agave_ufw.ymlAgave UFW rules
setup_solv_service.ymlSetup systemd service
setup_solv_service_init.ymlInitialize systemd service
setup_snapshot_finder.ymlSetup snapshot finder
add_solv.ymlAdd solv user

Shared Common (cmn/)

PlaybookDescription
build_solana.ymlBuild Solana from source (dispatches to build_agave/build_jito)
build_agave.ymlBuild Agave from GitHub source
build_jito.ymlBuild Jito from GitHub source
install_solana.ymlInstall Solana binary (deprecated)
install_package.ymlInstall system packages
install_rust.ymlInstall Rust toolchain
mount_disks.ymlMount and format disks
optimize_system.ymlOptimize system settings (sysctl, limits)
disable_swap.ymlDisable swap
setup_logrotate.ymlConfigure log rotation
setup_node_exporter.ymlSetup Prometheus node exporter
setup_norestart.ymlDisable auto-restart
setup_ufw.ymlConfigure UFW firewall
setup_unstaked_identity.ymlSetup unstaked identity keypair
restart_solv.ymlRestart solv service
copy_restart_sh.ymlCopy restarter script
update_ubuntu.ymlUpdate Ubuntu packages
wget_snapshot.ymlDownload snapshot
add_solv.ymlAdd solv user
rm_ledger.ymlRemove ledger data
fix_permissions.ymlFix file permissions

Key Variables (extra_vars)

VariableDescriptionDefault
validator_typeValidator type (jito, jito-bam, agave, firedancer-agave, firedancer-jito)jito
solana_versionSolana/Agave version to build
jito_versionJito version to build
firedancer_versionFiredancer version
snapshot_urlSnapshot download URL
identity_accountValidator identity pubkey
vote_accountVote account pubkey
block_engine_urlJito block engine URLhttps://frankfurt.mainnet.block-engine.jito.wtf
shred_receiver_addressJito shred receiver address64.130.50.14:1002
commission_bpsCommission in basis points0
dynamic_port_rangeValidator port range8000-8025
limit_ledger_sizeLedger size limit200000000
expected_shred_versionExpected shred version (testnet, epoch-dependent)
expected_bank_hashExpected bank hash (testnet, optional)
wait_for_supermajorityWait for supermajority slot (testnet, optional)
source_hostSource host for nodowntime migration
target_hostTarget host for nodowntime migration

Usage

All playbooks are designed to be run via ansible-playbook with extra_vars:

bash
ansible-playbook -i inventory mainnet-validator/init.yml \
  -e '{"validator_type":"jito","solana_version":"3.1.8","snapshot_url":"https://..."}'

No versions.yml required — all variables can be passed via extra_vars.

Interactive Deployment Flow

When deploying a new validator, the agent should guide the user through variable collection in this order. See AGENT.md for the full step-by-step flow and examples/inventory.yml for the generated output format.

Required Variables (must collect)

VariablePromptValidation
server_ip"Target server IP?"Valid IPv4
network"Mainnet or testnet?"mainnet or testnet
region"Server region? (amsterdam, frankfurt, tokyo, ny, ...)"String
validator_type"Which validator type?"jito, jito-bam, agave, firedancer-agave, firedancer-jito
solana_version"Solana version? (default: 3.1.8)"Semver
jito_version"Jito version?" (if jito/jito-bam)Semver
firedancer_version"Firedancer version?" (if firedancer)String
identity_account"Validator identity pubkey? (or generate)"Base58 pubkey or generate
vote_account"Vote account pubkey? (or generate)"Base58 pubkey or generate
snapshot_url"Snapshot URL? (auto-detected for ERPC nodes)"URL (cannot be empty for init)

Optional Variables (show defaults, confirm)

VariableDefaultWhen Required
ssh_usersolv (ubuntu for fresh servers)Always
commission_bps0Always
dynamic_port_range8000-8025Always
limit_ledger_size200000000Always
allowed_ssh_ipsStrongly recommended (UFW)
allowed_ipsOptional (UFW)
block_engine_urlAuto by regionJito types only
shred_receiver_addressAuto by regionJito types only
expected_shred_versionEpoch-dependentTestnet only
expected_bank_hashEpoch-dependentTestnet (optional)
wait_for_supermajorityEpoch-dependentTestnet (optional)

Optional: Reference RPC

VariableDescriptionDefault
reference_rpc_urlReference RPC endpoint for slot sync comparison (e.g., ERPC)
ERPC API keys are free at https://erpc.global — enables full slot sync monitoring during deployment and updates.

Pre-flight: Fresh Server Setup

If the target is a new server without a solv user:

bash
ansible-playbook -i inventory.yml cmn/add_solv.yml \
  -e '{"ansible_user":"ubuntu"}' --become

Deployment Command

All paths relative to skill's ansible/ directory:

bash
cd /path/to/slv-validator/ansible/
ansible-playbook -i inventory.yml {network}-validator/init.yml \
  -e '{"validator_type":"<type>","solana_version":"<version>","snapshot_url":"<url>"}'

Dry-Run First

Always offer --check mode before actual deployment:

bash
ansible-playbook -i inventory.yml {network}-validator/init.yml \
  -e '{"validator_type":"jito","solana_version":"3.1.8"}' --check

Installation

Terminal bash

openclaw install slv-validator
    
Copied!

💻Code Examples

cmn/ — Shared templates

-cmn--shared-templates.txt
## CLI Command ↔ Playbook Mapping

The `slv v` CLI commands map directly to these playbooks. `{net}` = `mainnet-validator` or `testnet-validator`.

| CLI Command | Playbook | Description |
|---|---|---|
| `slv v deploy` | `{net}/init.yml` | Full node initialization and deployment |
| `slv v start` | `{net}/start_node.yml` | Start validator |
| `slv v stop` | `{net}/stop_node.yml` | Stop validator |
| `slv v restart` | `{net}/restart_node.yml` | Restart validator |
| `slv v build:solana` | `{net}/install_solana.yml` | Build Solana from source |
| `slv v install:solana` | `cmn/install_solana.yml` | Install Solana binary (deprecated, prefer build) |
| `slv v setup:firedancer` | `{net}/setup_firedancer.yml` | Setup/update Firedancer |
| `slv v update:firedancer` | `{net}/update_firedancer.yml` | Update Firedancer binary |
| `slv v update:script` | `{net}/update_startup_config.yml` | Update start-validator.sh from template |
| `slv v set:identity` | `{net}/set_identity_key.yml` | Set validator identity key |
| `slv v set:unstaked` | `{net}/set_unstaked_key.yml` | Switch to unstaked identity |
| `slv v get:snapshot` | `{net}/wget_snapshot.yml` | Download snapshot via aria2c |
| `slv v cleanup` | `cmn/rm_ledger.yml` | Remove ledger/snapshot files |
| `slv v switch` | `{net}/nodowntime_migrate.yml` | Zero-downtime identity migration |
| `slv v list` | *(no playbook)* | List validators (CLI only) |
| `slv v gen:vote-account` | *(no playbook)* | Create vote account (solana CLI) |

## All Playbooks

### Mainnet Validator (`mainnet-validator/`)

| Playbook | Description |
|---|---|
| `init.yml` | Full node initialization (Agave/Jito) |
| `init-jito.yml` | Jito-specific initialization |
| `init-firedancer.yml` | Firedancer initialization |
| `restart_node.yml` | Restart validator |
| `start_node.yml` | Start validator |
| `stop_node.yml` | Stop validator |
| `install_solana.yml` | Build Solana from source |
| `install_agave.yml` | Build Agave from source |
| `install_jito.yml` | Build Jito from source |
| `install_rust.yml` | Install Rust toolchain |
| `setup_firedancer.yml` | Setup Firedancer binary and config |
| `update_firedancer.yml` | Update Firedancer binary |
| `update_startup_config.yml` | Update start-validator.sh from Jinja template |
| `deploy-start-validator-sh.yml` | Deploy start script to remote |
| `create-start-validator-sh.yml` | Generate start script from template |
| `nodowntime_migrate.yml` | Zero-downtime identity migration between nodes |
| `set_identity_key.yml` | Set validator identity key |
| `set_identity_to_active.yml` | Activate identity key |
| `set_unstaked_key.yml` | Switch to unstaked identity |
| `switch_on_identity.yml` | Enable identity (tower copy + key deploy) |
| `switch_off_identity.yml` | Disable identity (tower backup) |
| `switch_on_firedancer_identity.yml` | Enable Firedancer identity |
| `switch_off_firedancer_identity.yml` | Disable Firedancer identity |
| `copy_keys.yml` | Copy validator keys to node |
| `copy_restart_sh.yml` | Copy restarter script |
| `create_overrides.yml` | Generate overrides.yml from template |
| `setup_solv_service.yml` | Setup systemd service |
| `start-solv-service.yml` | Start systemd service |
| `setup_ufw.yml` | Configure UFW firewall |
| `setup_fb_ufw.yml` | Configure Firedancer-specific UFW rules |
| `setup_logrotate.yml` | Setup log rotation |
| `configure_hugetlbfs.yml` | Configure hugepages for Firedancer |
| `fail2ban_solana_rate_limit.yml` | Setup fail2ban rate limiting |
| `run_snapshot_finder.yml` | Find and download best snapshot |

### Testnet Validator (`testnet-validator/`)

| Playbook | Description |
|---|---|
| `init.yml` | Full initialization (Jito) |
| `init-agave.yml` | Agave-specific initialization |
| `init-firedancer.yml` | Firedancer initialization |
| `restart_node.yml` | Restart validator |
| `start_node.yml` | Start validator |
| `stop_node.yml` | Stop validator |
| `install_solana.yml` | Build Solana from source |
| `install_agave.yml` | Build Agave from source |
| `install_jito.yml` | Build Jito from source |
| `install_firedancer.yml` | Build Firedancer from source |
| `setup_firedancer.yml` | Setup Firedancer |
| `setup_firedancer_agave.yml` | Setup Firedancer with Agave |
| `setup_firedancer_jito.yml` | Setup Firedancer with Jito |
| `update_firedancer.yml` | Update Firedancer binary |
| `update_startup_config.yml` | Update start script from template |
| `deploy-start-validator-sh.yml` | Deploy start script |
| `create-start-validator-sh-agave.yml` | Generate Agave start script |
| `create-start-validator-sh-jito.yml` | Generate Jito start script |
| `nodowntime_migrate.yml` | Zero-downtime identity migration |
| `set_identity_key.yml` | Set identity key |
| `set_identity_to_active.yml` | Activate identity |
| `set_unstaked_key.yml` | Switch to unstaked identity |
| `switch_on_identity.yml` / `switch_off_identity.yml` | Toggle identity |
| `switch_on_firedancer_identity.yml` / `switch_off_firedancer_identity.yml` | Toggle Firedancer identity |
| `change_identity_and_restart.yml` | Change identity and restart in one step |
| `copy_keys.yml` | Copy keys to node |
| `rm_ledger.yml` | Remove ledger data |
| `restart_agave_with_rm_ledger.yml` | Restart with ledger removal |
| `restart_firedancer.yml` | Restart Firedancer |
| `restart_firedancer_with_rm_ledger.yml` | Restart Firedancer with ledger removal |
| `restart_solv.yml` | Restart solv service |
| `setup_agave.yml` | Setup Agave |
| `setup_agave_ufw.yml` | Agave UFW rules |
| `setup_solv_service.yml` | Setup systemd service |
| `setup_solv_service_init.yml` | Initialize systemd service |
| `setup_snapshot_finder.yml` | Setup snapshot finder |
| `add_solv.yml` | Add solv user |

### Shared Common (`cmn/`)

| Playbook | Description |
|---|---|
| `build_solana.yml` | Build Solana from source (dispatches to build_agave/build_jito) |
| `build_agave.yml` | Build Agave from GitHub source |
| `build_jito.yml` | Build Jito from GitHub source |
| `install_solana.yml` | Install Solana binary (deprecated) |
| `install_package.yml` | Install system packages |
| `install_rust.yml` | Install Rust toolchain |
| `mount_disks.yml` | Mount and format disks |
| `optimize_system.yml` | Optimize system settings (sysctl, limits) |
| `disable_swap.yml` | Disable swap |
| `setup_logrotate.yml` | Configure log rotation |
| `setup_node_exporter.yml` | Setup Prometheus node exporter |
| `setup_norestart.yml` | Disable auto-restart |
| `setup_ufw.yml` | Configure UFW firewall |
| `setup_unstaked_identity.yml` | Setup unstaked identity keypair |
| `restart_solv.yml` | Restart solv service |
| `copy_restart_sh.yml` | Copy restarter script |
| `update_ubuntu.yml` | Update Ubuntu packages |
| `wget_snapshot.yml` | Download snapshot |
| `add_solv.yml` | Add solv user |
| `rm_ledger.yml` | Remove ledger data |
| `fix_permissions.yml` | Fix file permissions |

## Key Variables (extra_vars)

| Variable | Description | Default |
|---|---|---|
| `validator_type` | Validator type (`jito`, `jito-bam`, `agave`, `firedancer-agave`, `firedancer-jito`) | `jito` |
| `solana_version` | Solana/Agave version to build | — |
| `jito_version` | Jito version to build | — |
| `firedancer_version` | Firedancer version | — |
| `snapshot_url` | Snapshot download URL | — |
| `identity_account` | Validator identity pubkey | — |
| `vote_account` | Vote account pubkey | — |
| `block_engine_url` | Jito block engine URL | `https://frankfurt.mainnet.block-engine.jito.wtf` |
| `shred_receiver_address` | Jito shred receiver address | `64.130.50.14:1002` |
| `commission_bps` | Commission in basis points | `0` |
| `dynamic_port_range` | Validator port range | `8000-8025` |
| `limit_ledger_size` | Ledger size limit | `200000000` |
| `expected_shred_version` | Expected shred version (testnet, epoch-dependent) | — |
| `expected_bank_hash` | Expected bank hash (testnet, optional) | — |
| `wait_for_supermajority` | Wait for supermajority slot (testnet, optional) | — |
| `source_host` | Source host for nodowntime migration | — |
| `target_host` | Target host for nodowntime migration | — |

## Usage

All playbooks are designed to be run via `ansible-playbook` with `extra_vars`:

-e '{"validator_type":"jito","solana_version":"3.1.8","snapshot_url":"https://..."}'

--e-validatortypejitosolanaversion318snapshoturlhttps.txt
No `versions.yml` required — all variables can be passed via `extra_vars`.

## Interactive Deployment Flow

When deploying a new validator, the agent should guide the user through variable collection
in this order. See `AGENT.md` for the full step-by-step flow and `examples/inventory.yml`
for the generated output format.

### Required Variables (must collect)

| Variable | Prompt | Validation |
|---|---|---|
| `server_ip` | "Target server IP?" | Valid IPv4 |
| `network` | "Mainnet or testnet?" | `mainnet` or `testnet` |
| `region` | "Server region? (amsterdam, frankfurt, tokyo, ny, ...)" | String |
| `validator_type` | "Which validator type?" | `jito`, `jito-bam`, `agave`, `firedancer-agave`, `firedancer-jito` |
| `solana_version` | "Solana version? (default: 3.1.8)" | Semver |
| `jito_version` | "Jito version?" (if jito/jito-bam) | Semver |
| `firedancer_version` | "Firedancer version?" (if firedancer) | String |
| `identity_account` | "Validator identity pubkey? (or generate)" | Base58 pubkey or `generate` |
| `vote_account` | "Vote account pubkey? (or generate)" | Base58 pubkey or `generate` |
| `snapshot_url` | "Snapshot URL? (auto-detected for ERPC nodes)" | URL (cannot be empty for init) |

### Optional Variables (show defaults, confirm)

| Variable | Default | When Required |
|---|---|---|
| `ssh_user` | `solv` (`ubuntu` for fresh servers) | Always |
| `commission_bps` | `0` | Always |
| `dynamic_port_range` | `8000-8025` | Always |
| `limit_ledger_size` | `200000000` | Always |
| `allowed_ssh_ips` | — | Strongly recommended (UFW) |
| `allowed_ips` | — | Optional (UFW) |
| `block_engine_url` | Auto by region | Jito types only |
| `shred_receiver_address` | Auto by region | Jito types only |
| `expected_shred_version` | Epoch-dependent | Testnet only |
| `expected_bank_hash` | Epoch-dependent | Testnet (optional) |
| `wait_for_supermajority` | Epoch-dependent | Testnet (optional) |

### Optional: Reference RPC

| Variable | Description | Default |
|---|---|---|
| `reference_rpc_url` | Reference RPC endpoint for slot sync comparison (e.g., ERPC) | — |

ERPC API keys are free at https://erpc.global — enables full slot sync monitoring during deployment and updates.

### Pre-flight: Fresh Server Setup

If the target is a new server without a `solv` user:

-e '{"ansible_user":"ubuntu"}' --become

--e-ansibleuserubuntu---become.txt
### Deployment Command

All paths relative to skill's `ansible/` directory:

-e '{"validator_type":"<type>","solana_version":"<version>","snapshot_url":"<url>"}'

--e-validatortypetypesolanaversionversionsnapshoturlurl.txt
### Dry-Run First

Always offer `--check` mode before actual deployment:
example.txt
ansible/
  mainnet-validator/   — Mainnet validator playbooks
  testnet-validator/   — Testnet validator playbooks
  cmn/                 — Shared common playbooks
jinja/
  mainnet-validator/   — Mainnet Jinja2 templates
  testnet-validator/   — Testnet Jinja2 templates
  cmn/                 — Shared templates
example.sh
cd /path/to/slv-validator/ansible/
ansible-playbook -i inventory.yml {network}-validator/init.yml \
  -e '{"validator_type":"<type>","solana_version":"<version>","snapshot_url":"<url>"}'

Tags

#devops_and-cloud

Quick Info

Category Development
Model Claude 3.5
Complexity One-Click
Author poppin-fumi
Last Updated 3/10/2026
🚀
Optimized for
Claude 3.5
🧠

Ready to Install?

Get started with this skill in seconds

openclaw install slv-validator