diff --git a/ansible/group_vars/sol_rpc.yml b/ansible/group_vars/sol_rpc.yml index efd1772..65d5600 100644 --- a/ansible/group_vars/sol_rpc.yml +++ b/ansible/group_vars/sol_rpc.yml @@ -5,10 +5,14 @@ solana_home: /var/lib/solana 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_validator_bin: /opt/solana/bin/agave-validator -solana_keygen_primary_bin: /opt/solana/bin/agave-keygen -solana_keygen_fallback_bin: /opt/solana/bin/solana-keygen +solana_keygen_bin: /opt/solana/bin/solana-keygen 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_ledger_dir: /var/lib/solana/ledger solana_accounts_dir: /var/lib/solana/accounts diff --git a/ansible/playbooks/doc-rpc-sol-min.yml b/ansible/playbooks/doc-rpc-sol-min.yml index 846b888..796dd37 100644 --- a/ansible/playbooks/doc-rpc-sol-min.yml +++ b/ansible/playbooks/doc-rpc-sol-min.yml @@ -157,14 +157,101 @@ path: "{{ solana_validator_bin }}" 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 ansible.builtin.shell: | set -euo pipefail - KEYGEN="{{ solana_keygen_primary_bin }}" - if [ ! -x "$KEYGEN" ]; then - KEYGEN="{{ solana_keygen_fallback_bin }}" - fi - "$KEYGEN" new --no-passphrase -o "{{ solana_identity_path }}" + "{{ solana_keygen_bin }}" new --no-passphrase -o "{{ solana_identity_path }}" become_user: "{{ solana_user }}" environment: HOME: "{{ solana_home }}" diff --git a/doc/etap-001-doc-rpc-sol-ansible.md b/doc/etap-001-doc-rpc-sol-ansible.md index 7a656ad..19cae2a 100644 --- a/doc/etap-001-doc-rpc-sol-ansible.md +++ b/doc/etap-001-doc-rpc-sol-ansible.md @@ -4,7 +4,7 @@ Cel etapu: uruchomić pierwszy, bezpieczny playbook Ansible dla hosta RPC (`mevn ## 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`: - inventory dla `mevnode`, - minimalny playbook testowy (bez zmian destrukcyjnych). @@ -18,6 +18,20 @@ Cel etapu: uruchomić pierwszy, bezpieczny playbook Ansible dla hosta RPC (`mevn ## 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`. - 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 +``` diff --git a/doc/etap-006-agave-install-identity-start.md b/doc/etap-006-agave-install-identity-start.md index d1b71ac..8a14e2d 100644 --- a/doc/etap-006-agave-install-identity-start.md +++ b/doc/etap-006-agave-install-identity-start.md @@ -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). - 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 diff --git a/doc/workflow.md b/doc/workflow.md new file mode 100644 index 0000000..46cdd44 --- /dev/null +++ b/doc/workflow.md @@ -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`.