#!/bin/bash # ============================================= # /root 文件夹每日备份脚本 # 备份到 Gitea: http://192.168.0.33:3000 # 仓库: admin/my-project (分支: root-backup) # # 备份内容:系统配置文件、自定义脚本、项目配置等 # 排除:缓存、node_modules、大模型数据、浏览器数据等 # ============================================= BACKUP_DIR="/tmp/root-backup-$$" REPO_URL="http://192.168.0.33:3000/admin/my-project.git" LOG_FILE="/var/log/root-backup.log" TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S") mkdir -p "$(dirname "$LOG_FILE")" log() { echo "[$TIMESTAMP] $1" | tee -a "$LOG_FILE" } cleanup() { rm -rf "$BACKUP_DIR" } trap cleanup EXIT # 克隆仓库 log "克隆仓库..." rm -rf "$BACKUP_DIR" no_proxy="$no_proxy,192.168.0.33" http_proxy="" https_proxy="" \ git clone --depth=1 "$REPO_URL" "$BACKUP_DIR" >> "$LOG_FILE" 2>&1 || { log "克隆失败,退出" exit 1 } BACKUP_BRANCH="root-backup" cd "$BACKUP_DIR" git config user.name "root-backup" git config user.email "backup@localhost" # 切换到或创建备份分支 if git branch -a | grep -q "$BACKUP_BRANCH"; then git checkout "$BACKUP_BRANCH" >> "$LOG_FILE" 2>&1 else git checkout -b "$BACKUP_BRANCH" >> "$LOG_FILE" 2>&1 fi # 清理旧内容(保留 .git) find . -not -path './.git/*' -not -name '.git' -maxdepth 1 -mindepth 1 -exec rm -rf {} + 2>/dev/null # 创建目录结构 mkdir -p config scripts project # ---- 1. 备份系统配置文件 ---- # shell 配置 cp /root/.bashrc config/ 2>/dev/null cp /root/.zshrc config/ 2>/dev/null cp /root/.profile config/ 2>/dev/null cp /root/.gitconfig config/ 2>/dev/null cp /root/.selected_editor config/ 2>/dev/null # ssh 配置(不含密钥本身,保留配置) rsync -a --delete /root/.ssh/ config/ssh/ 2>/dev/null # ---- 2. 备份自定义脚本 ---- rsync -a --delete /root/scripts/ scripts/ 2>/dev/null # ---- 3. 工作目录配置(排除大型目录) ---- # 只备份 OpenClaw 的非代码配置文件 if [ -d /root/work/OpenClaw ]; then mkdir -p project/OpenClaw rsync -a --delete \ --exclude='node_modules' \ --exclude='.git' \ --exclude='.cursor' \ --exclude='__pycache__' \ --exclude='*.pyc' \ --include='*.json' \ --include='*.yaml' \ --include='*.yml' \ --include='*.toml' \ --include='*.md' \ --include='*.cfg' \ --include='*.ini' \ --include='*.env' \ --include='*.sh' \ --include='*.py' \ --include='Dockerfile*' \ --include='Makefile' \ --include='*.txt' \ --exclude='*' \ /root/work/OpenClaw/ project/OpenClaw/ 2>/dev/null fi # ---- 4. 备份重要的 openclaw 配置 ---- if [ -d /root/.openclaw ]; then mkdir -p config/openclaw rsync -a --delete \ --exclude='workspace' \ --exclude='browser' \ --exclude='memory' \ --exclude='backups' \ --exclude='logs' \ --exclude='agents' \ --exclude='media' \ --include='*/' \ --include='*.json' \ --include='*.yaml' \ --include='*.yml' \ --include='*.env' \ --include='*.sh' \ --include='*.md' \ --exclude='*' \ /root/.openclaw/ config/openclaw/ 2>/dev/null fi # ---- 5. 备份 seo 配置 ---- if [ -d /root/seo ]; then rsync -a --delete \ --exclude='__pycache__' \ --exclude='*.pyc' \ --exclude='*.log' \ --exclude='evolution_cache' \ --exclude='.git' \ /root/seo/ seo/ 2>/dev/null fi # ---- 6. 备份 doc ---- if [ -d /root/doc ]; then rsync -a --delete /root/doc/ doc/ 2>/dev/null fi # ---- 7. 备份其他工具 ---- if [ -d /root/tools ]; then rsync -a --delete /root/tools/ tools/ 2>/dev/null fi # ---- 8. 备份 cron 任务列表 ---- crontab -l > config/crontab.txt 2>/dev/null # ---- 9. 生成系统信息快照 ---- { echo "# 系统信息快照" echo "备份时间: $TIMESTAMP" echo "主机名: $(hostname)" echo "IP: $(ip addr show enp0s25 2>/dev/null | grep 'inet ' | awk '{print $2}')" echo "内核: $(uname -r)" echo "磁盘: $(df -h / | tail -1)" echo "" echo "## 已安装软件包" dpkg -l 2>/dev/null | grep '^ii' | wc -l | xargs echo "Debian 包数量:" echo "" echo "## Docker 容器" docker ps -a --format '{{.Names}} {{.Status}}' 2>/dev/null || echo "(无 docker)" echo "" echo "## 监听端口" ss -tlnp 2>/dev/null | tail +2 || echo "(无数据)" } > system-info.md 2>/dev/null # 检查是否有变化 git add -A if git diff --cached --quiet; then log "没有变化,跳过备份" exit 0 fi # 显示变更摘要 CHANGED=$(git diff --cached --stat | tail -1) CHANGE_COUNT=$(git diff --cached --numstat | wc -l) log "变更: $CHANGE_COUNT 个文件" # 提交并推送 git commit -m "每日备份 $TIMESTAMP" log "推送至远端..." no_proxy="$no_proxy,192.168.0.33" http_proxy="" https_proxy="" \ git push origin "$BACKUP_BRANCH" >> "$LOG_FILE" 2>&1 log "备份完成!"