diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f5ce0b8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/stacks-node +/postgresql +/wait \ No newline at end of file diff --git a/README.md b/README.md index ab06e6a..da73316 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,8 @@ # stacks-node-mainnet +References: + ++ https://docs.hiro.so/stacks-blockchain-api/how-to-guides/how-to-run-mainnet-node ++ https://docs.hiro.so/references/hiro-archive + +Note: use `stop.sh` to stop daemons! diff --git a/config/Stacks.toml b/config/Stacks.toml new file mode 100644 index 0000000..0765fb6 --- /dev/null +++ b/config/Stacks.toml @@ -0,0 +1,27 @@ +[node] +working_dir = "/srv/stacks-node" +rpc_bind = "0.0.0.0:20443" +p2p_bind = "0.0.0.0:20444" +bootstrap_node = "02196f005965cebe6ddc3901b7b1cc1aa7a88f305bb8c5893456b8f9a605923893@seed.mainnet.hiro.so:20444" +wait_time_for_microblocks = 10000 + +[burnchain] +chain = "bitcoin" +mode = "mainnet" +peer_host = "bitcoin.blockstack.com" +username = "blockstack" +password = "blockstacksystem" +rpc_port = 8332 +peer_port = 8333 + +[[events_observer]] +endpoint = "127.0.0.1:3700" +retry_count = 255 +events_keys = ["*"] + +[connection_options] +read_only_call_limit_write_length = 15000000 +read_only_call_limit_read_length = 100000000 +read_only_call_limit_write_count = 7750 +read_only_call_limit_read_count = 7750 +read_only_call_limit_runtime = 5000000000 \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..897eb5e --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,64 @@ +version: '3.8' +services: + stacks-blockchain-postgres: + restart: always + image: postgres:15.3-alpine + container_name: stacks_postgres + command: postgres -c 'max_connections=1000' + shm_size: 2gb + network_mode: host + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: 6nyi11z9tWbXJDYsVESHQfNVo + POSTGRES_DB: alexgo + volumes: + - ./postgresql:/var/lib/postgresql + stacks-blockchain-api: + restart: always + image: bestmike007/stacks-blockchain-api:7.1.10 + container_name: stacks_api + command: sh -c "/wait && node ./lib/index.js" + network_mode: host + environment: + WAIT_HOSTS: '127.0.0.1:5432' + PG_HOST: 127.0.0.1 + PG_PORT: 5432 + PG_USER: alexgo + PG_PASSWORD: 6nyi11z9tWbXJDYsVESHQfNVo + PG_DATABASE: alexgo + STACKS_CORE_EVENT_PORT: '3700' + STACKS_CORE_EVENT_HOST: http://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: 127.0.0.1 + STACKS_CORE_RPC_PORT: '20443' + STACKS_CHAIN_ID: '0x00000001' + STACKS_API_ENABLE_FT_METADATA: 1 + STACKS_API_ENABLE_NFT_METADATA: 1 + NODE_ENV: production + volumes: + - $PWD/wait:/wait + stacks-blockchain: + restart: always + image: blockstack/stacks-blockchain:2.3.0.0.2 + container_name: stacks_node + environment: + WAIT_BEFORE: 3 + WAIT_AFTER: 3 + WAIT_HOSTS: "stacks-blockchain-api-event:3700" + NOP_BLOCKSTACK_DEBUG: 0 + XBLOCKSTACK_DEBUG: 0 + RUST_BACKTRACE: 0 + STACKS_CHAIN_ID: "0x00000001" + V2_POX_MIN_AMOUNT_USTX: 90000000260 + STACKS_CORE_RPC_HOST: 127.0.0.1 + STACKS_CORE_RPC_PORT: 20443 + STACKS_API_ENABLE_FT_METADATA: 1 + STACKS_API_ENABLE_NFT_METADATA: 1 + network_mode: host + volumes: + - ./Stacks.toml:/srv/Stacks.toml:ro + - ./stacks-node:/srv/stacks-node + - ./wait:/usr/bin/wait:ro + command: sh -c "/wait && stacks-node start --config=/srv/Stacks.toml" diff --git a/restore-archive-node.sh b/restore-archive-node.sh new file mode 100755 index 0000000..d6369fb --- /dev/null +++ b/restore-archive-node.sh @@ -0,0 +1,13 @@ +#!/bin/bash +set -e +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" +cd $DIR + +if [ -e stacks-node ]; then + echo "The stacks node is already running, this is for fresh start" + echo "If you need to reset and restore again, please stop daemons and remove ./stacks-node" + exit 0 +fi + +curl https://archive.hiro.so/mainnet/stacks-blockchain/mainnet-stacks-blockchain-latest.tar.gz | tar -zxv +mv mainnet stacks-node diff --git a/restore-archive-pg.sh b/restore-archive-pg.sh new file mode 100755 index 0000000..b565fc5 --- /dev/null +++ b/restore-archive-pg.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -e +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" +cd $DIR + +if [ -e postresql ]; then + echo "The stacks postgres is already running, this is for fresh start" + echo "If you need to reset and restore again, please stop postgres and remove ./postresql" + exit 0 +fi + +mkdir postgresql +curl -o postgresql/latest.dump https://archive.hiro.so/mainnet/stacks-blockchain-api-pg/stacks-blockchain-api-pg-15-7.1.10-latest.dump + +docker-compose up -d stacks-blockchain-postgres +docker exec -it stacks_postgres pg_restore -j 8 -Upostgres -v -C -d alexgo /var/lib/postgresql/latest.dump diff --git a/setup.sh b/setup.sh new file mode 100755 index 0000000..cf91d53 --- /dev/null +++ b/setup.sh @@ -0,0 +1,42 @@ +#!/bin/bash +set -e +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" +cd $DIR + +export DEBIAN_FRONTEND=noninteractive +apt-get update && apt-get dist-upgrade -y && apt-get autoremove -y && apt-get autoclean + +apt-get install -y dstat vim iftop direnv zip unzip ca-certificates curl git gnupg lsb-release dirmngr gpg gawk jq tmux screen traceroute dnsutils iftop ufw + +echo "Port 2280" >> /etc/ssh/sshd_config +echo "UseDNS no" >> /etc/ssh/sshd_config +systemctl restart ssh +ufw allow 20443/tcp +ufw allow 20444/tcp +ufw limit 2280 +echo y | ufw enable + +# docker +if [ ! -e /usr/local/bin/docker-compose ]; then + mkdir -m 0755 -p /etc/apt/keyrings + curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg + echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \ + $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null + apt-get update && apt-get install -y docker-ce + echo '{ + "log-driver": "json-file", + "log-opts": { + "max-size": "1024m" + }, + "live-restore": true + }' > /etc/docker/daemon.json + systemctl enable --now docker + systemctl restart docker + curl -SL https://github.com/docker/compose/releases/download/v2.18.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose + chmod +x /usr/local/bin/docker-compose +fi + +if [ ! -e "./wait" ]; then + wget -qO ./wait https://github.com/ufoscout/docker-compose-wait/releases/download/2.12.0/wait + chmod +x ./wait +fi diff --git a/start.sh b/start.sh new file mode 100755 index 0000000..4e61c6e --- /dev/null +++ b/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash +set -e +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" +cd $DIR + +docker-compose up -d diff --git a/stop.sh b/stop.sh new file mode 100755 index 0000000..b90a179 --- /dev/null +++ b/stop.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -e +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" +cd $DIR + +docker-compose down stacks-blockchain +docker-compose down stacks-blockchain-api +docker-compose down postgres