feat(ansible): build agave-validator from source
This commit is contained in:
@@ -5,10 +5,14 @@ solana_home: /var/lib/solana
|
|||||||
solana_install_script_url: https://release.anza.xyz/stable/install
|
solana_install_script_url: https://release.anza.xyz/stable/install
|
||||||
solana_active_release_bin_dir: "{{ solana_home }}/.local/share/solana/install/active_release/bin"
|
solana_active_release_bin_dir: "{{ solana_home }}/.local/share/solana/install/active_release/bin"
|
||||||
solana_validator_bin: /opt/solana/bin/agave-validator
|
solana_validator_bin: /opt/solana/bin/agave-validator
|
||||||
solana_keygen_primary_bin: /opt/solana/bin/agave-keygen
|
solana_keygen_bin: /opt/solana/bin/solana-keygen
|
||||||
solana_keygen_fallback_bin: /opt/solana/bin/solana-keygen
|
|
||||||
solana_rpc_service_name: solana-rpc
|
solana_rpc_service_name: solana-rpc
|
||||||
|
|
||||||
|
agave_repo_url: https://github.com/anza-xyz/agave.git
|
||||||
|
agave_version_tag: v2.3.13
|
||||||
|
agave_src_dir: "{{ solana_home }}/src/agave"
|
||||||
|
agave_rust_toolchain: "1.86.0"
|
||||||
|
|
||||||
solana_identity_path: /var/lib/solana/identity.json
|
solana_identity_path: /var/lib/solana/identity.json
|
||||||
solana_ledger_dir: /var/lib/solana/ledger
|
solana_ledger_dir: /var/lib/solana/ledger
|
||||||
solana_accounts_dir: /var/lib/solana/accounts
|
solana_accounts_dir: /var/lib/solana/accounts
|
||||||
|
|||||||
@@ -157,14 +157,101 @@
|
|||||||
path: "{{ solana_validator_bin }}"
|
path: "{{ solana_validator_bin }}"
|
||||||
register: solana_validator_bin_stat
|
register: solana_validator_bin_stat
|
||||||
|
|
||||||
|
- name: Install Agave build dependencies (Debian/Ubuntu) when validator missing
|
||||||
|
ansible.builtin.apt:
|
||||||
|
name:
|
||||||
|
- build-essential
|
||||||
|
- pkg-config
|
||||||
|
- libssl-dev
|
||||||
|
- clang
|
||||||
|
- cmake
|
||||||
|
- protobuf-compiler
|
||||||
|
- libudev-dev
|
||||||
|
- zlib1g-dev
|
||||||
|
state: present
|
||||||
|
update_cache: true
|
||||||
|
when:
|
||||||
|
- ansible_facts.os_family == "Debian"
|
||||||
|
- not solana_validator_bin_stat.stat.exists
|
||||||
|
|
||||||
|
- name: Ensure Agave source parent directory exists
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: "{{ agave_src_dir | dirname }}"
|
||||||
|
state: directory
|
||||||
|
owner: "{{ solana_user }}"
|
||||||
|
group: "{{ solana_group }}"
|
||||||
|
mode: "0755"
|
||||||
|
when: not solana_validator_bin_stat.stat.exists
|
||||||
|
|
||||||
|
- name: Install rustup (Agave build) for solana user when validator missing
|
||||||
|
ansible.builtin.shell: |
|
||||||
|
set -euo pipefail
|
||||||
|
curl -sSfL https://sh.rustup.rs | sh -s -- -y --default-toolchain "{{ agave_rust_toolchain }}"
|
||||||
|
become_user: "{{ solana_user }}"
|
||||||
|
environment:
|
||||||
|
HOME: "{{ solana_home }}"
|
||||||
|
args:
|
||||||
|
executable: /bin/bash
|
||||||
|
creates: "{{ solana_home }}/.cargo/bin/cargo"
|
||||||
|
when: not solana_validator_bin_stat.stat.exists
|
||||||
|
|
||||||
|
- name: Ensure Rust toolchain is installed for solana user when validator missing
|
||||||
|
ansible.builtin.shell: |
|
||||||
|
set -euo pipefail
|
||||||
|
export PATH="{{ solana_home }}/.cargo/bin:$PATH"
|
||||||
|
rustup toolchain install "{{ agave_rust_toolchain }}"
|
||||||
|
become_user: "{{ solana_user }}"
|
||||||
|
environment:
|
||||||
|
HOME: "{{ solana_home }}"
|
||||||
|
args:
|
||||||
|
executable: /bin/bash
|
||||||
|
when: not solana_validator_bin_stat.stat.exists
|
||||||
|
|
||||||
|
- name: Clone Agave sources when validator missing
|
||||||
|
ansible.builtin.git:
|
||||||
|
repo: "{{ agave_repo_url }}"
|
||||||
|
dest: "{{ agave_src_dir }}"
|
||||||
|
version: "{{ agave_version_tag }}"
|
||||||
|
depth: 1
|
||||||
|
update: true
|
||||||
|
become_user: "{{ solana_user }}"
|
||||||
|
environment:
|
||||||
|
HOME: "{{ solana_home }}"
|
||||||
|
when: not solana_validator_bin_stat.stat.exists
|
||||||
|
|
||||||
|
- name: Build agave-validator from sources when validator missing
|
||||||
|
ansible.builtin.shell: |
|
||||||
|
set -euo pipefail
|
||||||
|
export PATH="{{ solana_home }}/.cargo/bin:$PATH"
|
||||||
|
cd "{{ agave_src_dir }}"
|
||||||
|
cargo +{{ agave_rust_toolchain }} build --release -p agave-validator
|
||||||
|
become_user: "{{ solana_user }}"
|
||||||
|
environment:
|
||||||
|
HOME: "{{ solana_home }}"
|
||||||
|
args:
|
||||||
|
executable: /bin/bash
|
||||||
|
creates: "{{ agave_src_dir }}/target/release/agave-validator"
|
||||||
|
when: not solana_validator_bin_stat.stat.exists
|
||||||
|
|
||||||
|
- name: Install agave-validator to /opt/solana/bin when built
|
||||||
|
ansible.builtin.copy:
|
||||||
|
remote_src: true
|
||||||
|
src: "{{ agave_src_dir }}/target/release/agave-validator"
|
||||||
|
dest: "{{ solana_validator_bin }}"
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: "0755"
|
||||||
|
when: not solana_validator_bin_stat.stat.exists
|
||||||
|
|
||||||
|
- name: Re-check validator binary after source build
|
||||||
|
ansible.builtin.stat:
|
||||||
|
path: "{{ solana_validator_bin }}"
|
||||||
|
register: solana_validator_bin_stat
|
||||||
|
|
||||||
- name: Ensure identity key exists
|
- name: Ensure identity key exists
|
||||||
ansible.builtin.shell: |
|
ansible.builtin.shell: |
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
KEYGEN="{{ solana_keygen_primary_bin }}"
|
"{{ solana_keygen_bin }}" new --no-passphrase -o "{{ solana_identity_path }}"
|
||||||
if [ ! -x "$KEYGEN" ]; then
|
|
||||||
KEYGEN="{{ solana_keygen_fallback_bin }}"
|
|
||||||
fi
|
|
||||||
"$KEYGEN" new --no-passphrase -o "{{ solana_identity_path }}"
|
|
||||||
become_user: "{{ solana_user }}"
|
become_user: "{{ solana_user }}"
|
||||||
environment:
|
environment:
|
||||||
HOME: "{{ solana_home }}"
|
HOME: "{{ solana_home }}"
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ Cel etapu: uruchomić pierwszy, bezpieczny playbook Ansible dla hosta RPC (`mevn
|
|||||||
|
|
||||||
## Zakres
|
## Zakres
|
||||||
|
|
||||||
1. Sprawdzić i zainstalować Ansible na VPS (control node), jeśli brak.
|
1. Uruchamiać Ansible na VPS jako runner w Dockerze (bez instalacji Ansible na hoście), jeśli to jest preferowany model operacyjny.
|
||||||
2. Dodać minimalną strukturę Ansible w `trade-iac`:
|
2. Dodać minimalną strukturę Ansible w `trade-iac`:
|
||||||
- inventory dla `mevnode`,
|
- inventory dla `mevnode`,
|
||||||
- minimalny playbook testowy (bez zmian destrukcyjnych).
|
- minimalny playbook testowy (bez zmian destrukcyjnych).
|
||||||
@@ -18,6 +18,20 @@ Cel etapu: uruchomić pierwszy, bezpieczny playbook Ansible dla hosta RPC (`mevn
|
|||||||
|
|
||||||
## Kryteria akceptacji
|
## Kryteria akceptacji
|
||||||
|
|
||||||
- `ansible-playbook --version` działa na VPS.
|
- `ansible-playbook --version` działa w kontenerze na VPS.
|
||||||
- Playbook kończy się statusem success dla grupy `sol_rpc`.
|
- Playbook kończy się statusem success dla grupy `sol_rpc`.
|
||||||
- Wynik zawiera podstawowe fakty hosta i potwierdzenie łączności Ansible.
|
- Wynik zawiera podstawowe fakty hosta i potwierdzenie łączności Ansible.
|
||||||
|
|
||||||
|
## Jak uruchomić na VPS (Docker)
|
||||||
|
|
||||||
|
Przykład (image: `quay.io/ansible/ansible-runner:latest`):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /opt/trade-iac
|
||||||
|
docker run --rm -t \
|
||||||
|
-v "$PWD/ansible:/ansible" \
|
||||||
|
-v "$HOME/.ssh:/home/runner/.ssh:ro" \
|
||||||
|
-w /ansible \
|
||||||
|
quay.io/ansible/ansible-runner:latest \
|
||||||
|
ansible-playbook -i inventory/hosts.ini playbooks/doc-rpc-sol-min.yml
|
||||||
|
```
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ Cel etapu: domknąć bootstrap uruchomienia `solana-rpc` jako `solana` przez:
|
|||||||
|
|
||||||
- Bootstrap używa domyślnego bind `127.0.0.1` (bez publicznej ekspozycji RPC).
|
- Bootstrap używa domyślnego bind `127.0.0.1` (bez publicznej ekspozycji RPC).
|
||||||
- Produkcyjny bind na WG IP i hardening sieciowy będzie osobnym etapem.
|
- Produkcyjny bind na WG IP i hardening sieciowy będzie osobnym etapem.
|
||||||
|
- Release tar z `agave-install` nie zawiera `agave-validator`, więc `agave-validator` budujemy ze źródeł (tag `v2.x`) i instalujemy do `/opt/solana/bin`.
|
||||||
|
|
||||||
## Kryteria akceptacji
|
## Kryteria akceptacji
|
||||||
|
|
||||||
|
|||||||
67
doc/workflow.md
Normal file
67
doc/workflow.md
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
# Workflow `trade-iac`
|
||||||
|
|
||||||
|
Cel: utrzymywać konfigurację IaC w Git i wdrażać ją kontrolowanie na `mevnode`.
|
||||||
|
|
||||||
|
## 1. Dodanie klucza SSH na hoście (operator)
|
||||||
|
|
||||||
|
Host operatora musi mieć klucz do dostępu do repo `trade/trade-iac`.
|
||||||
|
|
||||||
|
Przykład:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh-keygen -t ed25519 -C "trade-iac-host" -f ~/.ssh/trade_iac
|
||||||
|
cat ~/.ssh/trade_iac.pub
|
||||||
|
```
|
||||||
|
|
||||||
|
Publiczny klucz dodajemy w Gitei (`Settings -> SSH Keys`), a potem test:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh -T git@gitea.mpabi.pl
|
||||||
|
```
|
||||||
|
|
||||||
|
## 2. Dodanie klucza SSH na VPS
|
||||||
|
|
||||||
|
VPS (runner/deployer) musi mieć osobny klucz do klonowania/pull z `trade/trade-iac`.
|
||||||
|
|
||||||
|
Przykład:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh-keygen -t ed25519 -C "trade-iac-vps" -f ~/.ssh/trade_iac
|
||||||
|
cat ~/.ssh/trade_iac.pub
|
||||||
|
ssh -T git@gitea.mpabi.pl
|
||||||
|
```
|
||||||
|
|
||||||
|
Ten publiczny klucz też dodajemy do Gitei.
|
||||||
|
|
||||||
|
## 3. Wdrożenie na `mevnode` (runner na VPS)
|
||||||
|
|
||||||
|
Po zmianach w repo:
|
||||||
|
|
||||||
|
1. `doc/` (opis etapu),
|
||||||
|
2. implementacja (playbook/vars),
|
||||||
|
3. test/syntax-check,
|
||||||
|
4. commit + push,
|
||||||
|
5. wdrożenie z VPS na `mevnode`,
|
||||||
|
6. testy powdrożeniowe.
|
||||||
|
|
||||||
|
Minimalny przepływ:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# VPS
|
||||||
|
git -C /opt/trade-iac pull --ff-only origin main
|
||||||
|
cd /opt/trade-iac
|
||||||
|
|
||||||
|
# uruchom Ansible w kontenerze (bez instalacji Ansible na hoście)
|
||||||
|
docker run --rm -t \
|
||||||
|
-v "$PWD/ansible:/ansible" \
|
||||||
|
-v "$HOME/.ssh:/home/runner/.ssh:ro" \
|
||||||
|
-w /ansible \
|
||||||
|
quay.io/ansible/ansible-runner:latest \
|
||||||
|
ansible-playbook -i inventory/hosts.ini playbooks/doc-rpc-sol-min.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
## Zasada pracy
|
||||||
|
|
||||||
|
- Zmiany zawsze przez PR/commit (bez ręcznych zmian na `mevnode` poza awarią).
|
||||||
|
- `mevnode` traktujemy jako target deploymentu, nie źródło prawdy.
|
||||||
|
- Źródłem prawdy jest repo `trade/trade-iac`.
|
||||||
Reference in New Issue
Block a user