Hugo 部署的几种方式
最近尝试了在服务器上安装 Hugo,并且几经努力终于成功地用 Nginx 完成了最终部署,也把之前买的域名利用起来了。之后考虑把另外一个博客也搬到服务器上,利用 webhook 完成自动部署。如果成功地话又可以水一篇,现在来看看 Hugo 常用的几种部署方式。
使用托管服务
所谓托管服务就是类似 Github Page、Cloudflare Page、Netlify 等,这里主要说一下 Github 的部署方式。
使用 Github 部署也有两种方式,一种是上传已经构建好的静态文件,另一种需要配合 Github Action 使用。
上传静态文件方式
直接上传静态文件到 Github 仓库的方式会比较简单。
-
使用
hugo -D命令,在本地构建好静态文件。 -
将
public文件夹下全部文件上传至仓库。 -
为该仓库设置
Github Page即可。
此后每次更新只要构建静态文件,上传至仓库就完成了,这一步可以写一个脚本完成。
以上方式可参考上一篇Hugo 安装与部署
使用 Github Action 方式 ① 1
用这个方法在最初设置的时候会有些麻烦,但是可以让整个站点得到较好的版本管理,同时也可以实现在线写博客。
使用这个方法需要建立两个仓库,一个仓库存放站点原始文件,另一个仓库存放构建好的静态文件。为了表述方便,下面将存放站点的仓库称为 Site,存放静态文件的仓库称为 Page。
-
上传新建好的站点至
Site仓库,这里不需要上传public文件夹,将其删除即可。 -
在
Site仓库找到Action选项卡,新建一个 workflow 2,名字随意。内容如下:
1name: GitHub Pages
2
3on:
4 push:
5 branches:
6 - main # 根据 Site 仓库实际 Branch 名称而定
7
8jobs:
9 deploy:
10 runs-on: ubuntu-20.04
11
12 steps:
13 - uses: actions/checkout@v2
14 with:
15 submodules: true # 如果 Hugo theme 是用子模块形式安装的话,选择 true,不是的话请删除这两行
16 fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod
17
18 - name: Setup Hugo
19 uses: peaceiris/actions-hugo@v2
20 with:
21 hugo-version: '0.91.2' # 可选 Hugo 最新版本,改为 latest 即可。如果主题样式格式为 .scss,下一行去掉注释
22 # extended: true
23
24 - name: Build
25 run: hugo --minify
26
27 - name: Deploy
28 uses: peaceiris/actions-gh-pages@v3
29 with:
30 external_repository: username/<仓库名称> # Page 仓库名称
31 personal_token: ${{ secrets.ACTION_ACCESS_TOKEN }}
32 publish_dir: ./public # 可以删除
33 publish_branch: main # 根据 Page 仓库实际 Branch 名称而定
- 获取
personal access token,将personal access token添加到Site仓库的Actions Secrets中,名称为ACTION_ACCESS_TOKEN
使用 Github Action 方式 ② 3
同样的需要建立两个仓库。
- 在
Site仓库新建一个 workflow
1name: build
2
3on:
4 push:
5 branches:
6 - main # 根据 Site 仓库实际 Branch 名称而定
7
8jobs:
9 build:
10 runs-on: ubuntu-latest
11
12 steps:
13 - name: 'Building...'
14 uses: reuixiy/hugo-deploy@v1
15 env:
16 DEPLOY_REPO: username/<仓库名称> # 填写 Page 仓库名称
17 DEPLOY_BRANCH: main # 根据 Page 仓库实际 Branch 名称而定
18 DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }}
19 # https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
20 TZ: Asia/Shanghai
-
生成一对
ssh key -
将公钥存放于
Page仓库的deploy key中,并开启写入权限,将私钥存放于Site仓库的Actions Secrets中,命名为DEPLOY_KEY
使用 Nginx 代理
我这次在服务器上安装 Hugo 后,不想再整个站点上传到 Github 。一是网络状态并不好,经常掉线。二是 Github Action 部署也要等一段时间(这不是主要原因)。用 Nginx 代理是因为我想玩个新东西。
准备工作
-
你要有一台服务器
-
准备一个域名,并解析到本服务器
-
在服务器上安装
Hugo
安装 Nginx
我的服务器是 Debian 10 ,简单粗暴的方法
1apt-get install nginx -y
配置 Nginx
1cd ~
2cd /etc/nginx/conf.d # 打开配置文件所在目录
3nano site.conf # 新建配置文件
在配置文件中写入以下内容
1server {
2 listen 80;
3 listen [::]:80;
4
5 server_name mysite.com www.mysite.com;
6
7 root /home/username/mysite/public/; # 静态文件存放的绝对路径
8 index index.html;
9
10 location / {
11 try_files $uri $uri/ =404;
12 }
13}
这里有两点提示:
-
静态文件所在路径可以用
pwd命令查看 -
这个配置是只用了
http协议,并没有添加ssl证书
添加 SSL 证书
如果是用 Cloudflare 解析域名的话,直接在上面申请证书,复制证书及私钥到服务器即可。然后在 Nginx 配置文件中添加如下内容:
1server {
2 listen 443 ssl http2;
3 listen [::]:443 ssl http2;
4 server_name mysite.com www.mysite.com; # 绑定证书的域名
5
6 ssl_certificate /etc/ssl/mysite.crt; # 证书存放路径
7 ssl_certificate_key /etc/ssl/mysite.key; # 私钥存放路径
8 ssl_session_timeout 5s;
9 ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
10 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
11 ssl_prefer_server_ciphers on;
12
13 location / {
14 root /home/username/mysite/public/; # 静态文件存放的绝对路径
15 index index.html;
16 }
17}
修改 Nginx 主配置文件
打开主配置文件
1cd ~
2nano /etc/nginx/nginx.conf
将 user www www 修改为 user root
运行 Nginx
通过以下命令开启运行 Nginx
1systemctl start nginx
2systemctl enable nginx
总结
这篇笔记我写了3天,头都炸了。
上面提到两种自动部署的 Github Action,其中方式①可以将 Site 仓库设为私密仓库,方式②则不可以。
用 Nginx 代理的方式也可以实现线上写作,自动部署。简单来说就是只上传 content 文件夹,同时在服务器部署 webhook ,每次push到仓库后触发服务器自动拉取,并重新构建静态文件。如果我能部署成功,到时候再做个记录。