Deploy a Graph Node

This tutorial will guide you to run The Graph self-hosted node on your machine via Docker Compose. Docker and Docker Compose are required to run graph node.

Prepare your docker-compose.yaml file

version: '3'
services:
graph-node:
image: graphprotocol/graph-node
ports:
- '8000:8000'
- '8001:8001'
- '8020:8020'
- '8030:8030'
- '8040:8040'
depends_on:
- ipfs
- postgres
extra_hosts:
- host.docker.internal:host-gateway
environment:
postgres_host: postgres
postgres_user: graph-node
postgres_pass: let-me-in
postgres_db: graph-node
ipfs: 'ipfs:5001'
ethereum: RPC_URL_TO_YOUR_NODE
GRAPH_LOG: info
ipfs:
image: ipfs/kubo:v0.14.0
ports:
- '5001:5001'
volumes:
- ./data/ipfs:/data/ipfs
postgres:
image: postgres:14
ports:
- '5432:5432'
command:
[
"postgres",
"-cshared_preload_libraries=pg_stat_statements",
"-cmax_connections=200"
]
environment:
POSTGRES_USER: YOUR_POSTGRES_USER
POSTGRES_PASSWORD: YOUR_POSTGRES_PASSWORD
POSTGRES_DB: YOUR_POSTGRES_DB
# FIXME: remove this env. var. which we shouldn't need. Introduced by
# <https://github.com/graphprotocol/graph-node/pull/3511>, maybe as a
# workaround for https://github.com/docker/for-mac/issues/6270?
PGDATA: "/var/lib/postgresql/data"
POSTGRES_INITDB_ARGS: "-E UTF8 --locale=C"
volumes:
- ./data/postgres:/var/lib/postgresql/data
In that:
  • RPC_URL_TO_YOUR_NODE: is RPC URL to your node (it could be your local U2U node or public tracing node). Example: 'solaris:http://host.docker.internal:8545' or 'solaris:https://rpc-mainnet.uniultra.xyz' for Solaris mainnet or 'nebulas:https://rpc-nebulas-testnet.uniultra.xyz' for Nebulas testnet.
  • POSTGRES_USER: your Postgres database username. Example: graph-node
  • POSTGRES_PASSWORD: Your Postgres database password. Example: let-me-in
  • POSTGRES_DB: your Postgres database database name. Example: graph-node
