碎碎念
最近在通过了 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.cssstatic/js/custom.js
然后在 config.toml 中配置:
[params]
custom_css = ["css/custom.css"]
custom_js = ["js/custom.js"]
- 主题会自动在页面中引入这些文件,方便你调整样式、加脚本。
短代码
支持折叠块(collapsible block)
在文章中这样写:
效果是:
- 页面上会显示一个类似「summary title」的折叠标题;
- 点开后能看到
block content内容。