Skip to content

博客部署方案

记录本博客的部署架构和踩坑经验。

部署架构

本地 git push → CNB 仓库 → .cnb.yml 流水线 → curl POST → 服务器 webhook (5678)
→ deploy-webhook.js → git pull + 清理构建 → Bark 手机通知

为什么用 Webhook 而不是定时任务

  • 秒级触发:代码推送后立即部署,不需要等待定时任务周期
  • 零资源浪费:没有轮询,只在 push 时触发
  • 状态可知:Bark 推送通知,部署成功/失败手机实时收到

服务器环境

项目说明
OSOpenCloudOS
面板宝塔面板
Web 服务器Nginx
进程管理PM2
端口5678 (webhook 服务)

踩坑记录

git pull 认证失败

服务器 root 用户没有 CNB 凭据,需要将 token 嵌入 remote URL:

bash
git remote set-url origin https://用户名:Token@cnb.cool/仓库路径.git

CNB 不支持 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

解决方案两步:

  1. VitePress 配置禁用自动清空:
ts
// docs/.vitepress/config.mts
vite: { build: { emptyOutDir: false } }
  1. 构建命令改用 find 绕过 .user.ini
bash
find docs/.vitepress/dist -mindepth 1 -not -name '.user.ini' -exec rm -rf {} +

webhook 自身更新后不生效

Node.js 启动时加载脚本到内存,磁盘文件更新需要重启:

bash
pm2 restart blog-webhook

Bark 通知

部署开始/成功/失败时自动推送到手机,通知以 blog-deploy 分组聚合。

js
// deploy-webhook.js
const BARK_KEY = "你的Key"  // 留空则关闭通知

Bark 是开源 iOS App,https://bark.day.app