5313bc9a3a84f4a20ace3c12cf2c191b11ef95e2
Form.useWatch('influx_version', form) 在 JSX 中内联调用,
违反 React hooks 规则(条件性调用 hooks),导致组件渲染时崩溃。
修复:将 watch 提到组件顶部,与 jobType 一起声明。
Co-Authored-By: Claude <noreply@anthropic.com>
数据备份管理系统
一个带 Web 操作界面的备份系统,支持将 MySQL 数据库 和 服务器目录 备份到 本地目录 或 S3 兼容对象存储(AWS S3 / MinIO / Ceph)。支持手动触发、Cron 定时调度、备份保留策略,以及从备份还原。
功能
- 📦 多数据源:MySQL 数据库(mysqldump)、服务器目录(tar.gz)
- ☁️ 多存储目标:本地目录、S3 兼容对象存储
- ⏰ Cron 定时调度:标准 cron 表达式
- 🔁 备份还原:从备份恢复 MySQL 库 / 解压目录
- 🗂️ 保留策略:保留最近 N 个 + 保留 N 天
- 👤 JWT 登录认证:单用户/多用户管理后台
- 📊 运行历史与日志:每次备份的执行详情、SHA256 校验、大小、耗时
技术栈
- 后端:Python 3.11、FastAPI、SQLAlchemy 2、APScheduler、boto3/aioboto3
- 前端:Vite + React 18 + TypeScript + Ant Design 5
- 数据库:SQLite(可平滑迁移 PostgreSQL)
- 部署:Docker Compose
快速开始
1. 准备环境变量
cp .env.example .env
make keys # 自动生成 SECRET_KEY 和 FERNET_KEY
或手动编辑 .env,至少填入以下三项:
SECRET_KEY=<openssl rand -hex 32>
FERNET_KEY=<python -c 'from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())'>
INITIAL_ADMIN_PASSWORD=<your-strong-password>
2. 启动
make up
- 前端:http://localhost:5173
- 后端 API:http://localhost:8000
- API 文档:http://localhost:8000/docs
3. 首次使用
- 打开
http://localhost:5173,用admin/INITIAL_ADMIN_PASSWORD登录 - Storages → 新建一个存储目标(Local 路径或 S3 桶)
- Jobs → 新建 → 选择数据源类型(MySQL / 目录)→ 填写源信息 → 选存储目标 → 保存
- Job 列表点 Run Now 立即触发,或填写
cron_expression启用定时调度
常用命令
make logs # 查看后端日志
make restart # 重启服务
make down # 停止服务
make clean # 停止并清理所有数据
项目结构
.
├── docker-compose.yml
├── .env.example
├── Makefile
├── backend/ # FastAPI 后端
└── frontend/ # React 前端
注意事项
- ⚠️ 单实例部署:内置 APScheduler,不要启动多个 backend 副本,否则会出现重复调度。多副本需要改造为分布式锁。
- 🔐 敏感字段加密:MySQL 密码和 S3 SecretKey 在数据库中以 Fernet 加密存储,前端永远看不到明文。
- 💾 数据持久化:所有元数据在
backend-data卷,本地备份在local-backups卷。删除前请先make down备份。 - 🗄️ mysqldump 必须可用:备份 MySQL 时后端容器需能调用
mysqldump(官方镜像已安装)。
License
MIT
Description
Languages
Python
57.7%
TypeScript
40.1%
Dockerfile
1%
Makefile
0.8%
Mako
0.2%
Other
0.2%