mirror of https://github.com/lukechilds/docs.git
Patrick Gray
4 years ago
committed by
Patrick Gray
3 changed files with 307 additions and 1 deletions
@ -0,0 +1,303 @@ |
|||
--- |
|||
title: Running an API node |
|||
description: Set up and run a local API node with Docker |
|||
icon: MainnetIcon |
|||
images: |
|||
large: /images/pages/mainnet.svg |
|||
sm: /images/pages/mainnet-sm.svg |
|||
--- |
|||
|
|||
## Introduction |
|||
|
|||
This procedure demonstrates how to run a local API node using Docker images. There are several components that must be |
|||
configured and run in a specific order for the local API node to work. |
|||
|
|||
For this procedure, the order in which the services are brought up is very important. In order to start the API node |
|||
successfully, you need to bring up the services in the following order: |
|||
|
|||
1. `postgres` |
|||
2. `stacks-blockchain-api` |
|||
3. `stacks-blockchain` |
|||
|
|||
When bringing down the API node, you should bring the services down in the exact reverse order in which they were |
|||
brought up, to avoid losing data. |
|||
|
|||
-> This procedure focuses on Unix-like operating systems (Linux and MacOS). This procedure has not been tested on |
|||
Windows. |
|||
|
|||
## Prerequisites |
|||
|
|||
Running a node has no specialized hardware requirements. Users have been successful in running nodes on Raspberry Pi |
|||
boards and other system-on-chip architectures. In order to complete this procedure, you must have the following software |
|||
installed on the node host machine: |
|||
|
|||
- [Docker](https://docs.docker.com/get-docker/) |
|||
- [curl](https://curl.se/download.html) |
|||
- [psql](http://postgresguide.com/utilities/psql.html) (_installed locally_) |
|||
- [jq](https://stedolan.github.io/jq/download/) |
|||
|
|||
### Firewall configuration |
|||
|
|||
In order for the API node services to work correctly, you must configure any network firewall rules to allow traffic on |
|||
the ports discussed in this section. The details of network and firewall configuration are highly specific to your |
|||
machine and network, so a detailed example isn't provided. |
|||
|
|||
The following ports must open on the host machine: |
|||
|
|||
Ingress: |
|||
|
|||
- postgres (open to `localhost` only): |
|||
- `5432 TCP` |
|||
- stacks-blockchain-api |
|||
- `3999 TCP` |
|||
- stacks-blockchain (open to `0.0.0.0/0`): |
|||
- `20443 TCP` |
|||
- `20444 TCP` |
|||
|
|||
Egress: |
|||
|
|||
- `8332` |
|||
- `8333` |
|||
- `20443-20444` |
|||
|
|||
These egress ports are for syncing [`stacks-blockchain`][] and Bitcoin headers. If they're not open, the sync will fail. |
|||
|
|||
## Step 1: initial setup |
|||
|
|||
In order to run the API node, you must download the Docker images and create a directory structure to hold the |
|||
persistent data from the services. Download and configure the Docker images with the following commands: |
|||
|
|||
```sh |
|||
docker pull blockstack/stacks-blockchain-api && docker pull blockstack/stacks-blockchain && docker pull postgres:alpine |
|||
docker network create stacks-blockchain > /dev/null 2>&1 |
|||
``` |
|||
|
|||
Create a directory structure for the service data with the following command: |
|||
|
|||
```sh |
|||
mkdir -p ./stacks-node/{persistent-data/postgres,persistent-data/stacks-blockchain,bns,config} && cd stacks-node |
|||
``` |
|||
|
|||
## Step 2: running Postgres |
|||
|
|||
The `postgres:alpine` Docker container can be run with default settings. You must set the password for the user to |
|||
`postgres` with the `POSTGRES_PASSWORD` environment variable. The following command starts the image: |
|||
|
|||
```sh |
|||
docker run -d --rm \ |
|||
--name postgres \ |
|||
--net=stacks-blockchain \ |
|||
-e POSTGRES_PASSWORD=postgres \ |
|||
-v $(pwd)/persistent-data/postgres:/var/lib/postgresql/data \ |
|||
-p 5432:5432 |
|||
postgres:alpine |
|||
``` |
|||
|
|||
You can verify the running Postgres instance on port `5432` with the command |
|||
|
|||
```sh |
|||
docker ps --filter name=postgres |
|||
``` |
|||
|
|||
## Step 3: running Stacks blockchain API |
|||
|
|||
The [`stacks-blockchain-api`][] image requires several environment variables to be set. To reduce the complexity of the |
|||
run command, you should create a new `.env` file and add the following to it using a text editor: |
|||
|
|||
``` |
|||
NODE_ENV=production |
|||
GIT_TAG=master |
|||
PG_HOST=postgres |
|||
PG_PORT=5432 |
|||
PG_USER=postgres |
|||
PG_PASSWORD=postgres |
|||
PG_DATABASE=postgres |
|||
STACKS_CHAIN_ID=0x00000001 |
|||
V2_POX_MIN_AMOUNT_USTX=90000000260 |
|||
STACKS_CORE_EVENT_PORT=3700 |
|||
STACKS_CORE_EVENT_HOST=0.0.0.0 |
|||
STACKS_BLOCKCHAIN_API_PORT=3999 |
|||
STACKS_BLOCKCHAIN_API_HOST=0.0.0.0 |
|||
STACKS_BLOCKCHAIN_API_DB=pg |
|||
STACKS_CORE_RPC_HOST=stacks-blockchain |
|||
STACKS_CORE_RPC_PORT=20443 |
|||
BNS_IMPORT_DIR=/bns-data |
|||
``` |
|||
|
|||
-> This guide configures the API to import BNS data with the `BNS_IMPORT_DIR` variable. To disable this import, comment |
|||
the line out by placing a `#` at the beginning of the line. If you leave the BNS import enabled, it may take several |
|||
minutes for the container to start while it imports the data. |
|||
|
|||
The `PG_HOST` and `STACKS_CORE_RPC_HOST` variables define the container names for `postgres` and `stacks-blockchain`. |
|||
You may wish to alter those values if you have named those containers differently than this guide. |
|||
|
|||
Start the [`stacks-blockchain-api`][] image with the following command: |
|||
|
|||
```sh |
|||
docker run -d --rm \ |
|||
--name stacks-blockchain-api \ |
|||
--net=stacks-blockchain \ |
|||
--env-file $(pwd)/.env \ |
|||
-v $(pwd)/bns:/bns-data \ |
|||
-p 3700:3700 \ |
|||
-p 3999:3999 \ |
|||
blockstack/stacks-blockchain-api |
|||
``` |
|||
|
|||
You can verify the running `stacks-blockchain-api` container with the command: |
|||
|
|||
```sh |
|||
docker ps --filter name=stacks-blockchain-api |
|||
``` |
|||
|
|||
## Step 4: running Stacks blockchain |
|||
|
|||
In order for the API to be functional, the [`stacks-blockchain-api`][] container must have data from a running |
|||
[`stacks-blockchain`][] instance. First create the `./config/Config.toml` file and add the following content to the |
|||
file using a text editor: |
|||
|
|||
```toml |
|||
[node] |
|||
working_dir = "/root/stacks-node/data" |
|||
rpc_bind = "0.0.0.0:20443" |
|||
p2p_bind = "0.0.0.0:20444" |
|||
bootstrap_node = "02da7a464ac770ae8337a343670778b93410f2f3fef6bea98dd1c3e9224459d36b@seed-0.mainnet.stacks.co:20444,02afeae522aab5f8c99a00ddf75fbcb4a641e052dd48836408d9cf437344b63516@seed-1.mainnet.stacks.co:20444,03652212ea76be0ed4cd83a25c06e57819993029a7b9999f7d63c36340b34a4e62@seed-2.mainnet.stacks.co:20444" |
|||
wait_time_for_microblocks = 10000 |
|||
|
|||
[[events_observer]] |
|||
endpoint = "stacks-blockchain-api:3700" |
|||
retry_count = 255 |
|||
events_keys = ["*"] |
|||
|
|||
[burnchain] |
|||
chain = "bitcoin" |
|||
mode = "mainnet" |
|||
peer_host = "bitcoin.blockstack.com" |
|||
username = "blockstack" |
|||
password = "blockstacksystem" |
|||
rpc_port = 8332 |
|||
peer_port = 8333 |
|||
|
|||
[connection_options] |
|||
read_only_call_limit_write_length = 0 |
|||
read_only_call_limit_read_length = 100000 |
|||
read_only_call_limit_write_count = 0 |
|||
read_only_call_limit_read_count = 30 |
|||
read_only_call_limit_runtime = 1000000000 |
|||
``` |
|||
|
|||
The `[[events_observer]]` block configures the instance to send blockchain events to the API container that you |
|||
started previously. |
|||
|
|||
Start the [`stacks-blockchain`][] container with the following command: |
|||
|
|||
```sh |
|||
docker run -d --rm \ |
|||
--name stacks-blockchain \ |
|||
--net=stacks-blockchain \ |
|||
-v $(pwd)/persistent-data/stacks-blockchain:/root/stacks-node/data \ |
|||
-v $(pwd)/config:/src/stacks-node \ |
|||
-p 20443:20443 \ |
|||
-p 20444:20444 \ |
|||
blockstack/stacks-blockchain \ |
|||
/bin/stacks-node start --config /src/stacks-node/Config.toml |
|||
``` |
|||
|
|||
You can verify the running [`stacks-blockchain`][] container with the command: |
|||
|
|||
```sh |
|||
docker ps --filter name=stacks-blockchain |
|||
``` |
|||
|
|||
## Step 5: verifying the services |
|||
|
|||
You can now verify that each of the services is running and talking to the others. |
|||
|
|||
To verify the database is ready: |
|||
|
|||
1. Connect to the Postgres instance with the command `psql -h localhost -U postgres`. Use the password from the |
|||
`POSTGRES_PASSWORD` environment variable you set when running the container. |
|||
2. List current databases with the command `\l` |
|||
3. Disconnect from the database with the command `\q` |
|||
|
|||
To verify the [`stacks-blockchain`][] tip height is progressing use the following command: |
|||
|
|||
```sh |
|||
curl -sL localhost:20443/v2/info | jq |
|||
``` |
|||
|
|||
If the instance is running you should recieve terminal output similar to the following: |
|||
|
|||
```json |
|||
{ |
|||
"peer_version": 402653184, |
|||
"pox_consensus": "89d752034e73ed10d3b97e6bcf3cff53367b4166", |
|||
"burn_block_height": 666143, |
|||
"stable_pox_consensus": "707f26d9d0d1b4c62881a093c99f9232bc74e744", |
|||
"stable_burn_block_height": 666136, |
|||
"server_version": "stacks-node 2.0.11.1.0-rc1 (master:67dccdf, release build, linux [x86_64])", |
|||
"network_id": 1, |
|||
"parent_network_id": 3652501241, |
|||
"stacks_tip_height": 61, |
|||
"stacks_tip": "e08b2fe3dce36fd6d015c2a839c8eb0885cbe29119c1e2a581f75bc5814bce6f", |
|||
"stacks_tip_consensus_hash": "ad9f4cb6155a5b4f5dcb719d0f6bee043038bc63", |
|||
"genesis_chainstate_hash": "74237aa39aa50a83de11a4f53e9d3bb7d43461d1de9873f402e5453ae60bc59b", |
|||
"unanchored_tip": "74d172df8f8934b468c5b0af2efdefe938e9848772d69bcaeffcfe1d6c6ef041", |
|||
"unanchored_seq": 0, |
|||
"exit_at_block_height": null |
|||
} |
|||
``` |
|||
|
|||
Verify the [`stacks-blockchain-api`][] is receiving data from the [`stacks-blockchain`][] with the following command: |
|||
|
|||
```sh |
|||
curl -sL localhost:3999/v2/info | jq |
|||
``` |
|||
|
|||
If the instance is configured correctly, you should recieve terminal output similar to the following: |
|||
|
|||
```json |
|||
{ |
|||
"peer_version": 402653184, |
|||
"pox_consensus": "e472cadc17dcf3bc1afafc6aa595899e55f25b72", |
|||
"burn_block_height": 666144, |
|||
"stable_pox_consensus": "6a6fb0aa75a8acd4919f56c9c4c81ce5bc42cac1", |
|||
"stable_burn_block_height": 666137, |
|||
"server_version": "stacks-node 2.0.11.1.0-rc1 (master:67dccdf, release build, linux [x86_64])", |
|||
"network_id": 1, |
|||
"parent_network_id": 3652501241, |
|||
"stacks_tip_height": 61, |
|||
"stacks_tip": "e08b2fe3dce36fd6d015c2a839c8eb0885cbe29119c1e2a581f75bc5814bce6f", |
|||
"stacks_tip_consensus_hash": "ad9f4cb6155a5b4f5dcb719d0f6bee043038bc63", |
|||
"genesis_chainstate_hash": "74237aa39aa50a83de11a4f53e9d3bb7d43461d1de9873f402e5453ae60bc59b", |
|||
"unanchored_tip": "74d172df8f8934b468c5b0af2efdefe938e9848772d69bcaeffcfe1d6c6ef041", |
|||
"unanchored_seq": 0, |
|||
"exit_at_block_height": null |
|||
} |
|||
``` |
|||
|
|||
Once the API is running, you can use it to [interact with other API endpoints][`stacks-blockchain-api`]. |
|||
|
|||
## Stopping the API node |
|||
|
|||
As discussed previously, if you want to bring down your API node, you must stop the services in the reverse order that |
|||
you started them. Performing the shutdown in this order ensures that you don't lose any data while shutting down |
|||
the node. |
|||
|
|||
Use the following commands to stop the local API node: |
|||
|
|||
```sh |
|||
docker stop stacks-blockchain |
|||
docker stop stacks-blockchain-api |
|||
docker stop postgres |
|||
``` |
|||
|
|||
## Additional reading |
|||
|
|||
- [Running an API instance with Docker][] in the `stacks-blockchain-api` repo |
|||
- [Running an API instance from source][] in the `stacks-blockchain-api` repo |
|||
|
|||
[running an api instance with docker]: https://github.com/blockstack/stacks-blockchain-api/blob/master/running_an_api.md |
|||
[running an api instance from source]: https://github.com/blockstack/stacks-blockchain-api/blob/master/running_api_from_source.md |
|||
[`stacks-blockchain`]: https://github.com/blockstack/stacks-blockchain |
|||
[`stacks-blockchain-api`]: https://github.com/blockstack/stacks-blockchain-api |
Loading…
Reference in new issue