Duniter squid
Duniter squid is an indexer for Duniter v2 based on the subsquid framework.
- git repository https://git.duniter.org/nodes/duniter-squid
Install duniter-squid
Requirements
You need an archive node running on the same network. In the following, we will assume this archive node is available in the duniter_default
network with the url ws://duniter-archive:9944
.
Docker compose
The following docker-compose.yml
allows you to start a duniter-squid
node. Please look carefully at the # <---
comments. To see the name of the network of your archive node, look at docker network ls
. This example compose comes from the one on the repo.
version: "3"
services:
# postgres database
db:
image: postgres:15
volumes:
- postgres-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres -d ${DB_NAME}"]
interval: 2s
timeout: 2s
retries: 5
environment:
POSTGRES_DB: ${DB_NAME}
POSTGRES_PASSWORD: ${DB_PASSWORD}
# hasura graphql endpoint
hasura-squid:
image: registry.duniter.org/nodes/duniter-squid/hasura:latest
depends_on:
processor:
condition: service_healthy
restart: always
ports:
- "${HASURA_LISTEN_PORT}:8080"
environment:
PRODUCTION: "true"
HASURA_GRAPHQL_DATABASE_URL: postgres://postgres:${DB_PASSWORD}@db:5432/${DB_NAME}
HASURA_GRAPHQL_ENABLE_CONSOLE: "true"
HASURA_GRAPHQL_DEV_MODE: "false"
HASURA_GRAPHQL_UNAUTHORIZED_ROLE: public
HASURA_GRAPHQL_ENABLE_TELEMETRY: "false"
HASURA_GRAPHQL_ADMIN_SECRET: ${HASURA_GRAPHQL_ADMIN_SECRET}
# squid processor which reads duniter data and put them in the postgres database
processor:
image: registry.duniter.org/nodes/duniter-squid/squid:latest
environment:
- DB_NAME=${DB_NAME}
- DB_PORT=5432
- DB_HOST=db
- DB_PASS=${DB_PASSWORD}
- RPC_ENDPOINT=${RPC_ENDPOINT}
- GENESIS_FILE=${GENESIS_FILE}
- HIST_GEN_FILE=${HIST_GEN_FILE}
- HIST_BLOCK_FILE=${HIST_BLOCK_FILE}
- HIST_TX_FILE=${HIST_TX_FILE}
- HIST_CERT_FILE=${HIST_CERT_FILE}
command: ["sqd", "process:prod"]
depends_on:
db:
condition: service_healthy
healthcheck:
test: ["CMD-SHELL", "pgrep -f 'process:prod'"]
interval: 5s
timeout: 2s
retries: 3
networks:
- default # <--- allows the processor to connect to the postgres database
- duniter # <--- allows the processor to connect to the duniter archive node
volumes:
postgres-data:
networks:
duniter:
name: duniter-gdev-archive_default # <--- your network name might vary depending on your config / folder name
external: true
And use this example environment file (from .env.example
):
# postgres
DB_NAME=squid
DB_PASSWORD=postgres
# processor input files (included in image)
GENESIS_FILE="./input/gdev.json"
HIST_GEN_FILE="./input/genesis.json"
HIST_BLOCK_FILE="./input/block_hist.json"
HIST_TX_FILE="./input/tx_hist.json"
HIST_CERT_FILE="./input/cert_hist.json"
# hasura
HASURA_GRAPHQL_ADMIN_SECRET=my_hasura_password
HASURA_LISTEN_PORT=8080
# Duniter RPC endpoint depending on your service name
RPC_ENDPOINT=ws://duniter-archive:9944
When you are ready, run the compose with:
docker compose down -v && # <--- if you want to erase previously existing data \
docker compose up -d && # <--- to start the compose in detached mode \
docker compose logs -f # <--- to see the logs and follow them
Nginx config
Example nginx config:
server {
listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate /etc/letsencrypt/live/YOUR_DOMAIN/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/YOUR_DOMAIN/privkey.pem;
server_name YOUR_DOMAIN;
access_log /var/log/nginx/YOUR_DOMAIN_access.log;
error_log /var/log/nginx/YOUR_DOMAIN_error.log;
location / {
add_header X-Robots-Tag "noindex";
proxy_pass http://localhost:4350;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
}
}
Use duniter-squid
Go on your duniter-squid
url (https://hasura.gdev.coinduf.eu/ for example) and make your requests in the GraphiQL playground. Then use the requests in your client.
Announce your endpoint
If you want other people to use your endpoint, do not forget to configure your Duniter node to announce it with DUNITER_PUBLIC_SQUID
.