Browse Source

add new optinoal whirlpool container

use-env-var-docker
kenshin-samourai 5 years ago
parent
commit
ab7b20aaec
  1. 1
      docker/my-dojo/.env
  2. 8
      docker/my-dojo/conf/docker-whirlpool.conf.tpl
  3. 29
      docker/my-dojo/dojo.sh
  4. 3
      docker/my-dojo/install/install-scripts.sh
  5. 3
      docker/my-dojo/install/upgrade-scripts.sh
  6. 27
      docker/my-dojo/overrides/whirlpool.install.yaml
  7. 85
      docker/my-dojo/whirlpool/Dockerfile
  8. 25
      docker/my-dojo/whirlpool/restart.sh
  9. 178
      docker/my-dojo/whirlpool/wait-for-it.sh

1
docker/my-dojo/.env

@ -18,6 +18,7 @@ DOJO_NGINX_VERSION_TAG=1.5.0
DOJO_TOR_VERSION_TAG=1.4.0
DOJO_EXPLORER_VERSION_TAG=1.3.0
DOJO_INDEXER_VERSION_TAG=1.0.0
DOJO_WHIRLPOOL_VERSION_TAG=1.0.0
#########################################

8
docker/my-dojo/conf/docker-whirlpool.conf.tpl

@ -0,0 +1,8 @@
#########################################
# CONFIGURATION OF WHIRLPOOL CONTAINER
#########################################
# Install and run an instance of whirlpool-cli inside Docker
# Value: on | off
WHIRLPOOL_INSTALL=off

29
docker/my-dojo/dojo.sh

