This guide gets you a Canopy full node: downloads the chain, follows it, stays synced — no stake, no domain, no application, open and permissionless. What Canopy is, and what its network is actually called: Background.
Hardware requirements
The project's own figures, not yet run by the harness — the card alongside has the minimum.
The full table, the validator profile, and how these numbers were sourced
The sidebar card shows the documented minimum; this table shows the recommendation beside it.
| Resource | Documented minimum | Documented recommendation |
|---|---|---|
| CPU | 2 vCPU | 4 vCPU |
| RAM | 4 GB | 8 GB |
| Storage | 25 GB | 100 GB |
| OS | 64-bit Linux | Ubuntu 26.04 LTS |
The same page lists a larger profile for a validator running the full monitoring stack — 4 vCPU / 8 GB / 100 GB minimum, 8 / 16 / 200 recommended — and notes that swap is worth having on the smaller configurations. This guide runs the smaller of the two, because the monitoring stack is what needs the bigger box. Source: Canopy node-runner setup and recommendations.
Step 1: Choose your hardware
No domain, no static IP, no open port — a small rented server is enough.
Step 1 — the server
Shared CPU, 2-4 vCPU, billed monthly — alpha software. Deploy-screen walkthrough and the VPS roundup are below.
What to choose on the deploy screen
Field-by-field walkthrough of Vultr's deploy screen, and why Ubuntu 24.04 rather than the "26.06" the quickstart names
The provider panel is where this guide most often costs somebody money it did not need to, so this part is specific. Vultr's deploy flow is Products → Compute → Deploy, and these are the choices that matter:
- Instance type: Shared CPU. That is the Cloud Compute family, and it is the cheap one. The Dedicated CPU option beside it is Optimized Cloud Compute — a separate, more expensive product line for workloads that need a core to themselves. A full node that follows a chain is not one of them, and landing on the wrong tab is how a first node ends up costing roughly double what it needed to.
- Plan: 2 vCPU / 4 GB. The documented minimum from the table above. The 4 vCPU / 8 GB recommendation is the comfortable version of the same thing; the profile that genuinely needs a bigger box is the validator with the monitoring stack, and this guide does not run it.
- Operating system: Ubuntu 24.04 LTS, under Configure Software →
Operating System. Canopy's own material gives two different answers here
and one of them is not a release: the quickstart says it "assumes an x86
server running Ubuntu 26.06"; there has never been an Ubuntu 26.06. The
setup page recommends "Ubuntu 26.04 LTS", which is real, and which is the
figure the table above reports because it is the project's own. This guide
uses 24.04 LTS because it is the version its commands are written for
and the version the verification harness runs (
ubuntu:24.04), so it is the one this page will be checked against when the badge at the top of it is earned. Neither number changes what you paste — Step 2 is the ordinary Docker apt sequence and Docker publishes packages for 24.04 and 26.04 alike — so if you have already deployed on 26.04, carry on rather than rebuild. - Location: whichever is nearest you. Nothing has to reach this node from outside, so the region only affects how it feels to type into.
- Automatic Backups: leave it off, under Additional Features. Vultr's billing documentation prices it at an extra 20% of the instance, and everything on this box is either reproducible from this page or in the key backup you take in Step 4.
- SSH Keys: skip it if you do not already have one. Password login is enough for a node you intend to destroy, and adding a key is one more thing to get wrong on a first attempt — the connect step below assumes the password. Ubuntu server setup covers keys, and locking SSH down behind them, for when this stops being an experiment.
Sources for the field names and the backup price: Vultr's Cloud Compute provisioning guide and how much automatic backups cost.
Using hardware you already own
A spare machine works too — what it needs, and why there are no hardware links here yet
A spare machine works, and for a full node it works better than it would for a validator, because nothing has to reach you from outside. It needs to stay powered and wired, and it needs the disk headroom in the table above.
No hardware links here yet, deliberately. This site's Amazon Associates entries are still placeholders — they carry no store tag and earn nothing — and rendering one would fail a production build rather than quietly ship a dead link. Until that programme is live, the machine classes worth considering are set out in best mini PCs for running crypto nodes.
Connect to your server
Get the IP, root, and password from the provider panel, then run
ssh root@<SERVER-IP>: type yes at the prompt, paste the password (nothing
shows, that's normal), and you're in.
The full connect walkthrough, the View Console fallback, and what to do if SSH warns the host key changed
Every step from here on runs on the server, not on your own computer — with one exception, the key backup in Step 4, which says so where it appears.
Open your server's page in the provider panel first. On Vultr, that is
Products → Compute → your instance, and the page carries the IP address,
the username root, and the password, with an eye icon to reveal it and a
copy icon beside it. Vultr's documentation notes that this page shows the
initial password only: if you change it later, the panel will not know.
Then open PowerShell on Windows, or Terminal on macOS or Linux, and run
ssh root@<SERVER-IP> with your server's real address in place of
<SERVER-IP> — so, for a server at 192.0.2.123, ssh root@192.0.2.123. Three
things happen, in this order:
- A fingerprint question, the first time only. SSH prints the server's key
fingerprint and asks whether you want to continue connecting. Type the whole
word
yesand press Enter; a bareyis not accepted. This is SSH memorising the server's identity so it can warn you if it ever changes. - A password prompt. Paste the password from the panel. Nothing appears as you type or paste it — no characters, no dots, no stars. That is deliberate, not a frozen terminal. Press Enter.
- A new prompt. You are on the server once the prompt turns into something
like
root@vultr:~#. If you are not sure, runhostname— it answers with the server's name, not your own machine's.
If SSH will not cooperate at all, the same panel has a View Console button,
which opens a browser terminal already logged in to the server. Every command in
this guide works there too. Source for the panel labels and the ssh form:
Vultr — how to use SSH with Vultr servers.
On hardware you own rather than rent, the address comes from your router instead
of a panel and the rest is identical;
Ubuntu server setup covers finding it.
Step 2: Install Docker, make and git
Run this in the SSH session you opened at the end of Step 1, not on your own computer.
Canopy ships as Docker containers, so the whole stack is Docker Compose. These are the prerequisite commands from the Canopy quickstart, unchanged except that two lines the docs wrap for page width are joined here — a trailing backslash is easy to lose when you copy.
sudo apt updatesudo apt install -y ca-certificates curl gnupg lsb-releasesudo mkdir -p /etc/apt/keyringscurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpgecho "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/nullsudo apt updatesudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-pluginsudo apt install -y makesudo apt install -y gitNothing in that block is version-specific. The two $( ) substitutions in the
fifth line work out your Ubuntu release and your CPU architecture for you, which
is why the same paste is correct on 24.04 and on 26.04 — and why the version
Canopy's quickstart names, which does not exist, matters less than it looks.
Step 1 has the detail on which image to pick.
Step 3: Get the node repository
Clone from your home directory. Every later block in this guide starts by
returning to ~/node, so if you clone somewhere else, adjust them to match.
cd ~git clone https://github.com/canopy-network/node.gitThis is the repository Canopy's docs call "the official source for setting up and operating validator infrastructure". It carries the compose files, the node configuration, the genesis file, and a Makefile that wraps the useful commands. Ask the Makefile what it can do — which doubles as a check that the clone worked:
cd ~/nodemake help help Show available targets
hash-password Generate a bcrypt hash for AUTH_PASSWORDHASH (prompts for password)
pull Pull the latest canopynetwork/canopy image
node-up Start the node only (no monitoring)
up Starts everything (node, monitoring, etc.)
down Stop everything
restart Restart the nodes (reload config.json changes)
logs Tail node logs
status Show container status
snapshot Download mainnet snapshots into data/ (stops nodes first)
snapshot-up Download mainnet snapshots into data/ and start nodes
gen-key First-boot: generate validator keyStep 4: Generate the node's key
cd ~/nodemake gen-keyThis is the one command on the page you cannot paste and walk away from, so it gets its own step. It asks you for a password and then a name for the key, one after the other, and you have to type both. The password is not echoed as you type it — the same silence as the SSH password prompt in Step 1, for the same reason. Pick something you will still be able to retrieve in a year, and put it in a password manager rather than in your head.
The command writes two files into config/: validator_key.json, the node's
operator key, and keystore.json, the encrypted wallet key.
You need this step even though a full node never validates. The node's compose
file declares config/validator_key.json as a Docker secret and mounts
config/keystore.json into the container, and Docker Compose refuses to start a
service whose secret file is missing. So the key comes first, always.
Those two prompts are also why the badge at the top of this page stops where it does. The verification harness runs a guide's commands unattended, and the Canopy CLI reads the password straight from the terminal with no flag to supply it, so a run reaches the end of Step 3 and can go no further. That is a limit of the harness, not of the command — which is why this is an ordinary command block that you type like any other.
Back up those two files, off the box
These run on your own computer, not on the server. scp copies over the
same SSH connection, from your machine's side of it. Open a second terminal
window and leave the SSH session alone, or type exit in it first and use the
same window.
Copy the files one at a time with
scp root@<SERVER-IP>:node/config/keystore.json . and then
scp root@<SERVER-IP>:node/config/validator_key.json ., putting your server's
address in place of <SERVER-IP> as you did for ssh. Four things are worth
knowing before you run them:
- The remote path has no leading slash on purpose. It is relative to
root's home directory, which is where Step 3 cloned the repository — sonode/config/keystore.json. - The trailing
.is the destination, and it means "the folder this terminal is in right now". Runpwdbefore you start and read the answer: that is where the files will land. On Windows it is usually something likeC:\Users\yourname, on macOS/Users/yourname. Nothing wrong with either, as long as you know it and do not go hunting for them on the server afterwards. - It asks for the server's root password once per file — the same password you logged in with, invisible again as you type it, and twice because this is two separate commands.
- Check they actually arrived. List that folder —
lson macOS or Linux,dirin Windows PowerShell — and confirm bothkeystore.jsonandvalidator_key.jsonare there and are not zero bytes.
Then move them somewhere you will still have in a year and nobody else can read: an encrypted disk, or a password manager's file or secure-note storage. Not the downloads folder, not a plaintext file in a synced cloud drive, and not back on the server. Losing them costs you nothing today and costs you this node's identity later; leaking them hands that identity to whoever finds them.
validator_key.json and keystore.json are this node's identity, not a place
to hold funds — a full node has no stake, so there is nothing of value in them
yet. If you ever go further and start holding something you would mind losing,
that is the moment a hardware wallet earns its keep:
Hardware wallet
Ledger keeps a private key on a physical device, off the machine running your node, and asks for a button press before it signs anything. That is worth having once the key or address in question holds funds with real value. It is not required for anything on this site: every guide here runs on a testnet, testnet tokens carry no real value, and a fresh software wallet -- a new browser-extension or app wallet, ideally in its own browser profile and separate from anything holding real funds -- is enough for that. See Wallets and exchanges for node runners for the difference and where hardware wallets actually fit.
Step 5: Start the node
cd ~/nodemake node-upThat target is docker compose -f docker-compose.yml up -d node — the node
container and nothing else. The first run pulls the canopynetwork/canopy
image, so give it a few minutes on a small box.
Two things this deliberately skips, both of which the quickstart includes:
- No
.envfile. Every field in.env.exampleconfigures the domain or the monitoring stack's passwords. The node's compose file falls back tolocalhostfor the external address when no domain is set, which is what you want when you do not have one. - No snapshot. The quickstart leads with
make snapshot-up, which downloads a chain snapshot so you do not sync from block zero. It needs a.envfor the snapshot URL and it starts the whole monitoring stack, so this guide syncs from genesis instead — which the quickstart names as a supported option, and which is slower. If you would rather trade the extra RAM for the faster sync, that is the trade on offer.
Because the external address stays localhost, other peers cannot dial you: the
Configure page notes that the external address "must be configured or no inbound
peers will ever be able to be established". Your node dials out to the seed
peers listed in config/config.json instead. For following the chain that is
enough, and it is exactly why a full node needs no domain and no open port.
Verify your node
Three checks, in order, because "the command ran" and "the node works" are different claims.
1. The container is up — not just started, but still running a minute later. A node that crashes on startup shows as exited, or as restarting, because the compose file sets a restart policy.
cd ~/nodedocker compose -f docker-compose.yml ps2. It is talking to the network. This stack has no wallet, explorer or RPC endpoint reachable from outside the container, so the logs are where you look. Canopy's own quickstart names logs as one of the places sync status can be observed.
cd ~/nodedocker compose -f docker-compose.yml logs node --tail 503. It is catching up. Run the same log command again ten minutes later. The block height it reports should be higher than it was. A height that never moves means the node is running but not syncing, which is a different and worse problem than a node that will not start.
To watch the logs live rather than take a snapshot of them, use make logs —
the same command with follow turned on, which will not exit until you press
Ctrl-C.
Points, rewards, and what is actually known
"So what do I get for this?" is the question every node guide gets asked, and it is where most of them start making things up. Here is the whole of what Canopy has published, and where the line between documented and unknown falls.
What the project documents. Its questing-claims page lets a participant record their "current Canopy Testnet campaign progress for possible consideration in a future CNPY distribution", and states, in bold, on the same page: "Submitting points does not confirm eligibility, an allocation, token value, or a distribution date." That sentence is the entirety of the project's own promise, and this site is not going to add to it. Source: Canopy — Questing Claims.
What that means for the node you just built. Read the page's own mechanics carefully, because they matter here: you sign in with an EVM wallet, and Canopy says "we use this wallet to look up the campaign activity associated with it". Points are found by the wallet that took part in the campaign. The validator key you generated in Step 4 is a fresh Canopy key, not that wallet, and running a full node is not listed anywhere on that page as an activity that records points. So do not read this guide as a way to accrue anything — it is a way to run a node. If you took part in the campaign with an EVM wallet, that wallet is what the portal knows about, whether or not a node of yours is ever running.
How the recording flow works, as the page describes it: sign in at
app.canopynetwork.org/claim with the EVM wallet used during the campaign;
create or select a Canopy destination wallet, which is where a distribution
would go and which you are responsible for controlling; then review the points
shown and record the submission. Canopy adds that points "may change as campaign
activity is added or program rules are applied", and that a submission can be
updated while the portal remains available.
If the mechanics of a distribution are new to you — what a claim actually is, how to check one read-only before connecting anything, and why "connect your wallet to check eligibility" is how people lose funds — that is what what happens after a testnet ends is for. It is a page to read before a claim goes live, not after.
Background
What Canopy is, and what this network is actually called
Canopy is a layerless appchain framework — sovereign L1s launched from templates on top of a shared root chain, with validators staking on that root chain. Its node-runner documentation is unusually clear about sizing, which is why it is the first project on this site to get a guide with real commands in it.
A note on what this network is called. Canopy uses three names for it. The
configuration the node repository ships declares networkID 1, and Canopy's
Configure page defines that value as mainnet. The quickstart calls the network
"Betanet" and says it is permissioned. The points page calls the campaign the
"Canopy Testnet campaign". We have not found anywhere the project reconciles
those three, so this guide does not pick one — it just says what the commands
do. If you are here to stake, you need an application approved first, and that
is out of scope for a full node.
Common errors
Filled in properly from the first real harness run. Until then, these are the failures this stack can produce and where they come from. The shape of each one is sourced; the exact error strings are not reproduced here, because nobody has seen them yet on this path and an invented one would be worse than none.
- The node will not start and Compose complains about a missing file. Almost
certainly Step 4 was skipped or failed.
config/validator_key.jsonis declared as a Docker secret and has to exist beforemake node-up. - The Docker keyring step stops and waits. The
gpg --dearmorline in Step 2 asks before replacing an existing keyring file, so running that block a second time prompts instead of completing. make gen-keyrefuses to replace an existing key without confirmation. It prompts before overwritingvalidator_key.json. Answering yes on a node that already has a key is how you lose the old one.make gen-keywrites no key and printswriting validator key: expected newline. The nickname prompt had a space in it — see the callout above Step 4. Retry with a one-word nickname.- Killed mid-sync. The box is under the documented 4 GB, or has no swap. The setup page recommends swap specifically for the minimum configurations, and the compose file caps the node container at 4 GB.
- The height never advances. The node started but is not syncing. Worth ruling out the boring explanation first: a genesis sync on alpha software is slow, and slow is not the same as stuck.
Maintenance
- Upgrades.
make pullfetches the latestcanopynetwork/canopyimage andmake node-uprestarts the node on it. The shipped configuration also has an auto-update coordinator enabled, so the node can update itself in place. - Logs.
make logsfollows them. Canopy rotates and compresses its own logs into alogs/sub-directory, and its Configure page warns that the directory is worth watching for uncontrolled growth during the alpha and beta phases. - Disk. The chain only grows. 25 GB is a documented minimum, not a destination — check free space before you need to.
- Stopping.
make downstops the stack. Stopping the server is a different thing and, on a rented box, not the thing that ends the bill: only destroying the instance does, and destroying it wipes the disk. Take the Step 4 key backup with you before you do.
Written from the project's documentation, not from a month of running it. Once the harness has run this guide and a node has been up long enough to have an opinion, this section gets rewritten from what actually happened.
FAQ
Is there a reward for running this? Not one anybody can promise you. Canopy documentation lets participants record testnet campaign points for possible consideration in a future CNPY distribution, and says plainly that submitting them confirms no eligibility, no allocation, no token value and no date — and those points are looked up by the EVM wallet used during the campaign, not by the node you just built. Points, rewards, and what is actually known has the detail, the source, and Canopy's safety list. Anyone telling you more than that is guessing.
Can I stake and become a validator with this? Not with this guide. Staking needs the monitoring stack, a domain and CNPY — and the quickstart says the network is permissioned, so getting CNPY means applying and being accepted. A full node is a prerequisite for that path, not a short version of it.
Can I run this on my laptop? More easily than with most node guides, because a full node needs no inbound connections at all. It needs to stay on, stay connected, and have the disk.
Why is there no firewall step?
Because the setup page says full nodes do not require any custom networking. The
ufw commands in Canopy's docs sit under the validator networking requirements.
Enabling a firewall you did not plan for is a good way to lock yourself out of a
server you are renting by the month.
Why is this guide marked pending? Because nobody has run these commands and captured the output. The commands are real, and every one of them traces to Canopy's published documentation or its official repository — but that is a weaker claim than "it works", and the badge is the difference between the two. It is cleared by a harness, never by an author who thinks the commands look right.