feat(backup): archive full ~/.openclaw to minio
This commit is contained in:
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user