使用 Notion-Hugo 构建个人博客

为什么会想要构建个人博客并且还是通过 Notion 的方式?

「零秒思考」后的结果:

  1. Notion 中毒用户,馋 Notion 的编辑器
  2. 对 Notion 中记录的内容做一个系统整理并输出,尽量使用图的形式来展示
  3. 记录个人的思考、成长以及展示自己的能力,以便后续回顾
  4. 希望每篇博客都有自己的拍摄的一张照片,记录生活的点滴

为什么选择 Hugo?

对 Hugo 这个项目接触比较早,大部分代码使用 Golang 实现,后续可操作性更强。

虽然「元否」和 Notion-Hugo 的作者都给出了比较详细的说明,但是在实际配置过程中,还需要熟悉 Github action、Cloudflare builder 等概念,以便理解何时触发网站构建以及发布。梳理了一个架构图以便快速理解原理,为后续优化提供思路。

https://github.com/HEIGE-PCloud/Notion-Hugo 在将 Notion 的 page 转换成 markdown 格式时,如果遇到图片,会将原始 URL 的方式写入到 markdown 文件中,而这个 URL 是有防盗链的,1 小时后便会过期,导致图裂。

https://prod-files-secure.s3.us-west-2.amazonaws.com/dc681554-1505-4cec-9a8f-844b66d5dcc8/4e9385da-92e0-4c4a-9ba1-871eb116b2e5/DSCF9506_preview.jpeg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAZI2LB466SETVVHQ7%2F20250927%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20250927T010113Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEBEaCXVzLXdlc3QtMiJHMEUCIBgl6TamR&X-Amz-Signature=d9be103faf2f37cf40ca1481c3dd906b8aa9e47d57bf05b8195d9929f53eebcc&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject

考虑到 Notion-Hugo 的转换脚本是通过 nodejs 来实现的,对我来说二开的难度较大,另外整体逻辑也不复杂,最终决定自己来重新搭建一套。在 Github 中找到了多个使用 python 来实现 notion2md 的库,经过对比和少量的 hack,完成了第一版转换脚本:https://github.com/polym/notion2md

以下是 Github Action workflow

name: Build and Deploy Blog

on:
  # 每天凌晨 1 点自动触发
  schedule:
    - cron: '0 17 * * *' # 北京时间 01:00
  # 允许手动触发
  workflow_dispatch:

jobs:
  build-deploy:
    runs-on: ubuntu-latest
    permissions:
      contents: write
    steps:
      - name: Checkout code
        uses: actions/checkout@v3
      
      # Hugo 主题库拉取
      - name: Update git submodules
        run: |
          git submodule update --init --recursive

      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.x'

      - name: Install dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y make
          pip install -r py/requirements.txt

      - name: Install latest Hugo
        run: |
          wget https://github.com/gohugoio/hugo/releases/download/v0.151.0/hugo_0.151.0_linux-amd64.deb -O hugo.deb
          sudo dpkg -i hugo.deb
          hugo version
      
      # 指定 NOTION DB 和 NOTION TOKEN
      - name: Set up environment variables
        run: |
          echo "NOTION_DB_ID=${{ secrets.NOTION_DB_ID }}" > .env
          echo "NOTION_TOKEN=${{ secrets.NOTION_TOKEN }}" >> .env
          echo "NOTION_DB_ID=${{ secrets.NOTION_DB_ID }}" >> $GITHUB_ENV
          echo "NOTION_TOKEN=${{ secrets.NOTION_TOKEN }}" >> $GITHUB_ENV

      - name: Build blog
        run: |
          make convert && make build

      # 自动提交 hugo-site/content 中的内容
      - name: Commit updated content
        uses: stefanzweifel/git-auto-commit-action@v6
        with:
          commit_message: Sync content with Notion
          file_pattern: 'hugo-site/content/'
  • 需要去解决 Notion 中特殊块到 Markdown 的连接
  • 对特定 Hugo 主题自定义配置,需要做好适配,初步思路通过 page 的属性字段来实现