logo
0
0
WeChat Login
✨ feat: 添加 base_path 配置支持多环境隔离

CNB Keep Toolkit

云原生开发环境数据持久化工具 - 为 CNB 环境提供多程序数据备份和恢复能力

🎯 功能特性

  • 多任务支持: 同时监控多个工具的数据(Claude Code、VS Code、Git 配置等)
  • 层级化存储: 基于 CNB 环境变量构建 {repo}/{branch}/{user}/{task} 路径结构,完全隔离
  • 实时同步: 自动监听文件变化,实时上传到腾讯云 COS
  • 智能恢复: 容器重启时自动从云端恢复数据,保留最新版本
  • 灵活配置: 支持 YAML 配置文件和环境变量两种配置方式
  • 可靠性保证: 自动重试、防抖动、并发控制,确保数据安全
  • 后台运行: 不阻塞前台进程,静默运行

快速开始

方式 1:使用配置文件(推荐)

  1. 创建配置文件:
# 复制示例配置 cp config.example.yaml ~/.config/cnb-keep-toolkit/config.yaml # 或使用 CNB 环境配置 cp configs/cnb-config.yaml /opt/cnb/config/config.yaml
  1. 配置 COS 认证(环境变量):
export COS_SECRET_ID=AKIDxxxxx export COS_SECRET_KEY=xxxxx export COS_BUCKET_URL=https://your-bucket-1234567890.cos.ap-guangzhou.myqcloud.com # 格式:https://{bucket-name}-{appid}.cos.{region}.myqcloud.com # 注意:URL 中已包含 region 信息,无需单独配置 region
  1. 运行:
./cnb-keep-toolkit

配置文件支持:

  • 多任务定义
  • 每个任务独立的监控目录和规则
  • 基于 CNB 环境变量的自动路径构建
  • 详细配置请参考 配置指南

方式 2:使用环境变量(向后兼容)

# 必需配置 export COS_SECRET_ID=AKIDxxxxx export COS_SECRET_KEY=xxxxx export COS_BUCKET_URL=https://your-bucket-1234567890.cos.ap-guangzhou.myqcloud.com # 格式:https://{bucket-name}-{appid}.cos.{region}.myqcloud.com # 注意:URL 中已包含 region,无需额外配置 # 可选配置 export WATCH_BASE_DIR=~/.claude/ export LOG_LEVEL=info

运行模式

同步模式(默认)

实时监听文件变化并上传:

export RUN_MODE=sync ./cnb-keep-toolkit

恢复模式

从云端恢复数据:

export RUN_MODE=restore ./cnb-keep-toolkit

3. CNB 环境集成

在 CNB 环境中,数据会自动恢复和同步:

# 执行恢复脚本(在容器启动时运行) bash /opt/cnb/scripts/cnb-restore.sh

构建

本地构建

# 构建当前平台 ./build.sh # 构建所有平台 ./build.sh --all

Docker 镜像

docker build -t cnb-keep-toolkit:latest .

配置说明

配置方式

1. YAML 配置文件(推荐)

支持多任务、灵活的文件规则、层级化存储。配置文件位置(按优先级):

  1. $CONFIG_FILE 环境变量指定
  2. /etc/cnb-keep-toolkit/config.yaml
  3. /opt/cnb/config/config.yaml
  4. ./config.yaml
  5. ~/.config/cnb-keep-toolkit/config.yaml

示例配置:

version: "1.0" global: storage: type: cos cos: secret_id: ${COS_SECRET_ID} secret_key: ${COS_SECRET_KEY} bucket_url: ${COS_BUCKET_URL} base_path: "cnb-toolkit" # 基础路径,用于环境隔离 path_template: "${CNB_REPO_SLUG}/${CNB_BRANCH}/${CNB_BUILD_USER}" tasks: - name: claude-code enabled: true watch_dir: ~/.claude/ globs: ["**/*"] exclude: ["*.tmp", "*.log"] - name: vscode-settings enabled: true watch_dir: ~/.vscode-server/data/User/ globs: ["settings.json", "keybindings.json"]

完整配置说明请参考:配置文档

2. 环境变量(向后兼容)

环境变量必需默认值说明
COS 配置
COS_SECRET_ID-腾讯云 SecretId
COS_SECRET_KEY-腾讯云 SecretKey
COS_BUCKET_URL-COS Bucket 完整 URL
格式:https://{bucket}-{appid}.cos.{region}.myqcloud.com
示例:https://mybucket-1234567890.cos.ap-guangzhou.myqcloud.com
CNB 环境变量(自动提供)
CNB_REPO_SLUG--仓库路径 (自动)
CNB_BRANCH--分支名 (自动)
CNB_BUILD_USER--构建用户 (自动)
其他配置
CONFIG_FILE-配置文件路径
LOG_LEVELinfo日志级别
LOG_FORMATjson日志格式

