T0FV404 / Hugo 博客搭建记录

Created Fri, 05 Dec 2025 21:36:35 +0800 Modified Fri, 05 Dec 2025 21:30:40 +0800
2032 Words

碎碎念

最近在通过了 github 学生认证,去白嫖了 Azure 的免费 Linux 服务器(并非,其实是 Azure 会每年送 100 美元,同时会给一定优惠,当然要每年认证一次),便萌生了搭建自己的博客的想法,正好 github 学生认证还能白嫖域名和 SSL 认证,何乐而不为呢?

不过真得说,微软这个服务器真容易炸啊,我 ssh 掉了好几次。我第一次用服务器还以为被黑了,问了 Tremse 才知道这是正常情况,但是炸了三次,原本还打算部署 syncthing 的,想想还是算了。

操作

本地建立仓库

先安装 hugo,安装方式不说,然后在你的目标文件夹执行命令即可:

hugo new site "blog"
cd "blog"
git init
git add .
git commit -m "first hugo blog"

远程建立仓库

远程服务器也先安装 hugo,安装方式不说,然后在你的目标文件夹执行命令即可:

mkdir blog
cd blog
git init
git config receive.denyCurrentBranch ignore
cd .git/hooks
touch post-receive
chmod +x post-receive
vim post-receive

然后在 post-receive 写入,建立 hook 自动构建:

#!/bin/sh

GIT_DIR=/home/xxx/blog/.git # 注意修改 xxx
WORK_TREE=/home/xxx/blog # 注意修改 xxx

# 强制同步工作区到最新提交
git --git-dir="$GIT_DIR" --work-tree="$WORK_TREE" reset --hard HEAD --

# 更新子模块(主题)
git --git-dir="$GIT_DIR" --work-tree="$WORK_TREE" submodule update --init --recursive

# 构建 Hugo 站点(在工作区目录中执行)
cd "$WORK_TREE" || exit 1
hugo

本地添加 origin

注意配置好 ssh 密钥,然后执行:

git remote add origin xxx # 注意修改 xxx
git push -u origin master

配置域名

由于 github 学生包实在是太好用了,所以我直接用 namecheap 的免费一年域名+免费一年 SSL 认证。(当然还有 name.com 的,但是那个要 visa 卡)

然后直接在自带的域名解析配置好公网 ip 即可。

等它个几分钟用 nslookup 检测一下域名,返回公网 ip 即可。

搭建 https 服务

作为不懂 web 的废物,我问了 ai ,好像目前都是用 nginx ,但是我问了一下有没有轻量且方便的,ai 又推荐了 caddy,作为小众哥,那自然是用这个了 😋。

而且它会自动帮你申请 https 证书,确实好。

安装不多说,修改 /etc/caddy/Caddyfile

t0fv404.me {
    root * /home/azureuser/blog/public
    file_server
}

www.t0fv404.me {
    redir https://t0fv404.me{uri}
}

退出重启:

sudo systemctl restart caddy
sudo systemctl status caddy

记得在云服务商防火墙开放端口。

文件权限

我发现配置是配好了,但是返回 403,于是问了 ai,发现是文件权限不对,但是 ai 很蠢直接要我们改 home 目录权限,可以把 caddy 用户加入我们的用户组:

sudo usermod -aG azureuser caddy

Hugo 框架介绍

目录结构介绍

它是 go 写的,所以在静态框架的方案中,应该是最快的

