181 lines
5.0 KiB
Bash
Executable File
181 lines
5.0 KiB
Bash
Executable File
#!/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 "备份完成!"
|