# Node Installation

## [EXPLORER](https://testnet.storyscan.app/)

* **Minimum hardware requirements**:

| Node Type | CPU | RAM | Storage |
| --------- | --- | --- | ------- |
| Testnet   | 4   | 8GB | 200GB   |

## 1) Auto\_install script

```bash
source <(curl -s https://raw.githubusercontent.com/111STAVR111/props/main/Story/storyt)
```

## 2) Manual installation

#### Preparing the server

```bash
sudo apt update && sudo apt upgrade -y
sudo apt install curl tar wget clang pkg-config libssl-dev jq build-essential bsdmainutils git make ncdu gcc git jq chrony liblz4-tool -y
```

### GO 1.22.2

```bash
ver="1.22.2"
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" >> $HOME/.bash_profile
source $HOME/.bash_profile
go version
```

## Build 18.01.25

```bash
cd $HOME && mkdir -p go/bin/
wget -O geth https://github.com/piplabs/story-geth/releases/download/v0.10.1/geth-linux-amd64
chmod +x geth
mv ~/geth ~/go/bin/geth
git clone https://github.com/piplabs/story
cd $HOME/story
git checkout v0.13.2
go build -o story ./client
sudo mv $HOME/story/story $HOME/go/bin/
mkdir -p ~/.story/story
mkdir -p ~/.story/geth
```

`story version`

* Version: v0.13.2-stable
* Git commit: c9c57b2

`geth version`&#x20;

* Version: 0.10.1-stable
* Git Commit: b60a3ba8d47e60a6c78ca0570f7dac66e8976d93

## Initiation

```python
story init --network odyssey --moniker "STAVR_guide"
```

## Download Genesis

```bash
wget -O $HOME/.story/story/config/genesis.json https://raw.githubusercontent.com/111STAVR111/props/refs/heads/main/Story/genesis.json
```

`sha256sum $HOME/.story/story/config/genesis.json`

* d332e9082222cc0dd6fe4e9943eafc89b2ce5e118a75ffa01b77e549fdd12587

### Download addrbook (upd every 2h)

```bash
wget -O $HOME/.story/story/config/addrbook.json "https://story-archive.snapshot.stavr.tech/addrbook.json"
```

## Create a service file

```bash
sudo tee /etc/systemd/system/story-geth.service > /dev/null <<EOF
[Unit]
Description=Story Geth Client
After=network.target

[Service]
User=$USER
ExecStart=$HOME/go/bin/geth --odyssey --syncmode full --http --http.api eth,net,web3,engine --http.vhosts '*' --http.addr 127.0.0.1 --http.port 8545 --ws --ws.api eth,web3,net,txpool --ws.addr 127.0.0.1 --ws.port 8546
Restart=on-failure
RestartSec=3
LimitNOFILE=4096

[Install]
WantedBy=multi-user.target
EOF

sudo tee /etc/systemd/system/story.service > /dev/null <<EOF
[Unit]
Description=Story Consensus Client
After=network.target

[Service]
User=$USER
WorkingDirectory=$HOME/.story/story
ExecStart=$HOME/go/bin/story run
Restart=on-failure
RestartSec=3
LimitNOFILE=4096

[Install]
WantedBy=multi-user.target
EOF
```

## StateSync Story Testnet

```bash
SOON
```

## SnapShot Testnet (updated every 12 hours)

{% hint style="success" %} <mark style="color:orange;">**You can check the size and time of snapshot creation with this command**</mark> \
`curl -sI https://story.snapshot.stavr.tech/story-snap.tar.lz4 | grep "last" && curl -sI https://story.snapshot.stavr.tech/story-snap.tar.lz4 | grep content-length | awk '{printf "%.2f GB\n", $2/1024/1024/1024}'`\
\
`curl -sI https://story.snapshot.stavr.tech/story_geth-snap.tar.lz4 | grep "last" && curl -sI https://story.snapshot.stavr.tech/story_geth-snap.tar.lz4 | grep content-length | awk '{printf "%.2f GB\n", $2/1024/1024/1024}'`
{% endhint %}

```bash
cd $HOME
snap install lz4
sudo systemctl stop story story-geth
cp $HOME/.story/story/data/priv_validator_state.json $HOME/.story/story/priv_validator_state.json.backup
rm -rf $HOME/.story/story/data
rm -rf $HOME/.story/geth/odyssey/geth/chaindata
curl -o - -L https://story.snapshot.stavr.tech/story-snap.tar.lz4 | lz4 -c -d - | tar -x -C $HOME/.story/story/
curl -o - -L https://story.snapshot.stavr.tech/story_geth-snap.tar.lz4 | lz4 -c -d - | tar -x -C $HOME/.story/geth/odyssey/geth/
mv $HOME/.story/story/priv_validator_state.json.backup $HOME/.story/story/data/priv_validator_state.json
wget -O $HOME/.story/story/config/addrbook.json "https://raw.githubusercontent.com/111STAVR111/props/main/Story/addrbook.json"
sudo systemctl restart story-geth
sudo systemctl restart story && sudo journalctl -fu story -ocat
```

