折腾完家里的 NAS 之后,我一直想把这些过程记录下来。照片备份、Jellyfin 影音库、Tailscale 外网访问……每一个步骤踩过的坑,搜索的时候都找不到中文资料,写出来或许能帮到别人。

于是我花了一个下午搭了这个博客。这篇文章记录整个过程。

为什么选 Hugo

搭博客有很多方式。最简单的是直接写 HTML,但每篇新文章都要复制一个模板文件,手动改标题、日期、导航,改一次主题要把所有页面都改一遍,维护成本太高。

另一个选择是 WordPress,功能齐全,但需要数据库和服务器,个人博客用不上那些功能,反而多了维护负担。

静态生成器是目前个人技术博客的主流方案:只写 Markdown,工具自动把它转成完整的 HTML 网站,部署到 CDN 上,快、免费、不需要服务器。

常见的选择有 Hugo、Hexo、Astro、Jekyll。我选 Hugo 的原因很简单:它是单个可执行文件,Windows 上解压即用,不需要安装 Node.js 或者任何运行时,构建速度极快。

安装 Hugo

打开 PowerShell,一行命令安装:

winget install Hugo.Hugo.Extended

验证是否安装成功:

hugo version

输出类似 hugo v0.161.1+extended 就可以了。

如果 winget 安装失败,去 Hugo Releases 下载 hugo_extended_x.x.x_windows-amd64.zip,解压后把 hugo.exe 放到 C:\Windows\System32\ 即可。

创建项目

选一个目录,我放在 D:\Projects

cd D:\Projects
hugo new site crownleo-blog
cd crownleo-blog
git init
git branch -M main

git branch -M main 是把默认分支重命名为 main,和 GitHub 保持一致,避免后面推送时分支名不匹配。

执行完之后,目录结构是这样的:

crownleo-blog/
├── content/        ← 文章放这里
├── static/         ← 图片等静态文件
├── themes/         ← 主题
└── hugo.toml       ← 站点配置

安装主题

我选的是 PaperMod,目前最流行的 Hugo 极简主题,支持深色模式、标签分类、全文搜索、阅读时间、代码一键复制,风格简洁不过时。

git submodule add --depth=1 https://github.com/adityatelange/hugo-PaperMod themes/PaperMod

网络不好时多试几次,或者开代理执行。

配置站点

打开 hugo.toml,替换为以下内容(根据自己情况修改):

baseURL = "https://crownleo.cn/"
languageCode = "zh-CN"
title = "crownleo"
theme = "PaperMod"
hasCJKLanguage = true
enableRobotsTXT = true
paginate = 10

[params]
  author = "王冠"
  description = "工程师的折腾记录:NAS、AI工具、代码与系统"
  defaultTheme = "auto"
  ShowReadingTime = true
  ShowCodeCopyButtons = true
  ShowToc = true
  TocOpen = false

  [params.homeInfoParams]
    Title = "👋 你好"
    Content = "工程师的折腾记录。振动工程背景,热衷于 NAS 搭建、AI 工具与代码实验。"

  [[params.socialIcons]]
    name = "github"
    url = "https://github.com/crownleo"

[menu]
  [[menu.main]]
    name = "文章"
    url = "/posts/"
    weight = 1
  [[menu.main]]
    name = "标签"
    url = "/tags/"
    weight = 2
  [[menu.main]]
    name = "关于"
    url = "/about/"
    weight = 3
  [[menu.main]]
    name = "🔍"
    url = "/search/"
    weight = 4

[outputs]
  home = ["HTML", "RSS", "JSON"]

hasCJKLanguage = true 是让 Hugo 正确统计中文字数,影响阅读时间的计算,不加这个中文文章的阅读时间会偏短。[outputs] 里加 JSON 是开启全文搜索功能用的。

写第一篇文章

文章直接放到 content/posts/ 目录下,用命令创建会自动补全开头的元信息:

hugo new posts/nas-docker.md

或者直接新建一个 .md 文件拖进去也完全没问题,Hugo 只认文件在不在那个目录,不在乎是怎么放进去的。

文章格式如下,开头的 --- 包裹的部分是元信息,正文是普通 Markdown:

---
title: "用 Docker 在 Windows 上搭建家用 NAS"
date: 2026-05-21T20:00:00+08:00
tags: ["NAS折腾", "Docker", "系统搭建"]
description: "完整记录 NextCloud + Jellyfin 的部署过程,包括踩过的坑。"
draft: false
---

## 前言

这是正文,正常写 Markdown 就行...

注意 draft: false,不写或者写 true 的话构建时这篇文章不会出现。

本地预览

hugo server

浏览器打开 http://localhost:1313,修改文件后实时刷新,满意了再推送。

推送到 GitHub

先在 GitHub 新建一个仓库(https://github.com/new),名字随意,建议 Private 私有。

在项目根目录新建 .gitignore

public/
resources/
.hugo_build.lock

然后推送:

git add .
git commit -m "init blog"
git remote add origin https://github.com/crownleo/crownleo-blog.git
git push -u origin main

部署到 Vercel

Vercel 对 Hugo 有原生支持,配置比大多数平台简单。

第一步: 打开 https://vercel.com,用 GitHub 账号登录。

第二步: 点击「Add New → Project」,选择刚才的 crownleo-blog 仓库,点击「Import」。

第三步: Vercel 会自动识别出这是 Hugo 项目,构建配置会自动填好:

选项 自动填写的值
Framework Preset Hugo
Build Command hugo
Output Directory public

只需要手动添加一个环境变量,指定 Hugo 版本(避免 Vercel 用旧版本构建报错):

  • 变量名:HUGO_VERSION
  • 值:0.161.1(填你本地 hugo version 输出的版本号)

点击「Deploy」,等待约 1 分钟构建完成。

Vercel 会分配一个临时域名如 crownleo-blog.vercel.app,先用这个验证效果。

绑定自定义域名

第一步: 进入 Vercel 项目 → Settings → Domains,填写 crownleo.cn,点击 Add。

第二步: Vercel 会提示需要添加 DNS 记录。去你的域名服务商(Cloudflare、阿里云等)添加一条 CNAME 记录:

类型 名称 内容
CNAME @crownleo.cn cname.vercel-dns.com

DNS 生效后(通常几分钟),访问 https://crownleo.cn 就能看到博客。HTTPS 证书 Vercel 自动签发。

日常写作

配置完成后,以后发文章只有这几步:

  1. content/posts/ 下新建或拖入 .md 文件
  2. 写内容,确认 draft: false
  3. 推送
git add .
git commit -m "新文章:文章标题"
git push

推送后 Vercel 自动触发构建,约 30 秒后 crownleo.cn 更新完成。

小结

整个流程跑通之后,日常写作和发布的心智负担几乎为零。打开编辑器,写 Markdown,推送,完事。

Hugo 本身的学习曲线很平缓,大多数配置一次设好就不用再动。PaperMod 主题把常用的功能都做好了,深色模式、标签、搜索、目录、代码复制,开箱即用。

接下来我会陆续把之前折腾 NAS 的经历都写进来,也会记录一些用 AI 工具提高效率的实验。