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