Once your filled those environment variables, you enter below command to start your graphnode with Docker Compose at the same directory where contains your docker-compose.yaml file:
docker-compose up
You will see something similar:
[+] Running 39/3
✔ postgres 13 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 34.0s
✔ graph-node 7 layers [⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 34.2s
✔ ipfs 16 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 14.4s
[+] Running 4/4
✔ Network graphnode_default Created 0.2s
✔ Container graphnode-postgres-1 Created 8.0s
✔ Container graphnode-ipfs-1 Created 8.0s
✔ Container graphnode-graph-node-1 Created 0.9s
Attaching to graphnode-graph-node-1, graphnode-ipfs-1, graphnode-postgres-1
graphnode-postgres-1 | The files belonging to this database system will be owned by user "postgres".
graphnode-postgres-1 | This user must also own the server process.
graphnode-postgres-1 |
graphnode-postgres-1 | The database cluster will be initialized with locale "C".
graphnode-postgres-1 | The default text search configuration will be set to "english".
graphnode-postgres-1 |
graphnode-postgres-1 | Data page checksums are disabled.
graphnode-postgres-1 |
graphnode-postgres-1 | fixing permissions on existing directory /var/lib/postgresql/data ... ok
graphnode-postgres-1 | creating subdirectories ... ok
graphnode-postgres-1 | selecting dynamic shared memory implementation ... posix
graphnode-postgres-1 | selecting default max_connections ... 100
graphnode-ipfs-1 | Changing user to ipfs
graphnode-postgres-1 | selecting default shared_buffers ... 128MB
graphnode-postgres-1 | selecting default time zone ... Etc/UTC
graphnode-postgres-1 | creating configuration files ... ok
graphnode-ipfs-1 | ipfs version 0.14.0
graphnode-ipfs-1 | generating ED25519 keypair...done
graphnode-ipfs-1 | peer identity: 12D3KooWNhXSghWxBP8R1CdGiNN3aUhFFNwP2WV7siHNK3Xr33Mw
graphnode-ipfs-1 | initializing IPFS node at /data/ipfs
graphnode-postgres-1 | running bootstrap script ... ok
graphnode-postgres-1 | performing post-bootstrap initialization ... ok
graphnode-graph-node-1 | Waiting for IPFS (ipfs:5001)
graphnode-ipfs-1 | to get started, enter:
graphnode-ipfs-1 |
graphnode-ipfs-1 | ipfs cat /ipfs/QmQPeNsJPyVWPFDVHb77w8G42Fvo15z4bG2X8D2GhfbSXc/readme
graphnode-ipfs-1 |
graphnode-ipfs-1 | Initializing daemon...
graphnode-ipfs-1 | Kubo version: 0.14.0-e0fabd6
graphnode-ipfs-1 | Repo version: 12
graphnode-ipfs-1 | System version: amd64/linux
graphnode-ipfs-1 | Golang version: go1.18.3
graphnode-postgres-1 | syncing data to disk ... ok
graphnode-postgres-1 |
graphnode-postgres-1 |
graphnode-postgres-1 | Success. You can now start the database server using:
graphnode-postgres-1 |
graphnode-postgres-1 | pg_ctl -D /var/lib/postgresql/data -l logfile start
graphnode-postgres-1 |
graphnode-postgres-1 | initdb: warning: enabling "trust" authentication for local connections
graphnode-postgres-1 | You can change this by editing pg_hba.conf or using the option -A, or
graphnode-postgres-1 | --auth-local and --auth-host, the next time you run initdb.
graphnode-ipfs-1 | 2023/10/09 10:08:39 failed to sufficiently increase receive buffer size (was: 208 kiB, wanted: 2048 kiB, got: 416 kiB). See https://github.com/lucas-clemente/quic-go/wiki/UDP-Receive-Buffer-Size for details.
graphnode-postgres-1 | waiting for server to start....2023-10-09 10:08:39.532 UTC [49] LOG: starting PostgreSQL 14.9 (Debian 14.9-1.pgdg120+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 12.2.0-14) 12.2.0, 64-bit
graphnode-postgres-1 | 2023-10-09 10:08:39.576 UTC [49] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
graphnode-postgres-1 | 2023-10-09 10:08:39.777 UTC [50] LOG: database system was shut down at 2023-10-09 10:08:32 UTC
graphnode-postgres-1 | 2023-10-09 10:08:39.904 UTC [49] LOG: database system is ready to accept connections
graphnode-postgres-1 | done
graphnode-postgres-1 | server started
graphnode-ipfs-1 | Swarm listening on /ip4/127.0.0.1/tcp/4001
graphnode-ipfs-1 | Swarm listening on /ip4/127.0.0.1/udp/4001/quic
graphnode-ipfs-1 | Swarm listening on /ip4/172.21.0.3/tcp/4001
graphnode-ipfs-1 | Swarm listening on /ip4/172.21.0.3/udp/4001/quic
graphnode-ipfs-1 | Swarm listening on /p2p-circuit
graphnode-ipfs-1 | Swarm announcing /ip4/127.0.0.1/tcp/4001
graphnode-ipfs-1 | Swarm announcing /ip4/127.0.0.1/udp/4001/quic
graphnode-ipfs-1 | Swarm announcing /ip4/171.242.12.100/udp/4001/quic
graphnode-ipfs-1 | Swarm announcing /ip4/171.242.12.202/udp/4001/quic
graphnode-ipfs-1 | Swarm announcing /ip4/172.21.0.3/tcp/4001
graphnode-ipfs-1 | Swarm announcing /ip4/172.21.0.3/udp/4001/quic
graphnode-ipfs-1 | API server listening on /ip4/0.0.0.0/tcp/5001
graphnode-ipfs-1 | WebUI: http://0.0.0.0:5001/webui
graphnode-ipfs-1 | Gateway (readonly) server listening on /ip4/0.0.0.0/tcp/8080
graphnode-ipfs-1 | Daemon is ready
graphnode-postgres-1 | CREATE DATABASE
graphnode-postgres-1 |
graphnode-postgres-1 |
graphnode-postgres-1 | /usr/local/bin/docker-entrypoint.sh: ignoring /docker-entrypoint-initdb.d/*
graphnode-postgres-1 |
graphnode-postgres-1 | waiting for server to shut down...2023-10-09 10:08:40.881 UTC [49] LOG: received fast shutdown request
graphnode-postgres-1 | .2023-10-09 10:08:40.931 UTC [49] LOG: aborting any active transactions
graphnode-postgres-1 | 2023-10-09 10:08:40.932 UTC [49] LOG: background worker "logical replication launcher" (PID 56) exited with exit code 1
graphnode-postgres-1 | 2023-10-09 10:08:40.932 UTC [51] LOG: shutting down
graphnode-graph-node-1 | Waiting for Postgres (postgres:5432)
graphnode-postgres-1 | 2023-10-09 10:08:41.234 UTC [49] LOG: database system is shut down
graphnode-postgres-1 | done
graphnode-postgres-1 | server stopped
graphnode-postgres-1 |
graphnode-postgres-1 | PostgreSQL init process complete; ready for start up.
graphnode-postgres-1 |
graphnode-postgres-1 | 2023-10-09 10:08:41.364 UTC [1] LOG: starting PostgreSQL 14.9 (Debian 14.9-1.pgdg120+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 12.2.0-14) 12.2.0, 64-bit
graphnode-postgres-1 | 2023-10-09 10:08:41.365 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
graphnode-postgres-1 | 2023-10-09 10:08:41.365 UTC [1] LOG: listening on IPv6 address "::", port 5432
graphnode-postgres-1 | 2023-10-09 10:08:41.458 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
graphnode-postgres-1 | 2023-10-09 10:08:41.526 UTC [64] LOG: database system was shut down at 2023-10-09 10:08:41 UTC
graphnode-postgres-1 | 2023-10-09 10:08:41.578 UTC [1] LOG: database system is ready to accept connections
graphnode-graph-node-1 | Oct 09 10:08:47.023 INFO Graph Node version: 0.32.0 (2023-08-21)
graphnode-graph-node-1 | Oct 09 10:08:47.023 WARN GRAPH_POI_ACCESS_TOKEN not set; might leak POIs to the public via GraphQL
graphnode-graph-node-1 | Oct 09 10:08:47.023 INFO Generating configuration from command line arguments
graphnode-graph-node-1 | Oct 09 10:08:47.023 WARN No fork base URL specified, subgraph forking is disabled
graphnode-graph-node-1 | Oct 09 10:08:47.023 INFO Starting up
graphnode-graph-node-1 | Oct 09 10:08:47.023 INFO Trying IPFS node at: http://ipfs:5001/
graphnode-graph-node-1 | Oct 09 10:08:47.028 INFO Creating transport, capabilities: archive, traces, url: https://rpc-mainnet.uniultra.xyz, provider: solaris-rpc-0
graphnode-graph-node-1 | Oct 09 10:08:47.029 INFO Successfully connected to IPFS node at: http://ipfs:5001/
graphnode-graph-node-1 | Oct 09 10:08:47.287 WARN Expensive queries file not set to a valid file: /etc/graph-node/expensive-queries.txt
graphnode-graph-node-1 | Oct 09 10:08:47.303 INFO Connecting to Postgres, weight: 1, conn_pool_size: 10, url: postgresql://graph-node:HIDDEN_PASSWORD@postgres:5432/graph-node?sslmode=prefer, pool: main, shard: primary
graphnode-graph-node-1 | Oct 09 10:08:47.303 INFO Pool successfully connected to Postgres, pool: main, shard: primary, component: Store
graphnode-graph-node-1 | Oct 09 10:08:47.309 INFO Setting up fdw, pool: main, shard: primary, component: ConnectionPool
graphnode-graph-node-1 | Oct 09 10:08:47.340 INFO Running migrations, pool: main, shard: primary, component: ConnectionPool
graphnode-graph-node-1 | Oct 09 10:08:58.857 INFO Migrations finished, pool: main, shard: primary, component: ConnectionPool
graphnode-graph-node-1 | Oct 09 10:08:58.858 INFO Mapping primary, pool: main, shard: primary, component: ConnectionPool
graphnode-graph-node-1 | Oct 09 10:08:58.877 INFO Connecting to Ethereum to get network identifier, capabilities: archive, traces, provider: solaris-rpc-0
graphnode-graph-node-1 | Oct 09 10:08:59.184 INFO Connected to Ethereum, capabilities: archive, traces, network_version: 39, provider: solaris-rpc-0
graphnode-graph-node-1 | Oct 09 10:08:59.691 INFO Creating LoadManager in disabled mode, component: LoadManager
graphnode-graph-node-1 | Oct 09 10:08:59.691 INFO Started block ingestor, network_name: solaris
graphnode-graph-node-1 | Oct 09 10:08:59.691 INFO Starting firehose block ingestor for network, network_name: solaris
graphnode-graph-node-1 | Oct 09 10:08:59.691 INFO Starting job runner with 5 jobs, component: JobRunner
graphnode-graph-node-1 | Oct 09 10:08:59.692 INFO Starting JSON-RPC admin server at: http://localhost:8020, component: JsonRpcServer
graphnode-graph-node-1 | Oct 09 10:08:59.692 INFO Starting GraphQL HTTP server at: http://localhost:8000, component: GraphQLServer
graphnode-graph-node-1 | Oct 09 10:08:59.692 INFO Starting index node server at: http://localhost:8030, component: IndexNodeServer
graphnode-graph-node-1 | Oct 09 10:08:59.692 INFO Started all assigned subgraphs, node_id: default, count: 0, component: SubgraphRegistrar
graphnode-graph-node-1 | Oct 09 10:08:59.692 INFO Starting GraphQL WebSocket server at: ws://localhost:8001, component: SubscriptionServer
graphnode-graph-node-1 | Oct 09 10:08:59.692 INFO Starting metrics server at: http://localhost:8040, component: MetricsServer
graphnode-graph-node-1 | Oct 09 10:08:59.866 INFO Downloading latest blocks from Ethereum, this may take a few minutes..., provider: solaris-rpc-0, component: EthereumPollingBlockIngestor
graphnode-graph-node-1 | Oct 09 10:09:46.238 INFO Syncing 27 blocks from Ethereum, code: BlockIngestionLagging, blocks_needed: 27, blocks_behind: 27, latest_block_head: 2043707, current_block_head: 2043680, provider: solaris-rpc-0, component: EthereumPollingBlockIngestor
graphnode-graph-node-1 | Oct 09 10:09:52.082 INFO Syncing 3 blocks from Ethereum, code: BlockIngestionStatus, blocks_needed: 3, blocks_behind: 3, latest_block_head: 2043710, current_block_head: 2043707, provider: solaris-rpc-0, component: EthereumPollingBlockIngestor
graphnode-graph-node-1 | Oct 09 10:09:53.731 INFO Syncing 1 blocks from Ethereum, code: BlockIngestionStatus, blocks_needed: 1, blocks_behind: 1, latest_block_head: 2043711, current_block_head: 2043710, provider: solaris-rpc-0, component: EthereumPollingBlockIngestor
Please take a look at the last line, graphnode has started to sync blocks with the RPC node. Your graphnode now is ready to deploy a subgraph.