## SnapShot Testnet Archive (updated every 2 days)

{% hint style="success" %} <mark style="color:orange;">**You can check the size and time of snapshot creation with this command**</mark> \
`curl -sI https://story-archive.snapshot.stavr.tech/story-snap.tar.lz4 | grep "last" && curl -sI https://story-archive.snapshot.stavr.tech/story-snap.tar.lz4 | grep content-length | awk '{printf "%.2f GB\n", $2/1024/1024/1024}'`\
\
`curl -sI https://story-archive.snapshot.stavr.tech/story_geth-snap.tar.lz4 | grep "last" && curl -sI https://story-archive.snapshot.stavr.tech/story_geth-snap.tar.lz4 | grep content-length | awk '{printf "%.2f GB\n", $2/1024/1024/1024}'`
{% endhint %}

```bash
cd $HOME
snap install lz4
sudo systemctl stop story
sudo systemctl stop story-geth
cp $HOME/.story/story/data/priv_validator_state.json $HOME/.story/story/priv_validator_state.json.backup
rm -rf $HOME/.story/story/data
rm -rf $HOME/.story/geth/odyssey/geth/chaindata
curl -o - -L https://story-archive.snapshot.stavr.tech/story-snap.tar.lz4 | lz4 -c -d - | tar -x -C $HOME/.story/story/
curl -o - -L https://story-archive.snapshot.stavr.tech/story_geth-snap.tar.lz4 | lz4 -c -d - | tar -x -C $HOME/.story/geth/odyssey/geth/
mv $HOME/.story/story/priv_validator_state.json.backup $HOME/.story/story/data/priv_validator_state.json
wget -O $HOME/.story/story/config/addrbook.json "https://raw.githubusercontent.com/111STAVR111/props/main/Story/addrbook.json"
sudo systemctl restart story-geth
sudo systemctl restart story && sudo journalctl -fu story -ocat
```

### Start

```bash
sudo systemctl daemon-reload
sudo systemctl enable story-geth
sudo systemctl enable story
sudo systemctl restart story-geth && sudo journalctl -fu story-geth -o cat
sudo systemctl restart story && sudo journalctl -fu story -o cat
```

### Live Peers (upd every 2h)

```bash
PEERS_URL="https://story-archive.snapshot.stavr.tech/peers-scan.txt"
update_peers() {
PEERS=$(curl -s $PEERS_URL | sed -n 's/^PEERS="\([^"]*\)"$/\1/p')
if [ -n "$PEERS" ]; then
sed -i -e "/^\[p2p\]/,/^\[/{s/^[[:space:]]*persistent_peers *=.*/persistent_peers = \"$PEERS\"/}" $HOME/.story/story/config/config.toml
echo -e "🔥Peers updated successfully 🔥"
else
echo "Failed to get peer data. Check the URL or try again later."
fi
}
update_peers
```

### Wallet

```bash
story validator export
```

### Create validator

```python
story validator create --stake 1500000000000000000000 --moniker STAVR_Guide --private-key $(cat $HOME/.story/story/config/private_key.txt | grep "PRIVATE_KEY" | awk -F'=' '{print $2}')
```

Check the <mark style="color:green;">node status:</mark>

```
curl localhost:26657/status | jq
```

Check the <mark style="color:red;">sync status:</mark>

```
curl -s http://localhost:26657/status | jq .result.sync_info
```

## [🧩Services and Tools🧩](https://stavr-team.gitbook.io/nodes-guides/testnets/story-network/statesync-snapshot)

## Monitoring

You can set up your node status alarm here - [Monitoring](https://stavr-team.gitbook.io/nodes-guides/monitoring)

## Security

You can create secure management of your wallet and your node by following this links.

[TMKMS](https://stavr-team.gitbook.io/nodes-guides/tmkms)               [Wallet Security](https://stavr-team.gitbook.io/nodes-guides/wallet-security)

### Delete node

```bash
sudo systemctl stop story-geth story
sudo systemctl disable story-geth story
rm /etc/systemd/system/story-geth.service /etc/systemd/system/story.service
sudo systemctl daemon-reload
cd $HOME
rm -rf .story story
rm -rf $(which story)
rm -rf $(which geth)
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://stavr-team.gitbook.io/nodes-guides/testnets/story-network/node-installation.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
