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 <dvandermaden0@berkeley.edu>

* [rosetta] Init docker infra files

Signed-off-by: Daniel Van Der Maden <dvandermaden0@berkeley.edu>

* [rosetta] Add Dockerfile run script & update README.md

Signed-off-by: Daniel Van Der Maden <dvandermaden0@berkeley.edu>

* [rosetta] Clarify docker usage in infra README.md

Signed-off-by: Daniel Van Der Maden <dvandermaden0@berkeley.edu>
pull/3391/head
Daniel Van Der Maden 4 years ago committed by GitHub
parent 4ce64b1387
commit 6ce8aeac3d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      node/node.go
  2. 29
      rosetta/infra/Dockerfile
  3. 127
      rosetta/infra/README.md
  4. 11
      rosetta/infra/run.sh

@ -904,6 +904,7 @@ func New(
node.BeaconBlockChannel = make(chan *types.Block) node.BeaconBlockChannel = make(chan *types.Block)
txPoolConfig := core.DefaultTxPoolConfig txPoolConfig := core.DefaultTxPoolConfig
txPoolConfig.Blacklist = blacklist 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.TxPool = core.NewTxPool(txPoolConfig, node.Blockchain().Config(), blockchain, node.TransactionErrorSink)
node.CxPool = core.NewCxPool(core.CxPoolSize) node.CxPool = core.NewCxPool(core.CxPoolSize)
node.Worker = worker.New(node.Blockchain().Config(), blockchain, chain.Engine) node.Worker = worker.New(node.Blockchain().Config(), blockchain, chain.Engine)

@ -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"]

@ -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`

@ -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[@]}"
Loading…
Cancel
Save