之前说了生成博客,接下来就要部署到服务器上了。这次我选用的 Web Server 是 Caddy,它同样是由 Go 编写,是一款快速、易用的生产型开源 Web 服务器,默认启动 HTTPS 和 HTTP/2,支持虚拟主机与多站点,还有可扩展插件等特点。
使用 Caddy 和 Github Webhook 可以实现 Hugo 静态博客的自动部署和更新。
一、准备事项
确认服务器安装了 curl、Git 和 Hugo
为博客创建仓库,并 push 到 Github
二、安装与使用 Caddy
Caddy 2 已经有 beta 测试版了,但是这里还是用 Caddy 1
1.下载 Caddy
使用下面的命令下载安装 Caddy,其中 http.git 是必须的插件,后面要用到,如果还需要其他插件也可以加上。
curl https://getcaddy.com | bash -s personal http.git
2.添加 caddy.service
我们使用 www-data 用户运行 caddy。首先确认 caddy 在 /usr/local/bin 下,用户/用户组/权限 为 root/root/755;然后用下面的命令让 caddy 能够以非root用户绑定到特权端口(例如80、443)
setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy
接着设置要用到的目录及其权限:
# 配置文件目录
mkdir /etc/caddy
chown -R root:root /etc/caddy
# ssl证书目录
mkdir /etc/ssl/caddy
chown -R root:www-data /etc/ssl/caddy
chmod 0770 /etc/ssl/caddy
# 日志文件目录
mkdir /var/log/caddy
chown -R root:www-data /var/log/caddy
chmod 0770 /etc/ssl/caddy
# 站点文件目录
mkdir /var/www
chown www-data:www-data /var/www
chmod 755 /var/www
最后安装 systemd 服务配置文件,重新加载 systemd 配置,设置 caddy 服务开机自启:
wget https://raw.githubusercontent.com/caddyserver/caddy/master/dist/init/linux-systemd/caddy.service
cp caddy.service /etc/systemd/system/
chown root:root /etc/systemd/system/caddy.service
chmod 644 /etc/systemd/system/caddy.service
systemctl daemon-reload
systemctl enable caddy.service
现在就可以使用 systemctl
命令管理 caddy 服务了
3.使用 Caddyfile 配置服务器
开启 caddy 服务之前还要写个配置文件 /etc/caddy/Caddyfile:
# 站点域名或ip,可以指定端口
example.com {
gzip # 开启gzip压缩
root /var/www/MyBlog_Hugo/public # 站点文件根目录
log /var/log/caddy/access.log # 访问日志
errors /var/log/caddy/errors.log # 错误日志
}
将站点文件放到设置的目录下,就可以启动 caddy 服务了
三、使用 Github WebHook 实现自动部署
使用 Webhook 实现自动部署的原理很简单,就是当成功 push 到 Github 仓库时,Github 会向钩子 URL 发送请求,服务器收到请求后重新拉取仓库代码实现自动更新部署。Hugo 生成静态页面的步骤也交给服务器自动完成。
1.在 Github 仓库中添加 Webhook
在仓库 Settings > Webhooks 中添加 Webhook,其中Payload URL 就是钩子 URL,Secret是校验签名。
2.配置 caddy http.git 插件
在 Caddyfile 中添加下面的内容
example.com {
......
git {
repo https://github.com/hozijui/MyBlog_Hugo.git
path /var/www/MyBlog_Hugo
clone_args --recursive
pull_args --recurse-submodules
key /path/to/id_rsa
hook /subscribe hook_secret
then hugo --destination=/var/www/MyBlog_Hugo/public
hook_type github
}
}
repo
:github 仓库地址,当前版本(v1.0.3)的插件处理 ssh 地址有点问题,可以参考这个 issuse 里的办法解决,也可以用 https。如果是私密仓库,需要加上用户名和密码。path
:本地仓库目录clone_args
:git clone 参数,–recursive 遍历所有的文件夹pull_args
:git pull 参数,–recurse-submodules 包括子模块key
:访问 Github SSH 的私钥hook
:有两个参数,第一个是钩子 URL,第二个是 Secret,必须与上面设置的保持一致then
:git pull 之后要执行的命令,这里执行 hugo 生成新的静态页面hook_type
:托管源文件的平台,就是 Github