存储路径结构

基于 CNB 环境变量自动构建层级化路径:

{base_path}/{CNB_REPO_SLUG}/{CNB_BRANCH}/{CNB_BUILD_USER}/{task_name}/

路径组成:

  • base_path: 环境前缀(dev/prod/cnb-toolkit 等)
  • CNB_REPO_SLUG: 仓库路径(自动)
  • CNB_BRANCH: 分支名(自动)
  • CNB_BUILD_USER: 用户名(自动)
  • task_name: 任务名称(配置)

示例(开发环境):

dev/ └── debug.icu/my-project/ ├── main/ │ ├── zhangsan/ │ │ ├── claude-code/ │ │ └── vscode-settings/ │ └── lisi/ │ └── claude-code/ └── feature-x/ └── zhangsan/ └── claude-code/

多环境隔离:

├── dev/debug.icu/... # 开发环境 ├── test/debug.icu/... # 测试环境 └── prod/debug.icu/... # 生产环境

架构设计

目录结构

cnb-keep-toolkit/ ├── cmd/ │ └── cnb-keep-toolkit/ # 应用入口 ├── internal/ │ ├── config/ # 配置管理 │ ├── storage/ # 存储接口和 COS 实现 │ ├── watcher/ # 文件监听器 │ ├── sync/ # 同步引擎 │ └── logger/ # 日志封装 ├── pkg/ │ └── retry/ # 重试机制 └── scripts/ └── cnb-restore.sh # CNB 环境恢复脚本

核心模块

  • Config: YAML 配置文件 + 环境变量加载和验证
  • Storage: COS 存储抽象接口
  • Watcher: 文件监听和防抖动(支持多实例)
  • Sync Engine: 同步引擎(管理多个 TaskRunner)
  • TaskRunner: 任务运行器(每个任务独立的 Watcher + Uploader + Downloader)
  • Retry: 指数退避重试机制

多任务架构

Engine ├── TaskRunner (claude-code) │ ├── Watcher → ~/.claude/ │ ├── Uploader → COS:/repo/branch/user/claude-code/ │ └── Downloader ├── TaskRunner (vscode-settings) │ ├── Watcher → ~/.vscode-server/ │ ├── Uploader → COS:/repo/branch/user/vscode-settings/ │ └── Downloader └── TaskRunner (custom-task) ├── Watcher → ~/custom/ ├── Uploader → COS:/repo/branch/user/custom-task/ └── Downloader

数据流

Task 1: 文件变化 → Watcher → Debouncer → Uploader → COS (path1) ↓ SyncState Task 2: 文件变化 → Watcher → Debouncer → Uploader → COS (path2) ↓ SyncState

COS 存储结构

/{base_path}/ ├── debug.icu/my-project/ │ ├── main/zhangsan/ │ │ ├── claude-code/ │ │ │ ├── .claude/ │ │ │ │ ├── sessions/ │ │ │ │ └── config.json │ │ │ └── .claude-code-workspace │ │ └── vscode-settings/ │ │ ├── settings.json │ │ └── keybindings.json │ └── dev/lisi/ │ └── claude-code/

实际示例(base_path=cnb-toolkit):

/cnb-toolkit/debug.icu/my-project/main/zhangsan/claude-code/.claude/config.json

测试

# 运行所有测试 go test ./... # 测试覆盖率 go test -cover ./... -coverprofile=coverage.out go tool cover -html=coverage.out -o coverage.html # 运行特定模块测试 go test ./internal/config/... go test ./internal/watcher/... go test ./internal/sync/...

故障排查

日志查看

# 同步模式日志 tail -f /var/log/cnb-keep-toolkit.log # 设置详细日志 export LOG_LEVEL=debug export LOG_FORMAT=text

常见问题

  1. COS 连接失败

    • 检查 COS_SECRET_IDCOS_SECRET_KEY 是否正确
    • 检查 COS_BUCKET_URL 格式是否正确
    • 检查网络连接
  2. 文件未上传

    • 检查文件是否在监听目录内
    • 检查文件是否匹配排除模式
    • 查看日志确认错误信息
  3. 恢复失败

    • 检查 COS 中是否存在数据
    • 检查本地目录权限
    • 查看日志确认错误信息

开发

依赖管理

go mod download go mod tidy

代码格式化

go fmt ./... go vet ./...

添加依赖

go get github.com/example/package

License

MIT License

联系方式