diff --git a/README.md b/README.md index 9ea9eef..2236ed4 100644 --- a/README.md +++ b/README.md @@ -17,16 +17,19 @@ This project is a Solana-based meme generator that allows users to connect their ## Setup - Install dependencies: + ```sh npm install ``` - Copy the `.env.example` file to `.env.local` and add your API keys: + ```sh cp .env.example .env.local ``` - Add your FAL AI key to the `.env.local` file: + ```env # Get key from https://fal.ai/ FAL_AI_KEY=your_fal_ai_key @@ -34,7 +37,7 @@ This project is a Solana-based meme generator that allows users to connect their - Setup a project on - - Visit https://app.pinata.cloud/developers/api-keys and click the `New Key` button to create a new key + - Visit and click the `New Key` button to create a new key - Choose the `Admin` scope and create the API key @@ -53,6 +56,7 @@ This project is a Solana-based meme generator that allows users to connect their ``` - Run the development server: + ```sh npm run dev ``` @@ -64,3 +68,7 @@ This project is a Solana-based meme generator that allows users to connect their - Connect your Solflare or Phantom wallet using the "Connect Wallet" button. - Select an AI model and enter a prompt to generate a meme. - Pay the required MTM tokens and wait for the meme to be generated. + +## Deploy + +Follow [instructions](./deploy/README.md) for deploying `sol-mem-gen` and `sol-token-locker` diff --git a/deploy/.registry.env.example b/deploy/.registry.env.example new file mode 100644 index 0000000..dc814bf --- /dev/null +++ b/deploy/.registry.env.example @@ -0,0 +1,10 @@ +# ENV for registry operations + +# Bond to use +REGISTRY_BOND_ID= + +# Target deployer LRN +DEPLOYER_LRN= + +# Authority to deploy the app under +AUTHORITY= diff --git a/deploy/Dockerfile b/deploy/Dockerfile new file mode 100644 index 0000000..a120b22 --- /dev/null +++ b/deploy/Dockerfile @@ -0,0 +1,40 @@ +ARG VARIANT=20-bullseye +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} + +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" \ + && npm cache clean --force > /dev/null 2>&1 + +RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ + && apt-get -y install --no-install-recommends jq bash + +# laconic-so +RUN curl -LO https://git.vdb.to/cerc-io/stack-orchestrator/releases/download/latest/laconic-so && \ +chmod +x ./laconic-so && \ +mv ./laconic-so /usr/bin/laconic-so + +# Configure the npm registry +RUN npm config set @cerc-io:registry https://git.vdb.to/api/packages/cerc-io/npm/ + +# DEBUG, remove +RUN yarn info @cerc-io/laconic-registry-cli + +# Globally install the cli package +RUN yarn global add @cerc-io/laconic-registry-cli diff --git a/deploy/README.md b/deploy/README.md new file mode 100644 index 0000000..d1cb4c8 --- /dev/null +++ b/deploy/README.md @@ -0,0 +1,120 @@ +# Deploy + +## Setup + +### sol-mem-gen + +* Clone the repo: + + ```bash + git clone git@git.vdb.to:deep-stack/sol-mem-gen.git + cd sol-mem-gen/deploy + ``` + +* Build registry CLI image: + + ```bash + docker build -t cerc/laconic-registry-cli . + + # Builds image cerc/laconic-registry-cli:latest + ``` + +* Configure `userKey` and `bondId` in the registry CLI config: + + ```bash + nano config.yml + ``` + +* Add configuration for registry operations: + + ```bash + cp .registry.env.example .registry.env + + # Fill in the required values + nano .registry.env + ``` + +* Add configuration for the app: + + ```bash + curl -s https://git.vdb.to/deep-stack/sol-mem-gen/raw/branch/main/.env.example -o .app.env + + # Fill in the required values + nano .app.env + ``` + +### sol-token-locker + +* Create a dir for `sol-token-locker` deployment: + + ```bash + # In deployments dir + mkdir sol-token-locker + cd sol-token-locker + ``` + +* Follow [instructions](https://git.vdb.to/deep-stack/sol-token-locker/src/branch/main/stack-orchestrator/stacks/sol-token-locker/README.md) to setup the `sol-token-locker` stack in `sol-token-locker` directory + +## Run + +### sol-mem-gen + +* Update configuration for the app as required: + + ```bash + # In sol-mem-gen/deploy dir + nano sol-mem-gen/.app.env + ``` + +* Deploy `sol-mem-gen` App: + + ```bash + docker run -it \ + -v ./:/app/deploy -w /app/deploy \ + -e DEPLOYMENT_DNS=memes.markto.market \ + cerc/laconic-registry-cli:latest \ + ./deploy.sh + ``` + +* Check deployment logs on deployer UI: + +* Visit deployed app: + +* To redeploy the app (using `main` branch), repeat the previous steps + +### sol-token-locker + +* Update configuration for token locker as required: + + ```bash + # In deployments dir + cd sol-token-locker + nano sol-token-locker-deployment/config.env + ``` + + * [Config reference](https://git.vdb.to/deep-stack/sol-token-locker/src/branch/main/stack-orchestrator/stacks/sol-token-locker/README.md#configuration) + +* Start the deployment: + + ```bash + laconic-so deployment --dir sol-token-locker-deployment start + ``` + +* Follow logs: + + ```bash + laconic-so deployment --dir sol-token-locker-deployment logs sol-token-locker -f + ``` + +* For updating the deployment: + + ```bash + # Stop the deployment + laconic-so deployment --dir sol-token-locker-deployment stop + + # Update the config as required + nano sol-token-locker-deployment/config.env + + # Re-start deployment + laconic-so deployment --dir sol-token-locker-deployment start + ``` diff --git a/deploy/config.yml b/deploy/config.yml new file mode 100644 index 0000000..0d5bbdb --- /dev/null +++ b/deploy/config.yml @@ -0,0 +1,10 @@ +# Registry CLI config +services: + registry: + rpcEndpoint: 'https://laconicd-sapo.laconic.com' + gqlEndpoint: 'https://laconicd-sapo.laconic.com/api' + userKey: + bondId: + chainId: laconic-testnet-2 + fees: 2.5 + gasPrice: 0.01alnt diff --git a/deploy/deploy.sh b/deploy/deploy.sh new file mode 100755 index 0000000..5c15c37 --- /dev/null +++ b/deploy/deploy.sh @@ -0,0 +1,126 @@ +#!/bin/bash + +# Fail on error +set -e + +source .registry.env +echo "Using REGISTRY_BOND_ID: $REGISTRY_BOND_ID" +echo "Using DEPLOYER_LRN: $DEPLOYER_LRN" +echo "Using AUTHORITY: $AUTHORITY" + +# Repository URL +REPO_URL="https://git.vdb.to/deep-stack/sol-mem-gen" + +# Get the latest commit hash from the repository +LATEST_HASH=$(git ls-remote $REPO_URL HEAD | awk '{print $1}') + +PACKAGE_VERSION=$(curl -s $REPO_URL/raw/branch/main/package.json | jq -r .version) +APP_NAME=sol-mem-gen + +echo "Repo: ${REPO_URL}" +echo "Latest hash: ${LATEST_HASH}" +echo "App version: ${PACKAGE_VERSION}" +echo "Deployment DNS: ${DEPLOYMENT_DNS}" + +# Current date and time for note +CURRENT_DATE_TIME=$(date -u) + +CONFIG_FILE=config.yml + +# Reference: https://git.vdb.to/cerc-io/test-progressive-web-app/src/branch/main/scripts + +# Get latest version from registry and increment application-record version +NEW_APPLICATION_VERSION=$(laconic -c $CONFIG_FILE registry record list --type ApplicationRecord --all --name "$APP_NAME" 2>/dev/null | jq -r -s ".[] | sort_by(.createTime) | reverse | [ .[] | select(.bondId == \"$REGISTRY_BOND_ID\") ] | .[0].attributes.version" | awk -F. -v OFS=. '{$NF += 1 ; print}') + +if [ -z "$NEW_APPLICATION_VERSION" ] || [ "1" == "$NEW_APPLICATION_VERSION" ]; then + # Set application-record version if no previous records were found + NEW_APPLICATION_VERSION=0.0.1 +fi + +# Generate application-record.yml with incremented version +mkdir records +RECORD_FILE=./records/application-record.yml + +cat >$RECORD_FILE <