惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

云风的 BLOG
云风的 BLOG
M
MIT News - Artificial intelligence
Recent Announcements
Recent Announcements
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Stack Overflow Blog
Stack Overflow Blog
J
Java Code Geeks
Microsoft Azure Blog
Microsoft Azure Blog
罗磊的独立博客
博客园 - 【当耐特】
H
Help Net Security
腾讯CDC
大猫的无限游戏
大猫的无限游戏
GbyAI
GbyAI
Last Week in AI
Last Week in AI
Jina AI
Jina AI
博客园 - 聂微东
Blog — PlanetScale
Blog — PlanetScale
A
About on SuperTechFans
Apple Machine Learning Research
Apple Machine Learning Research
P
Proofpoint News Feed
Y
Y Combinator Blog
C
Check Point Blog
博客园 - 司徒正美
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知

竹林里有冰的博客

Nuxt SSG 博客的尾斜杠到底怎么加? | 竹林里有冰的博客 小米 Xiaomi Book Pro 14 (Ultra X7) Linux 兼容性实测 | 竹林里有冰的博客 国内(大陆)版小米 FCM 熄屏断连:Rootless 环境下的尝试与可能的解决方案 | 竹林里有冰的博客 我没法访问 dl.google.com —— 记一次 TUN 下的网络 debug | 竹林里有冰的博客 Vercel 的缓存控制,你注意过吗? | 竹林里有冰的博客 小记 —— Caddy 在 Layer 4 上的流量代理实践 | 竹林里有冰的博客 你的域名后缀拖慢你的网站速度了嘛?——再谈 DNS 冷启动 | 竹林里有冰的博客 DNS 冷启动:小型站点的“西西弗斯之石” | 竹林里有冰的博客 HTTP/2 Server Push 已事实性“死亡”,我很怀念它 | 竹林里有冰的博客 Nuxt Content v3 中数组字段的筛选困境与性能优化 | 竹林里有冰的博客 后 OCSP 时代,浏览器如何应对证书吊销新挑战 | 竹林里有冰的博客 初试 Github Action Self-hosted Runner,想说爱你不容易 | 竹林里有冰的博客 DNS 解析延迟毁了我的图床优化 | 竹林里有冰的博客 Vue Markdown 渲染优化实战(下):告别 DOM 操作,拥抱 AST 与函数式渲染 | 竹林里有冰的博客 Vue Markdown 渲染优化实战(上):从暴力刷新、分块更新到 Morphdom 的华丽变身 | 竹林里有冰的博客 node-sass 迁移至 dart-sass 踩坑实录 | 竹林里有冰的博客 前端中的量子力学——一打开 F12 就消失的 Bug | 竹林里有冰的博客 2025 年,如何为 web 页面上展示的视频选择合适的压缩算法? | 竹林里有冰的博客 el-image 和 el-table 怎么就打架了?Stacking Context 是什么? | 竹林里有冰的博客 2025年,前端如何使用 JS 将文本复制到剪切板? | 竹林里有冰的博客 ssh 拯救世界——通过 ssh 隧道在内网服务器执行 APT 更新 | 竹林里有冰的博客 Cudy TR3000 吃鹅(daed)记 | 竹林里有冰的博客 使用 Cloudflare Workers 监控 Fedora Copr 构建状态 | 竹林里有冰的博客 基于 Cloudflare Workers 实现的在线服务状态检测告警系统 | 竹林里有冰的博客 构建部署在 Cloudflare Workers 上的 TG Bot | 竹林里有冰的博客 2024年,Firefox 是唯一还在坚持执行在线的 SSL 证书吊销状态检查的主流浏览器 | 竹林里有冰的博客 小爱课程表适配不完全指北——以 ZJUT 本科正方教务系统为例 | 竹林里有冰的博客 将博客从 waline v2 更新到 waline v3 | 竹林里有冰的博客 给家里云装上 Fedora 41 KDE 后,我是如何配置的 | 竹林里有冰的博客 为 Hexo 添加 follow 认证 | 竹林里有冰的博客
我的博客部署方案 | 竹林里有冰的博客
竹林里有冰 · 2022-11-04 · via 竹林里有冰的博客

