From 6b74477aff5003a576498aeb60688221871bf2c8 Mon Sep 17 00:00:00 2001 From: Prathamesh Musale Date: Mon, 24 Jun 2024 07:26:38 +0000 Subject: [PATCH] Add a laconic-console stack with registry CLI and console (#2) Part of [Create a public laconicd testnet](https://www.notion.so/Create-a-public-laconicd-testnet-896a11bdd8094eff8f1b49c0be0ca3b8) Reviewed-on: https://git.vdb.to/cerc-io/testnet-laconicd-stack/pulls/2 Co-authored-by: Prathamesh Musale Co-committed-by: Prathamesh Musale --- README.md | 5 +- .../docker-compose-laconic-console.yml | 32 ++ ...ml => docker-compose-testnet-laconicd.yml} | 2 +- .../laconic-console/cli/create-config.sh | 23 ++ .../config/laconic-console/console/config.yml | 6 + .../laconicd/{scripts => }/run-laconicd.sh | 7 +- .../cerc-laconic2-console-host/Dockerfile | 16 + .../cerc-laconic2-console-host/build.sh | 10 + .../cerc-laconic2-registry-cli/Dockerfile | 20 ++ .../cerc-laconic2-registry-cli/build.sh | 9 + .../container-build/cerc-laconic2d/build.sh | 2 +- .../cerc-webapp-base/Dockerfile | 58 ++++ .../cerc-webapp-base/Dockerfile.webapp | 12 + .../container-build/cerc-webapp-base/build.sh | 35 +++ .../scripts/apply-runtime-env.sh | 33 ++ .../scripts/apply-webapp-config.sh | 35 +++ .../cerc-webapp-base/scripts/build-app.sh | 61 ++++ .../scripts/start-serving-app.sh | 48 +++ .../stacks/laconic-console/README.md | 141 +++++++++ .../stacks/laconic-console/stack.yml | 12 + .../stacks/laconicd-full-node/README.md | 199 ------------ .../stacks/testnet-laconicd/README.md | 289 ++++++++++++++++++ .../stack.yml | 4 +- 23 files changed, 853 insertions(+), 206 deletions(-) create mode 100644 stack-orchestrator/compose/docker-compose-laconic-console.yml rename stack-orchestrator/compose/{docker-compose-laconicd-full-node.yml => docker-compose-testnet-laconicd.yml} (90%) create mode 100755 stack-orchestrator/config/laconic-console/cli/create-config.sh create mode 100644 stack-orchestrator/config/laconic-console/console/config.yml rename stack-orchestrator/config/laconicd/{scripts => }/run-laconicd.sh (88%) create mode 100644 stack-orchestrator/container-build/cerc-laconic2-console-host/Dockerfile create mode 100755 stack-orchestrator/container-build/cerc-laconic2-console-host/build.sh create mode 100644 stack-orchestrator/container-build/cerc-laconic2-registry-cli/Dockerfile create mode 100755 stack-orchestrator/container-build/cerc-laconic2-registry-cli/build.sh create mode 100644 stack-orchestrator/container-build/cerc-webapp-base/Dockerfile create mode 100644 stack-orchestrator/container-build/cerc-webapp-base/Dockerfile.webapp create mode 100755 stack-orchestrator/container-build/cerc-webapp-base/build.sh create mode 100755 stack-orchestrator/container-build/cerc-webapp-base/scripts/apply-runtime-env.sh create mode 100755 stack-orchestrator/container-build/cerc-webapp-base/scripts/apply-webapp-config.sh create mode 100755 stack-orchestrator/container-build/cerc-webapp-base/scripts/build-app.sh create mode 100755 stack-orchestrator/container-build/cerc-webapp-base/scripts/start-serving-app.sh create mode 100644 stack-orchestrator/stacks/laconic-console/README.md create mode 100644 stack-orchestrator/stacks/laconic-console/stack.yml delete mode 100644 stack-orchestrator/stacks/laconicd-full-node/README.md create mode 100644 stack-orchestrator/stacks/testnet-laconicd/README.md rename stack-orchestrator/stacks/{laconicd-full-node => testnet-laconicd}/stack.yml (72%) diff --git a/README.md b/README.md index b368cc3..bb069fe 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # testnet-laconicd-stack -Stacks to run nodes for laconic-testnet +Stacks to run a node for laconic testnet -- [Full node stack documentation](stack-orchestrator/stacks/laconicd-full-node/README.md) +- [testnet-laconicd stack documentation](stack-orchestrator/stacks/testnet-laconicd/README.md) +- [laconic-console stack documentation](stack-orchestrator/stacks/laconic-console/README.md) (to run laconic registry CLI and console standalone) diff --git a/stack-orchestrator/compose/docker-compose-laconic-console.yml b/stack-orchestrator/compose/docker-compose-laconic-console.yml new file mode 100644 index 0000000..ec97b53 --- /dev/null +++ b/stack-orchestrator/compose/docker-compose-laconic-console.yml @@ -0,0 +1,32 @@ +services: + cli: + image: cerc/laconic2-registry-cli:local + command: ["bash", "-c", "/app/create-config.sh && tail -f /dev/null"] + environment: + CERC_LACONICD_RPC_ENDPOINT: ${CERC_LACONICD_RPC_ENDPOINT:-http://laconicd:26657} + CERC_LACONICD_GQL_ENDPOINT: ${CERC_LACONICD_GQL_ENDPOINT:-http://laconicd:9473/api} + CERC_LACONICD_CHAIN_ID: ${CERC_LACONICD_CHAIN_ID:-laconic_9000-1} + CERC_LACONICD_USER_KEY: ${CERC_LACONICD_USER_KEY} + CERC_LACONICD_BOND_ID: ${CERC_LACONICD_BOND_ID} + CERC_LACONICD_GAS: ${CERC_LACONICD_GAS:-200000} + CERC_LACONICD_FEES: ${CERC_LACONICD_FEES:-200000photon} + volumes: + - ../config/laconic-console/cli/create-config.sh:/app/create-config.sh + - laconic-registry-data:/laconic-registry-data + extra_hosts: + - "host.docker.internal:host-gateway" + + console: + restart: unless-stopped + image: cerc/laconic2-console-host:local + environment: + CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} + CERC_WEBAPP_FILES_DIR: ${CERC_WEBAPP_FILES_DIR:-/usr/local/share/.config/yarn/global/node_modules/@cerc-io/console-app/dist/production} + LACONIC_HOSTED_ENDPOINT: ${LACONIC_HOSTED_ENDPOINT:-http://localhost:9473} + volumes: + - ../config/laconic-console/console/config.yml:/config/config.yml + ports: + - "80" + +volumes: + laconic-registry-data: diff --git a/stack-orchestrator/compose/docker-compose-laconicd-full-node.yml b/stack-orchestrator/compose/docker-compose-testnet-laconicd.yml similarity index 90% rename from stack-orchestrator/compose/docker-compose-laconicd-full-node.yml rename to stack-orchestrator/compose/docker-compose-testnet-laconicd.yml index 83b378e..9e22cf8 100644 --- a/stack-orchestrator/compose/docker-compose-laconicd-full-node.yml +++ b/stack-orchestrator/compose/docker-compose-testnet-laconicd.yml @@ -10,7 +10,7 @@ services: CERC_LOGLEVEL: ${CERC_LOGLEVEL:-info} volumes: - laconicd-data:/root/.laconicd - - ../config/laconicd/scripts/run-laconicd.sh:/opt/run-laconicd.sh + - ../config/laconicd/run-laconicd.sh:/opt/run-laconicd.sh ports: - "6060" - "26657" diff --git a/stack-orchestrator/config/laconic-console/cli/create-config.sh b/stack-orchestrator/config/laconic-console/cli/create-config.sh new file mode 100755 index 0000000..a57ef0d --- /dev/null +++ b/stack-orchestrator/config/laconic-console/cli/create-config.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +if [[ -n "$CERC_SCRIPT_DEBUG" ]]; then + set -x +fi + +set -e + +# Create the required config file +config_file="/app/config.yml" +cat < $config_file +services: + registry: + rpcEndpoint: ${CERC_LACONICD_RPC_ENDPOINT} + gqlEndpoint: ${CERC_LACONICD_GQL_ENDPOINT} + userKey: ${CERC_LACONICD_USER_KEY} + bondId: ${CERC_LACONICD_BOND_ID} + chainId: ${CERC_LACONICD_CHAIN_ID} + gas: ${CERC_LACONICD_GAS} + fees: ${CERC_LACONICD_FEES} +EOF + +echo "Exported config to $config_file" diff --git a/stack-orchestrator/config/laconic-console/console/config.yml b/stack-orchestrator/config/laconic-console/console/config.yml new file mode 100644 index 0000000..883e34e --- /dev/null +++ b/stack-orchestrator/config/laconic-console/console/config.yml @@ -0,0 +1,6 @@ +# Config for laconic-console + +services: + wns: + server: 'LACONIC_HOSTED_ENDPOINT/api' + webui: 'LACONIC_HOSTED_ENDPOINT/console' diff --git a/stack-orchestrator/config/laconicd/scripts/run-laconicd.sh b/stack-orchestrator/config/laconicd/run-laconicd.sh similarity index 88% rename from stack-orchestrator/config/laconicd/scripts/run-laconicd.sh rename to stack-orchestrator/config/laconicd/run-laconicd.sh index 99e7998..3ae415f 100755 --- a/stack-orchestrator/config/laconicd/scripts/run-laconicd.sh +++ b/stack-orchestrator/config/laconicd/run-laconicd.sh @@ -44,4 +44,9 @@ fi sed -i "s/^persistent_peers *=.*/persistent_peers = \"$CERC_PEERS\"/g" $NODE_HOME/config/config.toml echo "Starting laconicd node..." -laconicd start --gql-playground --gql-server --log_level $CERC_LOGLEVEL --home $NODE_HOME +laconicd start \ + --api.enable \ + --rpc.laddr="tcp://0.0.0.0:26657" \ + --gql-playground --gql-server \ + --log_level $CERC_LOGLEVEL \ + --home $NODE_HOME diff --git a/stack-orchestrator/container-build/cerc-laconic2-console-host/Dockerfile b/stack-orchestrator/container-build/cerc-laconic2-console-host/Dockerfile new file mode 100644 index 0000000..a989f24 --- /dev/null +++ b/stack-orchestrator/container-build/cerc-laconic2-console-host/Dockerfile @@ -0,0 +1,16 @@ +FROM cerc/webapp-base:local + +# Configure the cerc-io npm registry +RUN npm config set @cerc-io:registry https://git.vdb.to/api/packages/cerc-io/npm/ +RUN npm config set @lirewine:registry https://git.vdb.to/api/packages/cerc-io/npm/ + +WORKDIR /app + +COPY . . + +RUN echo "Installing dependencies" && yarn +RUN echo "Building" && LACONIC_HOSTED_CONFIG_FILE=config-hosted.yml yarn dist + +RUN npm config set @cerc-io:registry https://git.vdb.to/api/packages/cerc-io/npm/ + +RUN yarn global add file:$PWD diff --git a/stack-orchestrator/container-build/cerc-laconic2-console-host/build.sh b/stack-orchestrator/container-build/cerc-laconic2-console-host/build.sh new file mode 100755 index 0000000..ef43944 --- /dev/null +++ b/stack-orchestrator/container-build/cerc-laconic2-console-host/build.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +# Build cerc/laconic2-console-host + +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh + +# See: https://stackoverflow.com/a/246128/1701505 +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +docker build -t cerc/laconic2-console-host:local ${build_command_args} -f ${SCRIPT_DIR}/Dockerfile ${CERC_REPO_BASE_DIR}/laconic-console diff --git a/stack-orchestrator/container-build/cerc-laconic2-registry-cli/Dockerfile b/stack-orchestrator/container-build/cerc-laconic2-registry-cli/Dockerfile new file mode 100644 index 0000000..603cda5 --- /dev/null +++ b/stack-orchestrator/container-build/cerc-laconic2-registry-cli/Dockerfile @@ -0,0 +1,20 @@ +# Node.js version (use -bullseye variants on local arm64/Apple Silicon): 18, 16, 14, 18-bullseye, 16-bullseye, 14-bullseye, 18-buster, 16-buster, 14-buster +ARG VARIANT=18-bullseye +FROM node:${VARIANT} + +RUN apt-get update \ + && apt-get -y install --no-install-recommends python3 jq bash curl nano + +WORKDIR /app + +COPY . . + +RUN echo "Installing dependencies and building laconic-registry-cli" && \ + yarn && yarn build + +# Globally install the cli binary +RUN npm config set @cerc-io:registry https://git.vdb.to/api/packages/cerc-io/npm/ +RUN yarn global add file:$PWD + +# Default command sleeps forever so docker doesn't kill it +CMD ["bash", "-c", "while :; do sleep 600; done"] diff --git a/stack-orchestrator/container-build/cerc-laconic2-registry-cli/build.sh b/stack-orchestrator/container-build/cerc-laconic2-registry-cli/build.sh new file mode 100755 index 0000000..0c775dc --- /dev/null +++ b/stack-orchestrator/container-build/cerc-laconic2-registry-cli/build.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +# Build cerc/laconic2-registry-cli +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh + +# See: https://stackoverflow.com/a/246128/1701505 +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +docker build -t cerc/laconic2-registry-cli:local ${build_command_args} -f ${SCRIPT_DIR}/Dockerfile ${CERC_REPO_BASE_DIR}/laconic-registry-cli diff --git a/stack-orchestrator/container-build/cerc-laconic2d/build.sh b/stack-orchestrator/container-build/cerc-laconic2d/build.sh index 1c4f7de..2265c85 100755 --- a/stack-orchestrator/container-build/cerc-laconic2d/build.sh +++ b/stack-orchestrator/container-build/cerc-laconic2d/build.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Build cerc/laconicd +# Build cerc/laconic2d source ${CERC_CONTAINER_BASE_DIR}/build-base.sh docker build -t cerc/laconic2d:local ${build_command_args} ${CERC_REPO_BASE_DIR}/laconic2d diff --git a/stack-orchestrator/container-build/cerc-webapp-base/Dockerfile b/stack-orchestrator/container-build/cerc-webapp-base/Dockerfile new file mode 100644 index 0000000..5b119b3 --- /dev/null +++ b/stack-orchestrator/container-build/cerc-webapp-base/Dockerfile @@ -0,0 +1,58 @@ +# Originally from: https://github.com/devcontainers/images/blob/main/src/javascript-node/.devcontainer/Dockerfile +# [Choice] Node.js version (use -bullseye variants on local arm64/Apple Silicon): 18, 16, 14, 18-bullseye, 16-bullseye, 14-bullseye, 18-buster, 16-buster, 14-buster +ARG VARIANT=20-bullseye-slim +FROM node:${VARIANT} + +ARG USERNAME=node +ARG NPM_GLOBAL=/usr/local/share/npm-global + +# Add NPM global to PATH. +ENV PATH=${NPM_GLOBAL}/bin:${PATH} +# Prevents npm from printing version warnings +ENV NPM_CONFIG_UPDATE_NOTIFIER=false + +RUN \ + # Configure global npm install location, use group to adapt to UID/GID changes + if ! cat /etc/group | grep -e "^npm:" > /dev/null 2>&1; then groupadd -r npm; fi \ + && usermod -a -G npm ${USERNAME} \ + && umask 0002 \ + && mkdir -p ${NPM_GLOBAL} \ + && touch /usr/local/etc/npmrc \ + && chown ${USERNAME}:npm ${NPM_GLOBAL} /usr/local/etc/npmrc \ + && chmod g+s ${NPM_GLOBAL} \ + && npm config -g set prefix ${NPM_GLOBAL} \ + && su ${USERNAME} -c "npm config -g set prefix ${NPM_GLOBAL}" \ + # Install eslint + && su ${USERNAME} -c "umask 0002 && npm install -g eslint" \ + # Install semver + && su ${USERNAME} -c "umask 0002 && npm install -g semver" \ + # Install pnpm + && su ${USERNAME} -c "umask 0002 && npm install -g pnpm" \ + && npm cache clean --force > /dev/null 2>&1 + +# [Optional] Uncomment this section to install additional OS packages. +RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ + && apt-get -y install --no-install-recommends jq gettext-base + +# [Optional] Uncomment if you want to install an additional version of node using nvm +# ARG EXTRA_NODE_VERSION=10 +# RUN su node -c "source /usr/local/share/nvm/nvm.sh && nvm install ${EXTRA_NODE_VERSION}" + +# We do this to get a yq binary from the published container, for the correct architecture we're building here +COPY --from=docker.io/mikefarah/yq:latest /usr/bin/yq /usr/local/bin/yq + +COPY scripts /scripts + +# [Optional] Uncomment if you want to install more global node modules +# RUN su node -c "npm install -g " + +RUN mkdir -p /config + +# Install simple web server for now (use nginx perhaps later) +RUN yarn global add http-server + +# Expose port for http +EXPOSE 80 + +# Default command sleeps forever so docker doesn't kill it +CMD ["/scripts/start-serving-app.sh"] diff --git a/stack-orchestrator/container-build/cerc-webapp-base/Dockerfile.webapp b/stack-orchestrator/container-build/cerc-webapp-base/Dockerfile.webapp new file mode 100644 index 0000000..9eaf46e --- /dev/null +++ b/stack-orchestrator/container-build/cerc-webapp-base/Dockerfile.webapp @@ -0,0 +1,12 @@ +FROM cerc/webapp-base:local as builder + +ARG CERC_BUILD_TOOL +ARG CERC_BUILD_OUTPUT_DIR + +WORKDIR /app +COPY . . +RUN rm -rf node_modules build dist .next* +RUN /scripts/build-app.sh /app /data + +FROM cerc/webapp-base:local +COPY --from=builder /data /data diff --git a/stack-orchestrator/container-build/cerc-webapp-base/build.sh b/stack-orchestrator/container-build/cerc-webapp-base/build.sh new file mode 100755 index 0000000..5fc6cc3 --- /dev/null +++ b/stack-orchestrator/container-build/cerc-webapp-base/build.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash +# Build cerc/webapp-base + +source ${CERC_CONTAINER_BASE_DIR}/build-base.sh + +# See: https://stackoverflow.com/a/246128/1701505 +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +CERC_CONTAINER_BUILD_WORK_DIR=${CERC_CONTAINER_BUILD_WORK_DIR:-$SCRIPT_DIR} +CERC_CONTAINER_BUILD_DOCKERFILE=${CERC_CONTAINER_BUILD_DOCKERFILE:-$SCRIPT_DIR/Dockerfile} +CERC_CONTAINER_BUILD_TAG=${CERC_CONTAINER_BUILD_TAG:-cerc/webapp-base:local} + +docker build -t $CERC_CONTAINER_BUILD_TAG ${build_command_args} -f $CERC_CONTAINER_BUILD_DOCKERFILE $CERC_CONTAINER_BUILD_WORK_DIR +rc=$? + +if [ $rc -ne 0 ]; then + echo "BUILD FAILED" 1>&2 + exit $rc +fi + +if [ "$CERC_CONTAINER_BUILD_TAG" != "cerc/webapp-base:local" ]; then + cat < $TMP_ENV + set -a + source .env + source $TMP_ENV + set +a + rm -f $TMP_ENV +fi + +for f in $(find . -type f \( -regex '.*.html?' -or -regex ".*.[tj]s\(x\|on\)?$" \) | grep -v 'node_modules' | grep -v '.git'); do + for e in $(cat "${f}" | tr -s '[:blank:]' '\n' | tr -s '["/\\{},();]' '\n' | tr -s "[']" '\n' | egrep -o -e '^CERC_RUNTIME_ENV_.+$' -e '^LACONIC_HOSTED_CONFIG_.+$'); do + orig_name=$(echo -n "${e}" | sed 's/"//g') + cur_name=$(echo -n "${orig_name}" | sed 's/CERC_RUNTIME_ENV_//g') + cur_val=$(echo -n "\$${cur_name}" | envsubst) + if [ "$CERC_RETAIN_ENV_QUOTES" != "true" ]; then + cur_val=$(sed "s/^[\"']//" <<< "$cur_val" | sed "s/[\"']//") + fi + esc_val=$(sed 's/[&/\]/\\&/g' <<< "$cur_val") + echo "$f: $cur_name=$cur_val" + sed -i "s/$orig_name/$esc_val/g" $f + done +done diff --git a/stack-orchestrator/container-build/cerc-webapp-base/scripts/apply-webapp-config.sh b/stack-orchestrator/container-build/cerc-webapp-base/scripts/apply-webapp-config.sh new file mode 100755 index 0000000..6d36680 --- /dev/null +++ b/stack-orchestrator/container-build/cerc-webapp-base/scripts/apply-webapp-config.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi +if [[ $# -ne 2 ]]; then + echo "Illegal number of parameters" >&2 + exit 1 +fi +config_file_name=$1 +webapp_files_dir=$2 +if ! [[ -f ${config_file_name} ]]; then + echo "Config file ${config_file_name} does not exist" >&2 + exit 1 +fi +if ! [[ -d ${webapp_files_dir} ]]; then + echo "Webapp directory ${webapp_files_dir} does not exist" >&2 + exit 1 +fi +# First some magic using yq to translate our yaml config file into an array of key value pairs like: +# LACONIC_HOSTED_CONFIG_= +readarray -t config_kv_pair_array < <( yq '.. | ([path | join("_"), .] | join("=") )' ${config_file_name} | sort -r | sed -e '$ d' | sed 's/^/LACONIC_HOSTED_CONFIG_/' ) +declare -p config_kv_pair_array +# Then iterate over that kv array making the template substitution in our web app files +for kv_pair_string in "${config_kv_pair_array[@]}" +do + kv_pair=(${kv_pair_string//=/ }) + template_string_to_replace=${kv_pair[0]} + template_value_to_substitute=${kv_pair[1]} + template_value_to_substitute_expanded=${template_value_to_substitute//LACONIC_HOSTED_ENDPOINT/${LACONIC_HOSTED_ENDPOINT}} + # Run find and sed to do the substitution of one variable over all files + # See: https://stackoverflow.com/a/21479607/1701505 + echo "Substituting: ${template_string_to_replace} = ${template_value_to_substitute_expanded}" + # Note: we do not escape our strings, on the expectation they do not container the '#' char. + find ${webapp_files_dir} -type f -exec sed -i 's#'${template_string_to_replace}'#'${template_value_to_substitute_expanded}'#g' {} + +done diff --git a/stack-orchestrator/container-build/cerc-webapp-base/scripts/build-app.sh b/stack-orchestrator/container-build/cerc-webapp-base/scripts/build-app.sh new file mode 100755 index 0000000..30358bb --- /dev/null +++ b/stack-orchestrator/container-build/cerc-webapp-base/scripts/build-app.sh @@ -0,0 +1,61 @@ +#!/bin/bash + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi + +CERC_BUILD_TOOL="${CERC_BUILD_TOOL}" +CERC_BUILD_OUTPUT_DIR="${CERC_BUILD_OUTPUT_DIR}" + +WORK_DIR="${1:-/app}" +DEST_DIR="${2:-/data}" + +if [ -f "${WORK_DIR}/build-webapp.sh" ]; then + echo "Building webapp with ${WORK_DIR}/build-webapp.sh ..." + cd "${WORK_DIR}" || exit 1 + + rm -rf "${DEST_DIR}" + ./build-webapp.sh "${DEST_DIR}" || exit 1 +elif [ -f "${WORK_DIR}/package.json" ]; then + echo "Building node-based webapp ..." + cd "${WORK_DIR}" || exit 1 + + if [ -z "$CERC_BUILD_TOOL" ]; then + if [ -f "pnpm-lock.yaml" ]; then + CERC_BUILD_TOOL=pnpm + elif [ -f "yarn.lock" ]; then + CERC_BUILD_TOOL=yarn + else + CERC_BUILD_TOOL=npm + fi + fi + + time $CERC_BUILD_TOOL install || exit 1 + time $CERC_BUILD_TOOL build || exit 1 + + rm -rf "${DEST_DIR}" + if [ -z "${CERC_BUILD_OUTPUT_DIR}" ]; then + if [ -d "${WORK_DIR}/dist" ]; then + CERC_BUILD_OUTPUT_DIR="${WORK_DIR}/dist" + elif [ -d "${WORK_DIR}/build" ]; then + CERC_BUILD_OUTPUT_DIR="${WORK_DIR}/build" + else + echo "ERROR: Unable to locate build output. Set with --extra-build-args \"--build-arg CERC_BUILD_OUTPUT_DIR=path\"" 1>&2 + exit 1 + fi + fi + mv "${CERC_BUILD_OUTPUT_DIR}" "${DEST_DIR}" +else + echo "Copying static app ..." + mv "${WORK_DIR}" "${DEST_DIR}" +fi + +# One special fix ... +cd "${DEST_DIR}" +for f in $(find . -type f -name '*.htm*'); do + sed -i -e 's#/LACONIC_HOSTED_CONFIG_homepage/#LACONIC_HOSTED_CONFIG_homepage/#g' "$f" +done + +exit 0 diff --git a/stack-orchestrator/container-build/cerc-webapp-base/scripts/start-serving-app.sh b/stack-orchestrator/container-build/cerc-webapp-base/scripts/start-serving-app.sh new file mode 100755 index 0000000..3a114ee --- /dev/null +++ b/stack-orchestrator/container-build/cerc-webapp-base/scripts/start-serving-app.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi + +CERC_LISTEN_PORT=${CERC_LISTEN_PORT:-80} +CERC_WEBAPP_FILES_DIR="${CERC_WEBAPP_FILES_DIR:-/data}" +CERC_ENABLE_CORS="${CERC_ENABLE_CORS:-false}" +CERC_SINGLE_PAGE_APP="${CERC_SINGLE_PAGE_APP}" + +if [ -z "${CERC_SINGLE_PAGE_APP}" ]; then + # If there is only one HTML file, assume an SPA. + if [ 1 -eq $(find "${CERC_WEBAPP_FILES_DIR}" -name '*.html' | wc -l) ]; then + CERC_SINGLE_PAGE_APP=true + else + CERC_SINGLE_PAGE_APP=false + fi +fi + +# ${var,,} is a lower-case comparison +if [ "true" == "${CERC_ENABLE_CORS,,}" ]; then + CERC_HTTP_EXTRA_ARGS="$CERC_HTTP_EXTRA_ARGS --cors" +fi + +# ${var,,} is a lower-case comparison +if [ "true" == "${CERC_SINGLE_PAGE_APP,,}" ]; then + echo "Serving content as single-page app. If this is wrong, set 'CERC_SINGLE_PAGE_APP=false'" + # Create a catchall redirect back to / + CERC_HTTP_EXTRA_ARGS="$CERC_HTTP_EXTRA_ARGS --proxy http://localhost:${CERC_LISTEN_PORT}?" +else + echo "Serving content normally. If this is a single-page app, set 'CERC_SINGLE_PAGE_APP=true'" +fi + +LACONIC_HOSTED_CONFIG_FILE=${LACONIC_HOSTED_CONFIG_FILE} +if [ -z "${LACONIC_HOSTED_CONFIG_FILE}" ]; then + if [ -f "/config/laconic-hosted-config.yml" ]; then + LACONIC_HOSTED_CONFIG_FILE="/config/laconic-hosted-config.yml" + elif [ -f "/config/config.yml" ]; then + LACONIC_HOSTED_CONFIG_FILE="/config/config.yml" + fi +fi + +if [ -f "${LACONIC_HOSTED_CONFIG_FILE}" ]; then + /scripts/apply-webapp-config.sh $LACONIC_HOSTED_CONFIG_FILE "${CERC_WEBAPP_FILES_DIR}" +fi + +/scripts/apply-runtime-env.sh ${CERC_WEBAPP_FILES_DIR} +http-server $CERC_HTTP_EXTRA_ARGS -p ${CERC_LISTEN_PORT} "${CERC_WEBAPP_FILES_DIR}" diff --git a/stack-orchestrator/stacks/laconic-console/README.md b/stack-orchestrator/stacks/laconic-console/README.md new file mode 100644 index 0000000..3513bf2 --- /dev/null +++ b/stack-orchestrator/stacks/laconic-console/README.md @@ -0,0 +1,141 @@ +# laconic-console + +Instructions for running laconic registry CLI and console + +## Prerequisites + +* laconicd RPC and GQL endpoints + +## Setup + +* Clone the stack repo: + + ```bash + laconic-so fetch-stack git.vdb.to/cerc-io/testnet-laconicd-stack + ``` + +* Clone required repositories: + + ```bash + laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/laconic-console setup-repositories + ``` + +* Build the container images: + + ```bash + laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/laconic-console build-containers + ``` + + This should create the following docker images locally: + + * `cerc/laconic2-registry-cli` + * `cerc/webapp-base` + * `cerc/laconic2-console-host` + +## Create a deployment + +* Create a spec file for the deployment: + + ```bash + laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/laconic-console deploy init --output laconic-console-spec.yml + ``` + +* Edit `network` in the spec file to map container ports to host ports as required: + + ```bash + ... + network: + ports: + laconic-console: + - '8080:80' + ``` + +* Create a deployment from the spec file: + + ```bash + laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/laconic-console deploy create --spec-file laconic-console-spec.yml --deployment-dir laconic-console-deployment + ``` + +## Configuration + +* Inside the deployment directory, open `config.env` file and set following env variables: + + ```bash + # All optional + + # CLI configuration + + # laconicd RPC endpoint (default: http://laconicd:26657) + CERC_LACONICD_RPC_ENDPOINT= + + # laconicd GQL endpoint (default: http://laconicd:9473/api) + CERC_LACONICD_GQL_ENDPOINT= + + # laconicd chain id (default: laconic_9000-1) + CERC_LACONICD_CHAIN_ID= + + # laconicd user private key for txs + CERC_LACONICD_USER_KEY= + + # laconicd bond id for txs + CERC_LACONICD_BOND_ID= + + # Gas limit for txs (default: 200000) + CERC_LACONICD_GAS= + + # Max fees for txs (default: 200000photon) + CERC_LACONICD_FEES= + + # Console configuration + + # Laconicd (hosted) GQL endpoint (default: http://localhost:9473) + LACONIC_HOSTED_ENDPOINT= + ``` + +## Run + +* Start the deployment: + + ```bash + laconic-so deployment --dir laconic-console-deployment start + ``` + +* View the laconic console at + +* Use the `cli` service for registry CLI operations: + + ```bash + # Example + laconic-so deployment --dir laconic-console-deployment exec cli "laconic registry status" + ``` + +## Check status + +* To list down and monitor the running containers: + + ```bash + # With status + docker ps -a + + # Follow logs for console container + laconic-so deployment --dir laconic-console-deployment logs console -f + ``` + +## Clean up + +* Stop all services running in the background: + + ```bash + # Stop the docker containers + laconic-so deployment --dir laconic-console-deployment stop + ``` + +* To stop all services and also delete data: + + ```bash + # Stop the docker containers + laconic-so deployment --dir laconic-console-deployment stop --delete-volumes + + # Remove deployment directory (deployment will have to be recreated for a re-run) + rm -r laconic-console-deployment + ``` diff --git a/stack-orchestrator/stacks/laconic-console/stack.yml b/stack-orchestrator/stacks/laconic-console/stack.yml new file mode 100644 index 0000000..f03007f --- /dev/null +++ b/stack-orchestrator/stacks/laconic-console/stack.yml @@ -0,0 +1,12 @@ +version: "1.0" +name: laconic-console +description: "Laconic registry CLI and console" +repos: + - git.vdb.to/cerc-io/laconic-registry-cli@laconic2 + - git.vdb.to/cerc-io/laconic-console@laconic2 +containers: + - cerc/laconic2-registry-cli + - cerc/webapp-base + - cerc/laconic2-console-host +pods: + - laconic-console diff --git a/stack-orchestrator/stacks/laconicd-full-node/README.md b/stack-orchestrator/stacks/laconicd-full-node/README.md deleted file mode 100644 index 05ba436..0000000 --- a/stack-orchestrator/stacks/laconicd-full-node/README.md +++ /dev/null @@ -1,199 +0,0 @@ -# laconicd-full-node - -Instructions for running a laconicd testnet full node and joining as a validator - -## Prerequisites - -* Minimum hardware requirements: - - ```bash - RAM: 8-16GB - Disk space: 200GB - CPU: 2 cores - ``` - -* Testnet genesis file (file or an URL) and peer node addresses - -## Setup - -* Clone the stack repo: - - ```bash - laconic-so fetch-stack git.vdb.to/cerc-io/testnet-laconicd-stack - ``` - -* Clone required repositories: - - ```bash - laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/laconicd-full-node setup-repositories - ``` - -* Build the container images: - - ```bash - laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/laconicd-full-node build-containers - ``` - - This should create the following docker images locally: - - * `cerc/laconic2d` - -## Create a deployment - -* Create a spec file for the deployment: - - ```bash - laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/laconicd-full-node deploy init --output laconic-full-node-spec.yml - ``` - -* Edit `network` in the spec file to map container ports to host ports as required: - - ```bash - ... - network: - ports: - laconicd: - - '6060:6060' - - '26657:26657' - - '26656:26656' - - '9473:9473' - - '9090:9090' - - '1317:1317' - ``` - -* Create a deployment from the spec file: - - ```bash - laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/laconicd-full-node deploy create --spec-file laconic-full-node-spec.yml --deployment-dir laconic-full-node-deployment - ``` - -* Copy over the published testnet genesis file (`.json`) to data directory in deployment (`laconic-full-node-deployment/data/laconicd-data/tmp`): - - ```bash - # Example - mkdir -p laconic-full-node-deployment/data/laconicd-data/tmp - cp genesis.json laconic-full-node-deployment/data/laconicd-data/tmp/genesis.json - ``` - -## Configuration - -* Inside the deployment directory, open `config.env` file and set following env variables: - - ```bash - # Comma separated list of nodes to keep persistent connections to - # Example: "node-1-id@node-1-host:26656,node-2-id@node-2-host:26656" - CERC_PEERS="" - - # Optional - - # A custom human readable name for this node (default: TestnetNode) - CERC_MONIKER= - - # Network chain ID (default: laconic_9000-1) - CERC_CHAIN_ID= - - # Output log level (default: info) - CERC_LOGLEVEL= - ``` - -## Start the deployment - -```bash -laconic-so deployment --dir laconic-full-node-deployment start -``` - -## Check status - -* To list down and monitor the running containers: - - ```bash - # With status - docker ps -a - - # Follow logs for laconicd container - laconic-so deployment --dir laconic-full-node-deployment logs laconicd -f - ``` - -* Check the sync status of your node: - - ```bash - laconic-so deployment --dir laconic-full-node-deployment exec laconicd "laconicd status | jq .sync_info" - - # `catching_up: false` indicates that node is completely synced - ``` - -## Join as testnet validator - -* Create / import a new key pair: - - ```bash - # Create new keypair - laconic-so deployment --dir laconic-full-node-deployment exec laconicd "laconicd keys add " - - # OR - # Restore existing key with mnemonic seed phrase - # You will be prompted to enter mnemonic seed - laconic-so deployment --dir laconic-full-node-deployment exec laconicd "laconicd keys add --recover" - - # Query the keystore for your account's address - laconic-so deployment --dir laconic-full-node-deployment exec laconicd "laconicd keys show -a" - ``` - -* Request tokens from the testnet faucet for your account if required - -* Check balance for your account: - - ```bash - laconic-so deployment --dir laconic-full-node-deployment exec laconicd "laconicd query bank balances " - ``` - -* Create required validator configuration: - - ```bash - # Edit the staking amount and other fields as required - laconic-so deployment --dir laconic-full-node-deployment exec laconicd 'cat < -validator.json - { - "pubkey": $(laconicd cometbft show-validator), - "amount": "900000000photon", - "moniker": "", - "commission-rate": "0.1", - "commission-max-rate": "0.2", - "commission-max-change-rate": "0.01", - "min-self-delegation": "1" - } - EOF' - ``` - -* Create a validator: - - ```bash - laconic-so deployment --dir laconic-full-node-deployment exec laconicd 'laconicd tx staking create-validator -validator.json \ - --fees 50photon \ - --chain-id=laconic_9000-1 \ - --from ' - ``` - -* View your staking validator details: - - ```bash - laconic-so deployment --dir laconic-full-node-deployment exec laconicd "laconicd query staking validator " - ``` - -## Clean up - -* Stop all services running in the background: - - ```bash - # Stop the docker containers - laconic-so deployment --dir laconic-full-node-deployment stop - ``` - -* To stop all services and also delete data: - - ```bash - # Stop the docker containers - laconic-so deployment --dir laconic-full-node-deployment stop --delete-volumes - - # Remove deployment directory (deployment will have to be recreated for a re-run) - rm -r laconic-full-node-deployment - ``` diff --git a/stack-orchestrator/stacks/testnet-laconicd/README.md b/stack-orchestrator/stacks/testnet-laconicd/README.md new file mode 100644 index 0000000..3f950d0 --- /dev/null +++ b/stack-orchestrator/stacks/testnet-laconicd/README.md @@ -0,0 +1,289 @@ +# testnet-laconicd + +Instructions for running a laconicd testnet full node and joining as a validator + +## Prerequisites + +* Minimum hardware requirements: + + ```bash + RAM: 8-16GB + Disk space: 200GB + CPU: 2 cores + ``` + +* Testnet genesis file (file or an URL) and peer node addresses + +## Setup + +* Clone the stack repo: + + ```bash + laconic-so fetch-stack git.vdb.to/cerc-io/testnet-laconicd-stack + ``` + +* Clone required repositories: + + ```bash + # laconicd + laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/testnet-laconicd setup-repositories + + # laocnic cli and console + laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/laconic-console setup-repositories + ``` + +* Build the container images: + + ```bash + # laconicd + laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/testnet-laconicd build-containers + + # laocnic cli and console + laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/laconic-console build-containers + ``` + + This should create the following docker images locally: + + * `cerc/laconic2d` + * `cerc/laconic2-registry-cli` + * `cerc/webapp-base` + * `cerc/laconic2-console-host` + +## Create a deployment + +* Create a spec file for the deployment: + + ```bash + laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/testnet-laconicd deploy init --output testnet-laconicd-spec.yml + + laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/laconic-console deploy init --output laconic-console-spec.yml + ``` + +* Edit `network` in both the spec files to map container ports to host ports as required: + + ```bash + # testnet-laconicd-spec.yml + ... + network: + ports: + laconicd: + - '6060:6060' + - '26657:26657' + - '26656:26656' + - '9473:9473' + - '9090:9090' + - '1317:1317' + + # laconic-console-spec.yml + ... + network: + ports: + console: + - '8080:80' + ``` + +* Create deployments from the spec files: + + ```bash + laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/testnet-laconicd deploy create --spec-file testnet-laconicd-spec.yml --deployment-dir testnet-laconicd-deployment + + laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/laconic-console deploy create --spec-file laconic-console-spec.yml --deployment-dir laconic-console-deployment + + # Place them both in the same namespace (cluster) + cp testnet-laconicd-deployment/deployment.yml laconic-console-deployment/deployment.yml + ``` + +* Copy over the published testnet genesis file (`.json`) to data directory in deployment (`testnet-laconicd-deployment/data/laconicd-data/tmp`): + + ```bash + # Example + mkdir -p testnet-laconicd-deployment/data/laconicd-data/tmp + cp genesis.json testnet-laconicd-deployment/data/laconicd-data/tmp/genesis.json + ``` + +## Configuration + +* Inside the `testnet-laconicd-deployment` deployment directory, open `config.env` file and set following env variables: + + ```bash + # Comma separated list of nodes to keep persistent connections to + # Example: "node-1-id@node-1-host:26656,node-2-id@node-2-host:26656" + CERC_PEERS="" + + # Optional + + # A custom human readable name for this node (default: TestnetNode) + CERC_MONIKER= + + # Network chain ID (default: laconic_9000-1) + CERC_CHAIN_ID= + + # Output log level (default: info) + CERC_LOGLEVEL= + ``` + +* Inside the `laconic-console-deployment` deployment directory, open `config.env` file and set following env variables: + + ```bash + # All optional + + # CLI configuration + + # laconicd chain id (default: laconic_9000-1) + CERC_LACONICD_CHAIN_ID= + + # laconicd user private key for txs + CERC_LACONICD_USER_KEY= + + # laconicd bond id for txs + CERC_LACONICD_BOND_ID= + + # Gas limit for txs (default: 200000) + CERC_LACONICD_GAS= + + # Max fees for txs (default: 200000photon) + CERC_LACONICD_FEES= + + # Console configuration + + # Laconicd (hosted) GQL endpoint (default: http://localhost:9473) + LACONIC_HOSTED_ENDPOINT= + ``` + + Note: Use `host.docker.internal` as host to access ports on the host machine + +## Start the deployments + +```bash +laconic-so deployment --dir testnet-laconicd-deployment start +laconic-so deployment --dir laconic-console-deployment start +``` + +## Check status + +* To list down and monitor the running containers: + + ```bash + # With status + docker ps -a + + # Follow logs for laconicd container + laconic-so deployment --dir testnet-laconicd-deployment logs laconicd -f + ``` + +* Check the sync status of your node: + + ```bash + laconic-so deployment --dir testnet-laconicd-deployment exec laconicd "laconicd status | jq .sync_info" + + # `catching_up: false` indicates that node is completely synced + ``` + +* View the laconic console at + +* Use the cli service for registry CLI operations: + + ```bash + # Example + laconic-so deployment --dir laconic-console-deployment exec cli "laconic registry status" + ``` + +## Join as testnet validator + +* Create / import a new key pair: + + ```bash + # Create new keypair + laconic-so deployment --dir testnet-laconicd-deployment exec laconicd "laconicd keys add " + + # OR + # Restore existing key with mnemonic seed phrase + # You will be prompted to enter mnemonic seed + laconic-so deployment --dir testnet-laconicd-deployment exec laconicd "laconicd keys add --recover" + + # Query the keystore for your account's address + laconic-so deployment --dir testnet-laconicd-deployment exec laconicd "laconicd keys show -a" + ``` + +* Request tokens from the testnet faucet for your account if required + +* Check balance for your account: + + ```bash + laconic-so deployment --dir testnet-laconicd-deployment exec laconicd "laconicd query bank balances " + ``` + +* Create required validator configuration: + + ```bash + # Edit the staking amount and other fields as required + laconic-so deployment --dir testnet-laconicd-deployment exec laconicd 'cat < -validator.json + { + "pubkey": $(laconicd cometbft show-validator), + "amount": "900000000photon", + "moniker": "", + "commission-rate": "0.1", + "commission-max-rate": "0.2", + "commission-max-change-rate": "0.01", + "min-self-delegation": "1" + } + EOF' + ``` + +* Create a validator: + + ```bash + laconic-so deployment --dir testnet-laconicd-deployment exec laconicd 'laconicd tx staking create-validator -validator.json \ + --fees 50photon \ + --chain-id=laconic_9000-1 \ + --from ' + ``` + +* View your staking validator details: + + ```bash + laconic-so deployment --dir testnet-laconicd-deployment exec laconicd "laconicd query staking validator " + ``` + +## Perform operations + +* To perform txs against the chain using registry CLI, set your private key in config in the CLI container: + + ```bash + # (Optional) Get the PK from your node + laconic-so deployment --dir testnet-laconicd-deployment exec laconicd "laconicd keys export --unarmored-hex --unsafe" + + # Set your PK as 'userKey' in the config file + laconic-so deployment --dir laconic-console-deployment exec cli "nano config.yml" + + # Note: any changes made to the config will be lost when the cli Docker container is brought down + # So set / update the values in 'laconic-console-deployment/config.env' accordingly before restarting + ``` + +* Adjust / set other config values (`bondId`, `gas`, `fees`) as required and perform txs: + + ```bash + # Example + laconic-so deployment --dir laconic-console-deployment exec cli "laconic registry bond create --type photon --quantity 100000000000" + ``` + +## Clean up + +* Stop all `testnet-laconicd` services running in the background: + + ```bash + # Stop the docker containers + laconic-so deployment --dir testnet-laconicd-deployment stop + ``` + +* To stop all services and also delete data: + + ```bash + # Stop the docker containers + laconic-so deployment --dir testnet-laconicd-deployment stop --delete-volumes + + # Remove deployment directory (deployment will have to be recreated for a re-run) + rm -r testnet-laconicd-deployment + ``` + +* For `laconic-console`, see [laconic-console clean up](../laconic-console/README.md#clean-up) diff --git a/stack-orchestrator/stacks/laconicd-full-node/stack.yml b/stack-orchestrator/stacks/testnet-laconicd/stack.yml similarity index 72% rename from stack-orchestrator/stacks/laconicd-full-node/stack.yml rename to stack-orchestrator/stacks/testnet-laconicd/stack.yml index 677b1d2..82252ba 100644 --- a/stack-orchestrator/stacks/laconicd-full-node/stack.yml +++ b/stack-orchestrator/stacks/testnet-laconicd/stack.yml @@ -1,9 +1,9 @@ version: "1.0" -name: laconicd-full-node +name: testnet-laconicd description: "Laconicd full node" repos: - git.vdb.to/cerc-io/laconic2d containers: - cerc/laconic2d pods: - - laconicd-full-node + - testnet-laconicd