Try โ€‚โ€‰HackMD

Keys API launch guide

Simple Lido keys and validators HTTP API. Source code is available via link. API documentation and more information about how Keys api work is available via link.

Requirements

  1. 2 core CPU
  2. 5 GB RAM
    • Keys-API-DB โ€” 500MB
    • Keys-API โ€” 4GB
  3. EL Full node
  4. CL node for applications like Ejector that use validators API. KAPI currently doesn't work with Nimbus client. If you use Teku client, please use archive mode.

Environment variables

# Application port
PORT=3000

# The number of seconds that each request will last in storage
GLOBAL_THROTTLE_TTL=5

# The maximum number of requests within the TTL limit
GLOBAL_THROTTLE_LIMIT=100

# Cache expiration time in seconds
GLOBAL_CACHE_TTL=1

# Log level: debug, info, notice, warning or error
LOG_LEVEL=debug

# Log format: simple or json
LOG_FORMAT=json

# EL Node provider
# You could provide few providers for fallback
PROVIDERS_URLS=http://your_el_node1,http://your_el_node2

# chain id
CHAIN_ID=1

# DB config
DB_NAME=db
DB_PORT=5432
DB_HOST=keys_api_db
DB_USER=postgres
DB_PASSWORD=postgres

# It is possible to enable/disable collecting of validators
# value below is default
VALIDATOR_REGISTRY_ENABLE=true

# CL api urls
# if VALIDATOR_REGISTRY_ENABLE=false , there are no need to provide CL_API_URLS
CL_API_URLS=http://your_cl_node1,http://your_cl_node2

# FallbackProviderModule request policy parameters
# values below are default
PROVIDER_JSON_RPC_MAX_BATCH_SIZE=100
PROVIDER_CONCURRENT_REQUESTS=5
PROVIDER_BATCH_AGGREGATION_WAIT_MS=10

How to run

For running Keys Api please use our public stable image available via link.

Below you can find docker-compose example for running service with database.

Please always use the SHA256 hash of the Docker image for the latest release, which can be found here: https://docs.lido.fi/guides/tooling#keys-api.

docker-compose.yml
version: '3.7' services: keys_api_db: image: postgres:14-alpine restart: unless-stopped environment: - POSTGRES_DB=${DB_NAME} - POSTGRES_USER=${DB_USER} - POSTGRES_PASSWORD=${DB_PASSWORD} ports: - ${DB_PORT}:5432 volumes: - ./.volumes/pgdata-${CHAIN_ID}/:/var/lib/postgresql/data keys_api: image: lidofinance/lido-keys-api@<latest-hash> restart: always environment: - NODE_ENV=production - PORT=${PORT} - LOG_LEVEL=${LOG_LEVEL} - LOG_FORMAT=${LOG_FORMAT} - PROVIDERS_URLS=${PROVIDERS_URLS} - CHAIN_ID=${CHAIN_ID} - DB_NAME=${DB_NAME} - DB_PORT=${DB_PORT} - DB_HOST=${DB_HOST} - DB_USER=${DB_USER} - DB_PASSWORD=${DB_PASSWORD} - CL_API_URLS=${CL_API_URLS} - VALIDATOR_REGISTRY_ENABLE=${VALIDATOR_REGISTRY_ENABLE} ports: - '${PORT}:${PORT}' depends_on: - keys_api_db

To run docker-compose:

docker-compose up

Now you could access API on http://localhost:${PORT}/api.

Monitoring

Prometheus metrics will be available by enpoint http://localhost:${PORT}/metrics. You could find in repository configs and dashboards for running prometheus and grafana locally. for grafana configs check link. For prometheus link.

Below example of docker-compose from repository

docker-compose.yml
version: '3.7' services: keys_api_prometheus: image: prom/prometheus:v2.17.2 container_name: keys_api_prometheus ports: - 9090:9090 volumes: - ./prometheus/:/etc/prometheus/ command: - '--config.file=/etc/prometheus/prometheus.yml' keys_api_grafana: image: grafana/grafana-oss:9.1.5 container_name: keys_api_grafana restart: unless-stopped ports: - 8000:3000 volumes: - ./grafana/datasources.yml:/etc/grafana/provisioning/datasources/datasources.yml depends_on: - keys_api_prometheus