再谈hexo静态站搭建
回顾
不是头一次谈hexo静态站搭建了,2016年就写了相关的博客,非常耐心事无巨细地介绍过当时的搭建方案。
紧接着开了自己的VPS,于是又写文介绍了迭代方案,在VPS上做了镜像站部署,用dropbox做静态资源同步。现在由于国内不搭梯子访问github已经不稳定,VPS上的静态站反而成了主站,github pages上那个站成替身了哈哈。
概述
新的静态站其实主要更新了3个点:
主题:landscape-plus => fluid
图床:七牛 => 自建minio+cdn
评论插件:多说 => 自建waline
hexo
很幸运,在旧笔记本上居然翻到了完整未损坏的当年的hexo项目目录,不过其实要装修个人站的话,只需要把站里的markdown文章救回来就好,反正外面的静态站框架还是会用hexo。
说起来,hexo这个静态站框架也是很经久不衰,虽然插件和主题消亡了不少个,但框架本身还在持续迭代,社区也还在活跃,一直出新的插件和主题,简直跟sublime text有一拼,我也是真爱掺和这种自由度高的DIY项目,怕是早晚要入PCB板、3D打印的坑。
看了眼hexo的新官方文档,命令行用法没什么变化,项目结构也没变化,但比起9年前(Σ(⊙▽⊙”这就是成年人的世界吗?好吓人的时间尺度),除了github pages,适配了一些新的免费静态站托管平台:
gitlab pages:依赖可用的gitlab,gitlab知道吧?github开源对标方案。
Heroku:一个可以免费托管全栈应用的PaaS平台,有每月白嫖小时数,应用有些休眠问题要解决。
Netlify:SaaS托管平台。
Vercel:前端应用托管平台,有白嫖流量,但好像是固定额度,不是每月送额度。
RSS3:就是基于web3那一套做的RSS托管,简单理解就是IPFS上放静态资源,区块链代币支付存储和基建维护费。IPFS这个存储方案嘛我调研过,彻底去中心,可靠、近似真·持久化,IO性能还OK,但是存储成本其实比各大云厂的对象存储还贵一些,考虑到赛博活菩萨甚至有可以白嫖的对象存储,IPFS吧就有点鸡肋,现在更多是用来破审核,偷摸分享些灰色地带的资源。
一些纯资源同步工具:Rsync、FTPSync、SFTP。
还提了一嘴,其他类似的静态资源托管方案可以自己同步hexo项目的public目录内容即可,比如我的VPS+dropbox方案。
hexo的项目结构带大家熟悉一下:
1 |
|
_config.yml
:这是整个hexo项目的配置文件_config.landscape.yml
:这是landsacpe主题的hexo项目配置文件,landscape是hexo项目的默认主体,主题配置文件一般相对于项目配置文件会多出一些配置项,这就是主题的发挥空间。主题配置文件中的配置优先级高于项目配置,所以跟主题无关的项目配置可以配在_config.yml
里,主题特有的配置配在主题配置文件里,方便随时换主题。_config.fluid.yml
:这是我现在用的fluid主题的配置文件。几个json文件和
node_modules/
目录理解成项目运行时环境就好,包括了hexo框架本身、插件和主题的实现。迁移hexo项目时,可以删掉node_modules/
目录,靠json文件能重建项目运行时资源。themes/
目录是用来放git clone
下来的主题的,不是很冷门的主题的话,直接用命令安装到项目的运行时资源里就行。public/
目录用来放hexo框架生成的网站静态资源,可以直接把这个目录当网站根目录,拿去部署网站。scaffolds/
目录,字面意思是脚手架,其实是用来放几种markdown文件的模板,用生成markdown文件时会根据这些模板做一些内容初始化,我是还没有做什么修改。source/
目录是项目的内容目录,其中的markdown文件会生成对应静态资源后搬到public/
目录中,其他目录会原样搬到public/
目录中。source/about/index.md
用来创建关于页。source/_drafts
目录用来放文章草稿,不会生成静态资源。source/_posts
目录用来放文章正文,会生成静态资源。
hexo框架和fluid我就不细讲了,效果可以看我的静态站,用法可以看官方文档学习。
图床
静态站的头图、文章插图都会用到一些比较大的图片资源,这些资源如果跟其他静态资源放在一起,会有几个缺点:
图片可能越攒越多,对静态站的托管平台造成磁盘空间压力。静态站内的静态资源我是用dropbox同步,所以先于磁盘空间承压的瓶颈点是dropbox容量,这个对我影响比较大。
向静态站托管平台同步图片文件渠道通常比较受限,不能随心所欲,不那么方便日常攒图随时更新。这点上用dropbox倒是还算方便。
图片在静态站内部,客户端拉取资源需要走站域名,如果你有多个站,不方便跨站共享图,可能会有跨域问题。
图片的IO会占据静态站在托管平台的大部分IO带宽,如果你的IO带宽很有限或者流量受限,就比较危险了。有人说可以上CDN,是能缓解不少,但资源更新比较频繁的话,CDN回源也会频繁,还是会吃IO。我VPS带宽、流量可观,所以这点倒是无所谓。
长远考虑,我需要使用独立的、配有CDN的图床。
上一版静态站,我的图床是七牛图床,当时七牛提供子域名给每个用户空间,现在七牛要求用户自行绑定备案域名。备案可太麻烦了,我选择换方案。
有人安利过cloudfare的R2存储,虽然可以白嫖,但cloudfare国内被白嫖太多,CDN国内节点经常会负载过高变卡甚至断连。正巧我有了NAS这个便宜宽敞的存储空间,我选择自建对象存储,内网穿透出去作为图床,自配CDN。
minio
minio是Amazon S3对象存储的开源对标项目。minio可以用docker容器部署,我的群晖NAS支持docker容器,我在搭open-webui时有现成的frp内网穿透方案在公网暴露minio的API,这不就妥了。
minio还是用docker-compose部署:
1 |
|
注意2025.5.24发布的minio更新版本中,把minio的web控制台功能从社区版代码里移除了:RELEASE.2025-05-24T17-08-30Z
挪到商业版里了,挣钱嘛,不寒碜。所以我这里没有用latest镜像,而是用了还有web控制台的最后一个版本。
--console-address
如果不指定,会在每次启动容器时随机变化。
web控制台端口我不暴露到公网,安全保障。控制台界面跟普通S3对象存储的界面大同小异,能建桶,能配用户策略、桶策略,能配跨域白名单,能在界面操作桶文件。
CDN
有了对象存储,接下来就是选一个全球都有节点,不至于卡的、白嫖额度多的CDN。公布答案吧,我选了LightCDN,这家CDN的卖点是尽量让冷门区域也有节点覆盖,所以全球加速效果都不会太差,但也不会太快,对我来说足够了。
Waline
多说评论插件挂了有一阵子了,一直没顾上换新方案。时间尺度一拉长,就发现依赖第三方服务的插件还是欠缺稳定性,不如自建。
关于waline,我简要介绍一下:
hexo的fluid主题对waline有适配支持,不需要手动做代码嵌入
功能挺全:
能做基于Markdown的富文本评论编辑,支持微博表情
支持评论后台审核
支持匿名评论和用户注册
支持多语言界面
支持页面浏览量和评论数统计
支持邮件、微信、QQ、Telegram、Discord、飞书等各种webhook通知
数据库部分:可以有多种选择,SaaS可以用LeanCloud,DB就多了,MongoDB、MYSQL、TiDB、SQLite、PostgreSQL、腾讯的CloudBase,甚至能把github仓库当DB用。
服务端部分:可以在各种全栈应用托管平台部署,也可以自己在云主机上做独立部署。
我选择SQLite+独立部署服务端:
1 |
|
老规矩,不直接暴露端口到公网,nginx做汇聚入口和反向代理。
除了官方文档里提到的功能,还能配跨域白名单、QPS限制。
sqlite部署方式有点尴尬,需要从github仓库自己下载初始化好的waline.sqlite文件挂载进容器。