Quickstart
Your journey as a node runner starts here. For recommendations for system setup, please visit Setup & Recommendations.
Disclaimer: Canopy is alpha-stage software. While documentation and guides are provided to assist users, they are offered without warranties, guarantees, or assurances of reliability. Users are solely responsible for any issues that may arise, including but not limited to the loss of funds. Please proceed with caution.
0. Dependencies
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.
Checkout this and extend this repository for more configuration options
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:
Stack type: select option (2)
A password: to encrypt the validator key in the keystore
A nickname: for your validator key in the keystore, which will be the identity for your validator operator processes.
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 sectionAn 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.
Save this information! It'll be used later
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
Grafana configurations like GF_SECURITY_ADMIN_PASSWORD
should also be updated for production setups. Checkout Grafana's docker-image configuration guide
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
Syncing from scratch is also an option: you may remove the SNAPSHOT_1_URL
and SNAPSHOT_2_URL
from the .env
file.
Important:
Subsequent calls to start_with_snapshot will reset the datadirectory back to the latest snapshot
Use
make up
for a standard start without downloading the snapshot.(See
/deployments/monitoring/makefile
for additional details)
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:
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
Canopy Betanet is permissioned. Please fill out this application for consideration.
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 rewardsYou 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
Last updated