From a7d91318afd82fff7533e777b25a35fc4ebfbe5d Mon Sep 17 00:00:00 2001 From: zap Date: Fri, 6 Mar 2026 01:31:00 +0000 Subject: [PATCH] feat(backup): archive full ~/.openclaw to minio --- scripts/backup-to-minio.sh | 45 ++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/scripts/backup-to-minio.sh b/scripts/backup-to-minio.sh index f15f85d..5891581 100755 --- a/scripts/backup-to-minio.sh +++ b/scripts/backup-to-minio.sh @@ -2,9 +2,10 @@ set -euo pipefail CREDS_FILE="${CREDS_FILE:-$HOME/.openclaw/credentials/minio-zap.env}" -WORKSPACE="${WORKSPACE:-$HOME/.openclaw/workspace}" +OPENCLAW_ROOT="${OPENCLAW_ROOT:-$HOME/.openclaw}" STAMP="$(date -u +%Y%m%dT%H%M%SZ)" PREFIX="${PREFIX:-workspace-backups/$STAMP}" +ARCHIVE_NAME="openclaw-${STAMP}.tar.gz" if [[ ! -f "$CREDS_FILE" ]]; then echo "Missing creds file: $CREDS_FILE" >&2 @@ -19,25 +20,35 @@ if [[ -z "${MINIO_ENDPOINT:-}" || -z "${MINIO_ACCESS_KEY:-}" || -z "${MINIO_SECR exit 1 fi -# Backup only durable assistant context files -INCLUDE=( - "MEMORY.md" - "USER.md" - "TOOLS.md" - "HEARTBEAT.md" - "memory" -) +if [[ ! -d "$OPENCLAW_ROOT" ]]; then + echo "Missing OpenClaw root directory: $OPENCLAW_ROOT" >&2 + exit 1 +fi TMPDIR="$(mktemp -d)" trap 'rm -rf "$TMPDIR"' EXIT -for p in "${INCLUDE[@]}"; do - if [[ -e "$WORKSPACE/$p" ]]; then - cp -a "$WORKSPACE/$p" "$TMPDIR/" - fi -done +ARCHIVE_PATH="$TMPDIR/$ARCHIVE_NAME" +CHECKSUM_PATH="$TMPDIR/$ARCHIVE_NAME.sha256" +MANIFEST_PATH="$TMPDIR/manifest.txt" -MC_BIN="${MC_BIN:-$WORKSPACE/bin/mc}" +# Full backup of ~/.openclaw (including credentials, agents, sessions, cron, workspace, and channel state) +# Exclude only transient lock/socket artifacts. +tar -czf "$ARCHIVE_PATH" \ + --exclude='*.sock' \ + --exclude='*.pid' \ + -C "$HOME" .openclaw + +sha256sum "$ARCHIVE_PATH" > "$CHECKSUM_PATH" + +{ + echo "backup_root=$OPENCLAW_ROOT" + echo "archive=$ARCHIVE_NAME" + echo "created_utc=$STAMP" + echo "size_bytes=$(stat -c '%s' "$ARCHIVE_PATH")" +} > "$MANIFEST_PATH" + +MC_BIN="${MC_BIN:-$HOME/.openclaw/workspace/bin/mc}" if [[ ! -x "$MC_BIN" ]]; then MC_BIN="$(command -v mc || true)" fi @@ -48,7 +59,9 @@ fi "$MC_BIN" alias set minio "$MINIO_ENDPOINT" "$MINIO_ACCESS_KEY" "$MINIO_SECRET_KEY" >/dev/null "$MC_BIN" mb --ignore-existing "minio/$MINIO_BUCKET" >/dev/null -"$MC_BIN" mirror --overwrite "$TMPDIR" "minio/$MINIO_BUCKET/$PREFIX" >/dev/null +"$MC_BIN" cp "$ARCHIVE_PATH" "minio/$MINIO_BUCKET/$PREFIX/$ARCHIVE_NAME" >/dev/null +"$MC_BIN" cp "$CHECKSUM_PATH" "minio/$MINIO_BUCKET/$PREFIX/$ARCHIVE_NAME.sha256" >/dev/null +"$MC_BIN" cp "$MANIFEST_PATH" "minio/$MINIO_BUCKET/$PREFIX/manifest.txt" >/dev/null "$MC_BIN" ls --recursive "minio/$MINIO_BUCKET/$PREFIX" echo "Backup complete: s3://$MINIO_BUCKET/$PREFIX"