hexo迁移部署到阿里云


之前博客一直是通过 Coding 来部署的,最近发现 Coding 已经不能继续写入了,所以把 Hexo 静态博客迁移到了阿里云 OSS 和 CDN,这里记录一下整个过程

我的博客是 Hexo 生成的静态页面,之前的发布方式大概是:

1
2
3
hexo clean
hexo generate
hexo deploy

hexo deploy 会把生成后的 public 目录推送到 GitHub Pages 和 Coding。

后来发布的时候发现 Coding 返回了下面的提示:

1
CODING DevOps 标准版产品已于 2025 年 9 月 1 日下线,无法进行写操作

所以这次就顺手把博客迁移到阿里云 OSS 上。

为什么换到OSS

博客本身是纯静态资源,生成出来以后就是一堆 html、css、js、图片文件。

这种场景放到 OSS 很合适:

  1. 不需要服务器
  2. 不需要 node 常驻运行
  3. 上传 public 目录就可以访问
  4. 可以绑定自己的域名
  5. 可以配合 CDN 开启 HTTPS

我本来就有阿里云账号,也有 OSS,所以迁移成本不算高。

创建Bucket

我没有直接复用之前放图片的 Bucket,而是重新创建了一个专门放博客页面的 Bucket:

1
cs-blog-web

地域选择的是:

1
华东1(杭州)

这样做主要是为了把图片资源和博客页面分开。

尤其后面上传网站的时候会用同步命令,如果和图片放在一起,使用 --delete 时很容易误删图片。

静态页面

创建 Bucket 后,需要开启静态网站托管。

在 OSS Bucket 中找到:

1
静态页面

配置:

1
2
默认首页:index.html
默认 404 页:404.html

这里还有一个比较重要的配置,就是支持子目录。

Hexo 生成的文章路径一般是这种:

1
/2025/05/28/179-Element Plus表格高度适配/

真实文件其实是:

1
/2025/05/28/179-Element Plus表格高度适配/index.html

所以需要让 OSS 支持目录访问时自动寻找 index.html

绑定域名

我绑定的是:

1
www.chensheng.group

一开始我直接把 DNS 的 CNAME 指到了 OSS 静态网站地址:

1
cs-blog-web.oss-website-cn-hangzhou.aliyuncs.com

这样 HTTP 是可以访问的,但是 HTTPS 不太行。

后面发现正确方式应该是:

1
2
3
4
5
www.chensheng.group

阿里云 CDN

OSS 静态网站地址

也就是说,域名最终不要直接只绑 OSS,而是通过 CDN 来做 HTTPS。

CDN配置

在 CDN 中添加加速域名:

1
www.chensheng.group

源站配置成 OSS。

这里需要注意,如果要支持 Hexo 这种目录形式的访问,源站最好使用静态网站域名:

1
cs-blog-web.oss-website-cn-hangzhou.aliyuncs.com

CDN 开启后,会给一个 CNAME,比如:

1
www.chensheng.group.w.cdngslb.com

然后去域名解析中,把 www 的 CNAME 指向 CDN:

1
www  CNAME  www.chensheng.group.w.cdngslb.com

一开始我这里同时存在多个 www 解析,导致访问结果有时候正常,有时候异常。

最后只保留一条 www 的 CNAME,问题就稳定了。

HTTPS证书

OSS 域名管理里面也可以配置证书。

但是这次真正让 HTTPS 生效的是 CDN 的 HTTPS 配置。

也就是说:

1
2
OSS 证书:不是关键
CDN 证书:需要配置

CDN 开启 HTTPS 后,再访问:

1
https://www.chensheng.group/

就可以正常打开了。

ossutil

本地上传使用的是阿里云的 ossutil

安装好后配置 AccessKey:

1
ossutil config

需要填写:

1
2
3
endpoint: oss-cn-hangzhou.aliyuncs.com
accessKeyID: 阿里云 AccessKey ID
accessKeySecret: 阿里云 AccessKey Secret

AccessKey 建议使用 RAM 用户,不要直接使用主账号。

如果 AccessKey 泄露了,要及时禁用或者重新生成。

上传命令

Hexo 生成后的静态文件都在 public 目录。

所以上传命令是:

1
ossutil sync public oss://cs-blog-web/ --delete -f --endpoint oss-cn-hangzhou.aliyuncs.com

这里的 --delete 表示 OSS 上多余的旧文件会被删除,保证线上内容和本地 public 一致。

目录对象问题

迁移过程中还遇到一个问题。

上传后发现文章地址有时候访问到的是一个空目录对象,而不是目录下的 index.html

比如:

1
/2025/05/28/179-Element Plus表格高度适配/

应该访问:

1
/2025/05/28/179-Element Plus表格高度适配/index.html

但是 OSS 里面如果存在一个同名的空目录对象,就会把这个路径截住。

所以我在发布脚本里加了一步:上传完成后,清理所有以 / 结尾的 0 字节目录对象。

发布脚本

最后把发布逻辑整理成脚本。

package.json 中配置:

1
2
3
4
5
6
7
8
9
10
{
"scripts": {
"build": "hexo generate",
"clean": "hexo clean",
"deploy": "npm run deploy:oss",
"deploy:oss": "node scripts/deploy-oss.cjs",
"publish": "node scripts/publish.cjs",
"all": "node scripts/publish.cjs"
}
}

现在发布博客只需要执行:

1
npm run all

它会自动完成:

  1. 清理旧文件
  2. 生成静态页面
  3. 上传到 OSS
  4. 清理 OSS 目录对象
  5. 提交源码
  6. 推送到 GitHub

最终结构

最终整个博客访问链路是:

1
2
3
4
5
6
7
8
9
Hexo public

ossutil 上传

阿里云 OSS:cs-blog-web

阿里云 CDN

https://www.chensheng.group/

源码还是提交到 GitHub,静态页面则由 OSS 和 CDN 提供访问。

总结

这次迁移主要是因为 Coding 不能继续写入了。

原来的发布方式依赖 hexo deploy 推送 Coding,现在改成了:

1
2
3
4
Hexo 生成静态文件
ossutil 上传 OSS
CDN 负责 HTTPS 和加速
GitHub 保存源码

整体折腾下来,最容易踩坑的地方有三个:

  1. www 不能配置多个 CNAME
  2. HTTPS 最好放到 CDN 上处理
  3. OSS 里的目录对象会影响 Hexo 目录访问

以上就是我把博客从 Coding 迁移到阿里云 OSS 的过程,如有错误,欢迎大佬指出。

-------------本文结束感谢您的阅读-------------