# backup-platform
**Repository Path**: jeterlee/backup-platform
## Basic Information
- **Project Name**: backup-platform
- **Description**: 支持10+数据库的逻辑和物理备份
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2026-10-13
- **Last Updated**: 2026-10-13
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# AIDBM

**AI 原生智能数据库灾备管理平台**(AI-Native Database Backup & Disaster Recovery Management)
区别于传统备份工具,**AIDBM** 是国内少有的 AI 原生智能数据库灾备管理平台,以 AI 技术赋能传统数据备份、迁移、容灾场景,
解决**人工运维效率低、备份失效难发现、故障排查慢、异构数据适配难**等行业痛点,
真正实现数据灾备的**智能化、自动化、安全化、全域化**。
Oracle · MySQL · MariaDB · PostgreSQL · Kingbase(金仓) · DM(达梦) · SQL Server · openGauss · Redis · MongoDB · Neo4j · 文件
**备份 · 恢复 · PITR · 数据迁移 · 数据同步 · 数据对比 · 预校验 · 克隆 · 演练 · 巡检 · AI 告警**
[](#更新日志)
[](#许可证)
[](https://www.python.org/)
[](#docker-部署含离线运行)
[](https://flask.palletsprojects.com/)
---
> **部署到离线环境(不可联网、不可随意改代码)前请先阅读**:
> [产品功能固化清单](docs/feature_manifest_20260917.md)(功能全集、各引擎真实验证状态、能力边界)
> · [离线交付与运维手册](docs/offline_ops_manual_20260917.md)(安装、上线检查清单、排障地图、不改代码可调整项)
> · [产品设计说明书](docs/product_design_spec_20260916.md)(领域模型与产品化差距清单 G1–G13)
> **二次开发 / 排障前先读**:[代码图谱](docs/code_graph.md)(由 `scripts/gen_code_graph.py` 自动生成,零第三方依赖)——分层架构与模块依赖、枢纽模块与循环/越层依赖体检、**332 条 REST 路由索引**、页面→JS→接口链路、元数据库表访问热点、关键业务链路,以及「想改 X 先看哪些文件」。重生成:`python scripts/gen_code_graph.py`(结构漂移用 `--diff`,CI 卡口用 `--strict`)。
## 平台特色
- **AI 原生**:AI 助手可自然语言驱动备份/巡检/查询,自动做根因分析、修复建议与告警降噪;预校验与类型映射由 AI 辅助,把"备份失效"和"异构不兼容"挡在发生之前。
- **服务端插件化,客户端零安装**:所有驱动/插件/工具只装在平台服务端;用户客户端机器与被管理的数据库服务器**什么都不安装**、无需任何 Agent。
- **完全离线运行**:所有依赖随平台包自带(JDBC 驱动、JRE、原生驱动、备份工具离线包),运行时零联网。部署后运行 `python scripts/check_offline.py` 自检。
- **真实执行,如实失败**:所有备份/恢复/同步均为真实操作,连接失败或依赖缺失时任务**如实失败**并给出明确原因与修复指引,不做任何仿真兜底。
> **唯一的例外(如实说明)**:CDC 链路保留了仿真降级通道(`core/cdc/simulated.py`),仅在 ① `DEMO_MODE=on`、② 任务标记 `demo_only`、③ `rt_mode=sample` 三种**用户显式要求演示**的情况下被选中;因能力不足(引擎未注册 / 依赖缺失 / 客户端缺失)的自动降级自 v1.4.10 起**默认禁止**(`RT_ALLOW_SIMULATED_FALLBACK`,默认 false),此类情况任务直接置 FAILED 并写 error 日志,不再产出仿真数据。
- **迁移前预校验**:类型映射矩阵、数据级试写、字符集冲突、容量预估、主键/外键检查——结构或数据不合适在启动前拦截。
- **可插拔数据库类型**:除内置 10 种引擎外,界面就能"新增一种数据库"——填脚本模板 + 能力声明,即刻获得与内置引擎同等的备份/恢复/调度/存储能力,无需改代码。
- **多用户与权限管控**:24 个权限点 × 3 档内置角色(admin / operator / viewer),菜单按权限自动收敛,API 层二次校验,适配多人协作与运维审计要求。
---
## 功能总览
### 1. 备份能力
| 能力 | 说明 |
|---|---|
| 11 个数据库备份引擎 + 文件备份 | MySQL / MariaDB / PostgreSQL / Kingbase / DM / SQL Server / Oracle / openGauss / Redis / MongoDB / Neo4j + 文件(本地 + 远程 SSH 无 Agent)|
| 备份类型 | 全量 / 增量 / 差异(SQL Server)/ 快照 / 合成全量 / 组合(全量+增量双调度)|
| MySQL 物理增量备份与增量链恢复 | XtraBackup 增量备份;恢复时基备 prepare → 逐层合并增量 → 临时实例校验,自动处理压缩产物与增量链 |
| 达梦物理增量备份 | 联机 `BACKUP INCREMENT BACKUPSET`,增量备份集自动拉回 |
| 调度 | cron 表达式 / 固定间隔(APScheduler)|
| 保留策略 | 按天数 + 按份数双重清理(GFS)|
| 自定义备份/恢复脚本 | 全数据库类型通用,平台注入 `PLATFORM_*` 环境变量,SFTP 拉回产物并计算 sha256 |
| 三级存储 | L1 MinIO(热)/ L2 S3(冷)/ L3 本地导出,备份后自动并行复制 |
| 生命周期 | L1→L2 按龄/按容量下沉、到期清理 |
| 全局重删 | 内容 sha256 索引 + 引用计数 |
| 存储池加密 | AES-256-GCM 信封式,密钥来源:环境变量 / 系统设置托管 / 外部 KMS |
| 备份插件 | 服务端插件市场(XtraBackup / MariaDB Backup / pgBackRest / MongoDB Tools 等),支持离线包安装 |
| 虚拟机备份(整机) | PVE / KVM(libvirt) / ESXi / Hyper-V 纳管 → 保护策略 → 恢复点(PITR)→ 原地还原 / 克隆新 VM / 自动恢复验证(SureBackup 式);复用平台既有调度、保留、存储分层与告警 |
| 可插拔数据库类型 | 「数据库类型」页界面新增:填脚本模板(备份/增量/全实例/恢复/校验/列库/连通性)+ 能力声明,运行时渲染为 `CustomDBEngine` 注入引擎注册表,与内置引擎同一调度链路;`{{KEY}}` 占位渲染为 `${PLATFORM_KEY}`,脚本不落明文密码 |
| 远端工具动态发现 | 数据库服务用户 profile → 登录 shell → 常见目录枚举 → find,不写死路径;支持 `tool_path` 手动兜底 |
| 零安装执行 | SSH 远程优先(用数据库自带工具)→ 平台推送临时副本(/tmp 执行即清理)→ 回退平台服务端执行 |
### 2. 恢复能力
| 能力 | 说明 |
|---|---|
| 一键恢复 | 备份记录 → 目标实例(库级)或目标目录(文件级)|
| 表级并行导入 | MySQL 逻辑备份恢复自动拆分 dump 并行导入(`RESTORE_PARALLEL` 可调)|
| 物理恢复并行化 | XtraBackup `--prepare` 附带 `--parallel` |
| 增量链物理恢复 | 自动识别增量产物,定位全量基备,逐层应用后临时实例校验 |
| Redis 全自动恢复 | SFTP 推送 rdb → 停库 → 替换数据文件 → 自动重启加载 → PING 验证 |
| 恢复校验 | 策略化对最近成功备份做可恢复性校验(Oracle 走 impdp SQLFILE / RMAN RESTORE VALIDATE),生成报告 |
| 文件增量恢复 | 自动构建恢复链(最近全量 → 按时间应用增量)|
| PITR 时间点恢复 | MySQL binlog / PostgreSQL WAL 持续捕获;达梦 dmrman RESTORE/RECOVER(还原到指定目录,自动对齐源实例页大小/簇大小)|
### 2.1 备份后自动校验(记录列表的「校验✓」验的是什么)
每次备份成功后平台自动执行**产物级**两级校验(无需人工触发),结果写入 `backup_records.verified` / `verify_msg`,
在「备份记录」页以「校验✓」徽章展示,鼠标悬停可看本次结论原文:
| 级别 | 验什么 | 说明 |
|---|---|---|
| **L1 完整性** | sha256 校验和 + 历史比对 | 计算产物 sha256 并落库(>2GB 跳过以免拖慢主流程);与同任务上一条成功记录比对,一致则标注「与上次一致(疑似源未变更)」,用于发现"任务一直成功但数据没变"的假象 |
| **L2 可用性** | 产物格式头探测 | 按库型读产物头部识别:gzip/zstd 魔数、MySQL `-- MySQL dump`/`CREATE`/`INSERT`、PG `PostgreSQL`/`pg_dump` 等;其他类型至少确认存在、非空、可读 |
**注意**:这是"产物级"校验,证明备份文件已生成且格式可识别,**不等于真的恢复了一遍**。
要验证"能不能真的恢复出来",请用:
- **恢复校验**页:按策略定期把备份真实恢复到临时库/临时实例并比对,产出恢复测试报告;
- **克隆服务**:把备份拉起为虚拟数据库(VDB)供真实查询验证;
- **数据恢复**页:直接恢复到指定目标库并核对行数。
对应实现:`core/scheduler.py::_verify_backup`(L1+L2 判定)与各引擎 `verify_record()`(深度校验,
如 Oracle `impdp SQLFILE`、`RMAN RESTORE VALIDATE`)。校验未通过不会删除备份,记录照常保留。
### 3. 数据迁移(一站式:预检查 → 结构迁移 → 全量迁移 → 数据校验)
| 能力 | 说明 |
|---|---|
| 支持链路 | MySQL / MariaDB / PostgreSQL / DM(达梦)/ Oracle 互为源目标(含异构跨库:MySQL→达梦、PG→达梦、MySQL→PG、达梦→PG、MySQL→Oracle、Oracle→MySQL 等)|
| 全库迁移模式 | 源库所有表一次性迁移到目标库 |
| 数据校验 | 逐表行数比对(源 vs 目标),逐表明细 |
| 迁移报告 | 各阶段结果/行数/耗时汇总 |
| 连接通道 | 原生 Python 驱动优先(pymysql / psycopg2 / oracledb thin / dmPython),JDBC 兜底(驱动 jar 随包分发)|
### 4. 数据同步(实时/增量/离线)
| 能力 | 说明 |
|---|---|
| 支持链路 | 与数据迁移一致(MySQL / MariaDB / PostgreSQL / DM / Oracle 互为源目标,原生驱动 + JDBC 双通道)|
| 同步模式 | full(数据迁移·一次性)/ incremental(周期增量)/ realtime(实时轮询)|
| 写入模式 | append / overwrite(仅迁移可用)/ upsert / create_if_not_exists |
| 增量同步 | 指定增量列 + 起始值,watermark 断点记录 |
| 字段映射 | 同名映射 / 手动映射 / 可视化连线;列名归一 origin/upper/lower/camel/underscore |
| 统一类型系统 | 源端类型 → 平台中间类型 → 目标端类型,读写两侧一致转换 |
| 概念区分 | 迁移=一次性任务(支持覆盖写入);同步=持续性任务(禁用覆盖写入),引擎/预校验/前端四层强制执行 |
**Oracle 异构链路真机验证(129 / Oracle 19c)**:mysql→oracle 17/17 行 PASS、oracle→mysql 25/25 行 PASS。
深度测试命中并修复 Oracle 异构迁移典型坑:oracledb 占位符方言、`_` 开头标识符非法(ORA-00911)、
试写临时表 schema 前缀、datetime 字符串 NLS 转换(ORA-01843,会话级对齐 + 原生绑定)、
`varchar2(n)` 精度解析、空 ORDER BY(ORA-00936)、连接自动重试(跨虚拟机 1521 偶发重置)。
### 5. 迁移前预校验
| 检查项 | 说明 |
|---|---|
| 连通性 / 表存在性 | 源目标连接、源表可读、目标表存在性(overwrite 自动建表提示)|
| 异构类型映射矩阵 | 对标 DTS 结构初始化映射:UNSIGNED 升位、精度降级、ENUM/SET/JSON/BIT 特殊类型、TIME/空间类型目标不支持判定,逐列输出建表类型建议。覆盖 7 个源库 × 7 个目标库的偏门类型(数组 / JSONB / jsonpath / RANGE / ENUM / SET / RAW / ROWID / XMLTYPE / SDO_GEOMETRY / UNIQUEIDENTIFIER / HIERARCHYID / SQL_VARIANT / ROWVERSION / ST_GEOMETRY / VECTOR 等),每列给出 `ok` / `warn` / `fail` 级别与原因(`fail` 为预校验直接拦截项)|
| 主键检查 | upsert/实时同步要求目标表单列主键 |
| 增量列检查 | 增量列存在性与类型(数值/时间)|
| 数据级试写 | 源端采样 N 行 → 目标端按映射建议 DDL 建临时表试写 → 对账 → 清理(采样行数可配,0=跳过)|
| 大表容量预估 | 行数/体积统计、按带宽估时、大表告警 |
| 字符集冲突检测 | 跨库字符集家族判定(utf8mb4/utf8/GB18030/UTF8),4 字节→3 字节告警,不兼容拦截 |
| 外键父表完整性 | 子表依赖的父表不在同步列表 → 告警 |
| 接入点 | 引擎层强制拦截 + REST API + 前端结构化报告(运行前自动弹出)|
### 6. 数据对比
| 能力 | 说明 |
|---|---|
| 主键归并对比 | 对标 pt-table-checksum:keyset 分页双指针归并,O(单页)内存,千万级表可对比 |
| 差异行级定位 | missing_in_target / extra_in_target / changed 三类精确定位,附修复 SQL 指引 |
| 跨名表映射 | tables 支持 {"source": "...", "target": "..."} 跨名对比 |
| 同库/异库对比 | MySQL、PostgreSQL、DM(达梦)、Oracle、Kingbase 互为源目标 |
| 多库型校验和 | MySQL CRC32 / PG hashtext / Oracle·达梦 ORA_HASH / SQL Server CHECKSUM_AGG |
| 大小写不敏感 | 表清单与列名自动归一匹配 |
### 7. 实时备份(RT / CDP)
| 能力 | 说明 |
|---|---|
| MySQL binlog 流式捕获 + PITR | `mysqlbinlog --read-from-remote-server --raw --stop-never` |
| PostgreSQL WAL 流式捕获 | `pg_receivewal` |
| Oracle LogMiner / 达梦 LogMNR | 日志解析轨道 |
| Kingbase WAL | 缺 sys_receivewal 时降级采样 |
| 文件实时捕获 | watchdog / polling 双模式 |
### 8. 数据库部署
| 能力 | 说明 |
|---|---|
| 支持部署 | MySQL 8.0 / PostgreSQL / MongoDB(副本集+认证)/ Kingbase / Redis / DM / Oracle / openGauss |
| 部署流程 | 上传安装包 → 创建部署任务 → 异步执行(SFTP 推送 + 远程脚本)→ 实时日志 |
| Redis 部署 | 源码编译安装,启动脚本含 --daemonize,环境变量写入 profile.d |
| Kingbase 静默安装 | ISO 挂载 → InstallAnywhere 静默安装(自动处理临时目录/非 root/授权文件/家目录空间检查)|
| 参数配置 | base_dir / data_dir / 端口 / 密码 / 字符集 / 模式等,均由任务配置 |
### 9. 克隆服务(VDB)
| 能力 | 说明 |
|---|---|
| 免审批直通 | `CLONE_AUTO_APPROVE=true` 默认;可切回 ITSM 审批流 |
| 逻辑导入克隆 | mysql / mariadb / postgresql(备份产物流式导入到目标实例新库)|
| **PostgreSQL 秒级克隆(COW)** | `clone_mode=template`:`CREATE DATABASE ... TEMPLATE` 写时复制,实测 0.28s 完成整库克隆 |
| **MySQL 快照克隆(COW)** | `clone_mode=snapshot`:LVM 快照 + 独立端口实例;VG 空间预检,非 LVM 明确报错不降级 |
| **Oracle schema 克隆** | `clone_mode=schema`:在线 expdp 源 schema → impdp REMAP_SCHEMA 到新 schema(129 真机验证 44s)|
| TTL 到期自动销毁 | 默认 7 天,可配置;Oracle 克隆清理走 DROP USER CASCADE |
### 10. 运维运营
| 能力 | 说明 |
|---|---|
| 巡检 | 连通性/调度/上次状态三维体检,fail 即告警;巡检记录可导出、可调度 |
| 恢复演练 | RTO/RPO 评估,趋势/基线/季度排程 |
| 通知告警 | Webhook/钉钉/企微/飞书/邮件,成功失败分别开关 |
| AI 智能助手 | 对话式运维助手,支持平台内工具调用(查任务/查报告/触发操作),LLM 不可用时本地规则兜底 |
| AI 智能告警 | 规则分析 + 故障归因,降低告警噪音 |
| 备份质量监控 | 超长/超频判定,阈值可配 |
| 容灾链路 | binlog 位点一致性校验/日志缺口检测,健康灯(red/yellow/green)|
| ITSM 工单对接 | 内置适配器,可插拔;克隆/迁移审批工单联动 |
| 保护策略 | 策略 CRUD + 任务绑定(等级/并行度/RPO/RTO 目标)|
| 生命周期管理 | 冷热分级存储:状态概览 / 策略配置 / 手动触发归档降级 |
| 多租户 / RBAC | 已实现|
| 集群化 / 高可用 | ❌ 未实现(单机架构)|
### 11. 主机纳管与数据库部署
| 能力 | 说明 |
|---|---|
| SSH 主机纳管 | 增删改查 + 连接测试;备份/恢复/同步/克隆的远端执行通道 |
| 数据库一键部署 | 达梦/金仓/Redis/MySQL/PG/Oracle 静默安装:挂载 ISO → 安装 → 初始化 → 启动 → 验证 |
| 依赖插件管理 | 备份依赖客户端(xtrabackup/dexp 等)一键安装/卸载/查询 |
| 环境自检 | `tools/check_env.py` 一键核对驱动/JDBC/JRE(服务端集中安装,客户端零安装)|
### 12. 数据服务与高级能力
| 能力 | 说明 |
|---|---|
| 数据价值挖掘 | 资产盘点 → 敏感发现与国标分级(GB/T 43697-2024)→ 价值评估与冷数据治理 → 合规概览(PIPL/等保)→ 脱敏导出,把冷备份变成可治理、可举证、可外发的数据资产 |
| 全局重删 | 参照鼎甲迪备全局重删:块级去重,节省存储 |
| 自动合成全量 | 增量链自动合并为合成全量(永久增量体系)|
| 对象级恢复 | 从备份中精准提取指定表/对象,不必整库恢复 |
| 存储目标管理 | 多存储后端 CRUD + 连接测试 + 三级复制(本地/二级/三级)|
### 13. 可插拔数据库类型
| 能力 | 说明 |
|---|---|
| 界面新增数据库类型 | 「数据库类型」页填写 `db_type` / 显示名 / 默认端口 / 分类 / 图标 / 支持模式,保存即生效(无需重启)|
| 脚本模板 | 备份(全量 / 增量 / 全实例)、恢复、校验、列库、连通性测试共 7 个模板位;`{{KEY}}` 占位渲染为 `${PLATFORM_KEY}`,密码等敏感值经 `PLATFORM_PARAM_` 环境变量注入,**脚本文件不落明文** |
| 能力声明 | `backup_modes` / `supports_incremental` / `supports_full_instance` / `supports_sync` / `client_tools` / `skip_client_check`,驱动前端表单与调度行为 |
| 同一调度链路 | 渲染为 `CustomDBEngine` 实例注入引擎注册表,cron 调度、保留策略、三级存储、全局重删、恢复校验、告警全部自动复用 |
| 动态类型发现 | `/api/meta` 的 `db_types` / `db_type_meta` / `default_ports` 运行时合并自定义类型,任务表单下拉无需改代码 |
| 安全与治理 | 删除被备份任务引用的适配器会被拒绝(提示引用任务数);支持停用/启用、远端连通性测试、从内置模板复制 |
### 14. 用户与角色管理(RBAC)
| 能力 | 说明 |
|---|---|
| 多用户登录 | `users` 表 + PBKDF2-HMAC-SHA256(20 万次迭代,标准库实现,无第三方依赖,可离线打包)|
| 权限点 | 24 个,覆盖概览 / 备份 / 恢复 / 数据对比 / 部署 / 灾备 / 运维 / 系统 |
| 内置角色 | `admin`(全部)/ `operator`(备份·恢复·同步·克隆·对比·部署·巡检·告警·日志·运维分析,21 项)/ `viewer`(只读,4 项)|
| 附加权限 | 单用户可在角色基础上叠加权限点(`permissions` 字段,逗号分隔)|
| 菜单按权限显示 | 侧边栏 25 个菜单带 `data-perm`,登录后按 `hasPerm()` 自动隐藏;API 层 `permission_required()` 二次校验,前端绕过仍返回 403 |
| 账号治理 | 管理员重置密码 / 停用 / 删除(拒绝删除内置 admin 与最后一个启用的 admin);用户自助改密(校验旧密码);`must_change_password` 首登改密 |
| 兼容升级 | `users` 表为空时自动用 `config.WEB_USERNAME/WEB_PASSWORD` 种子首个 admin;旧会话与外部 API Token 调用方均不受影响 |
---
## 快速开始
```bash
# 1. 初始化元数据数据库
python init_db.py
# 2. 启动平台(同时启动后台调度器)
python run.py
```
浏览器访问 `http://<服务器IP>:8080`,默认账号 `admin / admin123`(**请立即修改**)。
> 首次启动会用 `config.WEB_USERNAME/WEB_PASSWORD` 自动创建首个 `admin` 用户(标记 `must_change_password`,建议登录后立即在「用户管理」改密)。
> 需要多人协作时,在「用户管理」新增账号并分配角色(admin / operator / viewer),菜单会按权限自动收敛。
> 备份任务执行前,请先在「系统设置 → SSH 主机」纳管数据库服务器(或使用任务级 SSH 凭据)。
---
## 离线环境部署
平台面向**完全离线环境**设计:运行时不安装任何东西,一切依赖随离线包自带。
1. **构建离线包**:PyInstaller 打包(Python 依赖全内置)+ `drivers/`(JDBC 驱动 jar)+ `jdk/`(JRE,达梦/Oracle JDBC 通道必需)+ 备份工具离线包。
2. **部署后自检**:`python scripts/check_offline.py` —— 五层检查(Python 依赖 / JDBC jar / JVM / dmPython / 外部工具),缺失项给出处置指引。
3. **备份工具**:仅支持离线包上传安装(备份插件页 SFTP 上传),不依赖在线源。
---
## 外部 API 调用(Bearer Token)
平台提供 REST API 供外部系统调用,认证方式为 **Bearer Token**。
### 获取令牌
登录 Web 页面 → 浏览器控制台(F12)执行:
```javascript
fetch("/api/tokens", {
method: "POST",
headers: {"Content-Type": "application/json"},
body: JSON.stringify({name: "外部监控系统"})
}).then(r => r.json()).then(d => console.log(d.token));
```
返回的 `token`(`bk_` 前缀)明文仅此一次展示,平台仅存哈希。
### 调用示例
```bash
TOKEN="bk_xxxxxxxx"
# 列出备份任务
curl -s -H "Authorization: Bearer $TOKEN" http://<服务器IP>:8080/api/tasks
# 立即执行一次全量备份
curl -s -X POST -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" -d '{"backup_type":"full"}' \
http://<服务器IP>:8080/api/tasks/22/run
# 查询最近备份记录
curl -s -H "Authorization: Bearer $TOKEN" \
"http://<服务器IP>:8080/api/records?limit=10"
# 触发巡检
curl -s -X POST -H "Authorization: Bearer $TOKEN" \
http://<服务器IP>:8080/api/inspection/run
# 数据同步任务迁移前预校验
curl -s -X POST -H "Authorization: Bearer $TOKEN" \
http://<服务器IP>:8080/api/sync-tasks/9/precheck
# 数据迁移(预检查 → 结构 → 全量 → 校验 一站式)
curl -s -X POST -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" -d '{"plan_id":1}' \
http://<服务器IP>:8080/api/migration/run
```
---
## Docker 部署(含离线运行)
### 镜像地址
```bash
docker pull ghcr.io/zhh9126/backup-platform:latest
docker pull ghcr.io/zhh9126/backup-platform:v1.4.16 # 固定版本(可回滚)
# 当前最新版本:v1.4.16(2026-09-24)
```
> v1.4.4 起镜像已内置全部运行依赖与备份工具(Python 原生驱动 / JDBC+JRE / xtrabackup / mariabackup 等),`docker run` 开箱即用,无需再外部挂载任何工具目录。
### 服务端环境自检(部署后先跑一遍)
```bash
python tools/check_env.py
# 一键核对:Python 直连驱动(8 项)/ JDBC 驱动包 / JRE,输出缺失项与离线安装指引
# 按"服务端集中安装、客户端零安装"设计,所有数据库驱动都在镜像内预装
```
### 国内加速
```json
// /etc/docker/daemon.json
{"registry-mirrors": ["https://docker.m.daocloud.io", "https://dockerproxy.com"]}
```
### 离线导入
```bash
# 有网机器导出
docker save ghcr.io/zhh9126/backup-platform:v1.4.16 -o aidbm-v1.4.16.tar
# 内网机器导入
docker load -i aidbm-v1.4.16.tar
```
### 运行
```bash
docker run -d --name backup-platform \
-p 8080:8080 \
-v backup-data:/data \
-e BACKUP_ROOT=/data/backups \
--restart unless-stopped \
ghcr.io/zhh9126/backup-platform:latest
```
> **备份文件存在哪?** 镜像默认把备份产物写到容器内 `/data/backups`(布局 `<该路径>/<数据库类型>/<任务ID_任务名>/`)。
> **必须把 `/data` 挂载到宿主机持久化卷**,否则备份会写进容器可写层(`docker inspect` 的 UpperDir 里能看到,重建容器即丢失)。
> 平台「备份存储管理」页顶部的**本地备份存储位置**卡片会显示实际路径、磁盘用量与持久化风险提示,并支持在线修改(界面配置优先级高于环境变量,重启后仍生效)。
### 升级(旧版本 → 新版本)
```bash
# 1. 导入新版本镜像(离线环境在有网机器 docker save 后拷入)
docker load -i aidbm-v1.4.16.tar
# 2. 停止并删除旧容器(备份数据在 backup-data 卷中,不受影响)
docker stop backup-platform
docker rm backup-platform
# 3. 用新版本镜像启动(命令与首次部署完全一致,仅换镜像 tag)
docker run -d --name backup-platform -p 8080:8080 -v backup-data:/data -e BACKUP_ROOT=/data/backups --restart unless-stopped ghcr.io/zhh9126/backup-platform:v1.4.16
# 4.(可选)删除旧版本镜像释放空间
docker rmi ghcr.io/zhh9126/backup-platform:v1.4.15
```
> 升级不丢数据:元数据库、备份产物、日志都在 `backup-data` 卷(`/data`),
> 换容器不影响。**删除旧镜像前确认容器已停止并移除**,否则会报
> `conflict: unable to remove ... container is using`。
### 卸载
```bash
# 1. 停止并删除容器
docker stop backup-platform
docker rm backup-platform
# 2. 删除镜像
docker rmi ghcr.io/zhh9126/backup-platform:v1.4.16
# 3.(谨慎)删除数据卷 —— 会清掉全部备份产物与元数据,操作前务必
# 先把备份文件拷贝转移!
docker volume inspect backup-data # 先查看卷在宿主机的实际位置
docker volume rm backup-data # 确认不再需要数据后再执行
```
> 卷的实际宿主机路径可用 `docker volume inspect backup-data`(Mountpoint 字段)查看,
> 离线环境建议直接从该目录 tar 备份后再做删除操作。
### Docker Compose(推荐生产)
```yaml
services:
backup-platform:
image: ghcr.io/zhh9126/backup-platform:latest
ports: ["8080:8080"]
environment:
- BACKUP_ROOT=/data/backups
volumes:
- ./data:/data # 元数据库 / 备份产物 / 日志统一持久化
restart: unless-stopped
```
### 手动构建镜像
```bash
docker build -t backup-platform:local .
```
---
## 配置
| 环境变量 | 说明 | 默认 |
|---|---|---|
| `WEB_HOST` / `WEB_PORT` | 监听地址 / 端口 | `0.0.0.0` / `8080` |
| `BACKUP_ROOT` | 备份产物根目录(界面「备份存储管理 → 本地备份存储位置」可实时修改并持久化,**界面配置优先级更高**) | `./backups` |
| `SCHEDULER_ENABLED` | 是否启用定时调度 | `true` |
| `DEFAULT_RETENTION_DAYS` / `DEFAULT_RETENTION_COUNT` | 默认保留天数 / 份数 | `30` / `50` |
| `LLM_API_KEY` / `LLM_BASE_URL` / `LLM_MODEL` | AI 智能体模型端点(不可达时自动本地兜底) | 见 `config.py` |
---
## 支持的数据库与所需客户端
> 以下工具装在**数据库服务器**上即可(数据库自带),平台经 SSH 远程执行并动态发现工具路径;平台机自身装有客户端时也可本机执行(零安装回退)。
| 数据库 | 备份 | 恢复 | 说明 |
|---|---|---|---|
| MySQL / MariaDB | mysqldump、xtrabackup | mysql、xtrabackup | 密码经临时选项文件注入;物理恢复在平台侧 prepare + 临时实例校验 |
| PostgreSQL | pg_dump、pg_basebackup | pg_restore / psql | PGPASSWORD 环境变量传密码 |
| Oracle | expdp / RMAN | impdp / RMAN | 数据泵 DIRECTORY;RMAN 支持增量 |
| Kingbase 金仓 | sys_dump、sys_basebackup | sys_restore / ksql | 兼容 PG 协议,默认端口 54321 |
| openGauss / 磐维 | gs_dump、gs_basebackup | gs_restore / gsql | 兼容 PG 协议族,默认端口 26000(磐维 12800);sha256 认证须 `-W` 显式传密,`gs_dump` 进度输出走落盘文件防污染 |
| DM 达梦 | dexp、disql(联机 BACKUP) | dimp、dmrman(PITR) | 原生驱动缺失时自动降级 JDBC 通道(驱动随包) |
| SQL Server | sqlcmd | sqlcmd | BACKUP/RESTORE DATABASE;SQLCMDPASSWORD 注入 |
| Redis | redis-cli --rdb | (替换 rdb + 自动重启) | REDISCLI_AUTH 传密码 |
| MongoDB | mongodump | mongorestore | --archive 流式拉回 |
| Neo4j | neo4j-admin database dump / backup、APOC 导出 | neo4j-admin database load / restore、apoc.import.* | 三通道:离线 dump、企业版在线 backup(不停机、可增量)、APOC 在线导出(Cypher/JSON/CSV);默认端口 7687 |
### 虚拟机备份支持矩阵(/vm)
| 虚拟化平台 | 接入方式 | 备份通道 | 增量能力 | 克隆新 VM |
|---|---|---|---|---|
| Proxmox VE | HTTPS API(账号密码 / API Token) | `vzdump`;PBS 存储时走 PBS 备份 | 备份存储为 PBS 时支持块级增量,否则按全量执行(如实说明,不伪造增量) | 支持(可隔离网络、改 MAC、自动开机、TTL 自动销毁) |
| KVM / libvirt | SSH + `virsh` | 快照/检查点 + 磁盘镜像导出 | 支持增量(`virsh backup-begin` 可用时) | 支持 |
| VMware ESXi | SSH + `vim-cmd` | 关机/快照后打包 VM 目录(vmdk) | 依赖快照链,不支持时回退全量 | 支持 |
| Hyper-V | SSH + PowerShell | `Export-VM` / 检查点导出 | 依赖检查点,不支持时回退全量 | 支持 |
设计要点:**不新建平行调度体系**——每台受保护 VM 对应一条 `backup_tasks(db_type='vm')`,复用平台调度、保留策略、三级存储、生命周期与告警;恢复点(PIT)单独建链(全量 / 增量 / 合成全量),支持按时间点选择还原,并可对恢复点做自动恢复验证(拉起隔离 VM 后销毁)。
**数据迁移/同步连接通道**:原生 Python 驱动优先(pymysql / psycopg2 / oracledb thin),JDBC 兜底(驱动 jar 随包,达梦/金仓/Oracle 全覆盖)。部署后运行 `python tools/check_env.py` 一键自检(服务端集中安装、客户端零安装)。
**以上不是上限——数据库类型可插拔**:除内置引擎外,可在「数据库类型」页界面新增任意一种数据库(GaussDB / OceanBase / TiDB / 自研库等),只需提供备份/恢复脚本模板与能力声明,即可获得与内置引擎**完全相同的**调度、保留策略、三级存储、重删、告警与恢复校验能力;脚本经 SSH 在数据库服务器执行,**客户端零安装**约束不变。
---
## 使用说明(导航结构)
- **概览**:仪表盘(任务数、累计备份体积、成功失败统计、四维健康度、近 7 天趋势)
- **备份管理**:数据库备份、文件备份、对象存储备份(MinIO / OSS / COS / S3 兼容)、存储管理(三级存储 + 合成全量)、备份策略、无 Agent、备份插件、实时备份(CDC / PITR)
- **数据恢复管理**:数据恢复、恢复校验、数据对比、数据库部署
- **记录**:备份记录、恢复记录
- **灾备管理**:数据迁移、数据同步、容灾链路、克隆服务、虚拟机备份
- **运维**:运维运营分析、巡检、AI 智能助手、智能告警、数据价值挖掘、系统日志、系统设置、用户管理(RBAC)
> 菜单按当前账号权限自动收敛:`viewer` 仅见只读入口,`operator` 不见系统设置 / 用户管理 / 数据库类型,`admin` 全量可见。
典型操作:
1. **数据库备份**:在「数据库备份」新建任务,填写连接、备份类型、调度、保留策略与存储目标。
2. **文件备份**:在「文件备份」先纳管远程主机,再建文件任务;全量生成 `*_full.tar.gz`,增量基于源快照仅打包变化文件。
3. **数据同步**:新建同步任务(源/目标连接 + 表 + 字段映射 + 写入模式 + 同步模式),运行前自动执行迁移前预校验,也可点「预检」单独查看报告。
4. **数据对比**:在「数据对比」新建对比任务(源/目标连接 + 表清单,支持跨名映射),报告逐行展示差异定位与修复指引。
5. **数据库部署**:在「数据库部署」上传安装包,选择目标主机一键部署,实时查看安装日志。
6. **克隆服务**:选择备份记录一键克隆(免审批直通),就绪后展示连接串,到期自动销毁。
7. **恢复校验**:配置策略定期对最近成功备份做可恢复性校验,查看报告与成功率 KPI。
8. **巡检**:点击"立即巡检"或配置定时巡检,查看 pass/warn/fail 明细。
9. **AI 智能体**:对话式助手支持查询任务/记录/存储用量、执行备份/巡检(需确认)、知识库问答。
10. **新增数据库类型**:在「数据库类型」页点「新增」,填 `db_type` / 显示名 / 默认端口与 7 个脚本模板(可从内置模板复制改),保存后到「数据库备份」新建任务即可选到该类型;右上「测试」可先做远端连通性验证。
11. **新增用户**:在「用户管理」页点「新增用户」,选角色(admin / operator / viewer)并勾选附加权限;保存后该用户登录即按权限看到对应菜单。
---
## 生产部署建议
- 使用 `gunicorn` 运行:`gunicorn -w 2 -b 0.0.0.0:8080 run:app`
- 元数据 SQLite 建议定期备份(`instance/meta.db`)
- 备份产物目录与数据库服务器网络隔离,配置三级存储异地容灾
- 离线环境部署完成后**首先运行** `python scripts/check_offline.py` 自检
## 安全说明
- 密码 AES 加密存储(元数据库中不含明文)
- 备份密码通过临时选项文件 / 环境变量注入,不出现在命令行(防 ps 泄露)
- 平台登录密码 PBKDF2-HMAC-SHA256 加盐哈希(20 万次迭代),元数据库不存明文
- 多用户权限双层校验:菜单按权限隐藏 + API 层 `permission_required()` 强制校验(前端绕过仍 403)
- 可插拔适配器脚本模板不落明文密码:敏感参数经 `${PLATFORM_PARAM_*}` 环境变量注入
- API Token 仅存哈希;会话 Cookie HttpOnly
- 默认账号请立即修改(首登会标记 `must_change_password`);生产环境建议限制来源 IP
## 更新日志
### 未发布(main 已合入,待打 tag 发版)
以下内容已提交到 main 分支,但尚未随版本 tag 与镜像发布:
- **openGauss 备份/恢复引擎接入(第 12 个数据库引擎)+ 单机部署**:复用 PostgreSQL 引擎链路(gs_dump / gs_restore / gsql / gs_basebackup 工具映射),经真实环境全矩阵端到端验证(逻辑 -Fc/-Fp/-Fd、全实例逐库、dumpall、物理 gs_basebackup、跨主机恢复、恢复校验)。修复的实战缺陷:sha256 认证不读 PGPASSWORD(必须 `-W` 显式传密)、gs_dump 进度输出走 stdout 污染产物流(改 `-f` 落盘)、`-Fd` 目录格式与 `-X stream` 限制、跨主机恢复、部署 glibc 预检加固。磐维 PanWeiDB 引擎(继承 openGauss,工具链同名同用法)工作区开发中。
- **不可变备份四层防护(G13 闭环)**:备份记录保留锁定(只许延长不许缩短,强制审计原因)→ 产物写保护(chmod 去写位)→ 完整性基线 + 每日 sha256 复检(任务 `backup_integrity_check`,默认 04:40)→ 删除路径四路拦截(定期清理 / GFS / 分层生命周期 / 任务删除全部跳过锁定记录)。API:`POST /api/records//lock` / `/unlock` / `/verify-integrity`。
- **数据同步 / 迁移可靠性("不重不丢不错")**:轮询实时同步水位持久化到 `sync_tasks.realtime_watermark`(重启续传不再重做全量快照)、时间戳回看窗口 `poll_overlap_seconds`、周期对账 `reconcile_every_polls`(检测轮询漏 DELETE)、批次写入失败回滚重试与错误明细、迁移 dry-run 预演 / 逐表 manifest / 断点续跑 / 行数 + 抽样内容双校验、MySQL→达梦兼容顾问补齐(静态 SQL 清单、列级保留字、迁移后自动 `SP_TAB_STAT_INIT`)。
- **i18n 中英文切换 v2/v3**:模板 935 条 + JS 高频串 + 正则动态串全量覆盖。
### v1.4.16(2026-09-24)
- **openEuler 物理备份兼容(现场反馈修复)**:根因是平台推送的 xtrabackup(CentOS7 构建)依赖 `libssl.so.10` 而 openEuler 缺失,且其报错格式 `version 'xxx' not found`(不带 `=>`)被旧 ldd 分类器漏判。修复:① 28 个非 glibc 依赖库打包进镜像 `/opt/xtrabackup_libs`(`XB_BUNDLED_LIB_DIR` 可覆盖);② ldd 分类器泛化——GLIBC_/GCC_/CXXABI_/LIBC_ 版本缺失判致命,其余 soname 缺失可推补;③ 推送前 ELF 架构预检。
- **页面"改了没变化"根因修复**:`base.html` 静态资源缓存版本号未升级导致浏览器拿旧 JS/CSS;此后改前端资源必同步升缓存戳。顺带修复空状态 `${T(...)}` 原文显示与弹窗标题冗余记录号。
### v1.4.15(2026-09-24)
- **科技感视觉层 v2**:teal 光晕背景、统计卡、卡片品牌渐变线、主按钮渐变、表头吸顶、状态徽章 pill 化与运行中呼吸动画。
- **i18n 中英文切换 v1**:右上角切换按钮 + 侧边栏/页面文案/状态徽章自动翻译,`localStorage` 记忆语言。
### v1.4.14(2026-09-24)
- **元数据库可插拔后端**:系统设置「元数据库」面板填 PG/MySQL 账号密码即可从 SQLite 无缝切换(`core/db.py` 适配层 + 方言翻译 + `core/meta_migrate.py` 迁移引擎 + 行数校验/序列归位),PG 14 全生命周期实测通过;回切携带数据。
- **迁移兼容性顾问(达梦七坑内置)**:`core/sync/compat_advisor.py`——达梦 VARCHAR 字节语义自动放大(UTF-8 ×3)、零日期消毒、无符号整型升位、NLS/大小写/兼容模式预检探测;非 MySQL 目标整型升位误判修复。
- **MySQL 物理备份远端推送三修复**:远端 glibc 过低误判为缺库、版本不匹配的旧工具误用(三级版本探测:端口横幅 → 服务二进制 → 平台客户端查 VERSION)、多服务机器版本误判;ELF 架构预检。**Docker 路径透明化**:容器内备份的宿主机映射在日志弹窗与存储页明示。全实例无业务库自动兜底含系统库。
- **插件内置守卫 + 离线包源**:镜像内置插件(xtrabackup 2.4/8.0 等)标记 builtin 不可卸载;插件市场支持 `core/plugins/offline_packages/` 离线包安装(完全离线环境可用)。
- **交付物治理**:`.dockerignore`/`.gitignore` 排除 `packages/`;前端设计约束文档与视觉现代化层第一版。
### v1.4.13(2026-09-22)
- **「组合 / 增量任务保存后无法编辑」根因修复(用户反馈,本次重点)**
- **现象**:任务是「组合(全量+增量)」或「增量」类型时,点「编辑」页面**毫无反应**、也不报错;全量任务正常。
- **根因三层叠加**:① 页面真实元素 id 是 `t_incremental_days` / `t_incremental_time`,旧 JS 按前缀拼成 `t_inc_days`;② `BKP.$` 对不存在的元素返回**万能代理对象**,参与 `if (el)` 判断恒为真,代码继续往下走;③ 该代理对象上调用 `querySelectorAll(...).forEach(...)` 得到 `undefined` → 抛 `TypeError`,而这条链路**没有任何 try/catch**,静默打断 `openTaskModal` —— 用户侧就是"点了没反应"。
- **修复**:`bkp-core.js` 让代理对象对 `querySelectorAll` 返回 `[]`、`querySelector` 返回 `null`(源头止血);`app.js` 新增 `_mixedIds` / `_firstRealEl` / `_checkboxesOf` / `_daysFromCron`,用 `document.getElementById` 逐个取候选 id(含 `_inc_` → `_incremental_` 兼容),缺失时**从 cron 星期段反推按天勾选**;`OpenTaskModal` / `openFileTaskModal` / `editTask` / `editFileTask` **全部加 try/catch + toast**(同类问题今后会弹红色提示而非静默)。顺带补齐 `tasks.html` 缺失的 `t_ssh_host`(高级选项里"指定纳管主机"此前不生效)。
- **新增「备份产物定期清理」**:备份一直积累会占满磁盘,而手工删风险极大。现在支持按**每个任务自己的保留天数/份数**自动回收,并提供 **dry-run 预览**。
- **安全设计(三层护栏)**:① **keep_min 兜底**——每任务最后 N 份成功备份无条件保留,永远不会清空最后一个可用备份;② **`_is_managed_path` 路径护栏**——只允许删备份根目录之内的文件,越界一律拒绝;③ **未配置保留天数的任务不会被清理**(不会被误伤)。
- **审计友好**:清理后默认把记录标记为 `expired_cleanup`(**保留审计轨迹**),可选才物理删行;"产物已不在磁盘"的幽灵记录只对齐账本,**不虚报释放空间**。
- **落地**:`core/backup_cleanup.py` + `api/backup_cleanup.py`(配置 / preview / preview\-\ / run)+ `core/scheduler.py` 新增 `_register_cleanup()`(job `backup_cleanup`,cron 默认 `10 3 * * *`,**start 与 reload 两条路径均已注册**,顺带修掉此前 reload 会丢 gfs/ferry job 的缺陷)+ 数据库备份页工具栏黄色按钮「定期清理」与弹窗(开关 / cron / 最少保留 / 是否删记录 / 扫描预览 / 立即清理)+ `expired_cleanup`、`expired_gfs` 状态徽章。
- **验证**:`tests/test_backup_cleanup.py` **13 passed**(含 UI 契约静态回归);本机手工跑过一次真实清理(24 条记录标记 `expired_cleanup`,其中 2 条真实删除了文件)。
- 默认:开关 **开启**、每任务最少保留 **1 份**、cron `10 3 * * *`;任务表单「保留天数」默认 30 天(`retention_count` 字段当前未在表单开放,需由管理员经接口设置)。
- **交付《AIDBM 用户操作指导手册(详细版)》**(`docs/AIDBM_用户操作指导手册_详细版_20260922.md`,1668 行 / 26 章 + 4 附录):逐 UI 事实编写(表单按**元素 id → 中文标签**抽取、取值范围取自 `