Wu Qing
1715abfcfb
fix: make agent install command proxy independent ( #50 )
v2.2.1
2026-04-25 13:43:30 +08:00
Wu Qing
eff48342c8
功能: 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
e2baa6bd17
修复: #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
5021fe665e
功能: 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
f7596bd319
功能: 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
726c5e134b
功能: 一键部署 Agent 向导 ( #44 )
2026-04-19 17:25:34 +08:00
Wu Qing
1a0e6d463a
修复: 中文 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
c629b5f286
文档: 按 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
bc3d03de7e
文档: 新增 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
757b0fa5ed
功能: 修复并实现多节点集群部署 ( #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
e04774ff68
功能: 新增 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
241a4808be
文档: 更新 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
b336bebdb1
优化: 多模块功能修复与体验改进 ( #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
33682b5ea7
优化: 存储类型下拉框分类中文标注去重 ( #33 )
...
优化: 存储类型下拉框分类中文标注去重
v1.4.2
2026-04-02 13:43:37 +08:00
Awuqing
435c819c77
优化: 存储类型下拉框分类中文标注 + 去重
...
问题: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
9ae04aaac3
功能: Docker 一键自动更新 ( #32 )
...
功能: Docker 一键自动更新
v1.4.1
2026-04-01 23:47:43 +08:00
Awuqing
618a1c1d43
功能: 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
ae658f1c2f
功能: 系统更新检查 ( #31 )
...
功能: 系统更新检查(GitHub Release + Docker)
v1.4.0
2026-04-01 23:18:21 +08:00
Awuqing
a78296404e
功能: 系统更新检查(GitHub Release + Docker)
...
后端:
- 新增 GET /api/system/update-check,从 GitHub Releases API 获取最新版本
- 自动比较当前版本与最新版本,匹配当前平台的下载链接
- 返回版本号、更新说明、下载链接、Docker 镜像信息
前端(系统设置页重构):
- 新增"检查更新"按钮,点击后展示更新结果
- 有新版本时显示版本号、更新说明、下载按钮、Docker 更新命令
- 新增磁盘状态卡片(总空间/已用/可用/使用率)
- 运行模式用彩色 Tag 区分(生产/开发)
2026-04-01 23:13:32 +08:00
Wu Qing
b00b288028
修复: rclone 后端列表不显示 + 调度审计 + 批量删除 ( #30 )
...
修复: rclone 后端列表不显示 + 调度审计 + 批量删除
v1.3.6
2026-04-01 23:02:40 +08:00
Awuqing
7602b6cd80
修复: rclone 后端列表不显示 + 调度审计 + 批量删除
...
1. 修复前端 rclone 后端 API 路径双重 /api 前缀导致 404,
存储类型下拉框现在正确显示全部 70+ rclone 后端
2. 调度器自动触发的备份任务计入审计日志(用户名: system)
3. 新增备份记录批量删除 API (POST /api/backup/records/batch-delete)
2026-04-01 22:57:55 +08:00
Wu Qing
82b6f741ba
修复: 上传操作级重试 ( #29 )
...
修复: 上传操作级重试,解决远端临时故障导致自动备份失败
v1.3.5
2026-04-01 18:40:13 +08:00
Awuqing
70dff41b70
修复: 上传操作级重试,解决 Google Drive 等远端临时故障导致自动备份连续失败
...
问题:rclone 底层重试只覆盖单个 HTTP 请求,但 Google API 的 502/timeout
等临时故障会导致整个上传操作失败,自动触发的备份任务连续失败。
修复:在 provider.Upload 外层增加操作级重试(最多 3 次,指数退避 10s/40s/90s),
每次重试重新打开文件并重建 reader 链。重试过程通过日志流实时反馈。
2026-04-01 18:35:26 +08:00
Wu Qing
6838eabc71
功能: 全部 rclone 后端注册为一级存储类型 ( #28 )
...
功能: 全部 rclone 后端注册为一级存储类型
v1.3.4
2026-04-01 12:59:29 +08:00
Awuqing
66b4714b71
功能: 全部 rclone 后端注册为一级存储类型
...
将全部 70+ rclone 后端(SFTP、Azure Blob、Dropbox、OneDrive、B2、SMB 等)
自动注册为独立 Factory,与 S3、FTP 等内置类型完全平级。
- 新增 GenericBackendFactory + RegisterAllBackends 自动注册全部后端
- 移除 oneof 硬编码白名单,type 字段接受任意已注册存储类型
- 前端类型选择器合并内置类型和全部 rclone 后端为统一可搜索下拉框
- 选择 SFTP 直接存储 type="sftp",非内置类型自动从 API 获取配置字段
2026-04-01 12:52:06 +08:00
Wu Qing
df82fa0280
优化: 重新设计 Cron 编辑器交互体验 ( #27 )
...
优化: 重新设计 Cron 编辑器交互体验
2026-04-01 07:50:16 +08:00
Awuqing
f0161aac94
优化: 重新设计 Cron 编辑器交互体验
...
核心问题:预设选中后下方 Tab 编辑器仍展开显示混乱的技术细节。
重新设计为三层交互:
1. 预设按钮(一键选择常见场景,选中高亮,无多余 UI)
2. 自定义选择器(每天/每周/每月/间隔四种模式,直观的时间选择器
和星期按钮,无需理解 cron 语法)
3. 手动输入(高级用户直接编辑 cron 表达式)
同时优化中文描述为自然语言("每天 02:00 执行" 替代 "02 时 00 分 执行")
2026-04-01 07:44:19 +08:00
Wu Qing
7149af012e
优化: Cron 表达式编辑器增加预设和中文描述 ( #26 )
...
优化: Cron 表达式编辑器增加预设和中文描述
v1.3.2
2026-04-01 00:17:38 +08:00
Wu Qing
3610ccfc87
修复: 审计日志补充操作详情 + 版本号注入修复 ( #25 )
...
修复: 审计日志补充操作详情 + 版本号注入修复
2026-04-01 00:17:34 +08:00
Wu Qing
407f8d7cff
修复: 存储目标创建/连接测试/类型选择三个关键问题 ( #24 )
...
修复: 存储目标创建/连接测试/类型选择三个关键问题
2026-04-01 00:17:29 +08:00
Awuqing
c25852d810
优化: Cron 表达式编辑器增加预设和中文描述
...
1. 新增 8 个常用预设按钮(每天 02:00、每 6 小时、每周日、每月 1 日等),
一键设置无需逐个 Tab 操作
2. 新增中文可读描述(如 "02 时 00 分 执行"),实时显示在表达式下方
3. 选中的预设按钮高亮显示
2026-04-01 00:12:32 +08:00
Awuqing
8a850b90b4
修复: 审计日志补充操作详情 + 版本号注入修复
...
1. 审计日志:所有 handler 的 recordAudit 调用补充有意义的 detail,
包括创建/更新时记录类型、删除时记录 ID、设置变更时记录修改的 key
2. 版本号:Makefile 的 run/build 都通过 ldflags 注入 git 版本号,
开发模式不再显示 "dev"
2026-04-01 00:10:51 +08:00
Awuqing
a581c4f30b
修复: 存储目标创建/连接测试/类型选择三个关键问题
...
1. 修复 oneof 白名单仅含 4 种类型,阿里云/腾讯/七牛/FTP/Rclone
类型的存储目标无法创建(binding 验证直接拒绝)
2. 修复本地磁盘 TestConnection 报 "directory not found",
在 List 前先 Mkdir 确保目录存在
3. 前端存储类型选项明确标注 Rclone 支持 SFTP/Azure/Dropbox 等
2026-04-01 00:06:08 +08:00
Wu Qing
31f996490f
功能: 集成 rclone 高级传输特性 + 全 70+ 后端支持 ( #23 )
...
功能: 集成 rclone 高级传输特性 + 全 70+ 后端支持
v1.3.1
2026-03-31 23:46:02 +08:00
Awuqing
1003302bdd
功能: 集成 rclone 高级传输特性 + 全 70+ 后端支持
...
1. 失败自动重试:rclone Pacer 指数退避,默认 10 次底层 HTTP 重试
2. 带宽限制:配置 bandwidth_limit + Settings 运行时可调
3. 上传实时进度:progressReader + LogHub SSE 推送字节级进度/速率
4. 存储空间查询:StorageAbout 可选接口,GetUsage 返回远端真实空间
5. 全 rclone 后端:backend/all 引入 70+ 后端,新增 rclone 存储类型,
API 驱动的可搜索后端选择器 + 动态配置表单
2026-03-31 23:37:59 +08:00
Wu Qing
cf5740b573
重构: 存储传输层集成 rclone 替代自研实现 ( #22 )
...
重构: 存储传输层集成 rclone 替代自研实现
v1.3.0
2026-03-31 22:55:41 +08:00
Awuqing
b2872f5143
重构: 存储传输层集成 rclone 替代自研实现
...
将 8 种存储后端(本地磁盘、S3、WebDAV、Google Drive、FTP、阿里云 OSS、
腾讯云 COS、七牛 Kodo)的底层传输从 4 个独立 SDK 自研实现替换为 rclone
fs 接口统一驱动。
- 新建 storage/rclone/ 包(~410 行胶水代码),包含通用 Provider 和 8 种
配置映射 Factory
- 删除 10 个旧 provider 包(~1000 行),净减少约 1000 行代码
- StorageProvider 接口、前端 UI、数据库模型、备份执行引擎全部零改动
- 获得 rclone 工业级传输能力(分片上传、断点续传、自动重试)
2026-03-31 22:52:16 +08:00
Wu Qing
fab3669ffa
Merge pull request #21 from Awuqing/feat/community-enhancements
...
feat: community enhancements, CI/CD pipeline, and backup integrity verification
v1.2.2
2026-03-31 13:23:11 +08:00
Awuqing
19fa8f632e
fix(test): use test TempDir for backup execution tests
...
The test passed an empty tempDir which defaulted to /tmp/backupx —
a directory that does not exist in CI runners. Use t.TempDir() based
path instead so the test is self-contained.
2026-03-31 13:20:11 +08:00
Awuqing
f388b98943
refactor: single-pass hashing during upload via TeeReader
...
Previous approach read the file twice (once for SHA-256, once for upload),
doubling disk I/O. Under concurrent multi-target uploads this becomes a
bottleneck.
New design — hashingReader wraps io.TeeReader + sha256.Hash:
file.Read() → TeeReader → sha256.Write() (hash) + provider (upload)
Single read pass yields both byte count and SHA-256 simultaneously.
Each upload goroutine independently opens the file and computes its own
hash. The first successful target writes checksum to the record via
sync.Once. Zero extra disk I/O, zero extra memory copies, fully
concurrent-safe.
2026-03-31 13:08:10 +08:00
Awuqing
7631cca01d
refactor: use CountingReader for upload integrity instead of List API
...
List()-based size check depends on the storage backend returning accurate
file sizes, which is not guaranteed (some WebDAV/Google Drive impls may
return 0 or omit the size field).
New approach: wrap the upload io.Reader with a CountingReader that counts
bytes as they flow through during upload. After upload completes, compare
counter.n against the expected fileSize. This is:
- Zero extra network calls (no List, no Download)
- Zero extra CPU/memory overhead (just an int64 increment per Read)
- Storage-backend agnostic (works with any provider)
If bytes transmitted != expected size → mark failed + auto-delete remote.
2026-03-31 12:40:12 +08:00
Awuqing
1d5923f747
refactor: replace download-based hash verification with lightweight size check
...
The previous approach downloaded the entire backup file after upload to
compute a remote SHA-256, which doubles bandwidth cost for every backup.
New approach:
- Local SHA-256 is still computed before upload (stored in record for audit)
- After upload, use provider.List() to check remote file size (single API call)
- If remote size is 0 or mismatches local size → mark failed + auto-delete
- If List() fails, log a warning but don't block (file may have uploaded fine)
This catches 0KB corrupted uploads with zero download overhead.
2026-03-31 12:36:29 +08:00
Awuqing
2537149b39
feat: add SHA-256 checksum verification for backup integrity
...
Addresses community feedback about 0KB corrupted backup files going
undetected after upload.
Implementation:
- Compute SHA-256 hash of final artifact (after compress/encrypt) before upload
- After each storage target upload, download the file back and verify
the hash matches the local checksum
- If verification fails: mark that target as failed, auto-delete the
corrupted remote file, and log detailed mismatch info
- Store checksum in BackupRecord model (new `checksum` column)
- Display truncated SHA-256 with copy button in backup records UI
Verification flow per storage target:
local SHA-256 → upload → download → remote SHA-256 → compare
- match: mark success
- mismatch: mark failed + delete corrupted remote file
2026-03-31 07:46:12 +08:00
Wu Qing
d4fc0b726c
Merge pull request #20 from Awuqing/feat/community-enhancements
...
fix: directory picker cannot navigate into subdirectories (#19 )
V1.2.1
2026-03-31 00:37:50 +08:00
Awuqing
2ace5a5352
fix: directory picker cannot navigate into subdirectories ( #19 )
...
Root cause: ArcoDesign Tree loadMore callback receives NodeInstance where
the key is at node.props.dataRef.key, not node.props.key. The old code
passed node.props directly which resulted in undefined key, causing
child directory loading to silently fail.
Fix:
- Access node key via node.props.dataRef?.key ?? node.props._key
- Add showLine + blockNode + folder icons for better visual hierarchy
- Add path display with copy button in selection modal
- Add unmountOnExit to reset state on close
Closes #19
2026-03-31 00:32:02 +08:00
Wu Qing
f7fb5126d1
Merge pull request #18 from Awuqing/feat/community-enhancements
...
Feat/community enhancements
2026-03-31 00:22:08 +08:00
Awuqing
9033ccabb7
docs: update Docker deployment to use published image from Docker Hub
...
- docker-compose.yml: change from local build to awuqing/backupx:latest
with clear comments for mounting host volumes
- README: Docker quick start now uses `docker run` / `docker compose`
directly without cloning the repo first
- Add Docker Hub badge and link to awuqing/backupx
- Keep source build instructions as a separate option
2026-03-31 00:16:31 +08:00
Awuqing
6c1e988920
docs: restructure README with user-friendly guides and deployment instructions
...
Rewrite both README.md and README_EN.md:
- Reorganize around user journey: install → setup → add storage → create task → monitor
- Add step-by-step "Quick Start" guide (5 steps from zero to first backup)
- Add storage target config reference table
- Consolidate duplicate deployment sections into single "Deployment Guide"
- Remove redundant password reset entries (was listed twice)
- Move Project Structure / Architecture to end (dev-facing, not user-facing)
- Compact API reference table (remove verbose endpoint prefixes)
- Add screenshot grid layout for better visual impact
2026-03-31 00:10:06 +08:00
Wu Qing
23d667a8c3
Merge pull request #17 from Awuqing/feat/community-enhancements
...
ci: add automated release pipeline with Docker Hub push and China mir…
V1.2.0
2026-03-30 23:45:13 +08:00
Awuqing
0aa25d99f2
ci: add automated release pipeline with Docker Hub push and China mirror support
...
- Fix Go/Node version mismatch in CI (1.21→1.25, 18→20)
- Rewrite release.yml: 3-job pipeline (frontend → binary release + Docker push)
- Supports both tag push and manual workflow_dispatch trigger
- Builds linux/amd64 + linux/arm64 binaries → GitHub Release tar.gz
- Builds multi-arch Docker image → Docker Hub (awuqing/backupx)
- Dockerfile: add ARG USE_CHINA_MIRROR for China network acceleration
(npm→npmmirror, go→goproxy.cn, apk→aliyun), add ARG VERSION injection
- Makefile: auto version from git tag, add docker/docker-cn targets
- README: add beginner-friendly China build guide and release instructions
2026-03-30 23:32:14 +08:00