我这个博客站经过我的多次折腾,最终又回到了Hugo,虽然还算比较喜欢wordpress强大齐全的功能,但架不住未来肉眼可见即将飙升的内存占用率,因此还是决定安家于Hugo家庭。对于只想分享经验和知识的小小需求,这里足以。

Prerequisites

  • VPS:我这里选的是Vultr,当年的胎盘价$2.5/月购入,现如今已经用了5年了。
  • github仓库

Components

  • Nginx
  • hugo
  • Certbot
  • github actions runner

Build repo from scratch

Blog repo

  1. 在本地创建一个blog文件夹

    hugo new site hugo-blog-example && cd hugo-blog-example
    

    目录结构如下

    ~ tree -L 3
    .
    ├── archetypes
    │   └── default.md
    ├── assets
    ├── config.toml
    ├── content
    ├── data
    ├── layouts
    ├── public
    ├── static
    └── themes
    
  2. 在github上创建一个空的私有仓库

  3. 提交当前所有文件到私有仓库

    git init
    git add .
    git commit -m "first commit"
    git branch -M main
    git remote add origin https://github.com/[YOUR NAME]/[YOUR REPO].git
    git push -u origin main
    
  4. 在Hugo主题库选一个喜欢的主题, 并安装

    这里以Paper为例, 在你的项目里运行以下command

    git submodule add https://github.com/nanxiaobei/hugo-paper themes/paper
    

    打开config.toml, 将主题改为pager

    theme = "paper"
    

    因为这里用到了git submodule,可参考这里查看一些相关的命令

    在本地起一个hugo server,端口默认是1313

    hugo server -D
    

    浏览器里输入localhost:1313,即可看到你fancy的站点啦。

  5. 修改配置文件config.toml,来更改站点的设置

    结合样例配置,和hugo官方配置文档来修改所需功能,这里需要花蛮多的时间,可以配置友链,评论系统,SEO等功能。

    baseURL = "https://blog.dustbreak.com/"
    author = "Mingo Gao"
    copyright = "Copyright © 2021–2022, Mingo Gao all rights reserved."
    paginate = 5
    languageCode = "en"
    DefaultContentLanguage = "en"
    enableInlineShortcodes = true
    ...
    
  6. 修改完毕后,记得提交代码,利用github来持久化存放你的所有blog

github actions runner

  1. 安装github action runner 可以根据此文档 在你的VM上,下载安装一个runner。 在Settings->Actions->Runners上会看到如下命令

    # Create a folder
    $ mkdir actions-runner && cd actions-runner# Download the latest runner package
    $ curl -o actions-runner-linux-x64-2.299.1.tar.gz -L https://github.com/actions/runner/releases/download/v2.299.1/actions-runner-linux-x64-2.299.1.tar.gz# Optional: Validate the hash
    $ echo "147c14700c6cb997421b9a239c012197f11ea9854cd901ee88ead6fe73a72c74  actions-runner-linux-x64-2.299.1.tar.gz" | shasum -a 256 -c# Extract the installer
    $ tar xzf ./actions-runner-linux-x64-2.299.1.tar.gz
    

    并注册此runner

    # Create the runner and start the configuration experience
    $ ./config.sh --url https://github.com/m1n9o/hugo-blog --token THISISALONGTOKEN
    
  2. 配置runner为service

    我们希望此runner可以开机自启,而不需要每次重启服务都得手动启动,根据此文档配置即可。

配置部署文件

在项目中创建`.github/workflows/deploy.yml`
```
name: Custom Server

on:
push:
    branches:
    - main  # Set a branch to deploy
pull_request:

jobs:
deploy:
    runs-on: self-hosted # 因为我们用了自己创建的runner,所以指定self-hosted
    concurrency:
    group: ${{ github.workflow }}-${{ github.ref }}
    steps:
    - uses: actions/checkout@v3
        with:
        submodules: true  # Fetch Hugo themes (true OR recursive)
        fetch-depth: 0    # Fetch all history for .GitInfo and .Lastmod

    - name: Setup Hugo
        uses: peaceiris/actions-hugo@v2
        with:
        hugo-version: '0.100.2'
        extended: true

    - name: Build
        run: hugo --minify

    - name: rsync
        run: rsync -r ./public/ /var/www/html/hugo-blog --delete # 将渲染出来的文件同步到指定目录下

```

以上github相关的配置就差不多了,接下来就需要在VM上配一下环境了

Build environment for blog

Hugo

  1. 安装Hugo
    sudo apt update
    sudo apt install hugo
    

Nginx

  1. 安装Nginx
    sudo apt update
    sudo apt install nginx
    
  2. 配置防火墙
    sudo ufw allow 'Nginx Full' # 会开启80和443端口
    sudo ufw status # 检查改动
    
  3. 检查web server
    systemctl status nginx
    # systemctl restart nginx
    

Certbot

  1. 安装Certbot

    add-apt-repository universe && add-apt-repository ppa:certbot/certbot
    apt-get install certbot python-certbot-nginx
    
  2. 创建certificate

    现在的certbot更强大了,在创建certificate的时候,可以自动配置nginx,并且可以定期自动renew,完全解放了双手。

    sudo certbot --nginx -d dustbreak.com -d blog.dustbreak.com
    

nginx配置

  1. 修改目标路径

    还记得在github actions的最后一步吗?需在/etc/nginx/nginx.conf文件里修改目标路径。

    root		/var/www/html/hugo-blog;
    

到此就大功告成了!

Commands

# 删除submodule
git rm --cached path/to/submodule
rm -rf path/to/submodule
rm -rf .git/modules/<path-to-submodule>
git config --remove-section submodule.<path-to-submodule>

# 列出已安装的app
apt list --installed

# 更新证书
certbot renew --dry-run
certbot renew

Reference