Slv Validator
Deploys and manages Solana validators on mainnet and testnet using Ansible playbooks and Jinja2 templates for multiple validator types including jito, agave,...
Description
SLV Validator Skill
Ansible playbooks and Jinja2 templates for deploying and managing Solana validators (mainnet and testnet).
Supported Validator Types
| Type | Description |
|---|---|
jito |
Jito MEV client (default for mainnet) |
jito-bam |
Jito with Block Awareness Module |
agave |
Standard Agave validator |
firedancer-agave |
Firedancer with Agave consensus |
firedancer-jito |
Firedancer with Jito consensus |
Directory Structure
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 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:
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)
| 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:
ansible-playbook -i inventory.yml cmn/add_solv.yml \
-e '{"ansible_user":"ubuntu"}' --become
Deployment Command
All paths relative to skill's ansible/ directory:
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:
ansible-playbook -i inventory.yml {network}-validator/init.yml \
-e '{"validator_type":"jito","solana_version":"3.1.8"}' --check
Reviews (0)
No reviews yet. Be the first to review!
Comments (0)
No comments yet. Be the first to share your thoughts!