Quickstart

Your journey as a node runner starts here. For recommendations for system setup, please visit Setup & Recommendations.

0. Dependencies

Install Docker + Docker Compose V2
sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release

# Add Docker’s official GPG key
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
  sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# Add Docker repo
echo \
  "deb [arch=$(dpkg --print-architecture) \
  signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Install Docker Engine + CLI + Compose plugin
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Apache Utils

sudo apt install apache2-utils

Make

sudo apt install make

Git

sudo apt install -y git

Ensure you've read and satisfied Setup & Recommendations before doing quickstart!

1. Clone the deployments repo

git clone https://github.com/canopy-network/deployments.git
cd deployments

The Canopy deployments repository is the official source for setting up and operating validator infrastructure.

It contains the configuration, scripts, and monitoring tools required to participate in the Canopy network.

2. Run the setup script to create the keys for your canopy validator

chmod +x setup.sh
./setup.sh

This will prompt you to input:

  1. Stack type: select option (2)

  2. A password: to encrypt the validator key in the keystore

  3. A nickname: for your validator key in the keystore, which will be the identity for your validator operator processes.

  4. A domain: With a DOMAIN variable defined, traefik will expose and validate SSL on this endpoints externally using the prefix shown in the first running section

  5. An email: This is simply the email address used when registering an account with an ACME certificate authority like Let’s Encrypt. We use this env variable to request SSL ACME certificate during traefik HTTPS validation.

3. Configure Grafana

cd monitoring-stack
vim .env

# Update Grafana Values
GF_SECURITY_ADMIN_PASSWORD=canopy
GF_SECURITY_ADMIN_USER=admin
GF_SMTP_HOST=smtp.gmail.com:587
GF_SMTP_USER=myadrress@gmail.com
GF_SMTP_PASSWORD=mypassword
GF_SMTP_FROM_ADDRESS=myaddress@gmail.com

4. Configure your DNS

Your domain should point to your production server using wildcard subdomains:

<YOUR_SUBDOMAIN>.<YOUR_DOMAIN> A record -> SERVER IP
*.<YOUR_SUBDOMAIN>.<YOUR_DOMAIN> A record -> SERVER IP

Domain propagation can take some time! Check it with the following commands:

nslookup monitoring.<YOURDOMAIN> -> SERVER IP
nslookup node1.<YOURDOMAIN> -> SERVER IP
nslookup node2.<YOURDOMAIN> -> SERVER IP

5. Set up alerting (optional)

To receive infrastructure and canopy alerts, configure the Discord and PagerDuty notification channels:

/deployments/monitoring-stack/monitoring/grafana/provisioning/alerting /discord-alert.yaml

settings:
  avatar_url: https://miro.medium.com/v2/da:true/resize:fit:1200/0*ZjYSm_q36J4KChdn
  message: |-
      {{ define "alerts.message" -}}
        {{ if .Alerts.Firing -}}
          {{ len .Alerts.Firing }} firing alert(s)
          {{ template "alerts.summarize" .Alerts.Firing }}
        {{- end }}
        {{- if .Alerts.Resolved -}}
          {{ len .Alerts.Resolved }} resolved alert(s)
          {{ template "alerts.summarize" .Alerts.Resolved }}
        {{- end }}
      {{- end }}

      {{ define "alerts.summarize" -}}
        {{ range . -}}
        - {{ index .Annotations "summary" }}
        {{ end }}
      {{ end }}
  title: '{{ template "default.title" . }}'
  url: <YOUR-DISCORD-CHANNEL>
  use_discord_username: false

Pagerduty

/deployments/monitoring-stack/monitoring/grafana/provisioning/alerting /pagerduty-alert.yaml

receivers:
  - uid: bekha14n1fgu8d
    type: pagerduty
    settings:
      integrationKey: <YOUR-PAGERDUTY-KEY>
    disableResolveMessage: false

6. Install Loki

Installing the loki-docker-driver lets your Docker containers stream logs directly to Loki, enabling real-time log aggregation and search in Grafana.

sudo docker plugin install grafana/loki-docker-driver --alias loki

It's essential for end-to-end observability in your monitoring stack.

7. Run Canopy

Starting Canopy automatically pulls a snapshot of the latest blockchain.

cd /deployments/monitoring-stack/
sudo make start_with_snapshot

8. Explore Setup

With Canopy running, it is recommended for you to familiarize yourself with the created endpoints:

  • Grafana: https://monitoring.<YOUR_DOMAIN>

  • Web wallet for CNPY: https://node1.<YOUR_DOMAIN>/wallet

  • Block Explorer for CNPY: https://node1.<YOUR_DOMAIN>/explorer

  • Web wallet for CNRY: https://node2.<YOUR_DOMAIN>/wallet

  • Block Explorer for CNRY: https://node2.<YOUR_DOMAIN>/explorer

9. Sync the blockchain

While the snapshot is pretty close to the top of the blockchain, some syncing will be required in most cases.

Syncing status may be observed in the monitoring tab of your web wallet as well as logs and rpc.

⚠️ Importantly, both CNPY and CNRY should be fully synced and stable before staking.

If there's any sign of corruption or 'stuck' node or if there's any doubt, contact the community in discord.

10. Create an 'output' private key

Go to https://wallet.node1.<YOUR_DOMAIN>

Press "New Private Key" and fill out the form:

Nickname: name to identify the new key

Password: used to encrypt the new key

This new key will later receive your validator rewards. It is recommended to download the keyfile.json and backup using the "Download Keys" button.

11. Get CNPY

12. Stake CNPY

At https://wallet.node1.<YOUR_DOMAIN>: click the STAKE button to initiate a STAKE transaction

Parameters:

  • Account: <nickname from step 2>

    • Important: ⚠️ use the key from step 2 not step 12 ⚠️

    • This account should be the 'funded' account from step 13

    • This is the operator address, where subsequent validator transactions like (edit-stake and unstake) should be sent from.

  • Delegate: false

    • Delegates are not active validators so is not applicable for this guide

  • Committees: 1,2

    • Chain IDs where stake should be allocated

  • Amount: CNPY to stake (6 decimals)

    • Leave a few CNPY unstaked for various transactions

  • Withdrawal: false to auto-compound rewards

    • You may use true to withdrawal the rewards automatically (comes with penalty)

  • Net-addr: tcp://<YOUR_DOMAIN>

    • validator's TCP address (<YOUR DOMAIN> defined in step 4)

  • Output: <nickname from step 12>

    • Important: ⚠️ use the key from step 12 not step 2 ⚠️

    • This address to receive staking rewards (recommended: use key from step 16)

  • Signer: <nickname from step 2>

    • Account that signs the transaction

  • Memo: optional

  • Txn-fee: <default is pre-filled>

    • transaction fee (default is pre-filled)

  • Password: <password from step 2>

    • Password of signer account

If successful, you'll see something like:

13. Watch for 10 minutes

  • If STAKED STATUS remains STAKED then it's a good sign that your Validator is online and healthy

See Manage for monitoring and management details

Last updated