109 lines
2.3 KiB
Bash
109 lines
2.3 KiB
Bash
#!/bin/bash
|
|
# OpenClaw Daily Backup Script
|
|
# 매일 새벽 3시에 실행
|
|
|
|
set -euo pipefail
|
|
|
|
# Load self-review library (V5.0.1 AOP)
|
|
# shellcheck source=/dev/null
|
|
source "$(dirname "$0")/../lib/self-review-lib.sh"
|
|
|
|
# Self-review metrics
|
|
START_TIME=$(date +%s)
|
|
|
|
BACKUP_DIR=~/openclaw/backups
|
|
DATE=$(date +%Y%m%d-%H%M)
|
|
BACKUP_NAME="backup-${DATE}-DAILY"
|
|
LOG_FILE=~/.openclaw/logs/backup.log
|
|
|
|
log() {
|
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
|
|
}
|
|
|
|
# Main backup logic
|
|
main() {
|
|
|
|
log "=== Backup Started ==="
|
|
|
|
# 백업 대상 디렉토리
|
|
TARGETS=(
|
|
"$HOME/openclaw"
|
|
"$HOME/.openclaw/openclaw.json"
|
|
"$HOME/.openclaw/agents"
|
|
"$HOME/clawd/scripts"
|
|
)
|
|
|
|
# 임시 디렉토리 생성
|
|
TEMP_DIR=$(mktemp -d)
|
|
trap "rm -rf $TEMP_DIR" EXIT
|
|
|
|
# 파일 복사
|
|
for target in "${TARGETS[@]}"; do
|
|
if [ -e "$target" ]; then
|
|
cp -r "$target" "$TEMP_DIR/" 2>/dev/null || true
|
|
fi
|
|
done
|
|
|
|
# 압축
|
|
cd "$TEMP_DIR"
|
|
tar -czf "${BACKUP_DIR}/${BACKUP_NAME}.tgz" . 2>/dev/null
|
|
|
|
# GPG 암호화 (암호 파일이 있는 경우)
|
|
if [ -f ~/.openclaw/.backup-passphrase ]; then
|
|
gpg --batch --yes --symmetric --cipher-algo AES256 \
|
|
--passphrase-file ~/.openclaw/.backup-passphrase \
|
|
"${BACKUP_DIR}/${BACKUP_NAME}.tgz"
|
|
rm "${BACKUP_DIR}/${BACKUP_NAME}.tgz"
|
|
log "Backup encrypted: ${BACKUP_NAME}.tgz.gpg"
|
|
else
|
|
log "Backup created (unencrypted): ${BACKUP_NAME}.tgz"
|
|
fi
|
|
|
|
# 7일 이상 된 백업 삭제
|
|
find "$BACKUP_DIR" -name "backup-*.tgz*" -mtime +7 -delete 2>/dev/null || true
|
|
|
|
log "=== Backup Complete ==="
|
|
|
|
return 0
|
|
}
|
|
|
|
# Run main function
|
|
main
|
|
MAIN_EXIT_CODE=$?
|
|
|
|
# ============================================
|
|
# Self-Review (V5.0.1)
|
|
# ============================================
|
|
END_TIME=$(date +%s)
|
|
DURATION=$((END_TIME - START_TIME))
|
|
|
|
# Non-AI cron (no OpenClaw API calls) → tokens=0
|
|
INPUT_TOKENS=0
|
|
OUTPUT_TOKENS=0
|
|
|
|
# Determine status
|
|
if [ $MAIN_EXIT_CODE -eq 0 ]; then
|
|
STATUS="ok"
|
|
WHAT_WENT_WRONG="없음"
|
|
WHY="백업 성공"
|
|
NEXT_ACTION="없음"
|
|
else
|
|
STATUS="fail"
|
|
WHAT_WENT_WRONG="백업 실패 (exit code: $MAIN_EXIT_CODE)"
|
|
WHY="스크립트 에러"
|
|
NEXT_ACTION="로그 확인: $LOG_FILE"
|
|
fi
|
|
|
|
# Log self-review
|
|
sr_log_review \
|
|
"Daily Backup" \
|
|
"$DURATION" \
|
|
"$INPUT_TOKENS" \
|
|
"$OUTPUT_TOKENS" \
|
|
"$STATUS" \
|
|
"$WHAT_WENT_WRONG" \
|
|
"$WHY" \
|
|
"$NEXT_ACTION"
|
|
|
|
exit $MAIN_EXIT_CODE
|