Files
my-project/scripts/backup-root.sh
T

181 lines
5.0 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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 "备份完成!"