Wu Qing
f7599dd9bd
Update README.md ( #95 )
2026-06-01 00:34:09 +08:00
Wu Qing
bf0e91db57
chore(ci): 为工作流声明最小权限 (contents: read) ( #96 )
...
修复 CodeQL actions/missing-workflow-permissions 告警:ci.yml 未显式声明
GITHUB_TOKEN 权限,默认可写。构建/测试仅需读取仓库内容,故收敛为 contents: read。
2026-06-01 00:27:24 +08:00
dependabot[bot]
37092f3167
build(deps): bump the npm_and_yarn group across 1 directory with 2 updates ( #93 )
...
Bumps the npm_and_yarn group with 2 updates in the /web directory: [ws](https://github.com/websockets/ws ) and [axios](https://github.com/axios/axios ).
Updates `ws` from 8.19.0 to 8.21.0
- [Release notes](https://github.com/websockets/ws/releases )
- [Commits](https://github.com/websockets/ws/compare/8.19.0...8.21.0 )
Updates `axios` from 1.15.2 to 1.16.0
- [Release notes](https://github.com/axios/axios/releases )
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md )
- [Commits](https://github.com/axios/axios/compare/v1.15.2...v1.16.0 )
---
updated-dependencies:
- dependency-name: ws
dependency-version: 8.21.0
dependency-type: indirect
dependency-group: npm_and_yarn
- dependency-name: axios
dependency-version: 1.16.0
dependency-type: direct:production
dependency-group: npm_and_yarn
...
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-31 23:37:13 +08:00
Wu Qing
51e4b0b0ce
fix(backup): 修复差异/清单设计评审发现的三处问题 ( #92 )
...
1) DeleteRecord 拒绝删除仍被成功差异依赖的全量(+CountDependentDifferentials),堵住手动删除孤立差异链的数据完整性缺口;2) 列表查询 Omit(Manifest),差异基线改按需 FindByID 加载,避免清单大列拖累热路径;3) FileRunner.Run 每文件即时关闭句柄,杜绝大目录 FD 泄漏。含仓储层单测。
2026-05-28 13:38:10 +08:00
Wu Qing
493e1faff5
feat(backup): 新增按需(选择性)文件恢复 ( #91 )
...
在内容浏览基础上支持仅恢复勾选的文件/目录到原位置。FileRunner.Restore 按选中集合过滤提取与删除;RestoreService.StartSelective(Start 委托,零破坏);恢复端点接受可选 selectedPaths;前端内容弹窗支持勾选恢复。
2026-05-27 19:50:50 +08:00
Wu Qing
68bb964350
feat(backup): 新增备份内容浏览 ( #90 )
...
查看每次备份捕获的文件清单(路径/大小/目录),核对完整性、排查遗漏。清单取自全量备份记录,无需下载解压;差异记录回退基线清单。只读端点 + 前端可筛选弹窗。
2026-05-27 19:33:44 +08:00
Wu Qing
65cf3a04d4
feat(backup): 新增 zstd 压缩选项 ( #89 )
...
备份压缩在 gzip 之外新增 zstd(更高压缩率、更快解压)。pkg/compress 新增 ZstdFile/UnzstdFile,Master 与 Agent 压缩/解压按后缀分流,任务校验与前端下拉同步;往返单测覆盖。
2026-05-27 19:15:06 +08:00
Wu Qing
90b58d58d6
feat(backup): 新增差异备份(differential)模式 ( #88 )
...
文件备份新增差异模式:仅打包自上次全量以来的变更并记录删除,恢复自动按全量+差异链还原。含基线解析、链式恢复、保留链保护与本机文件任务校验;清单/比对/删除/往返/保留保护单测全覆盖。
2026-05-27 19:03:40 +08:00
Wu Qing
f584a0802a
feat(backup): 新增 MongoDB 备份与恢复支持 ( #87 )
...
通过 mongodump/mongorestore --archive 流式管线接入 MongoDB 数据源,与现有数据库运行器架构一致;注册到 Master 与 Agent,含任务校验、默认端口与前端表单/恢复确认。5 个单测覆盖参数构造、全库、空产物与缺工具分支。
2026-05-27 18:35:10 +08:00
Wu Qing
992fc24150
feat(backup): GFS 分层保留策略(祖父-父-子)+ 任务表单配置 ( #85 )
...
新增 GFS 分层保留:按天/周/月/年保留代表性备份,各层级并集;任一>0 启用、全0 维持原策略(兼容),锁定记录豁免。后端 retention 算法+任务字段贯通,前端任务表单 GFS 配置。go test、tsc+vite 通过。
2026-05-27 15:36:58 +08:00
Wu Qing
386f12a11b
feat(backup): 备份保留锁定 / 法律保留(豁免清理删除 + 记录页锁定) ( #84 )
...
新增保留锁定:锁定的备份豁免保留期清理与手动删除(迁移基线/合规快照/取证)。model+Locked、retention 剔除锁定记录、DeleteRecord 拒绝删除、PUT /backup/records/:id/lock、记录页锁定/解锁操作与标识。go test、tsc+vite、运行时路由验证均通过。
2026-05-27 13:59:05 +08:00
Wu Qing
f807ce10e6
feat(audit): 审计日志保留期清理(后端自动清理 + 审计页配置) ( #83 )
...
审计日志新增可配置保留期:AuditLogRepository.DeleteBefore + AuditService 保留期监控(每 6h 读取 audit_retention_days,0/缺省=永久保留);审计页新增管理员保留天数配置控件。后端 go test、前端 tsc+vite 通过。
2026-05-27 08:37:34 +08:00
Wu Qing
a0d1e66199
feat(reports): 企业合规报表(后端聚合 + CSV 导出 + 前端页面) ( #82 )
...
新增合规报表:ReportService 逐任务聚合备份合规证据(成功率/最近成功/SLA 判定/加密/受保护量)+ JSON/CSV API;前端新增 /reports 页面(汇总卡片+明细表+CSV 导出)。后端 go test、前端 tsc+vite、端到端路由验证均通过。
2026-05-27 08:14:56 +08:00
dependabot[bot]
74e29a0753
build(deps): bump go_modules group in /server ( #71 )
...
dependabot 安全更新:rclone 1.73.3→1.73.5、golang.org/x/crypto 0.48→0.50、otel 1.39→1.41、aws-sdk 等(均为 minor/patch)。#71 CI(go build/test)通过。
2026-05-27 01:23:34 +08:00
dependabot[bot]
01ce536ca8
build(deps): bump npm_and_yarn group in /docs-site ( #72 )
...
dependabot 安全更新(docs-site 站点依赖),CI 通过。
2026-05-27 01:23:26 +08:00
Wu Qing
ef2e15f500
test(replication): 为零覆盖的备份复制服务补齐测试 ( #80 )
...
新增 replication_service_test.go:备份→复制到目标存储(目标出现对象、源保留、终态 success)+ 同源拒绝。纯测试新增。
2026-05-27 01:19:49 +08:00
Wu Qing
bdf68eef7a
test(verify): 为零覆盖的验证服务补齐测试 ( #79 )
...
新增 verification_service_test.go:合法压缩备份验证通过(回归保护 #77)+ 损坏对象验证必失败。纯测试新增。
2026-05-27 01:07:12 +08:00
Wu Qing
8747d6a21b
fix(security): 节点文件浏览限制为非 viewer ( #78 )
...
GET /api/nodes/:id/fs/list 加 RequireNotViewer() 守卫,杜绝只读 viewer 枚举节点文件系统目录(信息泄露);与备份任务配置的权限级别对齐。
2026-05-27 00:54:44 +08:00
Wu Qing
04ad3c29f4
feat(verify): 验证流程同样比对备份 SHA-256,对齐恢复路径强度 ( #77 )
...
验证流程在解压前比对下载对象的 SHA-256(复用恢复路径实现),移除 verifyByType 失效的 checksum 形参。备份/恢复/验证三路径完整性校验一致。
2026-05-27 00:49:27 +08:00
Wu Qing
e63b8f0be8
feat(agent): Agent 远程恢复同样校验备份 SHA-256(补全 #75) ( #76 )
...
AgentRestoreSpec/RestoreSpec 新增 Checksum 并由 GetAgentRestoreSpec 透传;Agent ExecuteRestore 在解压前比对 SHA-256,不匹配即中止还原。两条恢复路径完整性保证一致。
2026-05-27 00:40:49 +08:00
Wu Qing
45bc210313
feat(restore): 还原前校验备份 SHA-256,拒绝损坏/被篡改的备份 ( #75 )
...
恢复路径在解密/解压前比对下载对象的 SHA-256(与备份记录一致),不匹配即中止还原且不触碰源数据;早期无 checksum 的备份跳过(向后兼容)。新增单元+集成测试。
2026-05-27 00:27:41 +08:00
Wu Qing
0f30e7bf52
refactor: 消除集群执行服务冗余逻辑 + 修复节点状态滞后缺陷 ( #74 )
...
抽取备份/恢复/验证/复制四服务的复制粘贴逻辑到 execution_helpers.go(净减约 250 行);节点状态改为按 LastSeen 实时推导,消除过期 online 误判;Agent systemd 单元补齐 LimitNOFILE 与单机端一致。go build/test 全绿。
2026-05-26 14:12:39 +08:00
Wu Qing
e4c52fd8f4
docs: 新增 CONTRIBUTING 贡献指南 ( #73 )
...
补充开发环境搭建、构建/测试命令、Conventional Commits(中文)规范、
PR 流程与编码约定。内容与仓库实际一致(Go 1.25、make 目标、vitest
前端测试、后端自动托管 web/dist)。
承接 #64 的思路并重写为与代码库一致的准确版本(不含 #63/#64 中关于
`-e PORT` 等不准确的 troubleshooting 内容)。
Co-authored-by: okwn <13228820+okwn@users.noreply.github.com >
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-26 12:56:43 +08:00
Wu Qing
17f4ec63ae
fix: 后端直接托管 Web 控制台修复 #62,并修复 CodeQL 安全告警 ( #70 )
...
* fix(server): 后端直接托管 Web 控制台,修复无 nginx 时 404 (#62 )
问题 #62:在未安装 nginx 的服务器上,访问 :8340/ 返回
"route not found"(404),Web 控制台完全无法打开;同时 systemd
服务以 backupx 用户启动时因无权读取 root:root 0640 的配置文件
而反复退出(exit 1)。
修复:
- 后端新增 SPA 静态托管:自动探测前端目录(./web、./web/dist、
/opt/backupx/web 等,或 server.web_root 显式指定),命中后直接
提供静态文件与 index.html 回退,无需额外 nginx 反向代理即可访问
控制台。/api、/health、/metrics、/install 等保留前缀仍返回结构化
JSON 404,不会被 SPA 回退污染(沿用 issue #46 的约定)。
- 含 ".." 的请求路径由文件服务层直接拒绝,叠加 filepath.Rel 容器
校验,杜绝目录穿越。
- install.sh 以 backupx:backupx 安装配置文件并显式 chown,修复历史
版本 root:root 0640 导致服务无法读取配置而启动失败的问题;安装
完成提示同步说明可直接通过 :8340 访问,并给出 journalctl 排查命令。
- 新增 spa_test.go 覆盖目录探测、保留前缀判定、SPA 回退与穿越防护。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
* fix(security): 修复邮件头注入,加固 webhook 与整数转换
CodeQL 静态扫描在 main 上的真实告警修复:
- 邮件通知(email.go):From/To/Subject 头部此前直接拼接用户可控
内容(备份任务名会进入 Subject),存在 SMTP 头注入风险(可注入
Bcc 等额外头部或伪造正文)。新增 buildRawMessage/sanitizeHeaderValue
剔除头部值中的 CR/LF;正文保持原样。新增 email_test.go 覆盖。
- webhook 通知(webhook.go):Validate 增加 URL 解析与 http/https
协议校验,杜绝 file://、gopher:// 等可用于 SSRF 的协议。
- 整数转换(auth_service.go、storage_target_handler.go、
backup_record_handler.go):将 ParseUint 的 bitSize 由 64 改为 0
(即 uint 宽度),消除 uint64→uint 的潜在截断(32 位平台上为越界
拒绝而非静默截断),并清除 go/incorrect-integer-conversion 告警。
注:archive.go/file_runner.go 的 zipslip 告警为误报(已有 HasPrefix
容器校验且不解压符号链接);node FS 浏览与 webhook 目标主机由设计上
的鉴权用户控制,不在本次行为变更范围内。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-26 12:50:57 +08:00
dependabot[bot]
5a936ee162
build(deps): bump the npm_and_yarn group across 2 directories with 7 updates ( #59 )
...
Bumps the npm_and_yarn group with 1 update in the /docs-site directory: [fast-uri](https://github.com/fastify/fast-uri ).
Bumps the npm_and_yarn group with 6 updates in the /web directory:
| Package | From | To |
| --- | --- | --- |
| [follow-redirects](https://github.com/follow-redirects/follow-redirects ) | `1.15.11` | `1.16.0` |
| [lodash](https://github.com/lodash/lodash ) | `4.17.23` | `4.18.1` |
| [picomatch](https://github.com/micromatch/picomatch ) | `4.0.3` | `4.0.4` |
| [postcss](https://github.com/postcss/postcss ) | `8.5.8` | `8.5.14` |
| [axios](https://github.com/axios/axios ) | `1.13.6` | `1.15.2` |
| [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite ) | `6.4.1` | `6.4.2` |
Updates `fast-uri` from 3.1.0 to 3.1.2
- [Release notes](https://github.com/fastify/fast-uri/releases )
- [Commits](https://github.com/fastify/fast-uri/compare/v3.1.0...v3.1.2 )
Updates `follow-redirects` from 1.15.11 to 1.16.0
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases )
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.11...v1.16.0 )
Updates `lodash` from 4.17.23 to 4.18.1
- [Release notes](https://github.com/lodash/lodash/releases )
- [Commits](https://github.com/lodash/lodash/compare/4.17.23...4.18.1 )
Updates `picomatch` from 4.0.3 to 4.0.4
- [Release notes](https://github.com/micromatch/picomatch/releases )
- [Changelog](https://github.com/micromatch/picomatch/blob/master/CHANGELOG.md )
- [Commits](https://github.com/micromatch/picomatch/compare/4.0.3...4.0.4 )
Updates `postcss` from 8.5.8 to 8.5.14
- [Release notes](https://github.com/postcss/postcss/releases )
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md )
- [Commits](https://github.com/postcss/postcss/compare/8.5.8...8.5.14 )
Updates `axios` from 1.13.6 to 1.15.2
- [Release notes](https://github.com/axios/axios/releases )
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md )
- [Commits](https://github.com/axios/axios/compare/v1.13.6...v1.15.2 )
Updates `vite` from 6.4.1 to 6.4.2
- [Release notes](https://github.com/vitejs/vite/releases )
- [Changelog](https://github.com/vitejs/vite/blob/v6.4.2/packages/vite/CHANGELOG.md )
- [Commits](https://github.com/vitejs/vite/commits/v6.4.2/packages/vite )
---
updated-dependencies:
- dependency-name: fast-uri
dependency-version: 3.1.2
dependency-type: indirect
dependency-group: npm_and_yarn
- dependency-name: follow-redirects
dependency-version: 1.16.0
dependency-type: indirect
dependency-group: npm_and_yarn
- dependency-name: lodash
dependency-version: 4.18.1
dependency-type: indirect
dependency-group: npm_and_yarn
- dependency-name: picomatch
dependency-version: 4.0.4
dependency-type: indirect
dependency-group: npm_and_yarn
- dependency-name: postcss
dependency-version: 8.5.14
dependency-type: indirect
dependency-group: npm_and_yarn
- dependency-name: axios
dependency-version: 1.15.2
dependency-type: direct:production
dependency-group: npm_and_yarn
- dependency-name: vite
dependency-version: 6.4.2
dependency-type: direct:development
dependency-group: npm_and_yarn
...
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-26 12:47:09 +08:00
dependabot[bot]
d39335bdde
build(deps): bump golang.org/x/image ( #36 )
...
Bumps the go_modules group with 1 update in the /server directory: [golang.org/x/image](https://github.com/golang/image ).
Updates `golang.org/x/image` from 0.32.0 to 0.38.0
- [Commits](https://github.com/golang/image/compare/v0.32.0...v0.38.0 )
---
updated-dependencies:
- dependency-name: golang.org/x/image
dependency-version: 0.38.0
dependency-type: indirect
dependency-group: go_modules
...
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-26 12:43:21 +08:00
Wu Qing
7084d47c4b
feat(BackupX): harden agent cluster backup workflow
...
Squash merge PR #61
v2.3.5
2026-05-13 14:24:45 +08:00
Wu Qing
7a6ffd4ddd
feat(BackupX): 修复跨节点备份恢复终态处理 ( #60 )
...
* feat(BackupX): 修复集群部署管理逻辑
* feat(BackupX): 修复节点池任务运行归属
* feat(BackupX): 修复跨节点恢复路由
* feat(BackupX): 修复跨节点备份恢复终态处理
* test(BackupX): 稳定安装流HTTP测试
v2.3.4
2026-05-09 23:03:25 +08:00
Wu Qing
61709dd4c9
fix(cluster): support external master URL
...
- add server.external_url / BACKUPX_SERVER_EXTERNAL_URL for Agent install URL generation
- pass the configured external Master URL into install script and compose rendering
- document cluster deployment requirements for Docker, bare-metal, and multi-node setups
Fixes #55
2026-05-09 07:41:51 +08:00
Wu Qing
f6bd185b9f
feat: improve agent install release layout support
...
- fix bare-metal Agent install config and executor path handling
- support release package layout in deploy/install.sh and release workflow
- add regression tests for Agent execution and deploy install script behavior
2026-05-09 00:00:53 +08:00
Wu Qing
af0e8f5c1f
fix: respect local timezone for scheduler ( #54 )
v2.3.1
2026-05-01 14:39:16 +08:00
Wu Qing
63fde903d2
feat: add complete MFA support
...
Add complete MFA support with TOTP, recovery codes, WebAuthn, trusted-device cookie flow, and email/SMS OTP delivery via notification channels. Security follow-up: trusted device tokens are stored in HttpOnly cookies, and SMS OTP reuses the existing Webhook notifier to avoid introducing a new dynamic URL sink.
v2.3.0
2026-04-25 22:14:50 +08:00
Wu Qing
67a42b09ba
fix: make agent install command proxy independent ( #50 )
v2.2.1
2026-04-25 13:43:30 +08:00
Wu Qing
bc8742977e
功能: v2.2 节点池调度 + Grafana Dashboard + 版本漂移 UI ( #49 )
...
节点池动态调度(企业集群核心需求):
- model.Node 新增 Labels CSV;Node.HasLabel / LabelSet 辅助方法
- model.BackupTask 新增 NodePoolTag;与 NodeID 互斥(校验层拒绝同时设置)
- BackupExecutionService.selectPoolNode:匹配标签的在线节点中选"运行中任务最少"
并列按 ID 升序稳定;空池返回 NODE_POOL_EMPTY 让用户立即感知
- 选中节点仅写 BackupRecord,不回写 task.NodeID —— 每次执行重选实现真轮转均衡
Grafana Dashboard(v2.1 指标的可视化闭环):
- deploy/grafana/backupx-dashboard.json:11 个面板覆盖概览/时序/容量/集群
- deploy/grafana/README.md:Prometheus 抓取配置 + 告警建议
- release workflow 打包 grafana/ + nginx.conf 到 tar.gz
前端:
- 节点列表:Agent 版本 vs Master 不一致时橙红 Tag + Tooltip 提示升级
- 节点列表新增"标签/节点池"列,支持 CSV 编辑 + 并发/带宽一起改
- 任务表单新增 NodePoolTag 输入框,与节点选择器互斥禁用
测试:
- model/node_label_test.go:HasLabel / LabelSet / nil 安全
- service/node_pool_scheduler_test.go:负载最低优先 / 空池错误 / nil repo 降级
- go test ./... + npm run build 全绿
v2.2.0
2026-04-21 14:05:48 +08:00
Wu Qing
1a699da8d6
修复: #46 Agent 一键安装脚本在 Debian dash 下执行失败 ( #48 )
...
* 修复: #46 Agent 一键安装脚本在 Debian dash 下执行失败
根因(多因素,任何一个都可能导致用户复现的 "sh: 2: Syntax error: newline unexpected"):
- Debian/Ubuntu 默认 /bin/sh → dash;pipe 方式下 shebang 被忽略
- Content-Type: text/x-shellscript 会触发部分 CDN/反向代理的脚本识别与改写
- 如果响应被改写为 HTML,sh 在第 2 行(<html>)即报此语法错误
修复:
1. 前端命令改为 `curl -fsSL URL | sudo bash`(避开 dash)
2. 命令面板增加"先下载再执行"备用命令(代理过滤场景兜底)
3. install handler Content-Type 改为 text/plain;加 nosniff / no-store /
Content-Disposition 三头,减少中间层改写的概率
4. 脚本模板加 magic marker `BACKUPX_AGENT_INSTALL_V1`,用户可通过
`head -3` 自查响应完整性;加 bash 自举段,文件执行时优先切到 bash
测试:
- installscript/issue46_test.go 断言 magic + bash-bootstrap 存在于三种模式
- install_flow_test.go 断言新 headers 与 marker
- go test ./... 全绿,前端 build 通过
* 修复: #46 用户截图证实 nginx SPA fallback 返回 index.html
用户反馈截图显示 curl 下载到的是 BackupX 前端 HTML,而非 shell 脚本——
说明 /install/:token 未被反向代理转发到后端,nginx 按 try_files fallback
到 /index.html,sh 读第 2 行 <html> 报语法错误。
真正的根因修复:
1. 后端 install 端点额外暴露 /api/install/:token 别名,让反向代理
已有的 /api/ 转发规则自动接管
2. 节点创建时返回的 url/composeUrl 统一使用 /api/install/ 前缀
3. 更新 deploy/nginx.conf 模板:
- 新增 location /install/ 转发(兼容旧版本生成的命令)
- 新增 /health /ready /metrics 单独转发,避免 SPA fallback
测试:
- install_flow_test.go 新增 TestInstallScriptAliasUnderAPI 断言
/api/install/:token 路径可用 + 新生成的 url 用 /api/install/ 前缀
v2.1.0
2026-04-20 23:35:39 +08:00
Wu Qing
1b73f19eb1
功能: v2.1 可观测性与流控 ( #47 )
...
* 功能: v2.1 可观测性与流控 — Prometheus + 节点带宽 + 审计 Webhook
核心能力:
- Prometheus /metrics 端点:11 类指标(任务/存储/节点/SLA/验证/恢复/复制)
- 节点级带宽限速生效:model.Node.BandwidthLimit 覆盖全局默认
- 审计日志 Webhook 外输:HMAC-SHA256 签名,配合 SIEM 合规留档
实现:
- server/internal/metrics/ 独立 Registry + 异步 Gauge Collector(30s)
- backup/restore/verify/replication 服务注入 metrics 钩子,nil 安全
- resolveProviderForNode() 按 task.NodeID 解析 BandwidthLimit
- AuditService.SetWebhook + 动态 settings 推送,无需重启
测试:
- metrics/registry_test.go: 注册/采集/nil safety/HTTP handler
- service/audit_service_webhook_test.go: 签名正确性/异步投递/禁用路径
- go test ./... 全部通过
* chore: 触发 CodeQL 扫描
2026-04-20 23:26:04 +08:00
Wu Qing
539e9e64c4
功能: v2.0.0 企业级备份管理平台 — 11 项核心能力 ( #45 )
...
* 功能: v2.0.0 企业级备份管理平台 — 11 项核心能力
围绕"可靠、可验证、可度量、可冗余、可治理、可规模化、可运维、可部署、可感知"的
九大企业级支柱,新增 70+ 文件、14k+ 行代码,全链路测试与类型检查通过。
## 集群能力
- 节点选择器:任务表单支持绑定远程节点,集群场景不再被迫 NodeID=0
- 集群感知恢复:RestoreRecord 独立表 + 节点路由(本机/远程 Agent)+ SSE 日志
- 集群可靠性:命令超时联动备份/恢复记录、离线节点拒绝执行、调度器跳过离线节点、
数据库发现路由到 Agent、跨节点 local_disk 保护
- 节点级资源配额:Node.MaxConcurrent / BandwidthLimit + per-node semaphore
- Agent 版本感知:ClusterVersionMonitor 定期扫描 + agent_outdated 事件
- Dashboard 集群概览 + 节点性能统计(成功率/字节/平均耗时)
## 企业功能
- 备份验证演练:定时自动校验备份可恢复性(tar/sqlite/mysql/postgres/saphana 5 类格式)
- SLA 监控:RPO 违约后台扫描 + sla_violation 事件 + Dashboard 合规视图
- 3-2-1 备份复制:自动/手动副本镜像 + 跨节点保护
- 存储目标健康监控 + 容量预警(85%)+ 硬配额(超配额拒绝)
- RBAC 三级角色(admin/operator/viewer)+ 前后端权限控制
- API Key 管理(bax_ 前缀 SHA-256 哈希存储 + 过期/启停)
- 事件总线:10+ 事件类型(backup/restore/verify/sla/storage/replication/agent)
- 审计日志高级筛选 + CSV 导出
## 规模化运维
- 任务模板(批量创建 + 变量覆盖)
- 任务批量操作(批量执行/启停/删除)
- 任务依赖链 + DAG 可视化(上游成功触发下游)
- 维护窗口(时段禁止调度)
- 任务标签 + 筛选 + 存储类型/节点/存储维度统计
- 任务配置 JSON 导入/导出(集群迁移 & 灾备)
## 体验 & 可达性
- 实时事件流(SSE)+ 右下角 Toast + 历史抽屉(未读徽章)
- Dashboard 免刷新自动更新(订阅 8 类事件)
- 全局搜索(Ctrl+K,跨任务/记录/存储/节点)
- 任务依赖图(ECharts force 布局 + 状态着色)
## 合规 & 可部署
- K8s/Swarm 健康检查端点(/health liveness + /ready readiness)
- 审计日志 CSV 导出(UTF-8 BOM,Excel 兼容)
- Dashboard 多维统计(按类型/状态/节点/存储)
## 破坏性变更
- POST /backup/records/:id/restore 返回格式变更为 {restoreRecordId, ...}
(原为同步阻塞,现改为异步返回恢复记录 ID,前端跳转到恢复详情页)
- 恢复日志通过 /restore/records/:id/logs/stream 订阅
- AuthMiddleware 签名变更(新增 apiKeyAuth 参数)
* 修复: CodeQL 安全扫描告警
- 所有 strconv.ParseUint 由 64bit 改为 32bit 位宽,strconv 内置溢出检查
- hashApiKey 参数改名 rawToken 避免 CodeQL 误判为密码哈希(API Key 是 192 位
高熵 token,使用 bcrypt 会引入不必要的延迟;同时补充安全说明)
* 修复: API Key 哈希改用 HMAC-SHA256 + 应用级 pepper
- 符合 RFC 2104 标准,业界 API token 存储的推荐方案
- 数据库泄漏场景下增加离线反推难度(需同时获取二进制 pepper)
- 规避 CodeQL go/weak-sensitive-data-hashing 对裸 SHA-256 的误判
v2.0.0
2026-04-20 13:04:13 +08:00
Wu Qing
83bf5ec656
功能: 一键部署 Agent 向导 ( #44 )
2026-04-19 17:25:34 +08:00
Wu Qing
66373fa8e4
修复: 中文 i18n 目录名从 zh-Hans 改为 zh-CN,首页 SSR 翻译现已生效 ( #42 )
...
Docusaurus 3.10 会把 locale id 'zh-Hans' 规范化为 BCP 47 的 'zh-CN' 来
读取 i18n/ 目录。之前手工创建的 i18n/zh-Hans/ 目录 Docusaurus 识别不到,
导致中文版 SSR 输出仍是英文字符串,只有 URL 路由 /zh-Hans/ 生效。
同时修复 index.tsx 中 <Translate id={labelId}> 动态 id 问题:
write-translations 工具要求静态字符串,已拆分为三个独立的 Translate 元素。
2026-04-17 13:52:16 +08:00
Wu Qing
3a4c2edd9b
文档: 按 Ant/Arco Design 风格重构官网首页,修正 API 参考,完善 i18n ( #41 )
...
重构:
- 首页 Hero 重设计:双列布局(标题+CTA+指标 / macOS 风代码窗口)
- 引入渐变文字、pulse 徽章、悬停带动画的主按钮
- 功能卡片加 SVG 图标、悬停提升效果、部分卡片变成可点击链接
- 新增 HomepageShowcase 截图轮播区:Tab 切换四个核心页面(仪表盘/任务/存储/多节点)
- 全站换 Arco 蓝 (#165dff) 作为主色,紫色 (#8f4bff) 作为辅助
- 导航栏加毛玻璃效果、表格加圆角与边框、菜单项圆角化
- 深色模式配色整体收敛
内容修正:
- API 参考补全遗漏的端点:auth logout/profile、records batch-delete、
storage-targets star/usage/google-drive、notifications test、dashboard timeline、settings
- 把 API 表格改为"方法/端点/说明"三列,加响应结构说明
- 中英文 API 文档同步更新
i18n:
- code.json 补充 Hero、Features、Showcase 全部新翻译键
- 校对:16 个中英文档 frontmatter 完全对齐,无漏译
构建:双语 build 通过、产物 3.3MB
2026-04-17 13:39:27 +08:00
Wu Qing
a6dd8033ed
文档: 新增 Docusaurus 官网与双语文档,README 切换为英文默认 ( #39 )
...
- 新建 docs-site/ Docusaurus 项目,支持 en + zh-Hans 双语
- 从 README 迁移内容为独立文档页面:
- Getting Started(安装、快速开始)
- Deployment(Docker、裸机、Nginx、配置参考)
- Features(备份类型、存储后端、SAP HANA、多节点集群、通知)
- Reference(API、CLI)
- Development(开发、贡献)
- 自定义 BackupX 主题色、logo、落地页组件
- 新增 .github/workflows/docs.yml,Actions 自动构建并发布到 GitHub Pages
- README.md 切换为英文,中文版挪到 README.zh-CN.md,两者均精简为导航型
- 配置站点 URL:https://awuqing.github.io/BackupX/
2026-04-17 13:19:41 +08:00
Wu Qing
81c9c042d6
功能: 修复并实现多节点集群部署 ( #38 )
...
基础修复:
- 新增节点离线检测:每 15s 扫描,超 45s 未心跳的远程节点自动置离线
- 节点删除前检查关联任务,避免孤立备份任务
- BackupTaskRepository 新增 CountByNodeID/ListByNodeID
Master 端 Agent 协议:
- 新增 AgentCommand 模型与命令队列仓储(pending/dispatched/succeeded/failed/timeout)
- 新增 AgentService:任务下发、命令轮询、结果回收、超时扫描
- 新增专用 Agent HTTP API(X-Agent-Token 认证):
/api/agent/heartbeat
/api/agent/commands/poll
/api/agent/commands/:id/result
/api/agent/tasks/:id
/api/agent/records/:id
- BackupExecutionService 支持 node 路由:task.NodeID 指向远程节点时自动入队派发
Agent CLI(backupx agent 子命令):
- 配置:YAML 文件 / 环境变量 / CLI 参数,优先级 CLI > 文件 > 环境
- 心跳循环 + 命令轮询循环 + 优雅退出
- 本地复用 BackupRunner 与 storage registry 执行备份并直接上传
- 支持 run_task 和 list_dir 两种命令
远程目录浏览:
- NodeService 支持通过 Agent RPC 列出远程节点目录(15s 超时)
前端:
- NodesPage 添加节点后展示 Agent 启动命令和环境变量配置
文档:
- README 中英文重写"多节点集群"章节,含架构图、步骤、限制、CLI 参考
v1.6.0
2026-04-17 12:29:08 +08:00
Wu Qing
3e90e0f8a8
功能: 新增 SAP HANA 完整备份支持与 Backint 协议代理 ( #37 )
...
* chore: ignore web/dist directory in git repository
* 功能: 新增 SAP HANA 完整备份支持与 Backint 协议代理
- 修复 service 层校验 bug,使 SAP HANA 类型可正常创建
- 增强 hdbsql Runner:支持完整/增量/差异/日志备份、并行通道、失败重试
- 新增 Backint 协议代理(backupx backint 子命令),HANA 原生接口直连 BackupX 存储后端
- 新增本地 SQLite 目录维护 EBID↔对象键映射
- 前端新增 SAP HANA 扩展字段表单(备份类型/级别/通道数/重试次数/实例编号)
- README 中英文补充 SAP HANA 两种模式的使用说明
v1.5.0
2026-04-16 23:43:46 +08:00
Wu Qing
827a5a2181
文档: 更新 README 中英文文档 ( #35 )
...
- 存储后端描述更新为 70+ rclone 集成
- API 参考补充新增端点(节点编辑、Rclone 后端列表、版本检查、Agent 心跳)
- 技术栈补充 rclone
- 多节点集群章节补充 IP 检测、节点编辑等新功能描述
- 存储目标添加指南补充 Rclone 类型配置项分层说明
- 任务删除行为说明(清理远端文件、保留记录)
- 版本升级指引从一键更新改为手动 docker compose pull
- 发版示例更新为 v1.4.3
v1.4.3
2026-04-05 11:33:56 +08:00
Wu Qing
970eb154e1
优化: 多模块功能修复与体验改进 ( #34 )
...
1. 保留策略清理后自动删除空文件夹(新增 StorageDirCleaner 接口)
2. 备份任务删除时清理远端文件但保留备份记录
3. 节点管理修复:本机 IP/版本检测、Heartbeat OS/Arch 修正、新增编辑功能
4. 审计日志规范化:统一格式、丰富详情、节点操作增加审计记录
5. 系统设置移除一键更新操作,仅保留版本检查
6. Rclone 配置项分层展示(必填 + 高级可选折叠)
7. DirectoryPicker 目录选择器样式优化
2026-04-05 11:23:46 +08:00
Wu Qing
d26753c44a
优化: 存储类型下拉框分类中文标注去重 ( #33 )
...
优化: 存储类型下拉框分类中文标注去重
v1.4.2
2026-04-02 13:43:37 +08:00
Awuqing
4251eb9e15
优化: 存储类型下拉框分类中文标注 + 去重
...
问题:API 返回的 rclone 后端纯英文技术名难辨别,且和内置类型存在重复
(如 rclone 的 drive 和内置的 google_drive)。
修复:
- 前端静态定义分类+中文标注(常用/云存储/网盘/文件传输/企业存储/自建存储)
- 排除工具类后端(alias/cache/http/archive 等)和重复后端(drive→用google_drive)
- Select 使用 OptGroup 按分组渲染,搜索仍支持英文/中文关键词
- 常用类型(S3/阿里云/SFTP 等)置顶,其余按分类排列
2026-04-02 13:39:43 +08:00
Wu Qing
94d5fb7286
功能: Docker 一键自动更新 ( #32 )
...
功能: Docker 一键自动更新
v1.4.1
2026-04-01 23:47:43 +08:00
Awuqing
8eb93b3dd9
功能: Docker 一键自动更新
...
- 新增 POST /api/system/update-apply,执行 docker pull + docker compose up -d
- 前端系统设置页新增「一键更新(Docker)」按钮,点击后自动拉取新镜像并重启容器
- Dockerfile 安装 docker-cli + docker-cli-compose
- docker-compose.yml 挂载 /var/run/docker.sock 以支持容器内操作 Docker
- 自动检测是否为 Docker 环境,非 Docker 环境引导下载二进制
2026-04-01 23:43:12 +08:00
Wu Qing
df5c8aa80d
功能: 系统更新检查 ( #31 )
...
功能: 系统更新检查(GitHub Release + Docker)
v1.4.0
2026-04-01 23:18:21 +08:00