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)
