从零折腾一个自己的博客
第一次接触博客是大学入学前的那个暑假吧。我哥给我看的他的博客, 我寻思不就是记录东西的吗. 我也可以开个公众号哈哈哈哈哈.现在打脸了
师兄实习后, 经常刷博客, 也会给我分享一些技术型博客, 哎呀我也想有一个。
不是那种很复杂、很商业化的网站,也不是为了立刻写出什么很厉害的技术文章。更像是想给自己留一个地方。以后读论文、配环境、写项目、踩坑、突然想明白一个东西,都可以放进去。它不一定每天更新,但它应该在那里。
这件事刚开始的时候,我其实有点懵。组里有服务器,所以我的第一反应是:是不是应该把博客部署到服务器上?后来折腾了一圈才发现,如果只是个人博客,而且文章基本都是 Markdown,那一开始完全没必要把事情做重。静态博客加 GitHub Pages 已经够用了。(其实是师兄带着我走的)
现在回头看,这次真正有价值的地方不只是“我有了一个博客”,而是我终于把域名、DNS、GitHub Pages、HTTPS 这些以前听起来混在一起的东西,拆开看了一遍。(PS: 买域名的时候好纠结哈哈哈, 因为乳名叫乐乐, 想有个有纪念意义的. 师兄还调侃我”怎么不用你那个lelestarlight了? 因为中二时期给自己的邮箱名字是lelestarlight”)
先让博客本体跑起来
我一开始没有先买域名,而是先把博客本身跑起来。
这个顺序现在看是对的。因为域名只是一个入口,它不会让一个不存在的网站突然出现。真正最先要确定的是:我到底要把什么内容发布出去。
博客模板我最后换成了 Retypeset,底层是 Astro。对我来说,最重要的不是框架有多酷,而是它让我可以继续用 Markdown 写文章。平时写一篇博客,不需要手写 HTML,也不需要自己写后端。
日常写文章大概就是这样:
cd D:\xxx\ZichangYang.github.io
pnpm new-post my-new-post
pnpm dev本地预览没问题之后,再提交:
git add .
git commit -m "Add new post"
git pushpush 到 GitHub 之后,GitHub Pages 会负责把网站发布出去。
这一点让我觉得比较舒服, 就是以后写博客的时候,我面对的主要还是文章本身,而不是每次都要重新部署一遍网站。
为什么没有直接用服务器
一开始我想过用组里的服务器。
服务器当然可以部署博客,而且还能顺便练 Nginx、证书、反向代理这些东西。但想了一下,我这次真正想解决的问题不是“学习服务器运维”,而是“先有一个能长期写东西的地方”。
如果一上来就用服务器,我要额外关心很多事:
- 服务器环境要怎么配
- Nginx 怎么写
- HTTPS 证书怎么申请和续期
- 服务挂了怎么办
- 以后换服务器怎么办
这些都不是不能做,只是它们会把注意力从“写博客”拉走。
所以我最后接受了一个更简单的方案:静态博客放在 GitHub Pages。它免费、稳定,和 GitHub 仓库天然绑定。对现在的我来说这已经ok了。
这次我也有一个很明显的感受:简单不是不专业。很多时候简单是先把主要问题解决掉。等以后真的需要更多能力,再去加服务器也不迟。
买域名
博客用 GitHub Pages 跑起来之后,默认地址其实已经能访问:
https://ZichangYang.github.io但是还是想有一个属于自己的域名. 所以! 我去 Spaceship 买了一个域名:
lele.best买域名的时候我主要看两个价格:首年价格和续费价格。
很多域名第一年很便宜,但续费可能贵不少。个人博客不是什么商业项目,我也不想为了一个域名每年有太大负担。所以最后选域名的时候,我没有只看“第一年多少钱”,也看了后面长期续费能不能接受。
买完域名以后,我才意识到一件很好笑但很重要的事:买域名本身不会发生什么。我只是拥有了这个名字,但互联网还不知道这个名字应该指向哪里。那么!!域名和ip如何联系起来呢~
这就轮到 DNS 了。
DNS
以前我看到 DNS 会觉得它很玄学。
这次配完之后,我先把它理解成一个地址簿。
别人访问:
lele.best浏览器并不知道这个名字背后是哪台服务器,也不知道它应该去哪儿拿网页。DNS 要做的事情就是告诉它:
lele.best 应该去这里找我的博客实际托管在 GitHub Pages,所以 DNS 最终要把 lele.best 指到 GitHub Pages。
这里有两个平台:
- Spaceship:我在哪里买的域名,负责域名注册和续费
- Cloudflare:我用它管理 DNS,负责告诉别人这个域名应该指向哪里
师兄说“把域名转到 Cloudflare”,我一开始还以为是要把域名从 Spaceship 搬走。后来才明白,这里更准确地说,是把 DNS 管理交给 Cloudflare。
域名本身还是在 Spaceship 续费,但解析记录以后在 Cloudflare 改。
把 nameserver 改到 Cloudflare
我在 Cloudflare 里添加了 lele.best,选择的是 Connect a domain。Cloudflare 给了我两个 nameserver:
gabe.ns.cloudflare.com
yolanda.ns.cloudflare.com然后我回到 Spaceship,把原来的 nameserver 改成 Cloudflare 给的这两个。
这一步的意思是:
以后别人问 lele.best 应该去哪儿,不再问 Spaceship 默认 DNS,而是去问 Cloudflare这一步刚改完不会立刻全世界生效。DNS 有传播时间,所以中间会有一段“我明明改了,但怎么还没好”的等待期。(所以中间我刷新了好几次, 我很急但是不知道在急什么嘻嘻嘻)
我当时也反复看页面,生怕自己填错。现在回想起来,这种等待本身就是搭网站的一部分。不是所有东西都像本地代码一样,改完一保存就立刻生效。
在 Cloudflare 里填 DNS 记录
Cloudflare 接管 DNS 之后,还要告诉它具体怎么指路。
根域名 lele.best 用 A 记录指向 GitHub Pages 的 IP:
185.199.108.153
185.199.109.153
185.199.110.153
185.199.111.153www.lele.best 用 CNAME 指向:
ZichangYang.github.io我后来是这样理解 A 记录和 CNAME 的:
- A 记录:直接指向一个 IP 地址
- CNAME:把一个域名当作另一个域名的别名
所以这里的关系大概是:
lele.best -> GitHub Pages 的 IP
www.lele.best -> ZichangYang.github.io当时还有一个细节:Cloudflare 里的小云朵先保持 DNS only,也就是灰色云朵。因为我想先让 GitHub Pages 正常检测到 DNS,然后让 GitHub 自己签发 HTTPS 证书。等基础流程跑通之后,再考虑要不要开 Cloudflare 的代理。
在 GitHub Pages 里绑定自定义域名
DNS 指过去以后,还要去 GitHub 仓库里告诉 GitHub:
lele.best 是这个博客要用的域名位置是:
Settings -> Pages -> Custom domain填入:
lele.best保存之后,GitHub 会做 DNS 检查。
我看到绿色的:
DNS check successful呀呼~ok!!!!!!!!!!!!!!(感谢师兄and我的伙伴codex)
这一步让我又想明白一层:DNS 只是把请求带到 GitHub Pages 门口,但 GitHub Pages 也得知道这个请求应该交给哪个仓库。否则它收到了 lele.best 的访问,也不知道该把哪个网站返回出去。
HTTPS:最后只能等
域名绑好之后,还有 HTTPS 证书。
GitHub Pages 页面里显示过类似这样的状态:
TLS certificate is being provisioned意思是证书还在签发。这个阶段里,HTTP 可能已经能访问了,但 HTTPS 还没完全好,Enforce HTTPS 也可能暂时不能勾。
这一步很容易让人怀疑自己是不是哪里配错了。
但其实如果前面已经出现了:
DNS check successful那大概率不是 DNS 错了,而是证书还在处理。等一会儿,刷新页面,等 Enforce HTTPS 可以勾选之后,再把它打开。
一个差点吓到我的小插曲
中间我查 DNS 的时候,看到过类似这样的 IP:
198.18.0.x我当时第一反应是:坏了,是不是 DNS 配错了。
后来才发现,这很可能是本机代理或者网络环境产生的 fake-ip,并不代表公网 DNS 真的是这个结果。
所以查 DNS 的时候,不能只看自己电脑某一次查询。更靠谱的办法是查公共 DNS,比如 Google DNS 或 Cloudflare DNS。只要公网结果里 lele.best 指向 GitHub Pages 的那几个 IP,说明大方向就是对的。
这个小插曲对我挺有用的。它提醒我,排查问题的时候要先判断“我看到的现象来自哪里”。有时候不是配置错了,而是观察的位置不对。
我最后真正理解了什么
这次之前,我把“部署一个博客”想成一整块东西。
做完之后,我发现它其实可以拆成几层:
- GitHub 仓库:放博客源码
- Astro / Retypeset:把 Markdown 变成网页
- GitHub Pages:托管静态网页
- 域名:给网站一个好记的名字
- DNS:告诉别人这个名字应该去哪儿
- HTTPS:让访问过程变成安全连接
这些东西以前听起来都挤在一起,像一团线。真正做一遍之后,它们就各自站到了自己的位置上。
我也不是一开始就懂。很多步骤其实是跟着做的,做到某一步卡住了,再回头问“这一步到底在干嘛”。但这种理解反而比较真实。不是先把所有概念背完再开始,而是在动手过程中慢慢把它们串起来。
这大概也是我这次最喜欢的地方。
它不是一次很高级的工程实践,但它把一个原本很模糊的东西变成了一个我能摸到的流程。
后来又开始纠结文件放哪
博客弄好之后,我准备把这篇文章塞进项目里,结果又卡住了。不是报错,也不是部署失败,就是一个很日常的问题:
我以后每写一篇,都直接扔到 src/content/posts 下面吗?
刚开始我觉得应该是这样。毕竟它就叫 posts,文章不放这里还能放哪里。但看了一眼目录,我又有点不舒服。现在只有几篇文章当然没事,后面如果写多了,Markdown 文件、图片文件夹、各种临时名字全堆在一起,迟早会乱。毕竟刚开学的时候师兄给我重装系统, 教会我怎么分类文件.
而且这种乱不是那种马上会炸的乱,是更烦人的那种:每次想找一篇旧文章,都要在一堆文件名里扒拉半天。想到这里我就觉得,算了,还是趁现在还没几篇先理一下。
后来确认了一下,这个项目不是要求所有文章都平铺在 posts 下面。只要还在 src/content/posts 里面,下面再分文件夹也可以。
于是我就先分了三个:
notes
research
tools也没有什么很严肃的分类体系。research 放论文、科研这些,tools 放博客部署、环境配置、工具折腾,notes 就放一些还没那么明确的小记录。够用就行,别一上来把分类做得比文章还复杂。
但是刚分完我又想起另一个问题:文件移动了,网址会不会跟着变?
这个问题确实会(我很厉害吧..)。因为这个博客默认会用文章路径当网址的一部分。也就是说,如果我把:
posts/first-paper-experience.md挪到:
posts/research/first-paper-experience.md那网址也可能从:
/posts/first-paper-experience/变成:
/posts/research/first-paper-experience/这就有点尴尬了。我只是想收拾一下房间,不是想给门牌号也换了。尤其博客这种东西,后面万一哪篇文章被自己引用过、发给别人过,地址老变就很烦。
最后的办法是给文章写一个固定的 abbrlink:
abbrlink: first-paper-experience这样文件爱放哪放哪,网址还是认这个短名字。比如文章已经被我放到:
src/content/posts/research/first-paper-experience.md但访问地址还是:
/posts/first-paper-experience/这下就舒服多了。文件夹是给我自己看的,网址是给外面访问的,两边不要互相拖着跑。
我顺便也把分享图那块改了一下,让它也按 abbrlink 来找文章。不然正文地址稳住了,结果分享图地址又因为文件移动变了,也挺怪的。
现在目录大概变成这样:
posts
notes
hello.md
research
first-paper-experience.md
first-paper-experience.assets
tools
blog-deployment-record-post.md以后有图片的话,就跟着文章放一个同名的 .assets 文件夹。文章在哪,图就在哪旁边。这个规则很土,但好记。
这一段折腾其实挺小的,但我还挺在意。因为博客这种东西,如果一开始就让自己写得不顺手,后面很容易懒得写。目录不用多高级,至少别让我每次打开项目都先皱眉。
后面怎么写
博客搭好之后,真正的问题反而变成了:我要写什么。
现在我的写作流程很简单:
cd D:\Learning\blog\ZichangYang.github.io
pnpm new-post tools/post-name
pnpm dev如果这篇是在折腾工具,就放 tools;如果是论文相关,就放 research;如果只是随便记点东西,就先丢 notes。不用想太神圣,先让自己愿意写。
然后记得在文章开头给它一个固定的 abbrlink。这个名字以后就是它的网址,别随便改:
abbrlink: post-name写完之后本地看一眼,没问题就:
git add .
git commit -m "Add new post"
git push以后文章会发到:
https://lele.best我现在对这个博客的期待也不算很大。它不需要立刻变成一个内容很多的网站,也不需要每篇都写得特别完整。它先是一个记录自己的地方。
有些东西当时不记下来,过几天就会忘。尤其是那些配环境、改配置、查报错、突然想通的瞬间。它们单独看都很小,但积累起来,可能就是自己走过的路。
所以这篇文章也算是第一块砖。(Oh不对, 是第二块, 因为我太想先写一下我的论文了哈哈哈哈哈)
博客的门牌号已经挂上了,后面就慢慢往里面放东西~