#!/bin/bash
set -euo pipefail
# Configuration variables - modify these for your setup
SERVICE_NAME="stacks-node" # systemd service name
SNAPSHOT_DIR="/var/stacks/mainnet" # path to chainstate directory
SNAPSHOT_BASE="/tmp" # temporary directory for archives
EBS_VOLUME_ID="vol-1234567890abcdef0" # EBS volume ID containing chainstate
S3_BUCKET="s3://my-stacks-snapshots" # S3 bucket for archive storage
SNAPSHOT_TYPE="archive" # Options: ebs, archive, or both
# Stop the Stacks node service gracefully
stop_service() {
echo "Stopping $SERVICE_NAME..."
sudo systemctl stop "$SERVICE_NAME"
}
# Start the Stacks node service
start_service() {
echo "Starting $SERVICE_NAME..."
sudo systemctl start "$SERVICE_NAME"
}
# Create compressed archive and upload to S3
snapshot_archive() {
echo "Creating archive snapshot..."
# Generate timestamp and version info for filename
TIMESTAMP=$(date +"%Y%m%d")
DIR_NAME=$(basename "$SNAPSHOT_DIR")
VERSION=$(stacks-node version 2>&1 | tail -n 1 | awk '{print $2}')
DEST="$SNAPSHOT_BASE/$DIR_NAME-$VERSION-$TIMESTAMP.tar.zst"
# Create compressed archive (using zstd for better compression)
tar -cf - -C "$(dirname $SNAPSHOT_DIR)" "$(basename $SNAPSHOT_DIR)" | pzstd -o "$DEST"
echo "Archive created at: $DEST"
# Upload to S3
echo "Uploading to S3..."
aws s3 cp "$DEST" "$S3_BUCKET/"
echo "S3 upload complete: $S3_BUCKET/$(basename "$DEST")"
# Clean up local archive
rm "$DEST"
}
# Create EBS volume snapshot
snapshot_ebs() {
echo "Creating EBS snapshot of $EBS_VOLUME_ID..."
# Generate description with timestamp
TIMESTAMP=$(date +"%Y%m%d")
DESC="Stacks Node Snapshot - $TIMESTAMP"
# Create snapshot with tags
SNAPSHOT_ID=$(aws ec2 create-snapshot \
--volume-id "$EBS_VOLUME_ID" \
--description "$DESC" \
--tag-specifications "ResourceType=snapshot,Tags=[{Key=Name,Value=Stacks Snapshot},{Key=type,Value=chainstate}]" \
--query 'SnapshotId' --output text)
echo "EBS Snapshot ID: $SNAPSHOT_ID"
}
# Main execution function
main() {
case "$SNAPSHOT_TYPE" in
ebs)
stop_service
snapshot_ebs
start_service
;;
archive)
stop_service
snapshot_archive
start_service
;;
both)
stop_service
snapshot_archive # Create archive first
snapshot_ebs # Then EBS snapshot
start_service
;;
*)
echo "Invalid snapshot type: $SNAPSHOT_TYPE. Available options: ebs, archive, or both."
exit 1
;;
esac
echo "Snapshot process completed successfully!"
}
# Execute main function
main