123 lines
4.7 KiB
Plaintext
123 lines
4.7 KiB
Plaintext
Step 003: Geyser plugin -> PostgreSQL (Agave) na prywatnym RPC node
|
|
|
|
Cel:
|
|
- Wlaczyc Geyser plugin zapisujacy eventy do Postgresa.
|
|
- Na poczatek: dzialajace end-to-end (plugin laduje sie w validatorze + dane wpadaja do DB).
|
|
|
|
Wazne ryzyka:
|
|
- Pisanie wszystkiego do Postgresa na mainnet generuje OGROMNY write load.
|
|
Jezeli DB bedzie na tym samym hoście co validator, latwo o IO contention i spadek performance sync.
|
|
- Rekomendacja: startuj od selektorow (filtrow), np. tylko programy ktore bot potrzebuje.
|
|
|
|
0) Preconditions
|
|
- Agave dziala pod systemd:
|
|
- doc/step-002b-agave-validator-systemd.txt
|
|
- Masz pinned Agave release (tag) i go nie zmieniasz "w locie":
|
|
- doc/step-002f-agave-build-from-source-latest.txt
|
|
|
|
1) Postgres (lokalnie, minimalny setup)
|
|
sudo apt-get update
|
|
sudo apt-get install -y postgresql postgresql-contrib
|
|
sudo systemctl enable --now postgresql
|
|
|
|
# DB + user (dostosuj haslo; nie commituj do repo)
|
|
sudo -u postgres psql -v ON_ERROR_STOP=1 <<'SQL'
|
|
DO $$
|
|
BEGIN
|
|
IF NOT EXISTS (SELECT FROM pg_roles WHERE rolname = 'geyser') THEN
|
|
CREATE ROLE geyser LOGIN PASSWORD 'CHANGE_ME';
|
|
END IF;
|
|
END $$;
|
|
|
|
CREATE DATABASE geyser OWNER geyser;
|
|
SQL
|
|
|
|
2) Build plugin ze zrodel (Anza Agave plugin Postgres)
|
|
# Repo:
|
|
# https://github.com/anza-xyz/agave-geyser-plugin-postgres
|
|
#
|
|
# Uwaga: plugin i validator musza byc kompatybilne wersjami interfejsu.
|
|
# Najbezpieczniej: build pluginu po update Agave i test "plugin loaded".
|
|
#
|
|
# Opcjonalnie: pin plugin do tagu/commit (np. pod ten sam release co Agave).
|
|
# PLUGIN_REF="main" # albo tag/commit
|
|
|
|
sudo install -d -o root -g root -m 0755 /opt/solana/plugins
|
|
sudo install -d -o solana -g solana -m 0750 /var/lib/solana/src
|
|
|
|
PLUGIN_SRC_DIR="/var/lib/solana/src/agave-geyser-plugin-postgres"
|
|
|
|
sudo -u solana -H bash -lc "
|
|
set -euo pipefail
|
|
export PATH=/var/lib/solana/.cargo/bin:\$PATH
|
|
rm -rf \"${PLUGIN_SRC_DIR}\"
|
|
git clone https://github.com/anza-xyz/agave-geyser-plugin-postgres.git \"${PLUGIN_SRC_DIR}\"
|
|
cd \"${PLUGIN_SRC_DIR}\"
|
|
if [ \"${PLUGIN_REF:-main}\" != \"main\" ]; then git checkout \"${PLUGIN_REF}\"; fi
|
|
cargo build --release
|
|
"
|
|
|
|
# Typowa nazwa .so (sprawdz `ls target/release/*.so`):
|
|
sudo cp -a "${PLUGIN_SRC_DIR}"/target/release/*.so /opt/solana/plugins/
|
|
sudo chmod 0755 /opt/solana/plugins/*.so
|
|
|
|
3) Schema w Postgres
|
|
# Plugin repo ma SQL do stworzenia schematu. Najpierw znajdz plik:
|
|
sudo -u solana -H bash -lc '
|
|
cd /var/lib/solana/src/agave-geyser-plugin-postgres
|
|
find . -maxdepth 3 -type f -iname \"*schema*.sql\" -o -type f -iname \"create*.sql\" | sort
|
|
'
|
|
|
|
# Potem wykonaj jako postgres na DB geyser (podmien sciezke na znaleziony plik):
|
|
# sudo -u postgres psql -d geyser -f /var/lib/solana/src/agave-geyser-plugin-postgres/scripts/create_schema.sql
|
|
|
|
4) Konfig pluginu (JSON)
|
|
# Najbezpieczniej: skopiuj example config z repo pluginu i zmien tylko:
|
|
# - sciezke do .so
|
|
# - connection string
|
|
# - selektory (na poczatek mozesz dac \"*\" tylko na smoke test, potem zawęz)
|
|
#
|
|
# Znajdz przyklad w repo:
|
|
sudo -u solana -H bash -lc '
|
|
cd /var/lib/solana/src/agave-geyser-plugin-postgres
|
|
find . -maxdepth 4 -type f -iname \"*.json\" | sort
|
|
rg -n \"connection_str|libpath|accounts_selector|transaction_selector|selector\" -S . || true
|
|
'
|
|
|
|
sudo install -d -o root -g root -m 0755 /etc/solana
|
|
|
|
# Start od skopiowania example (podmien sciezke jesli repo ma inna nazwe pliku):
|
|
# sudo cp -a /var/lib/solana/src/agave-geyser-plugin-postgres/config.json /etc/solana/geyser-postgres.json
|
|
|
|
# Uprawnienia: config zawiera haslo, ale validator (User=solana) musi go czytac.
|
|
if [ -f /etc/solana/geyser-postgres.json ]; then
|
|
sudo chown root:solana /etc/solana/geyser-postgres.json
|
|
sudo chmod 0640 /etc/solana/geyser-postgres.json
|
|
fi
|
|
|
|
5) Wlaczenie pluginu w agave-validator (systemd)
|
|
# Sprawdz, jak na Twojej wersji nazywa sie flaga:
|
|
/opt/solana/bin/agave-validator --help | rg -n \"geyser|plugin\" || true
|
|
|
|
# Docelowo (w unit file) dopisz:
|
|
# --geyser-plugin-config /etc/solana/geyser-postgres.json
|
|
#
|
|
# Nastepnie:
|
|
sudo systemctl daemon-reload
|
|
sudo systemctl restart agave-validator
|
|
|
|
6) Weryfikacja
|
|
sudo journalctl -u agave-validator -n 200 --no-pager | rg -i \"geyser|plugin|postgres\" || true
|
|
|
|
# Czy w DB pojawiaja sie tabele (zalezy od schema.sql):
|
|
sudo -u postgres psql -d geyser -c \"\\dt\" | head
|
|
|
|
# Czy rosną inserty (przyklad - dostosuj nazwy tabel):
|
|
# sudo -u postgres psql -d geyser -c 'select count(*) from account;'
|
|
|
|
7) Performance (minimum sanity)
|
|
- Jezeli validator zacznie znacząco odstawać, zacznij od:
|
|
- zawężenia selektorow (unikaj \"*\" po smoke tescie)
|
|
- zmniejszenia batch/threads
|
|
- przeniesienia DB na osobny host (lub przynajmniej na osobny NVMe)
|