Snapshot

Prerequisite

Install depedencies

sudo apt update
sudo apt install -y git

Install Go

wget https://go.dev/dl/go1.23.3.linux-amd64.tar.gz
sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.23.3.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
source ~/.profile
go version

Install Cosmprund

git clone https://github.com/ChorusOne/cosmprund/
cd cosmprund
make build
cp build/cosmprund /usr/local/bin/cosmprund

Snapshot

Create script file on folder : /usr/local/bin/

#!/bin/bash

set -uo pipefail

# =============================
# Mapping chain name -> root folder
# =============================
declare -A CHAINS=(
  ["dungeon"]="/root/.dungeonchain"
  ["bitbadges"]="/mnt/nvme_1tb/.bitbadgeschain"
  ["paxi"]="/mnt/nvme_2tb/paxi"
)


# =============================
# Mapping chain name -> systemd service name
# =============================
declare -A SERVICES=(
  ["dungeon"]="dungeonchaind"
  ["bitbadges"]="bitbadgeschaind"
  ["paxi"]="paxid"
)

# Base folder for all public snapshots
WEB_BASE="/var/www/snapshot"

echo "πŸ“¦ Starting validator snapshot with node stop/start..."

for CHAIN in "${!CHAINS[@]}"; do
  ROOT_DIR="${CHAINS[$CHAIN]}"
  DATA_DIR="$ROOT_DIR/data"
  SERVICE="${SERVICES[$CHAIN]}"
  ARCHIVE_NAME="snapshot.tar.lz4"

  # Web folder for each chain
  WEB_SNAPSHOT_DIR="$WEB_BASE/$CHAIN"

  # Create web folder if it doesn't exist
  mkdir -p "$WEB_SNAPSHOT_DIR"

  echo ""
  echo "πŸ›‘ Stopping $SERVICE service..."
  systemctl stop "$SERVICE"

  echo "🧹 Pruning $CHAIN data directory before snapshot..."
  /usr/local/bin/cosmprund prune "$DATA_DIR" --force-compress-app --keep-blocks 50 --keep-versions 10 \
    || echo "⚠️ Prune failed for $CHAIN"

  echo "πŸ“¦ Archiving $CHAIN folders except config directly to web folder..."
  if [ -d "$ROOT_DIR" ]; then
    cd "$ROOT_DIR" || { 
      echo "⚠️ Failed to cd into $ROOT_DIR"; 
      systemctl start "$SERVICE"; 
      continue; 
    }

    ARCHIVE_PATH="$WEB_SNAPSHOT_DIR/$ARCHIVE_NAME"
    # Remove old snapshot if exists
    [ -f "$ARCHIVE_PATH" ] && rm -f "$ARCHIVE_PATH"

    # Tar all folders except config directly to web folder, ignore missing folders
    tar --exclude='./config' -cf - data lib wasm 2>/dev/null | lz4 - "$ARCHIVE_PATH"
    echo "βœ… $CHAIN data archived and compressed successfully to $ARCHIVE_PATH"
  else
    echo "⚠️ Skipping $CHAIN - root directory not found: $ROOT_DIR"
    systemctl start "$SERVICE"
    continue
  fi

  echo "πŸš€ Starting $SERVICE service again..."
  systemctl start "$SERVICE"

  echo "🧹 Copying genesis.json and addrbook.json to web directory..."
  cp "$ROOT_DIR/config/genesis.json" "$WEB_SNAPSHOT_DIR/" || echo "❌ Failed to copy genesis.json to web directory"
  cp "$ROOT_DIR/config/addrbook.json" "$WEB_SNAPSHOT_DIR/" || echo "❌ Failed to copy addrbook.json to web directory"

done

echo ""
echo "πŸŽ‰ All validator snapshots completed and published to $WEB_BASE!"
chmod +x /usr/local/bin/create-snapshot.sh
chmod +x /usr/local/bin/snapshot-logs-timestamp.sh

Running script snapshot automatically every 4 hours

crontab -e
0 */4 * * * /usr/local/bin/snapshot-logs-timestamp.sh

Reverse Proxy with Nginx

server {
    listen 80;
    server_name snapshot-3.provewithryd.xyz; # change with your snapshot domain
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name snapshot-3.provewithryd.xyz; # change with your snapshot domain

    # change provewithryd.xyz with your ssl path
    ssl_certificate /etc/letsencrypt/live/provewithryd.xyz/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/provewithryd.xyz/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    root /var/www/snapshot/;
    index index.html;
    autoindex on;
    autoindex_exact_size on;
    autoindex_localtime on;
    
    add_header 'Access-Control-Allow-Origin' '*';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';

    location / {
        try_files $uri $uri/ =404;
        autoindex on;
    }
}

Last updated