Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cli/deno.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@slv/cli",
"version": "0.10.0",
"version": "0.10.1",
"exports": "./dist/exe",
"publish": {
"include": [
Expand Down
2 changes: 1 addition & 1 deletion cmn/constants/version.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// e.g.: VERSION + SOLANA CLI NAME + NETWORK = '0.0.1' only numbers and dots

// SLV version
export const VERSION = '0.10.0'
export const VERSION = '0.10.1'

// Component versions
export const VERSION_SOLANA_TESTNET = '3.1.8'
Expand Down
2 changes: 1 addition & 1 deletion deno.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
"docker:rm": "bash scripts/docker-systemd-rm.sh",
"upload:script": "deno run -A cli/uploadScript.ts",
"upload:exe": "deno run -A cli/uploadExe.ts",
"upload:template": "tar -czf dist/template.tar.gz ./template/0.10.0 && deno run -A cli/uploadTemplate.ts",
"upload:template": "tar -czf dist/template.tar.gz ./template/0.10.1 && deno run -A cli/uploadTemplate.ts",
"purge:cache": "deno run -A cmn/lib/purgeR2Cache.ts"
},
"imports": {
Expand Down
2 changes: 1 addition & 1 deletion sh/0.9.961/install → sh/0.10.1/install
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

set -e

VERSION="0.9.961"
VERSION="0.10.1"
BASE_URL="https://storage.slv.dev/slv"
GRPC_TEST_URL_LINUX="https://storage.elsoul.nl/grpc_test"
GRPC_TEST_URL_MAC="https://storage.elsoul.nl/grpc_test_mac"
Expand Down
2 changes: 1 addition & 1 deletion sh/install
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

set -e

VERSION="0.10.0"
VERSION="0.10.1"
BASE_URL="https://storage.slv.dev/slv"
GRPC_TEST_URL_LINUX="https://storage.elsoul.nl/grpc_test"
GRPC_TEST_URL_MAC="https://storage.elsoul.nl/grpc_test_mac"
Expand Down
30 changes: 30 additions & 0 deletions template/0.10.1/.claude/AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Claude Agent Instructions — SLV Ansible Templates

## ⚠️ SECURITY — PUBLIC OSS REPOSITORY
- **NEVER commit secrets, API keys, tokens, passwords, or private IPs**
- Review every diff before committing

## Project
SLV (Solana Validator Launcher) Ansible playbooks. OSS: https://github.com/ValidatorsDAO/slv

## Structure
- `ansible/cmn/` — Shared tasks
- `ansible/mainnet-rpc/` — Mainnet RPC (Index + gRPC Geyser)
- `ansible/mainnet-validator/` — Mainnet Validators
- `ansible/testnet-*` / `ansible/devnet-*` — Other networks
- `jinja/` — Jinja2 config templates

## Key Variables
- `validator_type`: agave | jito | firedancer-agave | firedancer-jito | frankendancer
- `rpc_type`: "Index RPC" | "Geyser gRPC" | "Index RPC + gRPC"
- All passed as `extra_vars` at runtime

## Agents
- **Cecil**: Validator specialist (mainnet-validator/, testnet-validator/)
- **Tina**: RPC specialist (mainnet-rpc/, testnet-rpc/, devnet-rpc/)
- **Cloud**: gRPC Geyser specialist (geyser files in rpc dirs)

## Conventions
- `init.yml` = full node initialization from bare metal
- `build_solana.yml` preferred over `install_solana.yml`
- Ansible user: `solv`
25 changes: 25 additions & 0 deletions template/0.10.1/.codex/AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Codex Agent Instructions — SLV Ansible Templates

## ⚠️ SECURITY — PUBLIC OSS REPOSITORY
- **NEVER commit secrets, API keys, tokens, passwords, or private IPs**
- Review every diff before committing

## Project
SLV Ansible playbooks for deploying Solana nodes (Validator, RPC, gRPC Geyser).

## Structure
- `ansible/cmn/` — Shared tasks
- `ansible/mainnet-rpc/` — Mainnet RPC (Index + gRPC)
- `ansible/mainnet-validator/` — Mainnet Validators
- `ansible/testnet-*` / `ansible/devnet-*` — Other networks
- `jinja/` — Jinja2 config templates

## Key Variables
- `validator_type`: agave | jito | firedancer-agave | firedancer-jito | frankendancer
- `rpc_type`: "Index RPC" | "Geyser gRPC" | "Index RPC + gRPC"
- All passed as `extra_vars` at runtime

## Conventions
- `init.yml` = full node initialization
- `build_solana.yml` preferred over `install_solana.yml`
- User: `solv`
68 changes: 68 additions & 0 deletions template/0.10.1/AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# SLV Ansible Template — Agent Guide

## ⚠️ SECURITY — READ FIRST

**This is a public OSS repository (ValidatorsDAO/slv).**

- **NEVER commit secrets, API keys, tokens, passwords, or private IPs**
- **NEVER commit .env files, credentials, or internal infrastructure details**
- **Double-check every diff before committing** — if in doubt, don't commit
- Use placeholder values (e.g., `YOUR_API_KEY`, `x.x.x.x`) in examples
- Ansible `extra_vars` are passed at runtime, not stored here

## Overview

This directory contains Ansible playbooks and Jinja2 templates for deploying and managing Solana nodes.

### Directory Structure

```
ansible/
├── cmn/ # Common tasks (shared across all types)
│ ├── build_solana.yml # Build Solana from source (preferred)
│ ├── create_user.yml # Create solv user
│ ├── optimize_system.yml # System tuning
│ ├── mount_disks.yml # Disk partitioning & mount
│ └── ...
├── mainnet-rpc/ # Mainnet RPC (Index RPC & Geyser gRPC)
│ ├── init.yml # Full initialization playbook
│ ├── geyser_build.yml # Yellowstone Geyser plugin build
│ ├── geyser_richat_build.yml # Richat Geyser build (recommended)
│ └── ...
├── mainnet-validator/ # Mainnet Validator
│ ├── init.yml # Full initialization (supports all validator_types)
│ ├── init-jito.yml # Jito-specific init
│ ├── init-firedancer.yml # Firedancer-specific init
│ └── ...
├── testnet-rpc/ # Testnet RPC
├── testnet-validator/ # Testnet Validator
├── devnet-rpc/ # Devnet RPC
jinja/ # Jinja2 templates for config generation
```

### Key Concepts

1. **`validator_type`** — Controls the node software stack:
- `agave` | `jito` | `firedancer-agave` | `firedancer-jito` | `frankendancer`

2. **`rpc_type`** — (Mainnet RPC only) Controls RPC features:
- `Index RPC` | `Geyser gRPC` | `Index RPC + gRPC`

3. **All variables can be passed via `extra_vars`** — No need to edit `versions.yml`.

4. **`build_solana.yml` is preferred** over `install_solana.yml` (source build vs pre-built binary).

### Agent Assignments

| Agent | Specialty | Scope |
|-------|-----------|-------|
| **Cecil** | Validator | `mainnet-validator/`, `testnet-validator/` |
| **Tina** | RPC | `mainnet-rpc/`, `testnet-rpc/`, `devnet-rpc/` (except geyser) |
| **Cloud** | gRPC Geyser | Geyser-related files in all rpc dirs |

### Execution Pattern

```
API → kafka queue → ansible-api POST /apply
→ ansible-playbook -i "{ip}," -u solv {playbookPath} --extra-vars '{json}'
```
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@
when: validator_type in ['agave', 'firedancer-agave']

- import_playbook: build_jito.yml
when: validator_type in ['jito', 'firedancer-jito', 'firedancer']
when: validator_type in ['jito', 'jito-bam', 'firedancer-jito', 'firedancer']
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
# ⚠️ DEPRECATED: This playbook downloads pre-built binaries from storage.slv.dev
# Use cmn/build_solana.yml instead (builds from GitHub source)
# This file will be removed in a future version.
---
- name: Install/Update Solana CLI (agave, jito, or jito-bam) from hosted binaries
hosts: all
Expand Down
106 changes: 106 additions & 0 deletions template/0.10.1/ansible/devnet-rpc/geyser_richat_build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
---
- name: Build Richat Geyser plugin from source
hosts: all
vars_files:
- ~/.slv/versions.yml
become: true
vars:
working_dir: "/home/solv"
repo_url: "https://github.com/lamports-dev/richat.git"
richat_src_dir: "/home/solv/richat-src"
richat_install_root: "/home/solv/richat-geyser"
richat_current_link: "{{ richat_install_root }}/current"
richat_lib_name: "librichat_plugin_agave.so"
richat_symlink_path: "/home/solv/{{ richat_lib_name }}"
richat_config_template: "~/.slv/devnet-rpc/geyser-richat.json.j2"
richat_config_path: "/home/solv/geyser.json"
tasks:
- name: Resolve richat plugin version (overridable via -e richat_version=)
set_fact:
richat_version_resolved: "{{ richat_version | default(devnet_rpcs.richat_version | default('', true), true) }}"

- name: Ensure richat_version is provided
assert:
that:
- richat_version_resolved != ''
fail_msg: "richat_version must be provided (via -e richat_version= or devnet_rpcs.richat_version in ~/.slv/versions.yml)"

- name: Set paths for Richat plugin release
set_fact:
richat_release_dir: "{{ richat_install_root }}/releases/{{ richat_version_resolved }}"

- name: Clone or update the Richat repository with specific tag
git:
repo: "{{ repo_url }}"
dest: "{{ richat_src_dir }}"
version: "{{ richat_version_resolved }}"
update: yes
force: yes
become_user: solv

- name: Build Richat plugin-agave using Cargo
shell: |
source ~/.profile
cargo build --release -p richat-plugin-agave
args:
chdir: "{{ richat_src_dir }}"
executable: /bin/bash
become_user: solv

- name: Verify built plugin shared object exists
stat:
path: "{{ richat_src_dir }}/target/release/{{ richat_lib_name }}"
register: richat_so_stat

- name: Fail if plugin shared object was not built
assert:
that:
- richat_so_stat.stat.exists
fail_msg: "Build failed: {{ richat_src_dir }}/target/release/{{ richat_lib_name }} not found"

- name: Ensure directories exist for Richat plugin
file:
path: "{{ item }}"
state: directory
owner: solv
group: solv
mode: "0755"
loop:
- "{{ richat_install_root }}"
- "{{ richat_install_root }}/releases"
- "{{ richat_release_dir }}"

- name: Copy built plugin to release directory
copy:
src: "{{ richat_src_dir }}/target/release/{{ richat_lib_name }}"
dest: "{{ richat_release_dir }}/{{ richat_lib_name }}"
remote_src: yes
owner: solv
group: solv
mode: "0644"

- name: Point 'current' symlink to this Richat release
file:
src: "{{ richat_release_dir }}"
dest: "{{ richat_current_link }}"
state: link
force: yes
owner: solv
group: solv

- name: Symlink Richat plugin to stable path for geyser
file:
src: "{{ richat_release_dir }}/{{ richat_lib_name }}"
dest: "{{ richat_symlink_path }}"
state: link
force: yes
owner: solv
group: solv

- name: Copy the geyser.json configuration file for Richat
template:
src: "{{ richat_config_template }}"
dest: "{{ richat_config_path }}"
owner: solv
group: solv
mode: "0644"
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
- import_playbook: ../cmn/optimize_system.yml
- import_playbook: ../cmn/setup_norestart.yml
- import_playbook: ../cmn/setup_logrotate.yml
- import_playbook: ../cmn/install_solana.yml
- import_playbook: ../cmn/build_solana.yml

- import_playbook: ../cmn/setup_unstaked_identity.yml

Expand All @@ -46,7 +46,12 @@
- import_playbook: create-start-validator-sh.yml
when: validator_type in ['agave', 'jito', 'jito-bam']

- import_playbook: geyser_build.yml
- import_playbook: geyser_richat_build.yml
when:
- rpc_type in ['Geyser gRPC', 'Index RPC + gRPC']
- validator_type in ['agave', 'jito', 'jito-bam']

- import_playbook: install_richat.yml
when:
- rpc_type in ['Geyser gRPC', 'Index RPC + gRPC']
- validator_type in ['agave', 'jito', 'jito-bam']
Expand Down
Loading