使用 Caddy + GitHub Webhook 实现自动部署静态网站
在开发静态网站(如 Jekyll、Hugo、Hexo 等)时,为了实现一键部署的自动化体验,我们可以通过 GitHub Webhook 和 Caddy Server 搭建一个轻量级的 CI 自动部署服务。
本文将介绍如何:
- 使用 Caddy 添加 Git 插件
- 配置自动构建逻辑
- 添加 GitHub Webhook 实现自动拉取和构建部署
一、准备工作
1. 安装 Caddy 并添加 Git 插件
可以使用 https://caddyserver.com/download 提供的构建工具,选择你所需的插件:
- 系统平台:Linux/macOS
- 插件勾选:✅
http.git
也可以使用官方构建脚本手动安装(Linux 示例):
xcaddy build --with github.com/caddyserver/git
sudo mv caddy /usr/local/bin/
xcaddy
是官方推荐的 Caddy 插件构建工具,地址:https://github.com/caddyserver/xcaddy
二、配置 Caddyfile 实现自动部署
假设你有一个 Jekyll 项目托管在 GitHub,例如:
- GitHub 仓库地址:
https://github.com/yourname/yourblog
- 构建输出目录:
/var/www/yourblog
- 本地构建命令:
jekyll build
你的 Caddyfile
配置如下:
git /github/yourname/yourblog {
path /var/www/yourblog
then jekyll build /var/www/yourblog
hook /webhooks github_webhook_secret_key
hook_type github
clone_args --recursive
pull_args --recurse-submodules
}
配置说明:
关键字 | 含义 |
---|---|
git |
使用 git 插件挂载一个仓库 |
path |
克隆到的本地路径 |
then |
每次更新后执行的构建命令 |
hook |
Webhook 接口路径及密钥 |
hook_type |
指定来源类型(支持 github , gitea , gogs 等) |
clone_args |
初始化 clone 时附加参数(如递归子模块) |
pull_args |
每次 pull 的参数 |
三、添加 GitHub Webhook
- 打开你的仓库页面,进入
Settings -> Webhooks
- 点击 Add webhook
- 填写内容如下:
字段 | 值 |
---|---|
Payload URL | http://your-server-ip:port/webhooks |
Content type | application/json |
Secret | github_webhook_secret_key (与你配置一致) |
Events | 选择 Just the push event. |
保存后,GitHub 每次推送将触发该 URL 并自动拉取部署。
四、测试部署流程
- 本地修改你的博客项目代码,提交并推送:
git commit -am "update posts"
git push origin main
- 服务器 Caddy 会自动:
- 接收 Webhook
- 拉取最新代码
- 执行构建命令(如 Jekyll)
- 自动部署输出目录
可通过 journalctl -u caddy -f
或 caddy run
查看日志输出。
五、注意事项
- jekyll/hugo 等构建命令路径问题:建议写全路径,如
/usr/bin/jekyll
,确保 Caddy 启动用户有执行权限。 - 权限问题:确保
caddy
运行用户对目标路径拥有读写权限。 - 安全建议:Webhook Secret 不应为空,防止任意触发。