Add a laconic-console stack with registry CLI and console #2
@ -1,5 +1,6 @@
|
|||||||
# testnet-laconicd-stack
|
# 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)
|
||||||
|
@ -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:
|
@ -10,7 +10,7 @@ services:
|
|||||||
CERC_LOGLEVEL: ${CERC_LOGLEVEL:-info}
|
CERC_LOGLEVEL: ${CERC_LOGLEVEL:-info}
|
||||||
volumes:
|
volumes:
|
||||||
- laconicd-data:/root/.laconicd
|
- laconicd-data:/root/.laconicd
|
||||||
- ../config/laconicd/scripts/run-laconicd.sh:/opt/run-laconicd.sh
|
- ../config/laconicd/run-laconicd.sh:/opt/run-laconicd.sh
|
||||||
ports:
|
ports:
|
||||||
- "6060"
|
- "6060"
|
||||||
- "26657"
|
- "26657"
|
23
stack-orchestrator/config/laconic-console/cli/create-config.sh
Executable file
23
stack-orchestrator/config/laconic-console/cli/create-config.sh
Executable file
@ -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 <<EOF > $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"
|
@ -0,0 +1,6 @@
|
|||||||
|
# Config for laconic-console
|
||||||
|
|
||||||
|
services:
|
||||||
|
wns:
|
||||||
|
server: 'LACONIC_HOSTED_ENDPOINT/api'
|
||||||
|
webui: 'LACONIC_HOSTED_ENDPOINT/console'
|
@ -44,4 +44,9 @@ fi
|
|||||||
sed -i "s/^persistent_peers *=.*/persistent_peers = \"$CERC_PEERS\"/g" $NODE_HOME/config/config.toml
|
sed -i "s/^persistent_peers *=.*/persistent_peers = \"$CERC_PEERS\"/g" $NODE_HOME/config/config.toml
|
||||||
|
|
||||||
echo "Starting laconicd node..."
|
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
|
@ -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
|
10
stack-orchestrator/container-build/cerc-laconic2-console-host/build.sh
Executable file
10
stack-orchestrator/container-build/cerc-laconic2-console-host/build.sh
Executable file
@ -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
|
@ -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"]
|
9
stack-orchestrator/container-build/cerc-laconic2-registry-cli/build.sh
Executable file
9
stack-orchestrator/container-build/cerc-laconic2-registry-cli/build.sh
Executable file
@ -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
|
@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
# Build cerc/laconicd
|
# Build cerc/laconic2d
|
||||||
source ${CERC_CONTAINER_BASE_DIR}/build-base.sh
|
source ${CERC_CONTAINER_BASE_DIR}/build-base.sh
|
||||||
docker build -t cerc/laconic2d:local ${build_command_args} ${CERC_REPO_BASE_DIR}/laconic2d
|
docker build -t cerc/laconic2d:local ${build_command_args} ${CERC_REPO_BASE_DIR}/laconic2d
|
||||||
|
@ -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 <your-package-list-here>"
|
||||||
|
|
||||||
|
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"]
|
@ -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
|
35
stack-orchestrator/container-build/cerc-webapp-base/build.sh
Executable file
35
stack-orchestrator/container-build/cerc-webapp-base/build.sh
Executable file
@ -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 <<EOF
|
||||||
|
|
||||||
|
#################################################################
|
||||||
|
|
||||||
|
Built host container for $CERC_CONTAINER_BUILD_WORK_DIR with tag:
|
||||||
|
|
||||||
|
$CERC_CONTAINER_BUILD_TAG
|
||||||
|
|
||||||
|
To test locally run:
|
||||||
|
|
||||||
|
laconic-so run-webapp --image $CERC_CONTAINER_BUILD_TAG --env-file /path/to/environment.env
|
||||||
|
|
||||||
|
EOF
|
||||||
|
fi
|
@ -0,0 +1,33 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ -n "$CERC_SCRIPT_DEBUG" ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
|
WORK_DIR="${1:-./}"
|
||||||
|
|
||||||
|
cd "${WORK_DIR}" || exit 1
|
||||||
|
|
||||||
|
if [ -f ".env" ]; then
|
||||||
|
TMP_ENV=`mktemp`
|
||||||
|
declare -px > $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
|
@ -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_<path-through-objects>=<value>
|
||||||
|
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
|
61
stack-orchestrator/container-build/cerc-webapp-base/scripts/build-app.sh
Executable file
61
stack-orchestrator/container-build/cerc-webapp-base/scripts/build-app.sh
Executable file
@ -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
|
@ -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}"
|
141
stack-orchestrator/stacks/laconic-console/README.md
Normal file
141
stack-orchestrator/stacks/laconic-console/README.md
Normal file
@ -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 <http://localhost:8080>
|
||||||
|
|
||||||
|
* 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
|
||||||
|
```
|
12
stack-orchestrator/stacks/laconic-console/stack.yml
Normal file
12
stack-orchestrator/stacks/laconic-console/stack.yml
Normal file
@ -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
|
@ -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 <key-name>"
|
|
||||||
|
|
||||||
# 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 <key-name> --recover"
|
|
||||||
|
|
||||||
# Query the keystore for your account's address
|
|
||||||
laconic-so deployment --dir laconic-full-node-deployment exec laconicd "laconicd keys show <key-name> -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 <key-name>"
|
|
||||||
```
|
|
||||||
|
|
||||||
* 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 <<EOF > <your-node-moniker>-validator.json
|
|
||||||
{
|
|
||||||
"pubkey": $(laconicd cometbft show-validator),
|
|
||||||
"amount": "900000000photon",
|
|
||||||
"moniker": "<your-node-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 <your-node-moniker>-validator.json \
|
|
||||||
--fees 50photon \
|
|
||||||
--chain-id=laconic_9000-1 \
|
|
||||||
--from <key-name>'
|
|
||||||
```
|
|
||||||
|
|
||||||
* View your staking validator details:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
laconic-so deployment --dir laconic-full-node-deployment exec laconicd "laconicd query staking validator <key-name>"
|
|
||||||
```
|
|
||||||
|
|
||||||
## 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
|
|
||||||
```
|
|
289
stack-orchestrator/stacks/testnet-laconicd/README.md
Normal file
289
stack-orchestrator/stacks/testnet-laconicd/README.md
Normal file
@ -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 <http://localhost:8080>
|
||||||
|
|
||||||
|
* 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 <key-name>"
|
||||||
|
|
||||||
|
# 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 <key-name> --recover"
|
||||||
|
|
||||||
|
# Query the keystore for your account's address
|
||||||
|
laconic-so deployment --dir testnet-laconicd-deployment exec laconicd "laconicd keys show <key-name> -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 <key-name>"
|
||||||
|
```
|
||||||
|
|
||||||
|
* Create required validator configuration:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Edit the staking amount and other fields as required
|
||||||
|
laconic-so deployment --dir testnet-laconicd-deployment exec laconicd 'cat <<EOF > <your-node-moniker>-validator.json
|
||||||
|
{
|
||||||
|
"pubkey": $(laconicd cometbft show-validator),
|
||||||
|
"amount": "900000000photon",
|
||||||
|
"moniker": "<your-node-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 <your-node-moniker>-validator.json \
|
||||||
|
--fees 50photon \
|
||||||
|
--chain-id=laconic_9000-1 \
|
||||||
|
--from <key-name>'
|
||||||
|
```
|
||||||
|
|
||||||
|
* View your staking validator details:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
laconic-so deployment --dir testnet-laconicd-deployment exec laconicd "laconicd query staking validator <key-name>"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 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 <key-name> --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)
|
@ -1,9 +1,9 @@
|
|||||||
version: "1.0"
|
version: "1.0"
|
||||||
name: laconicd-full-node
|
name: testnet-laconicd
|
||||||
description: "Laconicd full node"
|
description: "Laconicd full node"
|
||||||
repos:
|
repos:
|
||||||
- git.vdb.to/cerc-io/laconic2d
|
- git.vdb.to/cerc-io/laconic2d
|
||||||
containers:
|
containers:
|
||||||
- cerc/laconic2d
|
- cerc/laconic2d
|
||||||
pods:
|
pods:
|
||||||
- laconicd-full-node
|
- testnet-laconicd
|
Loading…
Reference in New Issue
Block a user