目录包含发布的网站,在运行 hugo 或 hugo server 命令时生成。Hugo 会根据需要重新创建此目录及其内容。
├── resources/ my-site/
├── archetypes/ 包含用于新内容的模板
│   └── default.md
├── assets/ 目录包含通常通过资源管道传递的全局资源。这包括诸如图片、CSS、Sass、JavaScript 和 TypeScript 等资源。
├── content/ 目录包含构成站点内容的标记文件(通常是 Markdown)和页面资源。
├── data/ 目录包含用于增强内容、配置、本地化和导航的数据文件(JSON、TOML、YAML 或 XML)。
├── i18n/ 目录包含多语言站点的翻译表。
├── layouts/ 目录包含将内容、数据和资源转换为完整网站的模板。
├── public/ 目录包含发布的网站,在运行 hugo 或 hugo server 命令时生成。Hugo 会根据需要重新创建此目录及其内容。
├── resources/ 目录包含 Hugo 资源管道的缓存输出,这些输出是在您运行 hugo 或 hugo server 命令时生成的。默认情况下,此缓存目录包含 CSS 和图像。Hugo 会根据需要重新创建此目录及其内容。
├── static/ 目录包含在您构建网站时将被复制到 public 目录的文件。例如:favicon.ico、robots.txt 和用于验证网站所有权的文件。在引入 页面包 和 资源管道 之前,static 目录也用于存放图像、CSS 和 JavaScript。
├── themes/ 目录包含一个或多个主题,每个主题都有自己的子目录。
└── hugo.toml/config/ 目录包含你的站点配置,可能拆分为多个子目录和文件。对于配置最少或在不同环境中不需要不同行为的项目,项目根目录中名为 hugo.toml 的单个配置文件就足够了。

模板

可以在 archetypes/default.md 添加自己的模版,或者自己写一个,这样以后执行下面命令即可建立一个模版文章:

hugo new default/passage.md
---
title: "{{ replace .Name "-" " " | title }}"
description: ""
categories: []
date: {{ .Date }}
lastmod: {{ .Date }}
draft: true
showToc: true
# 如果你有封面图,可以用:
# 需要“预约发布”才加:
# publishDate: 2025-12-06T09:00:00+08:00
# 需要“自动下线”才加:
# expiryDate: 2026-01-01T00:00:00+08:00
# cover: "/images/xxx.jpg"
# PaperMod 常用字段(按需用)
# showToc: true           # 显示目录
# comments: true          # 开启评论(如果你配置了评论系统)
---

配置

可以在 hugo.toml 修改配置。

当然以上要根据主题来修改。

构建和预览

hugo --buildDrafts    # or -D
hugo --buildExpired   # or -E
hugo --buildFuture    # or -F
hugo server # 上面的选项也可以直接用,浏览器打开 http://localhost: 1313/

短代码

官方短代码手册

直接贴手册,因为我不知道如何让短代码失效。

主题选择

我用的是 github-style 主题,记录一下相关短代码,命令和文章头。

命令

hugo new post/title.md

文章

限制列表页显示内容(摘要)

使用 summary 字段

---
title: "title"
date: 2019-10-22T18:46:47+08:00
draft: false
summary: "The summary content"
---
  • summary 的内容只显示在文章列表/摘要位置,在文章正文页不会出现。

文中分隔

<! --more--> !后面的空格记得去掉,只是为了显示才加上的。
  • 短代码之前的内容会作为摘要显示在列表中;
  • 同时,这部分在文章正文页面也会显示(与 summary 不同)。

支持 LaTeX (KaTeX)

在文章 Front Matter 中开启:

---
katex: math
---

然后,KaTeX 会自动渲染被下面分隔符包裹的内容:

行内公式:\\( ... \\)
行间公式:$$ ... $$

支持 MathJax

在 Front Matter 中写:

mathJax: true
  • 主题会加载 MathJax 用于公式渲染。

自定义 CSS 与 JS

把自己的文件放到 static 目录下,比如:

  • static/css/custom.css
  • static/js/custom.js

然后在 config.toml 中配置:

[params]
  custom_css = ["css/custom.css"]
  custom_js = ["js/custom.js"]
  • 主题会自动在页面中引入这些文件,方便你调整样式、加脚本。

短代码

支持折叠块(collapsible block)

在文章中这样写:

效果是:

  • 页面上会显示一个类似「summary title」的折叠标题;
  • 点开后能看到 block content 内容。