Awuqing
c2805da6df
refactor(ui): 统一 SVG 图标组件
...
建立本地图标出口,统一项目内 Arco SVG 图标依赖并抽取登录页服务器插画。
以可复用的存储目标名称组件替换字符星标,补充可访问语义与组件测试。
2026-08-07 05:56:20 +08:00
Awuqing
f8deafcb00
feat(auth): 完善英文初始化与裸机安装
...
在登录和首个管理员创建前提供中英文切换,并在初始化状态不可达时展示可重试错误,避免误入登录页。
对齐源码构建产物与安装脚本路径,增加 systemd/API 就绪检查、失败诊断及中英文裸机文档。
Closes #104
2026-08-07 05:55:56 +08:00
Awuqing
cc50637b4b
feat(cluster): 支持远程源服务器集中备份
...
为 Master 本地磁盘增加可选流式中转,远程 Agent 可直接把产物写入中央存储并通过反向通道恢复。
持久化并校验传输模式,兼容既有 Agent 本机磁盘目标,补齐鉴权、完整性、配额、访问保护、前端配置及双向链路测试。
Closes #101
2026-08-07 05:54:34 +08:00
Awuqing
05dd1baa61
feat(backup): 新增 CDC 内容寻址仓库模式
...
使用内容定义分块、不可变 pack 与快照索引实现跨文件和跨快照去重。
接入多目标上传、软配额、恢复、下载、校验、保留和安全垃圾回收,并补充前端入口、中英文文档及端到端测试。
Closes #94
2026-08-07 05:53:16 +08:00
Wu Qing
50ce6587d8
feat(restore): 恢复到指定目录(文件类型本机恢复 + 确认弹窗输入) ( #86 )
...
* feat(restore): 支持恢复到指定目录(文件类型本机恢复)
恢复此前只能覆盖原始源路径。新增「恢复到指定目录」:把文件备份还原到任意目录,
用于测试恢复、迁移、并排恢复而不覆盖现网数据。
- backup.TaskSpec +RestoreTargetPath;FileRunner.Restore 非空时把归档解压到该目录。
- model.RestoreRecord +TargetPath(持久化/审计)。
- RestoreService.Start 增加 targetPath 参数与校验:仅文件类型、需绝对路径、
远程节点暂不支持(清晰报错);executeLocally 透传到 spec。
- 恢复触发端点接受可选请求体 {targetPath}(无 body 时恢复到原始路径)。
- 测试:恢复到指定目录后文件落在该目录;相对路径被拒。
* feat(restore): 恢复确认弹窗支持指定恢复目录
文件类型 + 本机恢复时,恢复确认弹窗新增「恢复到指定目录」输入(可选、绝对路径、
留空=原位置),并实时反映在「恢复目标」摘要中;经 startRestoreFromBackup 透传 targetPath。
2026-06-01 00:39:17 +08:00
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
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
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
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 and Claude Opus 4.7
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
Wu Qing
7084d47c4b
feat(BackupX): harden agent cluster backup workflow
...
Squash merge PR #61
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测试
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 )
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.
2026-04-25 22:14:50 +08:00
Wu Qing
67a42b09ba
fix: make agent install command proxy independent ( #50 )
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 全绿
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/ 前缀
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 的误判
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 参考
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 两种模式的使用说明
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
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 )
...
优化: 存储类型下拉框分类中文标注去重
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 一键自动更新
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)
2026-04-01 23:18:21 +08:00
Awuqing
9a4556f473
功能: 系统更新检查(GitHub Release + Docker)
...
后端:
- 新增 GET /api/system/update-check,从 GitHub Releases API 获取最新版本
- 自动比较当前版本与最新版本,匹配当前平台的下载链接
- 返回版本号、更新说明、下载链接、Docker 镜像信息
前端(系统设置页重构):
- 新增"检查更新"按钮,点击后展示更新结果
- 有新版本时显示版本号、更新说明、下载按钮、Docker 更新命令
- 新增磁盘状态卡片(总空间/已用/可用/使用率)
- 运行模式用彩色 Tag 区分(生产/开发)
2026-04-01 23:13:32 +08:00
Wu Qing
a772b94ca5
修复: rclone 后端列表不显示 + 调度审计 + 批量删除 ( #30 )
...
修复: rclone 后端列表不显示 + 调度审计 + 批量删除
2026-04-01 23:02:40 +08:00
Awuqing
3bd15bf3fd
修复: 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
5ae7fb2f5d
修复: 上传操作级重试 ( #29 )
...
修复: 上传操作级重试,解决远端临时故障导致自动备份失败
2026-04-01 18:40:13 +08:00
Awuqing
37ad6b1db1
修复: 上传操作级重试,解决 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
d9e0609089
功能: 全部 rclone 后端注册为一级存储类型 ( #28 )
...
功能: 全部 rclone 后端注册为一级存储类型
2026-04-01 12:59:29 +08:00
Awuqing
ab9919f15f
功能: 全部 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
d70b4094af
优化: 重新设计 Cron 编辑器交互体验 ( #27 )
...
优化: 重新设计 Cron 编辑器交互体验
2026-04-01 07:50:16 +08:00
Awuqing
eeec7678a1
优化: 重新设计 Cron 编辑器交互体验
...
核心问题:预设选中后下方 Tab 编辑器仍展开显示混乱的技术细节。
重新设计为三层交互:
1. 预设按钮(一键选择常见场景,选中高亮,无多余 UI)
2. 自定义选择器(每天/每周/每月/间隔四种模式,直观的时间选择器
和星期按钮,无需理解 cron 语法)
3. 手动输入(高级用户直接编辑 cron 表达式)
同时优化中文描述为自然语言("每天 02:00 执行" 替代 "02 时 00 分 执行")
2026-04-01 07:44:19 +08:00
Wu Qing
cefbdf3a53
优化: Cron 表达式编辑器增加预设和中文描述 ( #26 )
...
优化: Cron 表达式编辑器增加预设和中文描述
2026-04-01 00:17:38 +08:00
Wu Qing
4a56ad05fc
修复: 审计日志补充操作详情 + 版本号注入修复 ( #25 )
...
修复: 审计日志补充操作详情 + 版本号注入修复
2026-04-01 00:17:34 +08:00
Wu Qing
9ea02566cb
修复: 存储目标创建/连接测试/类型选择三个关键问题 ( #24 )
...
修复: 存储目标创建/连接测试/类型选择三个关键问题
2026-04-01 00:17:29 +08:00
Awuqing
a45b1f7bfb
优化: Cron 表达式编辑器增加预设和中文描述
...
1. 新增 8 个常用预设按钮(每天 02:00、每 6 小时、每周日、每月 1 日等),
一键设置无需逐个 Tab 操作
2. 新增中文可读描述(如 "02 时 00 分 执行"),实时显示在表达式下方
3. 选中的预设按钮高亮显示
2026-04-01 00:12:32 +08:00
Awuqing
bfc8728785
修复: 审计日志补充操作详情 + 版本号注入修复
...
1. 审计日志:所有 handler 的 recordAudit 调用补充有意义的 detail,
包括创建/更新时记录类型、删除时记录 ID、设置变更时记录修改的 key
2. 版本号:Makefile 的 run/build 都通过 ldflags 注入 git 版本号,
开发模式不再显示 "dev"
2026-04-01 00:10:51 +08:00
Awuqing
3023a089fb
修复: 存储目标创建/连接测试/类型选择三个关键问题
...
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
c437a72aad
功能: 集成 rclone 高级传输特性 + 全 70+ 后端支持 ( #23 )
...
功能: 集成 rclone 高级传输特性 + 全 70+ 后端支持
2026-03-31 23:46:02 +08:00
Awuqing
93bf8435b0
功能: 集成 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
b2055c08f1
重构: 存储传输层集成 rclone 替代自研实现 ( #22 )
...
重构: 存储传输层集成 rclone 替代自研实现
2026-03-31 22:55:41 +08:00
Awuqing
f4d2271cc1
重构: 存储传输层集成 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
7c81810019
Merge pull request #21 from Awuqing/feat/community-enhancements
...
feat: community enhancements, CI/CD pipeline, and backup integrity verification
2026-03-31 13:23:11 +08:00
Awuqing
deb7cf9a5e
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
ad5c25f38e
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
7568d8a2a2
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
e5a4aaadb2
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
51f1909a73
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
f1c7abfcc0
Merge pull request #20 from Awuqing/feat/community-enhancements
...
fix: directory picker cannot navigate into subdirectories (#19 )
2026-03-31 00:37:50 +08:00
Awuqing
4407fdf731
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
bf799b3bf3
Merge pull request #18 from Awuqing/feat/community-enhancements
...
Feat/community enhancements
2026-03-31 00:22:08 +08:00
Awuqing
7e5542cae3
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
01fd87f029
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
00b153b5e1
Merge pull request #17 from Awuqing/feat/community-enhancements
...
ci: add automated release pipeline with Docker Hub push and China mir…
2026-03-30 23:45:13 +08:00
Awuqing
f201b7633a
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
Wu Qing
4bf89ae7e5
Merge pull request #16 from Awuqing/feat/community-enhancements
...
feat: community enhancements — password reset, audit logs, multi-source backup
2026-03-30 23:10:07 +08:00
Awuqing
09698cc767
feat: add community enhancements — password reset, audit logs, multi-source backup
...
Three community-requested features:
1. CLI password reset: `backupx reset-password --username admin --password xxx`
Docker users can run via `docker exec`. No full app init needed.
2. Audit logging: async fire-and-forget audit trail for all key operations
(login, CRUD on tasks/targets/records, settings changes).
New UI page at /audit with category filter and pagination.
3. Multi-source path backup: file backup tasks now support multiple source
directories packed into a single tar archive. Backward compatible with
existing single sourcePath field.
2026-03-30 23:04:37 +08:00
Wu Qing
3e476c401a
Merge pull request #15 from Awuqing/feat/docker-support
...
feat: add Docker deployment support
2026-03-30 12:33:43 +08:00
Awuqing
b01828e3b4
feat: add Docker deployment support
...
- Multi-stage Dockerfile (Node build + Go build + Alpine runtime)
- docker-compose.yml with named volume for data persistence
- In-container Nginx reverse proxy (static files + API)
- Entrypoint script for graceful process management
- .dockerignore for optimized build context
- Updated README (zh/en) with Docker quick start and deployment docs
Closes #14
2026-03-30 07:56:15 +08:00
Wu Qing
5cc5b067fd
Merge pull request #12 from Awuqing/Awuqing-patch-1
...
Update SAP HANA tool description in README
2026-03-24 23:39:20 +08:00
Wu Qing
7a67241bc6
Update SAP HANA tool description in README
2026-03-24 22:56:10 +08:00
Wu Qing
3008d86027
Merge pull request #11 from Awuqing/feat/saphana-backup-data
...
feat(saphana): refactor backup from SQL export to BACKUP DATA USING FILE
2026-03-24 18:31:04 +08:00
Awuqing
29dba71b53
feat(saphana): refactor backup from SQL export to BACKUP DATA USING FILE
...
Replace the hdbsql SELECT-based schema DDL export with SAP HANA's official
BACKUP DATA USING FILE for proper data-level backup.
Changes:
- Run: issue BACKUP DATA [FOR <tenant>] USING FILE via hdbsql, package
resulting backup files into tar archive as artifact
- Restore: extract tar, locate backup prefix, issue RECOVER DATA
[FOR <tenant>] USING FILE ... CLEAR LOG
- Add helper functions: buildHdbsqlArgs, packageBackupFiles,
extractTarArchive, findBackupPrefix
- Add 7 unit tests covering backup/restore/error paths
2026-03-24 18:24:12 +08:00
Wu Qing
ab046be247
Merge pull request #10 from Awuqing/feat/saphana-ftp-support
...
docs: 更新 README 文档,添加 SAP HANA 和 FTP 支持说明
2026-03-22 11:18:36 +08:00
Awuqing
6118d5e779
docs: 更新 README 文档,添加 SAP HANA 和 FTP 支持说明
...
- 简介描述新增 FTP/FTPS 存储选项
- 备份类型列表新增 SAP HANA(通过 hdbsql 工具)
- 存储后端表格新增 FTP / FTPS 行
- 架构图 Storage Registry 新增 FTP / FTPS
- 项目结构树新增 backup/saphana 和 storage/ftp
- 技术栈表格新增 jlaffaye/ftp 依赖
- 同步更新中英文双语 README
2026-03-21 16:22:26 +08:00
Wu Qing
93121745b7
Merge pull request #9 from Awuqing/feat/saphana-ftp-support
...
feat: 新增 SAP HANA 数据库备份支持和 FTP 存储后端
2026-03-21 16:15:43 +08:00
Awuqing
0330dd4700
feat: 新增 SAP HANA 数据库备份支持和 FTP 存储后端
...
后端变更:
- 新增 SAP HANA 备份 Runner (saphana_runner.go),使用 hdbsql CLI 工具执行数据库导出/恢复
- 新增 FTP 存储 Provider (storage/ftp/provider.go),支持 FTP/FTPS 协议上传下载备份文件
- 在 storage/types.go 中添加 FTP 类型常量和 FTPConfig 配置结构
- 在 app.go 中注册 FTP Storage Factory 和 SAP HANA Backup Runner
- 添加 github.com/jlaffaye/ftp 依赖
前端变更:
- BackupTaskType 联合类型新增 'saphana',默认端口 30015
- StorageTargetType 联合类型新增 'ftp'
- 备份任务表单支持 SAP HANA 类型选择及数据库连接配置
- 存储目标表单新增 FTP 配置字段(主机/端口/用户名/密码/基础目录/TLS)
参考:backint_minio1.0.0/ Java 实现
2026-03-21 16:09:14 +08:00
Awuqing
f7adf30079
docs: 为README添加界面截图展示
...
添加了八个界面截图文件,并在中英文README文档中新增"Screenshots"章节,用于直观展示应用各主要功能页面的用户界面,方便用户快速了解软件外观和功能布局。
2026-03-19 23:04:03 +08:00
Awuqing
aff334e1af
add some tips
2026-03-17 13:45:31 +08:00
Awuqing
eadd3f8961
first commit
2026-03-17 13:29:09 +08:00