hexo迁移部署到阿里云
之前博客一直是通过 Coding 来部署的,最近发现 Coding 已经不能继续写入了,所以把 Hexo 静态博客迁移到了阿里云 OSS 和 CDN,这里记录一下整个过程
我的博客是 Hexo 生成的静态页面,之前的发布方式大概是:
1 | hexo clean |
hexo deploy 会把生成后的 public 目录推送到 GitHub Pages 和 Coding。
后来发布的时候发现 Coding 返回了下面的提示:
1 | CODING DevOps 标准版产品已于 2025 年 9 月 1 日下线,无法进行写操作 |
所以这次就顺手把博客迁移到阿里云 OSS 上。
为什么换到OSS
博客本身是纯静态资源,生成出来以后就是一堆 html、css、js、图片文件。
这种场景放到 OSS 很合适:
- 不需要服务器
- 不需要 node 常驻运行
- 上传
public目录就可以访问 - 可以绑定自己的域名
- 可以配合 CDN 开启 HTTPS
我本来就有阿里云账号,也有 OSS,所以迁移成本不算高。
创建Bucket
我没有直接复用之前放图片的 Bucket,而是重新创建了一个专门放博客页面的 Bucket:
1 | cs-blog-web |
地域选择的是:
1 | 华东1(杭州) |
这样做主要是为了把图片资源和博客页面分开。
尤其后面上传网站的时候会用同步命令,如果和图片放在一起,使用 --delete 时很容易误删图片。
静态页面
创建 Bucket 后,需要开启静态网站托管。
在 OSS Bucket 中找到:
1 | 静态页面 |
配置:
1 | 默认首页:index.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 | www.chensheng.group |
也就是说,域名最终不要直接只绑 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 | OSS 证书:不是关键 |
CDN 开启 HTTPS 后,再访问:
1 | https://www.chensheng.group/ |
就可以正常打开了。
ossutil
本地上传使用的是阿里云的 ossutil。
安装好后配置 AccessKey:
1 | ossutil config |
需要填写:
1 | endpoint: oss-cn-hangzhou.aliyuncs.com |
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 | { |
现在发布博客只需要执行:
1 | npm run all |
它会自动完成:
- 清理旧文件
- 生成静态页面
- 上传到 OSS
- 清理 OSS 目录对象
- 提交源码
- 推送到 GitHub
最终结构
最终整个博客访问链路是:
1 | Hexo public |
源码还是提交到 GitHub,静态页面则由 OSS 和 CDN 提供访问。
总结
这次迁移主要是因为 Coding 不能继续写入了。
原来的发布方式依赖 hexo deploy 推送 Coding,现在改成了:
1 | Hexo 生成静态文件 |
整体折腾下来,最容易踩坑的地方有三个:
www不能配置多个 CNAME- HTTPS 最好放到 CDN 上处理
- OSS 里的目录对象会影响 Hexo 目录访问
以上就是我把博客从 Coding 迁移到阿里云 OSS 的过程,如有错误,欢迎大佬指出。