Appearance
博客部署方案
记录本博客的部署架构和踩坑经验。
部署架构
本地 git push → CNB 仓库 → .cnb.yml 流水线 → curl POST → 服务器 webhook (5678)
→ deploy-webhook.js → git pull + 清理构建 → Bark 手机通知为什么用 Webhook 而不是定时任务
- 秒级触发:代码推送后立即部署,不需要等待定时任务周期
- 零资源浪费:没有轮询,只在 push 时触发
- 状态可知:Bark 推送通知,部署成功/失败手机实时收到
服务器环境
| 项目 | 说明 |
|---|---|
| OS | OpenCloudOS |
| 面板 | 宝塔面板 |
| Web 服务器 | Nginx |
| 进程管理 | PM2 |
| 端口 | 5678 (webhook 服务) |
踩坑记录
git pull 认证失败
服务器 root 用户没有 CNB 凭据,需要将 token 嵌入 remote URL:
bash
git remote set-url origin https://用户名:Token@cnb.cool/仓库路径.gitCNB 不支持 SSH 协议,只能用 HTTPS + Token。
dubious ownership 报错
root 用户操作其他用户创建的 Git 仓库时遇到:
bash
git config --global --add safe.directory /www/wwwroot/blog-cven-cn.user.ini 构建失败
CloudLinux CageFS 在网站目录下生成受保护的 .user.ini,VitePress 构建时 rmSync 无法删除,报 EPERM。
解决方案两步:
- VitePress 配置禁用自动清空:
ts
// docs/.vitepress/config.mts
vite: { build: { emptyOutDir: false } }- 构建命令改用
find绕过.user.ini:
bash
find docs/.vitepress/dist -mindepth 1 -not -name '.user.ini' -exec rm -rf {} +webhook 自身更新后不生效
Node.js 启动时加载脚本到内存,磁盘文件更新需要重启:
bash
pm2 restart blog-webhookBark 通知
部署开始/成功/失败时自动推送到手机,通知以 blog-deploy 分组聚合。
js
// deploy-webhook.js
const BARK_KEY = "你的Key" // 留空则关闭通知Bark 是开源 iOS App,https://bark.day.app。