上文见部署 Hugo 博客到 Ubuntu 服务器。
之前的博客更新思路是,本地提交修改至 GitHub,再登陆云服务器,手动执行脚本,达到更新博客内容的目的。但是,从 GitHub 拉取代码较慢,于是想到可以把本地的更改同时推送到 GitHub 和云服务器。再通过 Git Hooks 自动执行「更新博客」的脚本,以此达到提升效率的目的。
#更新 Git 至最新版本
云服务器的系统是 Ubuntu 20.04,所以可以通过以下命令安装 Git 的最新版本:
1
2
3
| add-apt-repository ppa:git-core/ppa
apt update
apt install git
|
#创建 Git 用户
1
2
3
| adduser git # note difference with useradd
passwd git # add password for git user
sudo visudo
|
修改 /etc/sudoers
:
1
2
3
| root ALL=(ALL) ALL
ubuntu ALL=(ALL:ALL) NOPASSWD: ALL
git ALL=(ALL:ALL) NOPASSWD: ALL # add
|
#配置 ssh 公匙
在本地主机执行以下命令:
1
| ssh-keygen -t ed25519 -C "email"
|
会生成两个文件:id_ed25519 和 id_ed25519.pub。将 id_ed25519.pub 文件里的内容复制到云服务器的 authorized_keys 文件中:
1
2
3
| su git
mkdir ~/.ssh
vim ~/.ssh/authorized_keys
|
然后在本地添加私匙:
如果不添加私匙,还是提示输入密码。
注意: ~
代表 /home/git
。只有 git 用户才能使用这个公匙。
修改权限:
1
2
3
| cd ~
chmod 600 .ssh/authorized_keys
chmod 700 .ssh
|
本地测试 git 服务:
1
| ssh -v git@server-ip # Server public network IP
|
#创建博客文件夹
1
2
3
| su root # switch to root user
mkdir /home/hugo
chown git:git -R /home/hugo
|
#更改站点目录权限
1
| sudo chown git:git -R /var/www/hugo # for git hook
|
#创建 bare 仓库并配置 Git Hook
1
2
3
4
5
6
| su root
cd /home/git
git init --bare blog.git
chown git:git -R blog.git
vim blog.git/hooks/post-receive
chmod +x blog.git/hooks/post-receive
|
新建文件 blog.git/hooks/post-receive
:
1
2
3
4
5
6
| #!/bin/sh
git --work-tree=/home/hugo --git-dir=/home/git/blog.git checkout -f
cd /var/www/hugo
rm -rf * # 删除文件夹下的所有文件以保持最新
cd /home/hugo
hugo --minify -d /var/www/hugo
|
#本地配置云服务器仓库
1
2
| git remote add origin git@server-ip:/home/git/blog.git
git push -u origin main # first push
|
#使用 Docker 配置 Hugo 部署
1
2
3
4
5
6
7
| #!/bin/sh
git --work-tree=/home/www --git-dir=/home/git/blog.git checkout -f
cd /home/www/public
sudo rm -rf * # 删除文件夹下的所有文件以保持最新 & 通过 Docker 生成文件权限为 root 需要加 sudo
cd /home/git/docker-blog
docker compose up -d
|
/home/git/docker-blog
:
1
| docker-compose.yml nginx.conf
|
docker-compose.yml
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| version: "3.9"
services:
nginx:
image: nginx:stable
volumes:
- $PWD/nginx.conf:/etc/nginx/nginx.conf
- /etc/letsencrypt:/etc/letsencrypt
- /home/www/public:/home/www/public
ports:
- "80:80"
- "443:443"
blog:
image: tianheg/hugo:0.98.0
volumes:
- /home/www:/home/git
- /home/www/public:/output
environment:
- HUGO_BASEURL=https://www.yidajiabei.xyz/
|
参考资料
- https://segmentfault.com/a/1190000039676421
- https://www.saintsjd.com/2011/01/what-is-a-bare-git-repository/
Layout of comment panels