# Akash.Network Deployment Attempt on TestNet ###### tags: `AkashNetwork` `Tutorials` **Aim:** To go through the docs https://docs.akash.network/guides/version , understand and document simple steps to deploy an app to akash network. The steps would be helpful to design the UI application for the bounty https://gitcoin.co/issue/ovrclk/awesome-akash/177/100025806 **Tools required:** Linux based OS recommended A simple starter create-react-app or create-next-app Basic CLI knowledge **Attempt #1:** Choosen Network: ``` #testnet AKASH_NET="https://raw.githubusercontent.com/ovrclk/net/master/testnet" ``` Each network has a corresponding directory (linked to above) containing network information. Each directory includes, at a minimum: (Source:https://github.com/ovrclk/net) Version: ``` AKASH_VERSION="$(curl -s "$AKASH_NET/version.txt")" ``` ChainID: ``` export AKASH_CHAIN_ID="$(curl -s "$AKASH_NET/chain-id.txt")" ``` Genesis: ``` curl -s "$AKASH_NET/genesis.json" > genesis.json ``` Seed Nodes ``` curl -s "$AKASH_NET/seed-nodes.txt" | paste -d, -s ``` Peer Nodes ``` curl -s "$AKASH_NET/peer-nodes.txt" | paste -d, -s ``` RPC Node Print a random RPC endpoint. The akash CLI will recognize AKASH_NODE environment variable when exported to the shell ``` export AKASH_NODE="$(curl -s "$AKASH_NET/rpc-nodes.txt" | shuf -n 1)" echo $AKASH_NODE ``` API Node Print a random API endpoint ``` curl -s "$AKASH_NET/api-nodes.txt" | shuf -n 1 ``` Terminal execution output: ``` torch@torch-ablazed:~/Desktop/akash.network$ export AKASH_NET="https://raw.githubusercontent.com/ovrclk/net/master/testnet" torch@torch-ablazed:~/Desktop/akash.network$ echo $AKASH_NET https://raw.githubusercontent.com/ovrclk/net/master/testnet torch@torch-ablazed:~/Desktop/akash.network$ echo env env torch@torch-ablazed:~/Desktop/akash.network$ export AKASH_VERSION="$(curl -s "$AKASH_NET/version.txt")" torch@torch-ablazed:~/Desktop/akash.network$ export export AKASH_CHAIN_ID="$(curl -s "$AKASH_NET/chain-id.txt")" torch@torch-ablazed:~/Desktop/akash.network$ export curl -s "$AKASH_NET/genesis.json" > genesis.json bash: export: `-s': not a valid identifier bash: export: `https://raw.githubusercontent.com/ovrclk/net/master/testnet/genesis.json': not a valid identifier torch@torch-ablazed:~/Desktop/akash.network$ curl -s "$AKASH_NET/genesis.json" > genesis.json torch@torch-ablazed:~/Desktop/akash.network$ curl -s "$AKASH_NET/seed-nodes.txt" | paste -d, -s torch@torch-ablazed:~/Desktop/akash.network$ curl -s "$AKASH_NET/peer-nodes.txt" | paste -d, -s 2b027ca96b51ab4f3c69ac54fd05b7ae082fa6a8@147.75.32.11:26656,036cbb0a1e11f9cafa54623b18761b094944d1ee@147.75.32.35:26656 torch@torch-ablazed:~/Desktop/akash.network$ curl -s "$AKASH_NET/seed-nodes.txt" | paste -d, -s torch@torch-ablazed:~/Desktop/akash.network$ export AKASH_NODE="$(curl -s "$AKASH_NET/rpc-nodes.txt" | shuf -n 1)" torch@torch-ablazed:~/Desktop/akash.network$ torch@torch-ablazed:~/Desktop/akash.network$ echo $AKASH_NODE http://147.75.32.11:26657 torch@torch-ablazed:~/Desktop/akash.network$ curl -s "$AKASH_NET/api-nodes.txt" | shuf -n 1 http://147.75.32.35:1317 torch@torch-ablazed:~/Desktop/akash.network$ ``` ## Install Akash Go to https://github.com/ovrclk/akash/releases Look for the latest tag in releases section and download *akash0.12.1linuxamd64.deb* for debian based systems check for installed package by typing *akash* in terminal , it should display command utility help which has usage and available commands ## Wallet setup *Deriving a New Key Locally* Setup required environment variables , we are using default keyring backend ``` export AKASH_KEY_NAME="torch" export AKASH_KEYRING_BACKEND="os" ``` Output on creating a wallet ``` torch@torch-ablazed:~/Desktop/akash.network$ export AKASH_KEY_NAME="torch" torch@torch-ablazed:~/Desktop/akash.network$ echo $AKASH_KEY_NAME torch torch@torch-ablazed:~/Desktop/akash.network$ export AKASH_KEYRING_BACKEND="os" torch@torch-ablazed:~/Desktop/akash.network$ akash \ > --keyring-backend "$AKASH_KEYRING_BACKEND" \ > keys add "$AKASH_KEY_NAME" - name: testwallet type: local address: akash1nrerxhf7le69cgypd00tf5ux2044jkstdhjskc pubkey: akashpub1addwnpepqvvvqmcnuhpqhn2urd52y403zuwngx4n0x364cmxw0v5q6xz9e4tc4xs434 mnemonic: "" threshold: 0 pubkeys: [] **Important** write this mnemonic phrase in a safe place. It is the only way to recover your account if you ever forget your password. trumpet alert mammal bonus increase topple pioneer noble bone neutral creek tragic address replace weekend accuse beauty watch honor fake toast report laugh gold ``` Get your wallet address by running the command: ``` akash \ --keyring-backend "$AKASH_KEYRING_BACKEND" \ keys show "$AKASH_KEY_NAME" -a ``` Set the environment variable ``` export AKASH_ACCOUNT_ADDRESS="akash1nrerxhf7le69cgypd00tf5ux2044jkstdhjskc" ``` Run the command , to get faucet address ``` curl "$AKASH_NET/faucet-url.txt" ``` Visit https://akash.vitwit.com/faucet Enter account address to recieve tokens Check account balance , ``` akash \ --node "$AKASH_NODE" \ query bank balances "$AKASH_ACCOUNT_ADDRESS" ``` Output: ``` torch@torch-ablazed:~/Desktop/akash.network$ export AKASH_ACCOUNT_ADDRESS="akash1nrerxhf7le69cgypd00tf5ux2044jkstdhjskc" torch@torch-ablazed:~/Desktop/akash.network$ curl "$AKASH_NET/faucet-url.txt" https://akash.vitwit.com/faucet torch@torch-ablazed:~/Desktop/akash.network$ ^C torch@torch-ablazed:~/Desktop/akash.network$ akash \ > --node "$AKASH_NODE" \ > query bank balances "$AKASH_ACCOUNT_ADDRESS" balances: - amount: "100000000" denom: uakt pagination: next_key: null total: "0" ``` ## Deployment to akash.network Verify your environment variables ``` torch@torch-ablazed:~/Desktop/akash.network$ echo $AKASH_NODE http://147.75.32.11:26657 torch@torch-ablazed:~/Desktop/akash.network$ echo $AKASH_CHAIN_ID akash-testnet-6 torch@torch-ablazed:~/Desktop/akash.network$ echo $AKASH_ACCOUNT_ADDRESS akash1nrerxhf7le69cgypd00tf5ux2044efe0tjmfqa torch@torch-ablazed:~/Desktop/akash.network$ echo $AKASH_KEYRING_BACKEND os torch@torch-ablazed:~/Desktop/akash.network$ echo $AKASH_KEY_NAME testwallet ``` > You will need docker for this , > I am on linux mint and easiest way to install docker here is to install it from your software manager > > Search for docker.io and install it , verify it by running docker command on CLI Docker reference : https://computingforgeeks.com/install-docker-and-docker-compose-on-linux-mint-19/ Run the following commands to make sure docker installation was succesful (Source: https://stackoverflow.com/questions/48957195/how-to-fix-docker-got-permission-denied-issue ) ``` sudo groupadd docker sudo usermod -aG docker $USER newgrp docker docker run hello-world ``` Output: ``` torch@torch-ablazed:~$ sudo usermod -aG docker $USER torch@torch-ablazed:~$ newgrp docker torch@torch-ablazed:~$ docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world b8dfde127a29: Pull complete Digest: sha256:5122f6204b6a3596e048758cabba3c46b1c937a46b5be6225b835d091b90e46c Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/ ``` ### Creating a docker image for NextJS app So , We have our docker installed , now lets create a docker image for our create-next-app > Make sure you have create-next-app globally installed using node , NPM or YARN > > or use `npx create-next-app my-app-name` Run the following commands ``` create-next-app akash-nexjs-docker cd akash-nextjs-docker ``` Make a file named `Dockerfile` and copy the content below Source: https://nextjs.org/docs/deployment#docker-image ``` # Install dependencies only when needed FROM node:alpine AS deps # Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed. RUN apk add --no-cache libc6-compat WORKDIR /app COPY package.json yarn.lock ./ RUN yarn install --frozen-lockfile # Rebuild the source code only when needed FROM node:alpine AS builder WORKDIR /app COPY . . COPY --from=deps /app/node_modules ./node_modules RUN yarn build && yarn install --production --ignore-scripts --prefer-offline # Production image, copy all the files and run next FROM node:alpine AS runner WORKDIR /app ENV NODE_ENV production RUN addgroup -g 1001 -S nodejs RUN adduser -S nextjs -u 1001 # You only need to copy next.config.js if you are NOT using the default configuration # COPY --from=builder /app/next.config.js ./ COPY --from=builder /app/public ./public COPY --from=builder --chown=nextjs:nodejs /app/.next ./.next COPY --from=builder /app/node_modules ./node_modules COPY --from=builder /app/package.json ./package.json USER nextjs EXPOSE 3000 # Next.js collects completely anonymous telemetry data about general usage. # Learn more here: https://nextjs.org/telemetry # Uncomment the following line in case you want to disable telemetry. # ENV NEXT_TELEMETRY_DISABLED 1 CMD ["yarn", "start"] ``` Run , sudo docker build -t akash-nextjs-docker . sudo docker run -p 3000:3000 akash-nextjs-docker sudo docker login sudo docker tag akash-nextjs-docker torchablazed/akash-nextjs sudo docker push torchabalzed/akash-nextjs ``` torch@torch-ablazed:~/Desktop/Docker image next /docker-akash-next$ sudo docker tag docker-akash-next torchablazed/test torch@torch-ablazed:~/Desktop/Docker image next /docker-akash-next$ sudo docker push torchablazed/test The push refers to repository [docker.io/torchablazed/test] 13fe2cb23f7c: Pushed 306c77f481c5: Pushed ac62ec5a61cc: Pushed c40cbb2dcd2f: Pushed f36022a7e4e2: Pushed 5b702d558a91: Pushed d1f5f77c9501: Pushed 6ff94098dca3: Mounted from library/node d70a24f36618: Mounted from library/node ace9a27c01e5: Mounted from library/node b2d5eeeaba3a: Mounted from library/node latest: digest: sha256:8601bcfffcf52a0ba5c742125948c4b903fb213e3608c033c13e5495ef8e6dd2 size: 2618 ``` Error resolve reference : https://stackoverflow.com/questions/41984399/denied-requested-access-to-the-resource-is-denied-docker Modifying yaml file for depplyment ``` torch@torch-ablazed:~/Desktop/akash.network$ curl -s https://raw.githubusercontent.com/ovrclk/docs/master/guides/deploy/deploy.yml > deploy.yml torch@torch-ablazed:~/Desktop/akash.network$ nano deploy.yml torch@torch-ablazed:~/Desktop/akash.network$ cat deploy.yml --- version: "2.0" services: web: image: torchablazed/akash-nextjs expose: - port: 3000 as: 80 to: - global: true profiles: compute: web: resources: cpu: units: 0.1 memory: size: 512Mi storage: size: 512Mi placement: westcoast: attributes: host: akash signedBy: anyOf: - "akash1365yvmc4s7awdyj3n2sav7xfx76adc6dnmlx63" pricing: web: denom: uakt amount: 1000 deployment: web: westcoast: profile: web count: 1 torch@torch-ablazed:~/Desktop/akash.network$ akash tx cert create client --chain-id $AKASH_CHAIN_ID --keyring-backend $AKASH_KEYRING_BACKEND --from $AKASH_KEY_NAME --node $AKASH_NODE --fees 5000uakt no certificate found for address akash1nrerxhf7le69cgypd00tf5ux2044efe0tjmfqa. generating new... {"body":{"messages":[{"@type":"/akash.cert.v1beta1.MsgCreateCertificate","owner":"akash1nrerxhf7le69cgypd00tf5ux2044efe0tjmfqa","cert":"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJ2ekNDQVdXZ0F3SUJBZ0lJRm9XMkhITW8yZ013Q2dZSUtvWkl6ajBFQXdJd1NqRTFNRE1HQTFVRUF4TXMKWVd0aGMyZ3hibkpsY25ob1pqZHNaVFk1WTJkNWNHUXdNSFJtTlhWNE1qQTBOR1ZtWlRCMGFtMW1jV0V4RVRBUApCZ1ZuZ1FVQ0JoTUdkakF1TUM0eE1CNFhEVEl4TURZd05URTBNekV4TkZvWERUSXlNRFl3TlRFME16RXhORm93ClNqRTFNRE1HQTFVRUF4TXNZV3RoYzJneGJuSmxjbmhvWmpkc1pUWTVZMmQ1Y0dRd01IUm1OWFY0TWpBME5HVm0KWlRCMGFtMW1jV0V4RVRBUEJnVm5nUVVDQmhNR2RqQXVNQzR4TUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowRApBUWNEUWdBRURIOFdkSzE1blNwOEV5cVVZa2NUOEsvY21SbDErQWFZd0ZMZFdJamphb09CZi9nM094VzJraXlqCitXU1pZbCs3azNQS1VGNVcrMUpuN2pGeXRJamtzS00xTURNd0RnWURWUjBQQVFIL0JBUURBZ1F3TUJNR0ExVWQKSlFRTU1Bb0dDQ3NHQVFVRkJ3TUNNQXdHQTFVZEV3RUIvd1FDTUFBd0NnWUlLb1pJemowRUF3SURTQUF3UlFJZwpHRUtnRVhlREg4d2NpM0lPd0hpUFVoVFBjcFhGSi95cjVQcGFmT3g5aEk4Q0lRRFNBTithYUlLZkkxRlBCSDNoCm5TUnFtSmVXd0tRKzVScFdUR1V5bFNTTXd3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=","pubkey":"LS0tLS1CRUdJTiBFQyBQVUJMSUMgS0VZLS0tLS0KTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFREg4V2RLMTVuU3A4RXlxVVlrY1Q4Sy9jbVJsMQorQWFZd0ZMZFdJamphb09CZi9nM094VzJraXlqK1dTWllsKzdrM1BLVUY1VysxSm43akZ5dElqa3NBPT0KLS0tLS1FTkQgRUMgUFVCTElDIEtFWS0tLS0tCg=="}],"memo":"","timeout_height":"0","extension_options":[],"non_critical_extension_options":[]},"auth_info":{"signer_infos":[],"fee":{"amount":[{"denom":"uakt","amount":"5000"}],"gas_limit":"200000","payer":"","granter":""}},"signatures":[]} confirm transaction before signing and broadcasting [y/N]: y {"height":"664389","txhash":"EAE4EBC2911E8CDC0A706CB9EAA9281E931396BE91838B0FBA6A6F03217FD997","codespace":"","code":0,"data":"0A190A17636572742D6372656174652D6365727469666963617465","raw_log":"[{\"events\":[{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"cert-create-certificate\"},{\"key\":\"sender\",\"value\":\"akash1nrerxhf7le69cgypd00tf5ux2044jkstdhjskc\"}]},{\"type\":\"transfer\",\"attributes\":[{\"key\":\"recipient\",\"value\":\"akash17xpfvakm2amg962yls6f84z3kell8c5lazw8j8\"},{\"key\":\"sender\",\"value\":\"akash1nrerxhf7le69cgypd00tf5ux2044jkstdhjskc\"},{\"key\":\"amount\",\"value\":\"5000uakt\"}]}]}]","logs":[{"msg_index":0,"log":"","events":[{"type":"message","attributes":[{"key":"action","value":"cert-create-certificate"},{"key":"sender","value":"akash1nrerxhf7le69cgypd00tf5ux2044jkstdhjskc"}]},{"type":"transfer","attributes":[{"key":"recipient","value":"akash17xpfvakm2amg962yls6f84z3kell8c5lazw8j8"},{"key":"sender","value":"akash1nrerxhf7le69cgypd00tf5ux2044jkstdhjskc"},{"key":"amount","value":"5000uakt"}]}]}],"info":"","gas_wanted":"200000","gas_used":"92932","tx":null,"timestamp":""} torch@torch-ablazed:~/Desktop/akash.network$ akash tx deployment create deploy.yml --from $AKASH_KEY_NAME --node $AKASH_NODE --chain-id $AKASH_CHAIN_ID --fees 5000uakt -y {"height":"664394","txhash":"6DC3828385131D5DF69E0F5A34B7A3C948B2BD431EEA7EC62763D0F0096AC40D","codespace":"","code":0,"data":"0A130A116372656174652D6465706C6F796D656E74","raw_log":"[{\"events\":[{\"type\":\"akash.v1\",\"attributes\":[{\"key\":\"module\",\"value\":\"deployment\"},{\"key\":\"action\",\"value\":\"deployment-created\"},{\"key\":\"version\",\"value\":\"eff03d46350ed2ce9af34bbd0d73091bf214b984e9e05cf4adcbf4046b9cbc4e\"},{\"key\":\"owner\",\"value\":\"akash1nrerxhf7le69cgypd00tf5ux2044jkstdhjskc\"},{\"key\":\"dseq\",\"value\":\"664393\"},{\"key\":\"module\",\"value\":\"market\"},{\"key\":\"action\",\"value\":\"order-created\"},{\"key\":\"owner\",\"value\":\"akash1nrerxhf7le69cgypd00tf5ux2044jkstdhjskc\"},{\"key\":\"dseq\",\"value\":\"664393\"},{\"key\":\"gseq\",\"value\":\"1\"},{\"key\":\"oseq\",\"value\":\"1\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"create-deployment\"},{\"key\":\"sender\",\"value\":\"akash1nrerxhf7le69cgypd00tf5ux2044jkstdhjskc\"},{\"key\":\"sender\",\"value\":\"akash1nrerxhf7le69cgypd00tf5ux2044jkstdhjskc\"}]},{\"type\":\"transfer\",\"attributes\":[{\"key\":\"recipient\",\"value\":\"akash17xpfvakm2amg962yls6f84z3kell8c5lazw8j8\"},{\"key\":\"sender\",\"value\":\"akash1nrerxhf7le69cgypd00tf5ux2044jkstdhjskc\"},{\"key\":\"amount\",\"value\":\"5000uakt\"},{\"key\":\"recipient\",\"value\":\"akash14pphss726thpwws3yc458hggufynm9x77l4l2u\"},{\"key\":\"sender\",\"value\":\"akash1nrerxhf7le69cgypd00tf5ux2044jkstdhjskc\"},{\"key\":\"amount\",\"value\":\"5000000uakt\"}]}]}]","logs":[{"msg_index":0,"log":"","events":[{"type":"akash.v1","attributes":[{"key":"module","value":"deployment"},{"key":"action","value":"deployment-created"},{"key":"version","value":"eff03d46350ed2ce9af34bbd0d73091bf214b984e9e05cf4adcbf4046b9cbc4e"},{"key":"owner","value":"akash1nrerxhf7le69cgypd00tf5ux2044jkstdhjskc"},{"key":"dseq","value":"664393"},{"key":"module","value":"market"},{"key":"action","value":"order-created"},{"key":"owner","value":"akash1nrerxhf7le69cgypd00tf5ux2044jkstdhjskc"},{"key":"dseq","value":"664393"},{"key":"gseq","value":"1"},{"key":"oseq","value":"1"}]},{"type":"message","attributes":[{"key":"action","value":"create-deployment"},{"key":"sender","value":"akash1nrerxhf7le69cgypd00tf5ux2044jkstdhjskc"},{"key":"sender","value":"akash1nrerxhf7le69cgypd00tf5ux2044jkstdhjskc"}]},{"type":"transfer","attributes":[{"key":"recipient","value":"akash17xpfvakm2amg962yls6f84z3kell8c5lazw8j8"},{"key":"sender","value":"akash1nrerxhf7le69cgypd00tf5ux2044jkstdhjskc"},{"key":"amount","value":"5000uakt"},{"key":"recipient","value":"akash14pphss726thpwws3yc458hggufynm9x77l4l2u"},{"key":"sender","value":"akash1nrerxhf7le69cgypd00tf5ux2044jkstdhjskc"},{"key":"amount","value":"5000000uakt"}]}]}],"info":"","gas_wanted":"200000","gas_used":"94608","tx":null,"timestamp":""} torch@torch-ablazed:~/Desktop/akash.network$ ``` **Set the environment variables** ``` export AKASH_DSEQ=<ID_FROM_TX> AKASH_OSEQ="1" AKASH_GSEQ="1" ``` ### As the deployment on testnet has no providers , upon verifying the depolyment it is invalid ``` torch@torch-ablazed:~/Desktop/akash.network$ akash query deployment get --owner $AKASH_ACCOUNT_ADDRESS --node $AKASH_NODE --dseq $AKASH_DSEQ Error: Deployment not found: invalid request ```