再谈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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
.
├── _config.fluid.yml
├── _config.landscape.yml
├── _config.yml
├── db.json
├── node_modules/
├── package.json
├── package-lock.json
├── public/
├── scaffolds/
│ ├── draft.md
│ ├── page.md
│ └── post.md
├── source/
│ ├── about/
│ │ └── index.md
│ ├── CNAME
│ ├── _drafts/
│ ├── img/
│ └── _posts/
└── themes/
  • _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我就不细讲了,效果可以看我的静态站,用法可以看官方文档学习。

图床

静态站的头图、文章插图都会用到一些比较大的图片资源,这些资源如果跟其他静态资源放在一起,会有几个缺点:

  1. 图片可能越攒越多,对静态站的托管平台造成磁盘空间压力。静态站内的静态资源我是用dropbox同步,所以先于磁盘空间承压的瓶颈点是dropbox容量,这个对我影响比较大。

  2. 向静态站托管平台同步图片文件渠道通常比较受限,不能随心所欲,不那么方便日常攒图随时更新。这点上用dropbox倒是还算方便。

  3. 图片在静态站内部,客户端拉取资源需要走站域名,如果你有多个站,不方便跨站共享图,可能会有跨域问题。

  4. 图片的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
2
3
4
5
6
7
8
9
10
11
12
13
14
minio:
image: ghcr.io/minio/minio:RELEASE.2025-04-22T22-12-26Z
container_name: minio
volumes:
- ./data:/data
- ./config:/root/.minio
ports:
- 9000:9000
- 9001:9001
environment:
- 'MINIO_ROOT_USER=bipedalbit'
- 'MINIO_ROOT_PASSWORD=****'
restart: unless-stopped
command: ["server /data --console-address :9001"]

注意2025.5.24发布的minio更新版本中,把minio的web控制台功能从社区版代码里移除了:RELEASE.2025-05-24T17-08-30Z

挪到商业版里了,挣钱嘛,不寒碜。所以我这里没有用latest镜像,而是用了还有web控制台的最后一个版本。

--console-address如果不指定,会在每次启动容器时随机变化。

web控制台端口我不暴露到公网,安全保障。控制台界面跟普通S3对象存储的界面大同小异,能建桶,能配用户策略、桶策略,能配跨域白名单,能在界面操作桶文件。

minio登录页
minio桶列表
minio桶详情

CDN

有了对象存储,接下来就是选一个全球都有节点,不至于卡的、白嫖额度多的CDN。公布答案吧,我选了LightCDN,这家CDN的卖点是尽量让冷门区域也有节点覆盖,所以全球加速效果都不会太差,但也不会太快,对我来说足够了。

lightcdn请求统计
lightcdn费用统计

Waline

多说评论插件挂了有一阵子了,一直没顾上换新方案。时间尺度一拉长,就发现依赖第三方服务的插件还是欠缺稳定性,不如自建。

关于waline,我简要介绍一下:

  • hexo的fluid主题对waline有适配支持,不需要手动做代码嵌入

  • 功能挺全

    • 能做基于Markdown的富文本评论编辑,支持微博表情

    • 支持评论后台审核

    • 支持匿名评论和用户注册

    • 支持多语言界面

    • 支持页面浏览量和评论数统计

    • 支持邮件、微信、QQ、Telegram、Discord、飞书等各种webhook通知

  • 数据库部分:可以有多种选择,SaaS可以用LeanCloud,DB就多了,MongoDB、MYSQL、TiDB、SQLite、PostgreSQL、腾讯的CloudBase,甚至能把github仓库当DB用。

  • 服务端部分:可以在各种全栈应用托管平台部署,也可以自己在云主机上做独立部署。

我选择SQLite+独立部署服务端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
version: '3.8'

services:
waline:
image: lizheming/waline:latest
container_name: waline
restart: unless-stopped
ports:
- 127.0.0.1:8086:8360
volumes:
- ${PWD}/data:/app/data
environment:
TZ: 'Asia/Shanghai'
SQLITE_PATH: '/app/data'
JWT_TOKEN: ${JWT_TOKEN}
SITE_NAME: "BipedalBit's blog"
SITE_URL: 'https://bipedalbit.net'
SECURE_DOMAINS: 'bipedalbit.net,****,****'
SERVER_URL: 'https://****'
AUTHOR_EMAIL: '****'
#LEAN_ID: ${LEAN_ID}
#LEAN_KEY: ${LEAN_KEY}
#LEAN_MASTER_KEY: ${LEAN_MASTER_KEY}
SMTP_SERVICE: 'QQ'
SMTP_USER: ${SMTP_USER}
SMTP_PASS: ${SMTP_PASS}
SENDER_NAME: 'bot'
SENDER_EMAIL: '****'
IPQPS: 5
COMMENT_AUDIT: 'false'
  • 老规矩,不直接暴露端口到公网,nginx做汇聚入口和反向代理。

  • 除了官方文档里提到的功能,还能配跨域白名单、QPS限制。

  • sqlite部署方式有点尴尬,需要从github仓库自己下载初始化好的waline.sqlite文件挂载进容器。

waline评论管理
waline用户管理
waline用户编辑


再谈hexo静态站搭建
https://blog.bipedalbit.net/2025/06/07/再谈hexo静态站搭建/
作者
Bipedal Bit
发布于
2025年6月7日
许可协议