From 6ce8aeac3d448d0bc13e5f1286ce97856de42f1f Mon Sep 17 00:00:00 2001 From: Daniel Van Der Maden Date: Mon, 12 Oct 2020 23:11:07 -0700 Subject: [PATCH] Rosetta Dockerfile (Stage 4 of Node API Overhaul) (#3385) * [node] Add txpool .rlp file based on cmd datadir Signed-off-by: Daniel Van Der Maden * [rosetta] Init docker infra files Signed-off-by: Daniel Van Der Maden * [rosetta] Add Dockerfile run script & update README.md Signed-off-by: Daniel Van Der Maden * [rosetta] Clarify docker usage in infra README.md Signed-off-by: Daniel Van Der Maden --- node/node.go | 1 + rosetta/infra/Dockerfile | 29 +++++++++ rosetta/infra/README.md | 127 +++++++++++++++++++++++++++++++++++++++ rosetta/infra/run.sh | 11 ++++ 4 files changed, 168 insertions(+) create mode 100644 rosetta/infra/Dockerfile create mode 100644 rosetta/infra/README.md create mode 100644 rosetta/infra/run.sh diff --git a/node/node.go b/node/node.go index 372774682..1a1abe72c 100644 --- a/node/node.go +++ b/node/node.go @@ -904,6 +904,7 @@ func New( node.BeaconBlockChannel = make(chan *types.Block) txPoolConfig := core.DefaultTxPoolConfig txPoolConfig.Blacklist = blacklist + txPoolConfig.Journal = fmt.Sprintf("%v/%v", node.NodeConfig.DBDir, txPoolConfig.Journal) node.TxPool = core.NewTxPool(txPoolConfig, node.Blockchain().Config(), blockchain, node.TransactionErrorSink) node.CxPool = core.NewCxPool(core.CxPoolSize) node.Worker = worker.New(node.Blockchain().Config(), blockchain, chain.Engine) diff --git a/rosetta/infra/Dockerfile b/rosetta/infra/Dockerfile new file mode 100644 index 000000000..bb0257718 --- /dev/null +++ b/rosetta/infra/Dockerfile @@ -0,0 +1,29 @@ +FROM golang:1.14 + +RUN apt update -y && apt upgrade -y +RUN apt install libgmp-dev libssl-dev curl git -y + +ENV GOPATH=/root/go +ENV GO111MODULE=on +ENV HMY_PATH=${GOPATH}/src/github.com/harmony-one +RUN mkdir -p $HMY_PATH + +WORKDIR $HMY_PATH + +RUN git clone https://github.com/harmony-one/harmony.git +RUN git clone https://github.com/harmony-one/bls.git +RUN git clone https://github.com/harmony-one/mcl.git + +WORKDIR $HMY_PATH/harmony + +RUN make linux_static +RUN cp ./bin/harmony /root && chmod +x /root/harmony + +WORKDIR $GOPATH + +RUN rm -rf * + +WORKDIR /root + +COPY run.sh run.sh +ENTRYPOINT ["/bin/bash","/root/run.sh"] diff --git a/rosetta/infra/README.md b/rosetta/infra/README.md new file mode 100644 index 000000000..3632f4500 --- /dev/null +++ b/rosetta/infra/README.md @@ -0,0 +1,127 @@ +# Docker deployment of a Rosetta enabled Harmony node + +## Docker Image +You can choose to build the docker image using the included Dockerfile with the following command: +```bash +docker build -t harmony-rosetta . +``` + +Or you can download/pull the image from dockerhub with the following command: +```bash +docker pull harmony-rosetta:latest +``` + +## Starting the node +You can start the node with the following command: +```bash +docker run -d -p 9700:9700 -v "$(pwd)/data:/root/data" harmony-rosetta --run.shard=0 +``` +> This command will create the container of the harmony node on shard 0 in the detached mode, +> binding port 9700 (the rosetta port) on the container to the host and mounting the shared +> `./data` directory on the host to `/root/data` on the container. Note that the container +> uses `/root/data` for all data storage (this is where the `harmony_db_*` directories will be stored). + +You can view your container with the following command: +```bash +docker ps +``` + +You can ensure that your node is running with the following curl command: +```bash +curl -X POST --data '{ +"network_identifier": { + "blockchain": "Harmony", + "network": "Mainnet", + "sub_network_identifier": { + "network": "shard 0", + "metadata": { + "is_beacon": true + } + } +}}' http://localhost:9700/network/status +``` + +Once can start the node in the offline mode with the following command: +```bash +docker run -d -p 9700:9700 -v "$(pwd)/data:/root/data" harmony-rosetta --run.shard=0 --run.offline +``` +> The offline mode implies that the node will not connect to any p2p peer or sync. + + +## Stopping the node +First get your `CONTAINER ID` using the following command: +```bash +docker ps +``` +> Note that if you do not see your node in the list, then your node is not running. +> You can verify this with the `docker ps -a` command. + +Once you have your `CONTAINER ID`, you can stop it with the following command: +```bash +docker stop [CONTAINER ID] +``` + +## Details + +**Note that all the arguments provided when running the docker img are immediately forwarded to the harmony node binary.** +> Note that the following args are **appended** to the provided arg when running the image: +> `--http.ip "0.0.0.0" --ws.ip "0.0.0.0" --http.rosetta --node_type "explorer" --datadir "./data" --log.dir "./data/logs"`. +> This effectively makes them args that you cannot change. + +### Running the node on testnet +All the args on the image run are forwarded to the harmony node binary. Therefore, you can simply add `-n testnet` to +run the node for testnet. For example: +```bash +docker run -d -p 9700:9700 -v "$(pwd)/data:/root/data" harmony-rosetta --run.shard=0 -n testnet +``` + +### Running the node with the http RPC capabilities +Similar to running a node on testnet, once can simply add `--http` to enable the rpc server. Then you have to forward +the host port to the container's rpc server port. +```bash +docker run -d -p 9700:9700 -p 9500:9500 -v "$(pwd)/data:/root/data" harmony-rosetta --run.shard=0 -n testnet --http +``` + +### Running the node with the web socket RPC capabilities +Similar to running a node on testnet, once can simply add `--ws` to enable the rpc server. Then you have to forward +the host port to the container's rpc server port. +```bash +docker run -d -p 9700:9700 -p 9800:9900 -v "$(pwd)/data:/root/data" harmony-rosetta --run.shard=0 -n testnet --ws +``` + +### Running the node in non-archival mode +One can append `--run.archive=false` to the docker run command to run the node in non-archival mode. For example: +```bash +docker run -d -p 9700:9700 -v "$(pwd)/data:/root/data" harmony-rosetta --run.shard=0 -n testnet --run.archive=false +``` + +### Running a node with a rcloned DB +Note that all node data will be stored in the `/root/data` directory within the container. Therefore, you can rclone +the `harmony_db_*` directory to some directory (i.e: `./data`) and mount the volume on the docker run. +This way, the node will use DB in the volume that is shared between the container and host. For example: +```bash +docker run -d -p 9700:9700 -v "$(pwd)/data:/root/data" harmony-rosetta --run.shard=0 +``` + +Note that the directory structure for `/root/data` (== `./data`) should look something like: +``` +. +├── explorer_storage_127.0.0.1_9000 +├── harmony_db_0 +├── harmony_db_1 +├── logs +│ ├── node_execution.log +│ └── zerolog-harmony.log +└── transactions.rlp +``` + +### Inspecting Logs +If you mount `./data` on the host to `/root/data` in the container, you van view the harmony node logs at +`./data/logs/` on your host machine. + +### View rosetta request logs +You can view all the rosetta endpoint requests with the following command: +```bash +docker logs [CONTAINER ID] +``` +> The `[CONTAINER ID]` can be found with this command: `docker ps` diff --git a/rosetta/infra/run.sh b/rosetta/infra/run.sh new file mode 100644 index 000000000..5da5e2069 --- /dev/null +++ b/rosetta/infra/run.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +set -e + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +DATA="$DIR/data" +LOGS="$DATA/logs" +BASE_ARGS=(--http.ip "0.0.0.0" --ws.ip "0.0.0.0" --http.rosetta --node_type "explorer" --datadir "$DATA" --log.dir "$LOGS") + +mkdir -p "$LOGS" +echo -e NODE ARGS: \" "$@" "${BASE_ARGS[@]}" \" +"$DIR/harmony" "$@" "${BASE_ARGS[@]}"