description | cover | coverY |
---|---|---|
For mainnet, it's recommended to use Cosmovisor to run your node. If you've not used it before, then run it during a testnet to check you can get it set up correctly. |
../.gitbook/assets/Discord Invite (29).png |
259 |
Setting up Cosmovisor is relatively straightforward. However, it does expect certain environment variables and folder structure to be set.
Cosmovisor allows you to download binaries ahead of time for chain upgrades, meaning that you can do zero (or close to zero) downtime chain upgrades. It's also useful if your local timezone means that a chain upgrade will fall at a bad time.
Rather than having to do stressful ops tasks late at night, it's always better if you can automate them away, and that's what Cosmovisor tries to do.
First, go and get cosmovisor (recommended approach):
go install cosmossdk.io/tools/cosmovisor/cmd/cosmovisor@latest
To install a previous version, you can specify the version after the @ sign. Note that versions older than 1.4.0 can also target a specific version, at a slightly different location:
go install github.com/cosmos/cosmos-sdk/cosmovisor/cmd/[email protected]
{% hint style="danger" %}
When using cosmovisor, make sure that you do not have auto download of binaries on. Ensure you have the environment variable DAEMON_ALLOW_DOWNLOAD_BINARIES
set to false
.
{% endhint %}
Your installation can be confirmed with:
which cosmovisor
This will return something like:
/home/<your-user>/go/bin/cosmovisor
{% hint style="info" %} Building from source allows you to target a specific version of Cosmovisor, in case you do not want to run 1.0.0 yet. {% endhint %}
You can also build from source; cosmovisor is in the main cosmos-sdk
repo on Github, so you can use Git tags to target a specific version. This example uses a tag, v0.42.7
that refers to the Cosmos SDK, as Cosmovisor-specific tags did not exist before August 2021. The first of these was cosmovisor/v0.1.0
, and the second is the current release, cosmovisor/v1.0.0
.
git clone https://github.com/cosmos/cosmos-sdk
cd cosmos-sdk
git checkout v0.42.7
make cosmovisor
cp cosmovisor/cosmovisor $GOPATH/bin/cosmovisor
cd $HOME
In the .profile
file, usually located at ~/.profile
, add:
export DAEMON_NAME=junod
export DAEMON_HOME=$HOME/.juno
Then source your profile to have access to these variables:
source ~/.profile
You can confirm success like so:
echo $DAEMON_NAME
It should return junod
.
Cosmovisor expects a certain folder structure:
.
├── current -> genesis or upgrades/<name>
├── genesis
│ └── bin
│ └── $DAEMON_NAME
└── upgrades
└── <name>
└── bin
└── $DAEMON_NAME
Don't worry about current
- that is simply a symlink used by Cosmovisor. The other folders will need setting up, but this is easy:
mkdir -p $DAEMON_HOME/cosmovisor/genesis/bin && mkdir -p $DAEMON_HOME/cosmovisor/upgrades
Cosmovisor needs to know which binary to use at genesis. We put this in $DAEMON_HOME/cosmovisor/genesis/bin
.
First, find the location of the binary you want to use:
which junod
Then use the path returned to copy it to the directory Cosmovisor expects. Let's assume the previous command returned /home/your-user/go/bin/junod
:
cp $HOME/go/bin/junod $DAEMON_HOME/cosmovisor/genesis/bin
cp $HOME/go/bin/junod $DAEMON_HOME/cosmovisor/genesis/bin
Post v1 versions of Cosmovisor have a command that will create the directories and copy the junod
binary into the proper directory. To create the directories and copy the binary, run this command:
cosmovisor init $HOME/go/bin/junod
Once you're done, check the folder structure looks correct using a tool like tree
.
Commands sent to Cosmovisor are sent to the underlying binary. For example, cosmovisor version
is the same as typing junod version
.
Nevertheless, just as we would manage junod
using a process manager, we would like to make sure Cosmovisor is automatically restarted if something happens, for example an error or reboot.
First, create the service file:
sudo nano /etc/systemd/system/junod.service
Change the contents of the below to match your setup - cosmovisor
is likely at ~/go/bin/cosmovisor
regardless of which installation path you took above, but it's worth checking.
Note cosmovisor run start
is only for the latest versions of cosmovisor. For earlier versions that line should be:
ExecStart=/home/<your-user>/go/bin/cosmovisor start
[Unit]
Description=Juno Daemon (cosmovisor)
After=network-online.target
[Service]
User=<your-user>
ExecStart=/home/<your-user>/go/bin/cosmovisor run start
Restart=always
RestartSec=3
LimitNOFILE=4096
Environment="DAEMON_NAME=junod"
Environment="DAEMON_HOME=/home/<your-user>/.juno"
Environment="DAEMON_ALLOW_DOWNLOAD_BINARIES=false"
Environment="DAEMON_RESTART_AFTER_UPGRADE=true"
Environment="DAEMON_LOG_BUFFER_SIZE=512"
[Install]
WantedBy=multi-user.target
{% hint style="info" %} A description of what the environment variables do can be found here. Change them depending on your setup. {% endhint %}
Note also that we set buffer size explicitly because of a live bug in Cosmovisor before version v1.0.0
. If you are using v1.0.0
, you may omit that line.
In addition, the same issue can be fixed by reducing the log via env variable. If you are unsure, ask on Discord.
{% hint style="warning" %} If syncing from a snapshot, do not start Cosmovisor yet. {% endhint %}
Finally, enable the service and start it.
sudo -S systemctl daemon-reload
sudo -S systemctl enable junod
# check config one last time before starting!
sudo systemctl start junod
Check it is running using:
sudo systemctl status junod
If you need to monitor the service after launch, you can view the logs using:
journalctl -fu junod