利用 github 的webhook 同步博客到自己服务器

用到的系统和软件

  • 云服务器: debian, 用于搭建网站。后面简称服务器。
  • windows系统: windows 11 22H2, 用于本地撰写博客。后面简称本地。
  • 争渡读屏: 整个操作流程都是使用争渡读屏完成的。
  • winscp: 在本地连接 云服务器,上传、下载和修改服务器文件。
  • ssh: 本地系统内置的 ssh工具,用于连接服务器。跟 winscp 配合使用。
  • akelpad: 用于本地编辑和修改文件。
  • github 账号: 用于托管博客文章的源代码。
  • caddy: 服务器上用于搭建网站的软件。
  • hugo: 生成静态网站的工具,在本地和服务器都需要安装。
  • git: 用于拉取和提交代码到 github 仓库。本地和服务器都需要安装。

基本原理

  1. 本地撰写博客文章。
  2. 利用 github 仓库保存博客内容。
  3. 提交到远程仓库后,触发 webhook。
  4. 云服务器收到 github 的 webhook 请求后,调用 git pull 拉取仓库代码,然后调用 hugo 生成网站。

本地环境配置

本地是在 windows 系统下,需要安装 git/hugo/winscp/akelpad, 具体步骤不在说明。

AkelPad 可以用其他编辑器代替。

服务器配置

安装 caddy 可参看我之前的文章,关于如何在腾讯云搭建网站服务器,地址是: https://www.qt06.com/post/417/ 如果你只要搭建博客,不需要其他网站的话,那么只需要安装 caddy 部分即可,数据库和 php 都不需要。

安装 hugo

1
wget -O hugo.deb https://github.com/gohugoio/hugo/releases/download/v0.126.0/hugo_extended_0.126.0_linux-amd64.deb && sudo dpkg -i hugo.deb

修改配置允许以 caddy 用户登录

找到 /etc/passwd 文件,用喜欢的编辑器打开。

找到包含 caddy 的一行,将末尾的 /sbin/nologin 替换位 /bin/bash, 然后保存。

这样就可以使用 su caddy 命令进入 caddy 用户了。

后面的所有操作都是要在 caddy 用户下操作的。

在 bash 下输入下面命令进入 caddy 用户环境下:

1
su caddy

服务器上搭建网站

输入下面命令进入 /data/www 目录下:

``bash cd /data/www


创建网站目录:

`bash
mkdir qt06.com

进入新建的网站目录:

1
cd qt06.com

克隆 github 仓库:

1
git clone --recursive https://github.com/qt06/qt06.github.io

这样会将仓库克隆到 qt06.github.io 目录下。

创建一个用于存放自动拉取代码和生成网站脚本的目录:

1
mkdir scripts

进入新建的 scripts 目录:

1
cd scripts

新建一个名为 build.sh 的文件,并且填入下面内容:

#!/usr/bin/bash
echo "begin at: $(date)" >> /data/www/qt06.com/build.log
cd /data/www/qt06.com/qt06.github.io
git pull >> /data/www/qt06.com/build.log
hugo >> /data/www/qt06.com/build.log
echo "end at: $(date)" >> /data/www/qt06.com/build.log

修改网站配置,加入 github 仓库的 webhook 地址

找到 /data/caddy/conf/vhost/qt06.com.conf 文件,打开后, 在 file_server 前面一行加入如下内容:

	exec /asdfqwer123498732424 {
		command /data/www/qt06.com/scripts/build.sh
		directory /data/www/qt06.com/qt06.github.io
		timeout 0
	}

完整的网站配置如下,提供给大家做参考:

qt06.com {
	redir https://www.{host}{uri}
	header -Server
}
www.qt06.com {
	root * /data/www/qt06.com/qt06.github.io/public
	encode gzip
	header -Server
	exec /asdfqwer123498732424 {
		command /data/www/qt06.com/scripts/hugo_build.sh
		directory /data/www/qt06.com/qt06.github.io
		timeout 0
	}
	file_server {
		index index.htm, index.html
	}
	log {
		format json {
			time_format "iso8601"
		}
		output file /data/caddy/log/qt06.com.log
	}
}

然后刷新 caddy 配置:

1
systemctl reload caddy

在github 仓库添加 webhook

进入 qt06.github.io 仓库的 settings 里的 webhook 界面,填写刚才的回调地址,也就是: https://qt06.com/asdfqwer123498732424

口令自己填写。

之后,就在本地编写好文章,push到仓库,就等待网站自动同步更新吧。

updatedupdated2024-06-272024-06-27