Backuper 是一个面向服务器的备份工具,支持定时或手动备份目录、MySQL、PostgreSQL 等数据源,并将归档上传至本地、SSH 远程或 S3 兼容对象存储。
- 备份源:目录(tar + zstd)、PostgreSQL(pg_dump)、MySQL(mysqldump)。
- 存储后端:本地文件系统、SSH/SFTP(内置
russh,降级rsync/scp)、S3 兼容对象存储(R2 / MinIO 等)。 - 调度与保留:基于 cron 的定时任务,同时支持保留最近 N 份和最近 N 天。
- 通知:备份成功后发送 Webhook、Discord Bot 或 Telegram Bot 通知。
- WebUI:基于 Nuxt 4 +
@nuxt/ui的仪表盘,支持登录鉴权、查看规则、手动触发和任务历史。 - CLI:
backuperctl用于启动、停止、重载、查看状态与手动触发备份。 - 守护进程:
backuperd提供 HTTP API、cron 调度、SQLite 状态记录与 systemd 服务模板。
Backuper/
├── crates/backuper-core # 配置、领域模型、Source / StorageBackend / Notifier trait
├── crates/backuper-engine # 备份源实现、存储后端、调度器、retention、通知组装
├── crates/backuper-daemon # backuperd 守护进程与 HTTP API
├── crates/backuper-cli # backuperctl 命令行工具
└── webui/ # Nuxt 4 WebUI
- Rust(见
rust-toolchain.toml) - Bun 1.3.x(用于 WebUI)
- Docker(可选,用于运行集成测试)
- systemd(可选,用于安装服务)
cargo build --release
cd webui
bun install
bun run buildrelease 产物位于 target/release/backuperd、target/release/backuperctl 和 webui/.output/public。
sudo ./scripts/install.sh
sudo systemctl enable --now backuper安装脚本会创建 backuper 用户、安装二进制文件、构建并安装 WebUI 静态资源、安装 systemd 单元。
参考 examples/backuper.toml:
[global]
data_dir = "/var/lib/backuper"
listen = "127.0.0.1:8080"
api_token = "CHANGE_ME"
[[rule]]
id = "docs"
schedule = "0 2 * * *"
storage = "local_backups"
[rule.source]
type = "directory"
path = "/srv/docs"
[rule.retention]
keep_last = 7
keep_days = 30
[[storage]]
id = "local_backups"
type = "local"
path = "/backup/backuper"启用 api_token 后,/api/* 端点需要 Authorization: Bearer <token>。
backuperctl start # 启动守护进程
backuperctl stop # 停止守护进程
backuperctl reload # 重载配置
backuperctl run <rule-id> # 手动触发规则
backuperctl status # 查看状态
backuperctl configtest # 检查配置语法守护进程默认监听 127.0.0.1:8080。
| 路径 | 方法 | 说明 |
|---|---|---|
/health |
GET | 健康检查 |
/api/login |
POST | WebUI 登录验证 token |
/api/status |
GET | 状态与最近任务 |
/api/rules |
GET | 规则列表 |
/api/run/{rule_id} |
POST | 手动触发规则 |
/api/reload |
POST | 重载配置 |
未配置 api_token 时,/api/* 公开访问;配置后需携带 Authorization: Bearer <token>。
cargo fmt --check
cargo clippy --workspace --all-targets
cargo test --workspace --all-targetsDocker 集成测试默认被 #[ignore] 跳过,显式运行:
cargo test --workspace --all-targets -- --ignored提交前请运行:
cargo fmt --check
cargo clippy --workspace --all-targets
cargo test --workspace --all-targets