Files
trade-iac/doc/step-003-geyser-plugin-postgres.txt

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)