一直以来,我的博客使用的几乎都是 Hexo 框架。

静态博客的一大优点就是可以支持 Serverless 部署,这使得我们可以直接在 Github Pages、Vercel 等平台直接部署上我的博客,如果用上 .eu.org 或者非洲国家免费域名就可以实现零成本的博客部署。

当然,我现在的博客并非是零成本搭建的,如你所见,我购入了印度国别域名 zhul.in 来凑出 竹林 的谐音。并在 Github Pages、Vercel 等平台的访问质量每况愈下的情况下又购入了位于香港的 VPS,这就引申出了今天的内容——介绍我博客的部署方案。

我的博客是使用 HK vps + Github Pages 两处部署实现的,通过 dnspod 免费版的域名分境内/外解析实现了分流。当境内的访客访问我的博客时,他们将会被解析到香港的 vps 上以获得更好的体验,而境外的访客将会被解析到 Github pages,毕竟 Github Pages 在境外的速度并不慢,并且稳定性肯定比我这小鸡要好得多。

不过关于通过 dns 解析分流这件事,之前看城南旧事的博客中有提到可以使用境外的 GeoScaling 完成,其免费支持全球分as、城市、经纬等智能解析,也支持自编辑脚本,看起来以后可以去试一试。

Dnspod截图Dnspod截图

而 Hexo 框架最被人诟病的一点是更新麻烦。这一点不可否认,使用 hexo generate 生成静态网页文件再部署到服务器上的过程在一台新设备上是不小的工作量,它涉及 git、nodejs 的安装,涉及到 ssh key 和 rsync,整个环境的搭建就要废上不小的工夫。

在博客内容的更新方面,我选择了将整个 Hexo 的 workdir 全部上传到 github,使用 Github Action 帮助我同时完成静态页面的生成和 Github Pages 及 vps 的部署工作。具体的代码可以直接见我的 GIthub 仓库,我在这里简单讲下思路。

  1. 安装 nodejs
    这个没什么可说的,有现成的 Github Action 去完成这件事,我这边直接使用了actions/setup-node@v2
  2. 使用 npm/yarn 安装相关依赖
    这个直接跑 yarn install 即可。
  3. 为每个文件重新设定最后修改时间
    这一步其实是挺重要的,Hexo框架生成每篇文章的最后修改时间的依据是该文件的最后修改时间,而对于 Github Action 的容器来说,每一个文件都刚刚被下载下来,都是最新的,这就会导致你的每一篇文章每次部署时都会被认为刚才修改过。
    我们这边可以直接使用 git 记录的时间来作为文件的最后修改时间。(参考 Sea's Blog
    git ls-files | while read filepath; do touch -d "$(git log -1 --format='@%ct' $filepath)" "$filepath" && echo "Fixed: $filepath"; done
    
  4. 设置时区
    读我的博客的人应该大多都是东八区的人,那我们应当把 Github Action 容器的时区设置为东八区,和自己 git commit 时所使用的设备的时间保持一致,否则某些文章的日期可能会发生一天的偏移。
    export TZ='Asia/Shanghai'
    
  5. 生成静态网页文件
    yarn build
    
  6. 部署到 Github Pages
    使用 peaceiris/actions-gh-pages@v3
  7. 初始化 Github Action 容器上的 ssh 私钥
    应当在 Github 仓库的设置里先新建一个 secret,填入自己的 ssh 私钥(更加标准的做法应当是为 github action 专门生成一对 ssh 密钥,将公钥上传到自己的 vps,将私钥上传到 Github 仓库的 secret 中)。
    github secret settinggithub secret setting
    我这边直接从点墨阁那边抄了点代码直接用。
  8. 使用 hexo 的 deploy 插件调用 rsync 将静态文件上传到自己服务器的对应目录(static server 你应当已经设置好了)
    yarn deploy
    

注: 本篇博客中引用的所有博客页面均在 web.archive.org 进行了存档,如后续遇到页面打不开的问题请自行前往查询存档。