Manual Installation (Cosmovisor)
Recommended Hardware: 8 Cores, 32GB RAM, 500GB of storage (NVME), 25 MBit/s
1. Install dependencies, if required
sudo apt update && sudo apt upgrade -y
sudo apt install curl git wget build-essential jq make lz4 gcc unzip pv -y
2. Install Go, if required
cd $HOME && \
ver="1.22.3"
wget "https://golang.org/dl/go$ver.linux-amd64.tar.gz" && \
sudo rm -rf /usr/local/go && \
sudo tar -C /usr/local -xzf "go$ver.linux-amd64.tar.gz" && \
rm "go$ver.linux-amd64.tar.gz" && \
echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> ~/.bash_profile && \
source ~/.bash_profile && \
go version
mkdir -p $HOME/go/bin
3. Download Story binary (v1.3.0)
cd $HOME
wget https://github.com/piplabs/story/releases/download/v1.3.0/story-linux-amd64
chmod +x story-linux-amd64
sudo mv $HOME/story-linux-amd64 $HOME/go/bin/story
source $HOME/.bash_profile
story version
4. Install Cosmovisor v1.7.0
go install cosmossdk.io/tools/cosmovisor/cmd/[email protected]
5. Create directories
mkdir -p $HOME/go/bin
mkdir -p $HOME/.story/story/cosmovisor/upgrades
mkdir -p $HOME/.story/story/cosmovisor/backup
6. Set temporary environment variables
export DAEMON_NAME=story
export DAEMON_HOME=$HOME/.story/story
export DAEMON_DATA_BACKUP_DIR=$HOME/.story/story/data
export PATH=$PATH:$HOME/go/bin:/usr/local/go/bin
7. Initialize Cosmovisor
cosmovisor init $HOME/go/bin/story
8. Download Story-Geth binary (v1.1.0)
wget https://github.com/piplabs/story-geth/releases/download/v1.1.0/geth-linux-amd64
chmod +x geth-linux-amd64
mv $HOME/geth-linux-amd64 $HOME/go/bin/story-geth
source $HOME/.bash_profile
story-geth version
mkdir -p "$HOME/.story/geth"
9. Initialize story
story init --network aeneid --moniker "<moniker>"
10. Set Custom ports
echo "export STORY_PORT="47"" >> $HOME/.bash_profile
source $HOME/.bash_profile
sed -i.bak -e "s%:1317%:${STORY_PORT}317%g;
s%:8551%:${STORY_PORT}551%g" $HOME/.story/story/config/story.toml
sed -i.bak -e "s%:26658%:${STORY_PORT}658%g;
s%:26657%:${STORY_PORT}657%g;
s%:26656%:${STORY_PORT}656%g;
s%^external_address = \"\"%external_address = \"$(wget -qO- eth0.me):${STORY_PORT}656\"%;
s%:26660%:${STORY_PORT}660%g" $HOME/.story/story/config/config.toml
11. Disable indexing
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.story/story/config/config.toml
12. Add fresh peers
sed -i.bak -e 's/^seeds *=.*/seeds = ""/' $HOME/.story/story/config/config.toml
PEERS=$(curl -sS https://story-testnet-rpc.shachopra.com/net_info | jq -r '.result.peers[] | "\(.node_info.id)@\(.remote_ip):\(.node_info.listen_addr)"' | awk -F ':' '{print $1":"$(NF)}' | paste -sd, -)
echo $PEERS
sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$PEERS\"/" $HOME/.story/story/config/config.toml
13. Create story-geth service file
sudo tee /etc/systemd/system/story-geth.service > /dev/null <<EOF
[Unit]
Description=Story Geth Client
After=network.target
[Service]
User=root
ExecStart=/root/go/bin/story-geth --aeneid --syncmode full --http --http.api eth,net,web3,engine --http.vhosts '*' --http.addr 0.0.0.0 --authrpc.addr 0.0.0.0 --http.port ${STORY_PORT}545 --authrpc.port ${STORY_PORT}551 --authrpc.vhosts '*' --ws --ws.api eth,web3,net,txpool --ws.addr 0.0.0.0 --ws.port ${STORY_PORT}546 --port 30308
Restart=on-failure
RestartSec=3
LimitNOFILE=4096
[Install]
WantedBy=multi-user.target
EOF
14. Create story service file
sudo tee /etc/systemd/system/story.service > /dev/null <<EOF
[Unit]
Description=Story Consensus Client
After=network.target
[Service]
User=root
Environment="DAEMON_NAME=story"
Environment="DAEMON_HOME=/root/.story/story"
Environment="DAEMON_ALLOW_DOWNLOAD_BINARIES=false"
Environment="DAEMON_RESTART_AFTER_UPGRADE=true"
Environment="DAEMON_DATA_BACKUP_DIR=/root/.story/story/data"
Environment="UNSAFE_SKIP_BACKUP=true"
ExecStart=/root/go/bin/cosmovisor run run
Restart=always
RestartSec=3
LimitNOFILE=4096
[Install]
WantedBy=multi-user.target
EOF
15. Download snapshot
sudo cp $HOME/.story/story/data/priv_validator_state.json $HOME/.story/priv_validator_state.json.backup
sudo rm -rf $HOME/.story/story/data
sudo rm -rf $HOME/.story/geth/aeneid/geth/chaindata
mkdir -p $HOME/.story/geth/aeneid/geth
wget -O snapshot_story.lz4 https://story-snapshot.shachopra.com:8443/downloads/snapshot_story.lz4
wget -O snapshot_storygeth.lz4.lz4 https://story-snapshot.shachopra.com:8443/downloads/snapshot_storygeth.lz4
lz4 -c -d snapshot_story.lz4 | pv | sudo tar -xv -C $HOME/.story/story/
lz4 -c -d snapshot_storygeth.lz4 | pv | sudo tar -xv -C $HOME/.story/geth/aeneid/geth/
sudo cp $HOME/.story/priv_validator_state.json.backup $HOME/.story/story/data/priv_validator_state.json
16. Add geth enode
story-geth --exec 'admin.addPeer("enode://463a4e6d9c962e3f69a1c6a7e1bd4be248ac658e4b676b7e1010d7b50731f3067ca26335ca49ac3400ea7d98dab91a7379d79980d12ad9c74ae6d98e2045c055@107.181.252.150:30308")' attach ~/.story/geth/aeneid/geth.ipc
17. Start Story & Story-Geth node
sudo systemctl daemon-reload && \
sudo systemctl enable story-geth && \
sudo systemctl enable story && \
sudo systemctl start story-geth && \
sudo systemctl start story
# check status & logs
sudo systemctl status story-geth
sudo systemctl status story
sudo journalctl -u story-geth -f -o cat
sudo journalctl -u story -f -o cat
18. Check sync status
curl localhost:${STORY_PORT}657/status | jq
19. Create Validator (if you have 1024 tokens)
story validator export --export-evm-key --evm-key-path .env
story validator create --stake 1024000000000000000000 --moniker "<moniker>" --rpc https://aeneid.storyrpc.io --chain-id 1315 --unlocked=true
20. Export your Validator key & EVM Private key
story validator export
story validator export --export-evm-key
Last updated