#!/bin/bash set -e if [[ "$UID" != 0 ]]; then sudo $0 $@ exit fi SNAPSHOT_TIME="00:00" SNAPSHOT_SRC="PATH/TO/.liked" SNAPSHOT_DST_PREFIX="PATH/TO/BTRFS/SNAPSHOT/DIR" ARCHIVE_DST="PATH/TO/ARCHIVE/DIR" ARCHIVE_DST_PENDING="${ARCHIVE_DST}/pending" PRUNING_BINARY="PRUNING/EXECUTABLE" KEEP_BLOCKS="1000" MAIN_ARCHIVE_LIST=( "data/application.db" "data/blockstore.db" "data/cs.wal" "data/evidence.db" "data/state.db" "data/priv_validator_state.json" ) SEPARATED_ARCHIVE_LIST=( "data/tx_index.db" ) echo "$(date -Iseconds) - Starting liked service" systemctl start liked while true; do # `expr` will return non-zero code if the result is `0`, so wrapping using `echo` TO_SLEEP=$(echo $(expr $(date -d "${SNAPSHOT_TIME}" +%s) - $(date -d "now" +%s))) if [ ${TO_SLEEP} -lt 0 ]; then TO_SLEEP=$(echo $(expr ${TO_SLEEP} "+" 86400)) fi echo "$(date -Iseconds) - Wait until ${SNAPSHOT_TIME}, sleeping for ${TO_SLEEP} seconds" sleep ${TO_SLEEP} echo "$(date -Iseconds) - Stopping service" systemctl stop liked echo "$(date -Iseconds) - Service stopped, creating snapshot" SNAPSHOT_DST="${SNAPSHOT_DST_PREFIX}/$(date -Isecond)" btrfs subvolume snapshot "${SNAPSHOT_SRC}" "${SNAPSHOT_DST}" echo "$(date -Iseconds) - Snapshot created, Starting service" systemctl start liked echo "$(date -Iseconds) - Service started, prunning snapshot" "${PRUNING_BINARY}" prune-and-compact "${SNAPSHOT_DST} ${KEEP_BLOCKS}" echo "$(date -Iseconds) - Prunned snapshot, archiving snapshot" TIMESTAMP=$(date +%F) pushd "${SNAPSHOT_DST}" mkdir -p ${ARCHIVE_DST_PENDING} TARGET="${ARCHIVE_DST_PENDING}/liked-data-${TIMESTAMP}.tar.zst" tar -c ${MAIN_ARCHIVE_LIST[@]} \ | pv -s $(du -sb ${MAIN_ARCHIVE_LIST[@]} | awk '{sum+=$1;} END {print sum;}') \ | zstd -T0 \ > "${TARGET}" LATEST_TARGET="${ARCHIVE_DST_PENDING}/liked-data-latest.tar.zst" rm -f "${LATEST_TARGET}" ln -s "${TARGET}" "${LATEST_TARGET}" for ARCHIVE in ${SEPARATED_ARCHIVE_LIST[@]}; do NAME=$(basename $ARCHIVE) TARGET="${ARCHIVE_DST_PENDING}/liked-data-${TIMESTAMP}-${NAME}.tar.zst" tar -c $ARCHIVE \ | pv -s $(du -sb $ARCHIVE | awk '{sum+=$1;} END {print sum;}') \ | zstd -T0 \ > ${TARGET} done mv "${ARCHIVE_DST_PENDING}/*" "${ARCHIVE_DST}" popd > /dev/null echo "$(date -Iseconds) - Archived snapshot" # btrfs subvolume delete "${SNAPSHOT_DST}" done