@ -14,6 +14,7 @@ source_file() {
}
# Source config files
source_file "$DIR/conf/docker-whirlpool.conf"
source_file "$DIR/conf/docker-indexer.conf"
source_file "$DIR/conf/docker-bitcoind.conf"
source_file "$DIR/conf/docker-explorer.conf"
@ -43,6 +44,10 @@ select_yaml_files() {
yamlFiles="$yamlFiles -f $DIR/overrides/indexer.install.yaml"
fi
if [ "$WHIRLPOOL_INSTALL" == "on" ]; then
yamlFiles="$yamlFiles -f $DIR/overrides/whirlpool.install.yaml"
fi
# Return yamlFiles
echo "$yamlFiles"
}
@ -236,6 +241,7 @@ uninstall() {
docker image rm -f samouraiwallet/dojo-nginx:"$DOJO_NGINX_VERSION_TAG"
docker image rm -f samouraiwallet/dojo-tor:"$DOJO_TOR_VERSION_TAG"
docker image rm -f samouraiwallet/dojo-indexer:"$DOJO_INDEXER_VERSION_TAG"
docker image rm -f samouraiwallet/dojo-whirlpool:"$DOJO_WHIRLPOOL_VERSION_TAG"
docker volume prune -f
return 0
@ -264,6 +270,7 @@ clean() {
del_images_for samouraiwallet/dojo-nginx "$DOJO_NGINX_VERSION_TAG"
del_images_for samouraiwallet/dojo-tor "$DOJO_TOR_VERSION_TAG"
del_images_for samouraiwallet/dojo-indexer "$DOJO_INDEXER_VERSION_TAG"
del_images_for samouraiwallet/dojo-whirlpool "$DOJO_WHIRLPOOL_VERSION_TAG"
}
# Upgrade
@ -362,9 +369,18 @@ logs_explorer() {
fi
}
logs_whirlpool() {
if [ $3 -eq 0 ]; then
docker exec -ti whirlpool tail -f /home/whirlpool/.whirlpool-cli/whirlpool-output.log
else
docker exec -ti whirlpool tail -n $3 /home/whirlpool/.whirlpool-cli/whirlpool-output.log
fi
}
logs() {
source_file "$DIR/conf/docker-bitcoind.conf"
source_file "$DIR/conf/docker-indexer.conf"
source_file "$DIR/conf/docker-whirlpool.conf"
source_file "$DIR/conf/docker-common.conf"
case $1 in
@ -400,6 +416,13 @@ logs() {
explorer )
logs_explorer $1 $2 $3
;;
whirlpool )
if [ "$WHIRLPOOL_INSTALL" == "on" ]; then
logs_whirlpool $1 $2 $3
else
echo -e "Command not supported for your setup.\nCause: Your Dojo is not running a whirlpool client"
fi
;;
* )
yamlFiles=$(select_yaml_files)
services="nginx node tor db"
@ -412,6 +435,9 @@ logs() {
if [ "$INDEXER_INSTALL" == "on" ]; then
services="$services indexer"
fi
if [ "$WHIRLPOOL_INSTALL" == "on" ]; then
services="$services whirlpool"
fi
eval "docker-compose $yamlFiles logs --tail=0 --follow $services"
;;
esac
@ -448,8 +474,9 @@ help() {
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 " dojo.sh logs whirlpool : display the logs of the Whirlpool client"
echo " "
echo " Available options (only available for api, tracker, pushtx, pushtx-orchest and explorer modules):"
echo " Available options (only available for api, tracker, pushtx, pushtx-orchest, explorer and whirlpool 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"

3
docker/my-dojo/install/install-scripts.sh

@ -76,6 +76,9 @@ init_config_files() {
cp ./conf/docker-indexer.conf.tpl ./conf/docker-indexer.conf
echo "Initialized docker-indexer.conf"
cp ./conf/docker-whirlpool.conf.tpl ./conf/docker-whirlpool.conf
echo "Initialized docker-whirlpool.conf"
if [ "$EXPLORER_INSTALL" == "on" ]; then
cp ./nginx/explorer.conf ./nginx/dojo-explorer.conf
else

3
docker/my-dojo/install/upgrade-scripts.sh

@ -60,6 +60,9 @@ update_config_files() {
update_config_file ./conf/docker-indexer.conf ./conf/docker-indexer.conf.tpl
echo "Initialized docker-indexer.conf"
update_config_file ./conf/docker-whirlpool.conf ./conf/docker-whirlpool.conf.tpl
echo "Initialized docker-whirlpool.conf"
# Initialize config files for nginx and the maintenance tool
if [ "$EXPLORER_INSTALL" == "on" ]; then
cp ./nginx/explorer.conf ./nginx/dojo-explorer.conf

27
docker/my-dojo/overrides/whirlpool.install.yaml

@ -0,0 +1,27 @@
version: "3.2"
services:
whirlpool:
image: "samouraiwallet/dojo-whirlpool:${DOJO_WHIRLPOOL_VERSION_TAG}"
container_name: whirlpool
build:
context: ./whirlpool
env_file:
- ./.env
- ./conf/docker-common.conf
- ./conf/docker-node.conf
- ./conf/docker-whirlpool.conf
restart: always
command: "/wait-for-it.sh nginx:80 --timeout=720 --strict -- /restart.sh"
expose:
- "8899"
volumes:
- data-whirlpool:/home/whirlpool
depends_on:
- nginx
networks:
whirlnet:
ipv4_address: 172.30.1.8
volumes:
data-whirlpool:

85
docker/my-dojo/whirlpool/Dockerfile

@ -0,0 +1,85 @@
FROM debian:buster
ENV WHIRLPOOL_HOME /home/whirlpool
ENV WHIRLPOOL_DIR /usr/local/whirlpool-cli
# Install prerequisites
# Create group & user whirlpool
# Create .whirlpool-cli subdirectory of WHIRLPOOL_HOME
# Create /usr/local/src/whirlpool-cli directory
RUN set -ex && \
apt-get update && \
apt-get install -y libevent-dev zlib1g-dev libssl-dev gcc make automake ca-certificates autoconf musl-dev coreutils gpg wget default-jdk && \
addgroup --system -gid 1113 whirlpool && \
adduser --system --ingroup whirlpool -uid 1110 whirlpool && \
mkdir -p "$WHIRLPOOL_HOME/.whirlpool-cli" && \
chown -Rv whirlpool:whirlpool "$WHIRLPOOL_HOME" && \
chmod -R 750 "$WHIRLPOOL_HOME" && \
mkdir -p "$WHIRLPOOL_DIR"
# Install Tor
ENV WHIRLPOOL_TOR_URL https://archive.torproject.org/tor-package-archive
ENV WHIRLPOOL_TOR_VERSION 0.4.2.7
ENV WHIRLPOOL_TOR_GPG_KS_URI hkp://keyserver.ubuntu.com:80
ENV WHIRLPOOL_TOR_GPG_KEY1 0xEB5A896A28988BF5
ENV WHIRLPOOL_TOR_GPG_KEY2 0xC218525819F78451
ENV WHIRLPOOL_TOR_GPG_KEY3 0x21194EBB165733EA
ENV WHIRLPOOL_TOR_GPG_KEY4 0x6AFEE6D49E92B601
RUN set -ex && \
mkdir -p /usr/local/src/ && \
cd /usr/local/src && \
wget -qO "tor-$WHIRLPOOL_TOR_VERSION.tar.gz" "$WHIRLPOOL_TOR_URL/tor-$WHIRLPOOL_TOR_VERSION.tar.gz" && \
wget -qO "tor-$WHIRLPOOL_TOR_VERSION.tar.gz.asc" "$WHIRLPOOL_TOR_URL/tor-$WHIRLPOOL_TOR_VERSION.tar.gz.asc" && \
gpg --keyserver "$WHIRLPOOL_TOR_GPG_KS_URI" --recv-keys "$WHIRLPOOL_TOR_GPG_KEY1" && \
gpg --keyserver "$WHIRLPOOL_TOR_GPG_KS_URI" --recv-keys "$WHIRLPOOL_TOR_GPG_KEY2" && \
gpg --keyserver "$WHIRLPOOL_TOR_GPG_KS_URI" --recv-keys "$WHIRLPOOL_TOR_GPG_KEY3" && \
gpg --keyserver "$WHIRLPOOL_TOR_GPG_KS_URI" --recv-keys "$WHIRLPOOL_TOR_GPG_KEY4" && \
gpg --verify "tor-$WHIRLPOOL_TOR_VERSION.tar.gz.asc" && \
tar -xzvf "tor-$WHIRLPOOL_TOR_VERSION.tar.gz" -C /usr/local/src && \
cd "/usr/local/src/tor-$WHIRLPOOL_TOR_VERSION" && \
./configure \
--disable-asciidoc \
--sysconfdir=/etc \
--disable-unittests && \
make && make install && \
cd .. && \
rm -rf "tor-$WHIRLPOOL_TOR_VERSION" && \
rm "tor-$WHIRLPOOL_TOR_VERSION.tar.gz" && \
rm "tor-$WHIRLPOOL_TOR_VERSION.tar.gz.asc"
# Install whirlpool-cli
ENV WHIRLPOOL_URL https://github.com/Samourai-Wallet/whirlpool-client-cli/releases/download
ENV WHIRLPOOL_VERSION 0.10.5
ENV WHIRLPOOL_JAR "whirlpool-client-cli-$WHIRLPOOL_VERSION-run.jar"
ENV WHIRLPOOL_SHA256 94da0b3dc3da1a6292d7ffe74c0cba324a8b553437e66898e86312051ee1b84f
RUN set -ex && \
cd "$WHIRLPOOL_DIR" && \
echo "$WHIRLPOOL_SHA256 *$WHIRLPOOL_JAR" > WHIRLPOOL_CHECKSUMS && \
wget -qO "$WHIRLPOOL_JAR" "$WHIRLPOOL_URL/$WHIRLPOOL_VERSION/$WHIRLPOOL_JAR" && \
sha256sum -c WHIRLPOOL_CHECKSUMS 2>&1 | grep OK && \
mv "$WHIRLPOOL_JAR" whirlpool-client-cli-run.jar && \
chown -Rv whirlpool:whirlpool "$WHIRLPOOL_DIR" && \
chmod -R 750 "$WHIRLPOOL_DIR"
# Copy restart script
COPY ./restart.sh /restart.sh
RUN chown whirlpool:whirlpool /restart.sh && \
chmod u+x /restart.sh && \
chmod g+x /restart.sh
# Copy wait-for-it script
COPY ./wait-for-it.sh /wait-for-it.sh
RUN chown whirlpool:whirlpool /wait-for-it.sh && \
chmod u+x /wait-for-it.sh && \
chmod g+x /wait-for-it.sh
# Expose API port
EXPOSE 8899
# Switch to user whirlpool
USER whirlpool

25
docker/my-dojo/whirlpool/restart.sh

@ -0,0 +1,25 @@
#!/bin/bash
set -e
whirlpool_options=(
--listen
--cli.dojo.enabled=true
--cli.tor=true
--cli.torConfig.executable=/usr/local/bin/tor
--cli.torConfig.coordinator.enabled=true
--cli.torConfig.coordinator.onion=true
--cli.torConfig.backend.enabled=false
--cli.torConfig.backend.onion=false
--logging.file="/home/whirlpool/.whirlpool-cli/whirlpool-output.log"
)
if [ "$COMMON_BTC_NETWORK" == "testnet" ]; then
whirlpool_options+=(--cli.server="TESTNET")
whirlpool_options+=(--cli.dojo.url="http://172.30.1.3:80/test/v2/")
else
whirlpool_options+=(--cli.server="MAINNET")
whirlpool_options+=(--cli.dojo.url="http://172.30.1.3:80/v2/")
fi
cd /home/whirlpool/.whirlpool-cli
java -jar /usr/local/whirlpool-cli/whirlpool-client-cli-run.jar "${whirlpool_options[@]}"

178
docker/my-dojo/whirlpool/wait-for-it.sh

@ -0,0 +1,178 @@
#!/usr/bin/env bash
# Use this script to test if a given TCP host/port are available
WAITFORIT_cmdname=${0##*/}
echoerr() { if [[ $WAITFORIT_QUIET -ne 1 ]]; then echo "$@" 1>&2; fi }
usage()
{
cat << USAGE >&2
Usage:
$WAITFORIT_cmdname host:port [-s] [-t timeout] [-- command args]
-h HOST | --host=HOST Host or IP under test
-p PORT | --port=PORT TCP port under test
Alternatively, you specify the host and port as host:port
-s | --strict Only execute subcommand if the test succeeds
-q | --quiet Don't output any status messages
-t TIMEOUT | --timeout=TIMEOUT
Timeout in seconds, zero for no timeout
-- COMMAND ARGS Execute command with args after the test finishes
USAGE
exit 1
}
wait_for()
{
if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
echoerr "$WAITFORIT_cmdname: waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
else
echoerr "$WAITFORIT_cmdname: waiting for $WAITFORIT_HOST:$WAITFORIT_PORT without a timeout"
fi
WAITFORIT_start_ts=$(date +%s)
while :
do
if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then
nc -z $WAITFORIT_HOST $WAITFORIT_PORT
WAITFORIT_result=$?
else
(echo > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1
WAITFORIT_result=$?
fi
if [[ $WAITFORIT_result -eq 0 ]]; then
WAITFORIT_end_ts=$(date +%s)
echoerr "$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds"
break
fi
sleep 1
done
return $WAITFORIT_result
}
wait_for_wrapper()
{
# In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692
if [[ $WAITFORIT_QUIET -eq 1 ]]; then
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
else
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
fi
WAITFORIT_PID=$!
trap "kill -INT -$WAITFORIT_PID" INT
wait $WAITFORIT_PID
WAITFORIT_RESULT=$?
if [[ $WAITFORIT_RESULT -ne 0 ]]; then
echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
fi
return $WAITFORIT_RESULT
}
# process arguments
while [[ $# -gt 0 ]]
do
case "$1" in
*:* )
WAITFORIT_hostport=(${1//:/ })
WAITFORIT_HOST=${WAITFORIT_hostport[0]}
WAITFORIT_PORT=${WAITFORIT_hostport[1]}
shift 1
;;
--child)
WAITFORIT_CHILD=1
shift 1
;;
-q | --quiet)
WAITFORIT_QUIET=1
shift 1
;;
-s | --strict)
WAITFORIT_STRICT=1
shift 1
;;
-h)
WAITFORIT_HOST="$2"
if [[ $WAITFORIT_HOST == "" ]]; then break; fi
shift 2
;;
--host=*)
WAITFORIT_HOST="${1#*=}"
shift 1
;;
-p)
WAITFORIT_PORT="$2"
if [[ $WAITFORIT_PORT == "" ]]; then break; fi
shift 2
;;
--port=*)
WAITFORIT_PORT="${1#*=}"
shift 1
;;
-t)
WAITFORIT_TIMEOUT="$2"
if [[ $WAITFORIT_TIMEOUT == "" ]]; then break; fi
shift 2
;;
--timeout=*)
WAITFORIT_TIMEOUT="${1#*=}"
shift 1
;;
--)
shift
WAITFORIT_CLI=("$@")
break
;;
--help)
usage
;;
*)
echoerr "Unknown argument: $1"
usage
;;
esac
done
if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then
echoerr "Error: you need to provide a host and port to test."
usage
fi
WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-15}
WAITFORIT_STRICT=${WAITFORIT_STRICT:-0}
WAITFORIT_CHILD=${WAITFORIT_CHILD:-0}
WAITFORIT_QUIET=${WAITFORIT_QUIET:-0}
# check to see if timeout is from busybox?
WAITFORIT_TIMEOUT_PATH=$(type -p timeout)
WAITFORIT_TIMEOUT_PATH=$(realpath $WAITFORIT_TIMEOUT_PATH 2>/dev/null || readlink -f $WAITFORIT_TIMEOUT_PATH)
if [[ $WAITFORIT_TIMEOUT_PATH =~ "busybox" ]]; then
WAITFORIT_ISBUSY=1
WAITFORIT_BUSYTIMEFLAG="-t"
else
WAITFORIT_ISBUSY=0
WAITFORIT_BUSYTIMEFLAG=""
fi
if [[ $WAITFORIT_CHILD -gt 0 ]]; then
wait_for
WAITFORIT_RESULT=$?
exit $WAITFORIT_RESULT
else
if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
wait_for_wrapper
WAITFORIT_RESULT=$?
else
wait_for
WAITFORIT_RESULT=$?
fi
fi
if [[ $WAITFORIT_CLI != "" ]]; then
if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then
echoerr "$WAITFORIT_cmdname: strict mode, refusing to execute subprocess"
exit $WAITFORIT_RESULT
fi
exec "${WAITFORIT_CLI[@]}"
else
exit $WAITFORIT_RESULT
fi
Loading…
Cancel
Save