快捷菜单
常用功能一站直达
更多功能请点顶栏「快捷菜单」
问题:我这个oneblog博客架构方案,只用一个cnb仓库新不行呀,不用gitee仓库了,请评估下。
cusor auto回复:2026年7月5日。
只用 CNB 一个仓库、去掉 Gitee,技术上完全可行,而且能从根本上消除你之前遇到的「后台保存了、站点没更新」这类双仓同步问题。代码里 CNB 读写能力已经具备,主要差在 CI 和默认配置仍按「Gitee 写、CNB 建」设计。
本质上是 两个真相源:
| 角色 | 仓库 |
|---|---|
| 后台写入 | Gitee |
| CI / 部署 | CNB |
所以必须维护:pull from gitee → sync to gitee → 定时 cron 拉取 → 保存后再 triggerCnbSiteRebuild。友链那次问题,根因就在这里。
一条链路:后台写 CNB → push 触发流水线 → 直接构建部署。不再需要 Gitee 镜像、回推、定时拉取,也不需要大部分「保存后再触发重建」的补丁逻辑。
| 能力 | 状态 |
|---|---|
| CNB 读文件 / 列目录 | ✅ cnbReadFileText、cnbWalkFiles |
| CNB 写/删文件 | ✅ cnbGitRequest(需 repo-code:rw) |
| 后台选 CNB 平台 | ✅ GitRepo.vue 已支持 |
| 连接测试 | ✅ platform === 'cnb' 分支已有 |
| README 默认远程 | 写的是 cnb.cool/onedayxyy/hugo-teek-private |
后台设置页已提示 CNB Token 需要 repo-code:r + repo-code:rw。
.cnb.yml(必改)以下阶段都可以删掉:
pull from gitee before build(master.push、web_trigger、api_trigger_rebuild、cron)sync to gitee*/30 若只为拉 Gitee,可删或改成纯定时重建当前默认仍是 Gitee:
1 const platform = env.GIT_PLATFORM || 'gitee';
2 return {
3 platform,
4 token,
5 owner: env.GIT_OWNER || env.GITEE_OWNER || env.CNB_OWNER || env.GITHUB_OWNER || 'onlyonexl',应改为:platform: cnb,owner: onedayxyy。
| 项 | 单 CNB 值 |
|---|---|
GIT_PLATFORM | cnb |
GIT_OWNER | onedayxyy |
GIT_REPO | hugo-teek-private |
GIT_TOKEN | CNB 令牌(repo-code:rw) |
后台「系统设置」里也要切到 CNB,并填 onedayxyy/hugo-teek-private。
markGiteeMutation 在 platform === 'cnb' 时不会标记变更,因此 dispatchV1Api 不会走二次 triggerCnbSiteRebuild:
1function markGiteeMutation(config) {
2 if (config?._giteeMutation && config.platform !== 'cnb') {
3 config._giteeMutation.mutated = true;单 CNB 下这其实是合理的:写入 CNB 本身就会产生 commit,触发 master.push 流水线,一般不必再写 .cnb-rebuild-trigger。
| 维度 | 双仓库(现状) | 单 CNB |
|---|---|---|
| 数据一致性 | 易分叉,需 sync / cron / 手动触发 | 单一真相源 |
| 保存 → 上线延迟 | 写 Gitee + 触发 CNB + pull Gitee | 写 CNB → push 即构建 |
| CI 复杂度 | 高(pull、sync、跳过规则) | 低 |
| 出问题的概率 | 高(你已踩过) | 低 |
| Token 管理 | Gitee + CNB 两套 | 主要一套 CNB |
| 备份 / 容灾 | Gitee 可当镜像 | 需另做备份(七牛、导出等) |
| 国内 clone / 开源曝光 | Gitee 更熟 | 依赖 CNB |
| 大仓库列表性能 | Gitee Tree API 原生递归 | CNB 用 cnbWalkFiles 全树遍历,文章特别多时可能更慢 |
只改后台、不改 CI 会翻车
即便后台改成写 CNB,当前 CI 仍会先 pull from gitee,构建用的还是 Gitee 旧数据。必须同步改 .cnb.yml。
CNB 写入权限
Token 必须有 repo-code:rw;先在后台「测试连接」、再试保存一篇文章验证。
连续保存可能连触发多次构建
双仓时代靠「写 Gitee + 单次 trigger」有缓冲;单 CNB 每次保存都是一次 push。一般可接受,后续可加防抖。
Gitee 不必立刻删
可先停用(不再写入、CI 不再拉取),保留只读备份一段时间。
onedayxyy/hugo-teek-private + CNB Token。.cnb.yml:去掉所有 Gitee pull/sync;视情况删 cron。secret/envs.yml,去掉 Gitee 凭证。工作量:大约半天(配置切换 + CI 精简 + 端到端验证),不需要重写 Admin 核心逻辑。
推荐迁到单 CNB。
你现在的双仓方案是为了规避早期 CNB API 不成熟而做的「Gitee 写、CNB 建」折中;随着 CNB 读写和 CI 已稳定,继续维护双仓的同步成本大于收益。友链、公告那类问题,在单仓下会自然消失。
如果你确认要迁,我可以下一步直接帮你改 .cnb.yml、默认配置,并整理一份迁移检查清单(不 push,等你确认后再推)。
本地备份数据:
1D:\hugo-teek-private-迁移cnb单仓库-20260705commit信息:
1$ git log
2commit b9bf46adefddd1049fd958c3db5228768d542528 (HEAD -> master)
3Merge: 7cc54c7 8eca668
4Author: nuc-it-win11 <2675263825@qq.com>
5Date: Sun Jul 5 21:38:33 2026 +0800
6
7 Merge branch 'master' of https://cnb.cool/onedayxyy/hugo-teek-private请帮我把全站迁移成单一cnb仓库维护吧,要求无bug。
1令牌名:oneblogadmin2(仓库完全读写功能)
2Git Username:cnb
3Token:3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxTgR (已加密) 1开始把全站迁到单一 CNB 仓库:我会先梳理 Gitee 相关引用与 CI 配置,再改 Admin 默认写入目标并精简流水线。
2
3Auto
4
5迁移工作已在后台进行,会覆盖这些部分:
6
7CI:.cnb.yml 去掉所有 Gitee pull/sync
8Admin:默认写入 onedayxyy/hugo-teek-private(CNB)
9自动重建:改为依赖 CNB push 触发,避免双仓二次触发
10配置与文档:.env.example、README、后台 Git 设置页默认值
11
12完成后我会把改动清单和生产环境手动步骤(EdgeOne 环境变量、KV 设置)一并给你。
13
14!
15
16eo pages kv值
17cnb token
18博客后台前端 & cnb仓库开源api1ci: sync cnb to gitee
2
3此时,有个需求,每当自己的cnb仓库有任何改变时,都给我同步到自己的gitee仓库,这个是用以做仓库备份数据使用,请给我写到ci流水线里。
4cnb仓库:https://cnb.cool/onedayxyy/hugo-teek-private (私有库)
5gitee仓库:https://gitee.com/onlyonexl/ongblog-gitee-backup(私有库)已完成。在 .cnb.yml 的 master.push 流水线里加入了 Gitee 备份同步阶段。
在 master.push 的 构建之前 增加了 tencentcom/git-sync 阶段,将 CNB 仓库镜像到 Gitee 备份库:
1- name: 同步仓库到 Gitee 备份
2 image: tencentcom/git-sync
3 settings:
4 branch: master
5 auth_type: https
6 username: ${GIT_USERNAME}
7 password: ${GIT_ACCESS_TOKEN}
8 target_url: https://gitee.com/onlyonexl/ongblog-gitee-backup.git
9 push_tags: true
10 force: true| 变更来源 | 是否同步 |
|---|---|
手动 git push 到 CNB master | ✅ master.push 触发 |
后台图形化保存(api_trigger_admin_write → push) | ✅ push 后再触发 master.push |
手动「构建&部署」/ api_trigger_rebuild | ❌ 不改仓库,不同步 |
在 https://cnb.cool/onedayxyy/secret/-/blob/main/envs.yml 中确认已有(你其它项目里应该已配过):
| 变量 | 说明 |
|---|---|
GIT_USERNAME | Gitee 登录名,如 onlyonexl |
GIT_ACCESS_TOKEN | Gitee 私人令牌,需对 ongblog-gitee-backup 有 projects 写权限 |
https://gitee.com/onlyonexl/ongblog-gitee-backup 已创建(私有库)推送 .cnb.yml 到 CNB 后,下一次 master.push 就会开始自动备份到 Gitee。需要的话我可以帮你检查密钥库变量是否齐全,或协助首次同步验证。
(后台无法删除友链)
已定位并修复,代码已推送(1638f86)。
根因:CNB 的 /-/git/contents 只支持 GET 读取,不支持 Gitee/GitHub 那种 POST/PUT 写入。单 CNB 迁移后,后台保存友链仍在调 Contents 写入 API,所以报 CNB API POST 404: {"errcode":5}。
修复方案:改为走 CI 流水线写入:
api_trigger_admin_write 构建git commit → git pushpush 再触发 master.push 完成站点构建请你确认一件事:CNB 访问令牌需同时勾选:
repo-code:r / repo-code:rw(读写信仓)repo-cnb-trigger:rw(触发流水线)在 EdgeOne 环境变量或后台「系统设置」里更新 Token 后,再试一次删除友链。成功时提示应为「已保存,CNB 将自动构建(约 3–5 分钟)」,CNB 流水线里应能看到 api_trigger_admin_write 任务。
亲测成功。
帮检查下,博客后台图形化 相关功能配置后,是否都会默认触发ci构建呢?不要有遗漏了
已完成对 Vue 后台全量 API 与 CNB 构建链路的审计,结论如下。
后台所有 Git 写入(writeFile / deleteFile / uploadImageToGitbed)在 platform=cnb 时走:
1保存 → api_trigger_admin_write(改文件+commit+push)→ master.push(完整构建+部署)/api/v1/* 写请求经 dispatchV1Api 包装:若 _giteeMutation.mutated=true,响应会带上 triggered: true(仅 UI 反馈,不二次触发)。
另有 显式触发(不依赖 push):
POST /config/merge → api_trigger_rebuildPOST /preview/rebuild → api_trigger_rebuild| 后台页面 | API | 写入目标 |
|---|---|---|
| 站点配置 → Hugo/站点/作者/页脚/文档版权 | PUT /config/* | user-configuration/*.toml |
| 主题切换 | POST /themes/switch | hugo.toml |
| 主题配置 | PUT /themes/{theme}/config | 主题下各配置文件(每个文件一次 CI) |
| 个人资料 | PUT /config/author + PUT /themes/.../params.toml | 两次写入 → 两次 CI |
| 菜单 CRUD / 排序 | POST/PUT/DELETE /menus/* | menus.toml |
| 菜单映射 批量保存 | PUT /sections | sections.toml |
| 文章 新建/编辑/删除 | POST/PUT/DELETE /posts/* | content/**/*.md |
| 文章权重/排序 | PUT /posts-weight、POST /posts/reorder | front matter |
| 友链/赞助/壁纸/导航/封面/公告/Hero/个人主页 | PUT /friendlinks 等 | data/* 或 homepage.yaml |
| 备份 JSON 导入 | POST /backup/import | 多文件恢复(N 文件 ≈ N 次 CI) |
| 目录 创建 | POST /directories | .gitkeep |
| 媒体库上传/删除(非七牛) | POST /media/upload、DELETE /media | Git 图床 |
| 图库上传/删除(非七牛,走 Git) | POST /gallery/upload、DELETE /gallery/:id | Git + KV |
| 云存储上传(Git 回退) | POST /cloud-storage/upload | Git 图床 |
| 手动「触发配置合并」 | POST /config/merge | 直接 api_trigger_rebuild |
| 功能 | 原因 |
|---|---|
| Git 仓库设置 | 仅写 KV/环境变量 |
| 清除缓存 | 仅清 KV 缓存 |
| 备份导出 / 七牛上传 / 云端列表 | 读 Git 或写七牛,不改仓库 |
| 云存储配置 CRUD | 仅 KV |
| 相册/图库元数据编辑、外链图添加 | 仅 KV |
| 媒体/图库 七牛模式 上传删除 | 文件在 OSS,不进 Git |
配置验证 POST /config/validate | 只校验 |
| 预览状态/启动 | EdgeOne 静态部署,无本地 Hugo |
| 插件/应用市场 | ComingSoon 占位 |
| 评论页 | 只读,跳转主题配置 |
| 关于页面 | 只读,实际改文章 |
| 功能 | API | 现状 |
|---|---|---|
| 菜单映射 新增 | POST /sections | 后端空桩,不持久化 |
| 菜单映射 删除 | DELETE /sections/:dir | 后端空桩,不持久化 |
| 目录重命名/删除 | PUT/DELETE /directories/:path | 返回提示,未实现 |
| 目录权重 | PATCH /directories/weight | 未持久化 |
| 文章批量移动/删除/更新 | POST /posts/batch-* | Phase 2 桩 |
| 图库批量操作 | POST /gallery/batch-* | Phase 3 桩 |
| 相册排序 | POST /albums/reorder | 空桩 |
菜单映射:编辑走 PUT /sections(整表保存)是正常的;新增/删除单条 目前是假的,需改为统一走 PUT 或补全 POST/DELETE 实现。
api_trigger_admin_write,可能连续触发多次 CI。git push。notifySaveResponse,成功提示可能不显示「将自动构建」。图库/媒体走七牛时,不会触发站点 CI 也不会把图片写进 Git。若文章里引用的是 Git 路径,线上可能看不到新图——这是存储策略问题,不是 CI 漏触发。
所有真正写入 CNB 仓库的配置/内容保存,都会默认触发 CI(admin_write → push → master.push),核心路径没有遗漏。
需要关注的不是「漏触发 CI」,而是:
如果需要,我可以下一步直接修 Section 映射新增/删除(改为内部合并后统一 PUT /sections),并给主题多文件保存加批量合并,减少重复 CI。
日历 · 精选 · 友链 · 更多
如果内容对你有帮助,欢迎请我喝杯咖啡 ☕



One的公众号
爱折腾博客的小白