# 0g Node Installation Guide

By [@Nelson](https://paragraph.com/@nelson-5) · 2024-08-06

---

### Update **Dependencies:**

> To successfully install new libraries and tools, it is better to update the old dependencies

    sudo apt update
    sudo apt install curl git jq build-essential gcc unzip wget lz4 -y
    

### Install GO:

    cd $HOME && \\
    ver="1.21.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" >> $HOME/.bash_profile && \\
    source $HOME/.bash_profile && \\
    go version
    

### Install binary:

    git clone -b v0.1.0 <https://github.com/0glabs/0g-chain.git>
    ./0g-chain/networks/testnet/install.sh
    source .profile
    

### Set variables (you can personalize them):

> Variables will be used further for convenience

    echo 'export MONIKER="type_your_moniker_nodebrand"' >> ~/.bash_profile
    echo 'export CHAIN_ID="zgtendermint_16600-1"' >> ~/.bash_profile
    echo 'export WALLET_NAME="wallet"' >> ~/.bash_profile
    echo 'export RPC_PORT="26657"' >> ~/.bash_profile
    source $HOME/.bash_profile
    

### Initialize the node:

    cd $HOME
    0gchaind config chain-id $CHAIN_ID
    0gchaind init $MONIKER --chain-id $CHAIN_ID
    0gchaind config node tcp://localhost:$RPC_PORT
    0gchaind config keyring-backend os
    

### Install current release:

    wget -P ~/.0gchain/config <https://github.com/0glabs/0g-chain/releases/download/v0.1.0/genesis.json>
    

### Configure **config.toml** file:

    PEERS="" && \\
    SEEDS="c4d619f6088cb0b24b4ab43a0510bf9251ab5d7f@54.241.167.190:26656,44d11d4ba92a01b520923f51632d2450984d5886@54.176.175.48:26656,f2693dd86766b5bf8fd6ab87e2e970d564d20aff@54.193.250.204:26656,f878d40c538c8c23653a5b70f615f8dccec6fb9f@54.215.187.94:26656" && \\
    sed -i -e "s/^seeds *=.*/seeds = \\"$SEEDS\\"/; s/^persistent_peers *=.*/persistent_peers = \\"$PEERS\\"/" $HOME/.0gchain/config/config.toml
    

### Set the config:

    EXTERNAL_IP=$(wget -qO- eth0.me) \\
    PROXY_APP_PORT=26658 \\
    P2P_PORT=26656 \\
    PPROF_PORT=6060 \\
    API_PORT=1317 \\
    GRPC_PORT=9090 \\
    GRPC_WEB_PORT=9091
    

### Set the port and address:

    sed -i \\
        -e "s/\\(proxy_app = \\"tcp:\\/\\/\\)\\([^:]*\\):\\([0-9]*\\).*/\\1\\2:$PROXY_APP_PORT\\"/" \\
        -e "s/\\(laddr = \\"tcp:\\/\\/\\)\\([^:]*\\):\\([0-9]*\\).*/\\1\\2:$RPC_PORT\\"/" \\
        -e "s/\\(pprof_laddr = \\"\\)\\([^:]*\\):\\([0-9]*\\).*/\\1localhost:$PPROF_PORT\\"/" \\
        -e "/\\[p2p\\]/,/^\\[/{s/\\(laddr = \\"tcp:\\/\\/\\)\\([^:]*\\):\\([0-9]*\\).*/\\1\\2:$P2P_PORT\\"/}" \\
        -e "/\\[p2p\\]/,/^\\[/{s/\\(external_address = \\"\\)\\([^:]*\\):\\([0-9]*\\).*/\\1${EXTERNAL_IP}:$P2P_PORT\\"/; t; s/\\(external_address = \\"\\).*/\\1${EXTERNAL_IP}:$P2P_PORT\\"/}" \\
        $HOME/.0gchain/config/config.toml
    

    sed -i \\
        -e "/\\[api\\]/,/^\\[/{s/\\(address = \\"tcp:\\/\\/\\)\\([^:]*\\):\\([0-9]*\\)\\(\\".*\\)/\\1\\2:$API_PORT\\4/}" \\
        -e "/\\[grpc\\]/,/^\\[/{s/\\(address = \\"\\)\\([^:]*\\):\\([0-9]*\\)\\(\\".*\\)/\\1\\2:$GRPC_PORT\\4/}" \\
        -e "/\\[grpc-web\\]/,/^\\[/{s/\\(address = \\"\\)\\([^:]*\\):\\([0-9]*\\)\\(\\".*\\)/\\1\\2:$GRPC_WEB_PORT\\4/}" $HOME/.0gchain/config/app.toml
    

### Set the pruning:

    sed -i.bak -e "s/^pruning *=.*/pruning = \\"custom\\"/" $HOME/.0gchain/config/app.toml
    sed -i.bak -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \\"100\\"/" $HOME/.0gchain/config/app.toml
    sed -i.bak -e "s/^pruning-interval *=.*/pruning-interval = \\"10\\"/" $HOME/.0gchain/config/app.toml
    

### Set the gas price:

    sed -i "s/^minimum-gas-prices *=.*/minimum-gas-prices = \\"0ua0gi\\"/" $HOME/.0gchain/config/app.toml
    

### Set indexer:

    sed -i "s/^indexer *=.*/indexer = \\"kv\\"/" $HOME/.0gchain/config/config.toml
    

### Create a service file:

    sudo tee /etc/systemd/system/ogd.service > /dev/null <<EOF
    [Unit]
    Description=OG Node
    After=network.target
    
    [Service]
    User=$USER
    Type=simple
    ExecStart=$(which 0gchaind) start --home $HOME/.0gchain
    Restart=10
    LimitNOFILE=65535
    
    [Install]
    WantedBy=multi-user.target
    EOF
    

### Install addrbook:

    curl -Ls <https://snapshots.switchgear.top/snapshots/testnet/zero-gravity/addrbook.json> > $HOME/.0gchain/config/addrbook.json
    

### Install Spanshot:

> To speed up the process of syncing the node with the network, you should install a snapshot

    sudo systemctl stop ogd
    cp $HOME/.0gchain/data/priv_validator_state.json $HOME/.0gchain/priv_validator_state.json.backup
    rm -rf $HOME/.0gchain/data
    curl -L <http://snapshots.switchgear.top/snapshots/testnet/zero-gravity/zgtendermint_16600-1_latest.tar.lz4> | tar -Ilz4 -xf - -C $HOME/.0gchain
    mv $HOME/.0gchain/priv_validator_state.json.backup $HOME/.0gchain/data/priv_validator_state.json
    sudo systemctl restart ogd && sudo journalctl -u ogd -f -o cat
    

### Update peers

> Updating peers before connecting a node provides up-to-date information about available and verified nodes on the network, which improves the establishment of initial connections and increases the security and efficiency of the node

    PEERS=$(curl -s --max-time 3 --retry 2 --retry-connrefused "<https://snapshots.switchgear.top/snapshots/testnet/zero-gravity/peers.txt>")
    if [ -z "$PEERS" ]; then
        echo "No peers were retrieved from the URL."
    else
        echo -e "\\nPEERS: "$PEERS""
        sed -i "s/^persistent_peers *=.*/persistent_peers = "$PEERS"/" "$HOME/.0gchain/config/config.toml"
        echo -e "\\nConfiguration file updated successfully.\\n"
    fi
    

### Start node:

    sudo systemctl daemon-reload && \\\\
    sudo systemctl enable ogd && \\\\
    sudo systemctl restart ogd && sudo journalctl -u ogd -f -o cat
    

### Check node synchronization:

If you get **false,** you can install the validator. If it is `true`, you have to wait.

    0gchaind status | jq .sync_info

---

*Originally published on [@Nelson](https://paragraph.com/@nelson-5/0g-node-installation-guide)*
