From 712730933d631ad4307f54bbaa5d69b05f985046 Mon Sep 17 00:00:00 2001 From: kenshin-samourai Date: Wed, 25 Dec 2019 14:46:48 +0100 Subject: [PATCH] add an optional container running a local instance of btc-rpc-explorer --- docker/my-dojo/.env | 1 + docker/my-dojo/conf/docker-explorer.conf.tpl | 16 +++++++++ docker/my-dojo/docker-compose.yaml | 2 ++ docker/my-dojo/dojo.sh | 30 +++++++++++++++-- docker/my-dojo/explorer/Dockerfile | 33 +++++++++++++++++++ docker/my-dojo/explorer/restart.sh | 21 ++++++++++++ docker/my-dojo/install/install-scripts.sh | 18 +++++++++- docker/my-dojo/install/upgrade-scripts.sh | 16 +++++++++ docker/my-dojo/nginx/Dockerfile | 20 +++++------ docker/my-dojo/nginx/explorer.conf | 13 ++++++++ .../my-dojo/overrides/explorer.install.yaml | 28 ++++++++++++++++ docker/my-dojo/tor/restart.sh | 6 ++++ 12 files changed, 191 insertions(+), 13 deletions(-) create mode 100644 docker/my-dojo/conf/docker-explorer.conf.tpl create mode 100644 docker/my-dojo/explorer/Dockerfile create mode 100644 docker/my-dojo/explorer/restart.sh create mode 100644 docker/my-dojo/nginx/explorer.conf create mode 100644 docker/my-dojo/overrides/explorer.install.yaml diff --git a/docker/my-dojo/.env b/docker/my-dojo/.env index 388973b..9e16e75 100644 --- a/docker/my-dojo/.env +++ b/docker/my-dojo/.env @@ -16,6 +16,7 @@ DOJO_BITCOIND_VERSION_TAG=1.3.0 DOJO_NODEJS_VERSION_TAG=1.3.0 DOJO_NGINX_VERSION_TAG=1.3.0 DOJO_TOR_VERSION_TAG=1.2.0 +DOJO_EXPLORER_VERSION_TAG=1.0.0 ######################################### diff --git a/docker/my-dojo/conf/docker-explorer.conf.tpl b/docker/my-dojo/conf/docker-explorer.conf.tpl new file mode 100644 index 0000000..987205a --- /dev/null +++ b/docker/my-dojo/conf/docker-explorer.conf.tpl @@ -0,0 +1,16 @@ +######################################### +# CONFIGURATION OF EXPLORER CONTAINER +######################################### + + +# Install and run a block explorer inside Dojo +# Value: on | off +EXPLORER_INSTALL=off + + +# Password required for accessing the block explorer +# (login can be anything) +# Keep this password secret! +# Provide a value with a high entropy! +# Type: alphanumeric +EXPLORER_KEY=myExplorerPassword diff --git a/docker/my-dojo/docker-compose.yaml b/docker/my-dojo/docker-compose.yaml index eb2ef0e..998b1ce 100644 --- a/docker/my-dojo/docker-compose.yaml +++ b/docker/my-dojo/docker-compose.yaml @@ -57,6 +57,7 @@ services: command: "/wait-for node:8080 --timeout=720 -- nginx" expose: - "80" + - "9080" volumes: - data-nginx:/data depends_on: @@ -74,6 +75,7 @@ services: context: ./tor env_file: - ./.env + - ./conf/docker-explorer.conf - ./conf/docker-tor.conf restart: on-failure command: /restart.sh diff --git a/docker/my-dojo/dojo.sh b/docker/my-dojo/dojo.sh index 54e9f6d..fd17f41 100755 --- a/docker/my-dojo/dojo.sh +++ b/docker/my-dojo/dojo.sh @@ -15,6 +15,7 @@ source_file() { # Source config files source_file "$DIR/conf/docker-bitcoind.conf" +source_file "$DIR/conf/docker-explorer.conf" source_file "$DIR/conf/docker-common.conf" source_file "$DIR/.env" @@ -33,6 +34,10 @@ select_yaml_files() { fi fi + if [ "$EXPLORER_INSTALL" == "on" ]; then + yamlFiles="$yamlFiles -f $DIR/overrides/explorer.install.yaml" + fi + # Return yamlFiles echo "$yamlFiles" } @@ -113,6 +118,7 @@ uninstall() { docker image rm samouraiwallet/dojo-db:"$DOJO_DB_VERSION_TAG" docker image rm samouraiwallet/dojo-bitcoind:"$DOJO_BITCOIND_VERSION_TAG" + docker image rm samouraiwallet/dojo-explorer:"$DOJO_EXPLORER_VERSION_TAG" docker image rm samouraiwallet/dojo-nodejs:"$DOJO_NODEJS_VERSION_TAG" docker image rm samouraiwallet/dojo-nginx:"$DOJO_NGINX_VERSION_TAG" docker image rm samouraiwallet/dojo-tor:"$DOJO_TOR_VERSION_TAG" @@ -135,6 +141,7 @@ clean() { docker image prune del_images_for samouraiwallet/dojo-db "$DOJO_DB_VERSION_TAG" del_images_for samouraiwallet/dojo-bitcoind "$DOJO_BITCOIND_VERSION_TAG" + del_images_for samouraiwallet/dojo-explorer "$DOJO_EXPLORER_VERSION_TAG" del_images_for samouraiwallet/dojo-nodejs "$DOJO_NODEJS_VERSION_TAG" del_images_for samouraiwallet/dojo-nginx "$DOJO_NGINX_VERSION_TAG" del_images_for samouraiwallet/dojo-tor "$DOJO_TOR_VERSION_TAG" @@ -170,9 +177,13 @@ upgrade() { # Display the onion address onion() { + if [ "$EXPLORER_INSTALL" == "on" ]; then + V3_ADDR_EXPLORER=$( docker exec -it tor cat /var/lib/tor/hsv3explorer/hostname ) + echo "Explorer hidden service address (v3) = $V3_ADDR_EXPLORER" + fi + V2_ADDR=$( docker exec -it tor cat /var/lib/tor/hsv2dojo/hostname ) V3_ADDR=$( docker exec -it tor cat /var/lib/tor/hsv3dojo/hostname ) - echo "API hidden service address (v3) = $V3_ADDR" echo "API hidden service address (v2) = $V2_ADDR" @@ -196,6 +207,14 @@ logs_node() { fi } +logs_explorer() { + if [ $3 -eq 0 ]; then + docker exec -ti explorer tail -f /data/logs/$1-$2.log + else + docker exec -ti explorer tail -n $3 /data/logs/$1-$2.log + fi +} + logs() { source_file "$DIR/conf/docker-bitcoind.conf" source_file "$DIR/conf/docker-common.conf" @@ -222,12 +241,18 @@ logs() { api | pushtx | pushtx-orchest | tracker ) logs_node $1 $2 $3 ;; + explorer ) + logs_explorer $1 $2 $3 + ;; * ) yamlFiles=$(select_yaml_files) services="nginx node tor db" if [ "$BITCOIND_INSTALL" == "on" ]; then services="$services bitcoind" fi + if [ "$EXPLORER_INSTALL" == "on" ]; then + services="$services explorer" + fi eval "docker-compose $yamlFiles logs --tail=0 --follow $services" ;; esac @@ -259,8 +284,9 @@ help() { echo " dojo.sh logs tracker : display the logs of the Tracker (nodejs)" echo " dojo.sh logs pushtx : display the logs of the pushTx API (nodejs)" echo " dojo.sh logs pushtx-orchest : display the logs of the pushTx Orchestrator (nodejs)" + echo " dojo.sh logs explorer : display the logs of the Explorer" echo " " - echo " Available options (only available for api, tracker, pushtx and pushtx-orchest modules):" + echo " Available options (only available for api, tracker, pushtx, pushtx-orchest and explorer modules):" echo " -d [VALUE] : select the type of log to be displayed." echo " VALUE can be output (default) or error." echo " -n [VALUE] : display the last VALUE lines" diff --git a/docker/my-dojo/explorer/Dockerfile b/docker/my-dojo/explorer/Dockerfile new file mode 100644 index 0000000..081460a --- /dev/null +++ b/docker/my-dojo/explorer/Dockerfile @@ -0,0 +1,33 @@ +FROM node:8.12.0-stretch + +ENV LOGS_DIR /data/logs +ENV APP_DIR /home/node/app + +ENV EXPLORER_URL https://github.com/janoside/btc-rpc-explorer/archive +ENV EXPLORER_VERSION 1.1.5 + + +# Create logs and apps directory +RUN mkdir -p "$LOGS_DIR" && \ + chown -R node:node "$LOGS_DIR" && \ + mkdir "$APP_DIR" + +# Download the source code and install it +RUN set -ex && \ + wget -qO explorer.tar.gz "$EXPLORER_URL/v$EXPLORER_VERSION.tar.gz" && \ + tar -xzvf explorer.tar.gz -C "$APP_DIR/" --strip-components 1 && \ + rm explorer.tar.gz && \ + cd "$APP_DIR" && \ + npm install --only=prod && \ + chown -R node:node "$APP_DIR" + +# Copy restart script +COPY ./restart.sh "$APP_DIR/restart.sh" + +RUN chown node:node "$APP_DIR/restart.sh" && \ + chmod u+x "$APP_DIR/restart.sh" && \ + chmod g+x "$APP_DIR/restart.sh" + +EXPOSE 3002 + +USER node \ No newline at end of file diff --git a/docker/my-dojo/explorer/restart.sh b/docker/my-dojo/explorer/restart.sh new file mode 100644 index 0000000..4da82fa --- /dev/null +++ b/docker/my-dojo/explorer/restart.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +cd /home/node/app + +explorer_options=( + --port 3002 + --host 172.28.1.7 + --basic-auth-password "$EXPLORER_KEY" + --coin BTC + --bitcoind-host "$BITCOIND_IP" + --bitcoind-port "$BITCOIND_RPC_PORT" + --bitcoind-user "$BITCOIND_RPC_USER" + --bitcoind-pass "$BITCOIND_RPC_PASSWORD" + --no-rates + --privacy-mode +) + +# Blacklist all functions provided by the RPC API +explorer_options+=(--rpc-blacklist "addnode,analyzepsbt,clearbanned,combinepsbt,combinerawtransaction,converttopsbt,createmultisig,createpsbt,createrawtransaction,decodepsbt,decoderawtransaction,decodescript,deriveaddresses,disconnectnode,echo,echojson,estimaterawfee,estimatesmartfee,finalizepsbt,generatetoaddress,generatetodescriptor,getaddednodeinfo,getbestblockhash,getblock,getblockchaininfo,getblockcount,getblockfilter,getblockhash,getblockheader,getblockstats,getblocktemplate,getchaintips,getchaintxstats,getconnectioncount,getdescriptorinfo,getdifficulty,getmemoryinfo,getmempoolancestors,getmempooldescendants,getmempoolentry,getmempoolinfo,getmininginfo,getnettotals,getnetworkhashps,getnetworkinfo,getnodeaddresses,getpeerinfo,getrawmempool,getrawtransaction,getrpcinfo,gettxout,gettxoutproof,gettxoutsetinfo,help,invalidateblock,joinpsbts,listbanned,logging,ping,preciousblock,prioritisetransaction,pruneblockchain,reconsiderblock,savemempool,scantxoutset,sendrawtransaction,setban,setmocktime,setnetworkactive,signmessagewithprivkey,signrawtransactionwithkey,stop,submitblock,submitheader,syncwithvalidationinterfacequeue,testmempoolaccept,uptime,utxoupdatepsbt,validateaddress,verifychain,verifymessage,verifytxoutproof,waitforblock,waitforblockheight,waitfornewblock") + +node ./bin/cli.js "${explorer_options[@]}" > /data/logs/explorer-error.log 2> /data/logs/explorer-output.log diff --git a/docker/my-dojo/install/install-scripts.sh b/docker/my-dojo/install/install-scripts.sh index 88b6bcd..79b2142 100755 --- a/docker/my-dojo/install/install-scripts.sh +++ b/docker/my-dojo/install/install-scripts.sh @@ -6,6 +6,12 @@ else source ./conf/docker-bitcoind.conf.tpl fi +if [ -f ./conf/docker-explorer.conf ]; then + source ./conf/docker-explorer.conf +else + source ./conf/docker-explorer.conf.tpl +fi + if [ -f ./conf/docker-common.conf ]; then source ./conf/docker-common.conf else @@ -49,10 +55,20 @@ init_config_files() { cp ./conf/docker-node.conf.tpl ./conf/docker-node.conf echo "Initialized docker-node.conf" + cp ./conf/docker-explorer.conf.tpl ./conf/docker-explorer.conf + echo "Initialized docker-explorer.conf" + cp ./conf/docker-tor.conf.tpl ./conf/docker-tor.conf echo "Initialized docker-tor.conf" - # Initialize config files for nginx and the maintenance tool + # Initialize config files for nginx and the maintenance tool + if [ "$EXPLORER_INSTALL" == "on" ]; then + cp ./nginx/explorer.conf ./nginx/dojo-explorer.conf + else + cp /dev/null ./nginx/dojo-explorer.conf + fi + echo "Initialized dojo-explorer.conf (nginx)" + if [ "$COMMON_BTC_NETWORK" == "testnet" ]; then cp ./nginx/testnet.conf ./nginx/dojo.conf echo "Initialized dojo.conf (nginx)" diff --git a/docker/my-dojo/install/upgrade-scripts.sh b/docker/my-dojo/install/upgrade-scripts.sh index 9c4f44f..68554aa 100755 --- a/docker/my-dojo/install/upgrade-scripts.sh +++ b/docker/my-dojo/install/upgrade-scripts.sh @@ -6,6 +6,12 @@ else source ./conf/docker-common.conf.tpl fi +if [ -f ./conf/docker-explorer.conf ]; then + source ./conf/docker-explorer.conf +else + source ./conf/docker-explorer.conf.tpl +fi + source ./conf/docker-bitcoind.conf # Confirm upgrade operation @@ -45,10 +51,20 @@ update_config_files() { update_config_file ./conf/docker-node.conf ./conf/docker-node.conf.tpl echo "Initialized docker-node.conf" + update_config_file ./conf/docker-explorer.conf ./conf/docker-explorer.conf.tpl + echo "Initialized docker-explorer.conf" + update_config_file ./conf/docker-tor.conf ./conf/docker-tor.conf.tpl echo "Initialized docker-tor.conf" # Initialize config files for nginx and the maintenance tool + if [ "$EXPLORER_INSTALL" == "on" ]; then + cp ./nginx/explorer.conf ./nginx/dojo-explorer.conf + else + cp /dev/null ./nginx/dojo-explorer.conf + fi + echo "Initialized dojo-explorer.conf (nginx)" + if [ "$COMMON_BTC_NETWORK" == "testnet" ]; then cp ./nginx/testnet.conf ./nginx/dojo.conf echo "Initialized dojo.conf (nginx)" diff --git a/docker/my-dojo/nginx/Dockerfile b/docker/my-dojo/nginx/Dockerfile index 4eef0b5..93db47a 100644 --- a/docker/my-dojo/nginx/Dockerfile +++ b/docker/my-dojo/nginx/Dockerfile @@ -1,18 +1,18 @@ -FROM nginx:1.15.10-alpine +FROM nginx:1.15.10-alpine # Create data directory -ENV LOGS_DIR /data/logs +ENV LOGS_DIR /data/logs -RUN mkdir -p "$LOGS_DIR" && \ - chown -R nginx:nginx "$LOGS_DIR" +RUN mkdir -p "$LOGS_DIR" && \ + chown -R nginx:nginx "$LOGS_DIR" # Copy configuration files -COPY ./nginx.conf /etc/nginx/nginx.conf - -COPY ./dojo.conf /etc/nginx/sites-enabled/dojo.conf +COPY ./nginx.conf /etc/nginx/nginx.conf +COPY ./dojo.conf /etc/nginx/sites-enabled/dojo.conf +COPY ./dojo-explorer.conf /etc/nginx/sites-enabled/dojo-explorer.conf # Copy wait-for script -COPY ./wait-for /wait-for +COPY ./wait-for /wait-for -RUN chmod u+x /wait-for && \ - chmod g+x /wait-for \ No newline at end of file +RUN chmod u+x /wait-for && \ + chmod g+x /wait-for \ No newline at end of file diff --git a/docker/my-dojo/nginx/explorer.conf b/docker/my-dojo/nginx/explorer.conf new file mode 100644 index 0000000..ee0e85c --- /dev/null +++ b/docker/my-dojo/nginx/explorer.conf @@ -0,0 +1,13 @@ +server { + listen 9080; + server_name _; + + location / { + proxy_pass http://explorer:3002; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_cache_bypass $http_upgrade; + } +} diff --git a/docker/my-dojo/overrides/explorer.install.yaml b/docker/my-dojo/overrides/explorer.install.yaml new file mode 100644 index 0000000..5c3d3d1 --- /dev/null +++ b/docker/my-dojo/overrides/explorer.install.yaml @@ -0,0 +1,28 @@ +version: "3.2" + +services: + explorer: + image: "samouraiwallet/dojo-explorer:${DOJO_EXPLORER_VERSION_TAG}" + container_name: explorer + build: + context: ./explorer + env_file: + - ./.env + - ./conf/docker-bitcoind.conf + - ./conf/docker-explorer.conf + restart: on-failure + command: "/home/node/app/restart.sh" + expose: + - "3002" + volumes: + - data-explorer:/data/logs + networks: + dojonet: + ipv4_address: 172.28.1.7 + + node: + depends_on: + - explorer + +volumes: + data-explorer: diff --git a/docker/my-dojo/tor/restart.sh b/docker/my-dojo/tor/restart.sh index c3b29bb..3331415 100644 --- a/docker/my-dojo/tor/restart.sh +++ b/docker/my-dojo/tor/restart.sh @@ -25,6 +25,12 @@ tor_options=( --HiddenServiceDirGroupReadable 1 ) +if [ "$EXPLORER_INSTALL" == "on" ]; then + tor_options+=(--HiddenServiceDir /var/lib/tor/hsv3explorer) + tor_options+=(--HiddenServiceVersion 3) + tor_options+=(--HiddenServicePort "80 172.29.1.3:9080") +fi + if [ "$TOR_USE_BRIDGES" == "on" ]; then tor_options+=(--ClientTransportPlugin "obfs4 exec /usr/local/bin/obfs4proxy") tor_options+=(--UseBridges 1)