Skip to content

feat: 解决 CDC 去重、集中备份与首次初始化问题 - #105

Draft
Awuqing wants to merge 4 commits into
mainfrom
codex/resolve-open-issues
Draft

feat: 解决 CDC 去重、集中备份与首次初始化问题#105
Awuqing wants to merge 4 commits into
mainfrom
codex/resolve-open-issues

Conversation

@Awuqing

@Awuqing Awuqing commented Aug 7, 2026

Copy link
Copy Markdown
Owner

变更概览

兼容性与安全

  • 既有未配置 masterRelay 的本地磁盘目标继续保持 Agent 本机存储语义。
  • 集中中转校验任务、节点、存储目标、传输模式、字节数和 SHA-256,并清理不完整产物。
  • CDC 仓库保持 Master 单写者,内容标识支持 HMAC,pack 支持压缩与 AES-GCM 加密。
  • 前端新增代码未引入阴影、渐变、独立字体、加粗样式或超过 4px 的圆角。

验证

  • go test ./...
  • go vet ./...
  • npm test -- --run:13 个测试文件、28 个用例通过
  • npm run build
  • 文档站中英文生产构建
  • sh -n deploy/install.sh
  • 使用全新数据库完成真实浏览器验收:中英文切换、首次管理员页面、SVG 渲染、样式约束与控制台日志均通过

Awuqing added 4 commits August 7, 2026 05:53
使用内容定义分块、不可变 pack 与快照索引实现跨文件和跨快照去重。

接入多目标上传、软配额、恢复、下载、校验、保留和安全垃圾回收,并补充前端入口、中英文文档及端到端测试。

Closes #94
为 Master 本地磁盘增加可选流式中转,远程 Agent 可直接把产物写入中央存储并通过反向通道恢复。

持久化并校验传输模式,兼容既有 Agent 本机磁盘目标,补齐鉴权、完整性、配额、访问保护、前端配置及双向链路测试。

Closes #101
在登录和首个管理员创建前提供中英文切换,并在初始化状态不可达时展示可重试错误,避免误入登录页。

对齐源码构建产物与安装脚本路径,增加 systemd/API 就绪检查、失败诊断及中英文裸机文档。

Closes #104
建立本地图标出口,统一项目内 Arco SVG 图标依赖并抽取登录页服务器插画。

以可复用的存储目标名称组件替换字符星标,补充可访问语义与组件测试。
if !filepath.IsAbs(targetRoot) {
return fmt.Errorf("repository restore target must be absolute: %s", targetRoot)
}
if err := os.MkdirAll(targetRoot, 0o755); err != nil {
}
switch entry.Kind {
case "directory":
if info, statErr := os.Lstat(targetPath); statErr == nil {
} else if !errors.Is(statErr, os.ErrNotExist) {
return fmt.Errorf("inspect restore directory %s: %w", targetPath, statErr)
}
if err := os.MkdirAll(targetPath, os.FileMode(entry.Mode)); err != nil {
}
directories = append(directories, entry)
case "symlink":
if err := os.RemoveAll(targetPath); err != nil {
if err := os.RemoveAll(targetPath); err != nil {
return fmt.Errorf("replace restore symlink %s: %w", targetPath, err)
}
if err := os.Symlink(entry.LinkTarget, targetPath); err != nil {
}
if entry.Kind == "file" {
modTime := time.Unix(0, entry.ModTime)
if err := os.Chtimes(targetPath, modTime, modTime); err != nil {
if !ok {
return fmt.Errorf("unsafe repository restore path %q", entry.Path)
}
if err := os.Chmod(targetPath, os.FileMode(entry.Mode)); err != nil {
return fmt.Errorf("restore mode for %s: %w", targetPath, err)
}
modTime := time.Unix(0, entry.ModTime)
if err := os.Chtimes(targetPath, modTime, modTime); err != nil {
}
for _, segment := range strings.Split(relative, string(filepath.Separator)) {
current = filepath.Join(current, segment)
info, statErr := os.Lstat(current)
current = filepath.Join(current, segment)
info, statErr := os.Lstat(current)
if errors.Is(statErr, os.ErrNotExist) {
if err := os.Mkdir(current, 0o755); err != nil && !errors.Is(err, os.ErrExist) {
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants