#!/usr/bin/env bash set -euo pipefail CREDS_FILE="${CREDS_FILE:-$HOME/.openclaw/credentials/minio-zap.env}" 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 exit 1 fi # shellcheck disable=SC1090 source "$CREDS_FILE" if [[ -z "${MINIO_ENDPOINT:-}" || -z "${MINIO_ACCESS_KEY:-}" || -z "${MINIO_SECRET_KEY:-}" || -z "${MINIO_BUCKET:-}" ]]; then echo "Missing required MinIO env vars in $CREDS_FILE" >&2 exit 1 fi if [[ ! -d "$OPENCLAW_ROOT" ]]; then echo "Missing OpenClaw root directory: $OPENCLAW_ROOT" >&2 exit 1 fi TMPDIR="$(mktemp -d)" trap 'rm -rf "$TMPDIR"' EXIT ARCHIVE_PATH="$TMPDIR/$ARCHIVE_NAME" CHECKSUM_PATH="$TMPDIR/$ARCHIVE_NAME.sha256" MANIFEST_PATH="$TMPDIR/manifest.txt" # 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 if [[ -z "$MC_BIN" || ! -x "$MC_BIN" ]]; then echo "MinIO client not found. Set MC_BIN or install mc." >&2 exit 1 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" 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"