Backer 是计算机组成与体系结构/软件工程课程项目,基于 C++17 在 Linux 平台开发,使用 CLI11 提供命令行接口,spdlog 处理日志,Google Test 驱动测试。
依赖通过 CMake FetchContent 自动拉取(CLI11 v2.4.2、spdlog v1.14.1、GTest v1.15.2),无需手动安装。加密功能依赖系统 OpenSSL(libssl-dev,通过 find_package 接入)。
当前状态:已完成核心备份/还原、特殊文件、元数据保留、自定义筛选(6 维度)、Tar/Zip 打包、gzip/zstd/lzma 压缩、AES-256-GCM/SM4-CBC 加密、Qt 6 图形界面及定时备份(Cron 调度 + 数据淘汰)。后续将通过管道架构扩展实时监控及网络备份等功能。
前置要求:GCC 9+ / Clang 12+、CMake 3.16+
加密功能需要系统安装 OpenSSL 开发库(Ubuntu:
sudo apt install libssl-dev,Fedora:sudo dnf install openssl-devel)。CMake 通过find_package自动检测。
# 构建(CLI 版本,需要 OpenSSL)
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j$(nproc)
# 构建 GUI 版本(需要 Qt6:sudo apt install qt6-base-dev)
cmake -B build -DBUILD_GUI=ON -DCMAKE_BUILD_TYPE=Release
cmake --build build -j$(nproc)
# 运行测试
ctest --test-dir build --output-on-failure
# 生成测试数据(在 data/source 下创建目录及各类文件)
bash scripts/setup-testdata.sh
# CLI 使用(测试数据目录备份/还原)
./build/backer-cli backup data/source data/backup
./build/backer-cli restore data/backup data/restore
# 端到端流程测试(交互式选择 Local/Docker)
bash scripts/test-backup-restore.sh
# 仅运行特定测试
./build/backer_test --gtest_filter="*RestoreEngine*"# 先准备好测试数据
bash scripts/setup-testdata.sh
# 构建镜像(multi-stage 构建,最终镜像约 100MB)
# 国内用户可添加 --build-arg GH_PROXY=https://ghproxy.net/ 加速依赖下载
docker build -t backer .
# 使用 Compose(含数据卷挂载)进入容器执行备份
docker compose run --rm backer backup /data/source /data/backup
# 查看备份结果(目录已挂载到宿主机)
ls -la data/backup
# 使用 Compose 还原备份
docker compose run --rm backer restore /data/backup /data/restore
# 查看还原结果
ls -la data/restore
# 交互式运行
docker run --rm backer --helpdocker-compose.yml 默认挂载三个数据卷:
./data/source:/data/source:ro— 待备份源目录./data/backup:/data/backup— 备份输出目录./data/restore:/data/restore— 还原目标目录
- ✅ 核心备份/还原 — 目录树递归扫描,文件内容读写,备份索引
- ✅ 特殊文件处理 — 符号链接、命名管道 (FIFO)、块/字符设备、Socket 完整备份与还原
- ✅ 元数据保留 — 属主 (uid/gid)、权限 (含 setuid/setgid/sticky)、时间戳 (atime/mtime, 纳秒精度)
- ✅ 灵活筛选 — 支持自定义包含/排除规则(路径/类型/名称/时间/尺寸/属主 6 维度)
- ✅ 打包格式 — 自实现 Tar 格式,可选 Zip (miniz) 打包
- ✅ 压缩算法 — 支持 gzip / zstd / lzma 多级压缩(归档后压缩,还原前解压)
- ✅ 加密保护 — AES-256-GCM / SM4-CBC (OpenSSL EVP) 加密备份数据
- ✅ 图形界面 — Qt 6 桌面 GUI,macOS 简约风格
- 🔲 实时监控 — inotify 文件变更实时备份
- ✅ 定时备份 — Cron 表达式调度 + 快照数据淘汰
- 🔲 网络备份 — gRPC + Protocol Buffers 远程备份
backer/
├── CMakeLists.txt # 根构建配置(FetchContent 自动拉取依赖)
├── Dockerfile # Multi-stage Docker 构建
├── docker-compose.yml # Compose 编排
├── .dockerignore # 构建上下文精简
├── .github/ # CI: workflows/ci.yml(lint → 构建测试 → Valgrind → Docker)
├── .claude/ # Claude Code AI 辅助配置(commands/:implement-feature, test-features, update-info, git 等)
├── cmake/ # CMake 模块(FetchQt6.cmake — Qt6 自动下载)
├── .vscode/ # VS Code 编辑器配置(c_cpp_properties.json)
├── CLAUDE.md # AI 辅助开发指南
├── LICENSE # Apache 2.0
├── docs/
│ ├── architecture-design.md # 分层架构 + 管道模式
│ ├── requirements.md # 需求规格说明
│ ├── technology-selection.md # 技术选型记录
│ ├── reportDetails.md # 课程报告详情
│ └── plans/ # 分阶段实现计划(README + 01~11)
├── src/ # 🔧 源代码
│ ├── main.cpp # 程序入口(CLI 初始化 + 命令派发)
│ ├── cli/ # ✅ 命令行接口 (CLI11)
│ ├── core/ # ✅ 备份/还原引擎(含特殊文件+元数据)
│ ├── fs/ # ✅ 文件系统抽象层(含元数据+特殊文件)
│ ├── storage/ # ✅ 存储抽象层(本地文件系统)
│ ├── filters/ # ✅ 筛选器(6 维度自定义规则)
│ ├── pack/ # ✅ 打包模块(Tar ustar + miniz Zip)
│ ├── compress/ ✅ # 压缩模块(gzip/zstd/lzma 策略接口 + 工厂)
│ ├── crypto/ ✅ # 加密模块(AES-256-GCM / SM4-CBC,基于 OpenSSL EVP)
│ ├── gui/ ✅ # Qt 6 图形界面(自动下载 Qt6)
│ ├── scheduler/ ✅ # 定时备份(cron 调度 + 数据淘汰)
│ ├── watch/ 🔲 # inotify 实时监控
│ └── network/ 🔲 # gRPC 网络备份
├── tests/ # 📝 Google Test 单元测试
├── scripts/ # 辅助脚本(setup-qt6.sh, setup-testdata.sh, test-backup-restore.sh)
└── data/ # 🧪 脚本生成的测试数据(.gitignore)
├── source/ # 源目录(setup-testdata.sh 生成)
├── backup/ # 备份输出
└── restore/ # 还原目标
✅ = 已完成 🔲 = 待实施
详见 架构设计文档。
系统采用五层分层架构(表现层 → 业务层 → 管道层 → 基础设施层 → 存储层),管道层通过策略接口支持可插拔的压缩/加密算法。
main分支为保护分支,禁止直接在上面开发- 所有开发在特性分支上进行,分支命名规则:
feature/<功能名>— 新功能fix/<bug描述>— 缺陷修复docs/<文档名>— 文档变更refactor/<模块名>— 重构
- 禁止直接
push或merge到main,所有变更必须通过 Pull Request 合入
提示:以下流程可配合 Claude 命令(
/斜杠命令)自动完成部分步骤,详见.claude/commands/。
# 1. 用 Claude 创建分支(按规范命名,支持所有分支类型)
/git:create-branch
# → 交互式引导:选择分支类型(feat/fix/docs/refactor...)、输入需求描述、自动生成分支名
# → 效果:feature/airprofly_01-core-backup-restore
# 2. 暂存所有变更
git add .
# 3. 使用 Claude 审查并优化已暂存的变更
/simplify
# → 自动审查变更并应用简化/复用/优化建议
# 4. 将 /simplify 的改动重新暂存,然后生成提交信息
git add .
/git:git-commit
# → 基于 git diff --staged 自动生成 Conventional Commits 格式信息
# 5. 推送到远程 (非 main 分支)
git push origin <分支名>
# 6. 在 GitHub 上创建 Pull Request → 待 review 通过后合入 main(合并时务必选择 **Squash and merge**,不要使用 Create a merge commit)项目配置了 GitHub Actions CI,每次推送/PR 自动运行:
| Job | 系统 | 内容 |
|---|---|---|
linux-build |
Ubuntu 22.04 | GCC-12 / Clang-14 双编译器 + Google Test + GUI |
macos-build |
macOS 14 | Xcode Clang + Google Test |
windows-build |
Windows 2022 | MSVC + Google Test |
docker |
Ubuntu 22.04 | Docker 镜像构建验证 |
本项目基于 Apache License 2.0 开源 — 详见 LICENSE。