本文基于已经搭建好的 hexo 博客,不再讲解 hexo 博客的搭建。

2026-08 更新:原 Serverless Framework(scf deploy / tencent-website 组件)方案已废弃下线,以下为最新的 COS 静态网站托管方案。

🚀 方案概述

  • 托管:腾讯云 COS 对象存储静态网站托管(无服务器,按量付费)
  • 上传:coscmd 命令行工具,一条命令同步整个站点
  • 域名:自定义域名 + 免费 DV 证书
  • 备案:域名未备案时,存储桶必须使用海外地域(如新加坡 ap-singapore);已备案域名可用国内地域(如广州)并配 CDN 加速

🚀 部署步骤

✈ 1. 存储桶准备

对象存储控制台 → 创建存储桶(或使用已有桶):

配置项
名称 全小写,如 cokode-blog-1304070044(全局唯一,自动追加 APPID)
地域 未备案:新加坡 ap-singapore;已备案:广州 ap-guangzhou
访问权限 公有读私有写

✈ 2. 开启静态网站托管

存储桶 → 基础配置 → 静态网站 → 开启,索引文档填 index.html

✈ 3. 绑定自定义域名

存储桶 → 域名管理 → 自定义源站域名 → 绑定你的域名,类型选「静态网站

✈ 4. HTTPS 证书

SSL 证书控制台 → 申请免费 DV 证书(一般一天内签发)→ 在存储桶域名管理中配置 HTTPS

✈ 5. DNS 解析

在域名注册商处把 NS 改为 DNSPod(f1g1ns1.dnspod.net / f1g1ns2.dnspod.net),然后在 DNSPod 添加 CNAME 记录:

⚠️ 关键:CNAME 必须指向「静态网站域名」,不是默认域名!
指向默认 cos.地域.myqcloud.com 域名时,访问根路径 / 会返回 403 AccessDenied(根路径需要 ListBucket 权限,而公有读只开放 GetObject)。

主机记录 记录类型 记录值
@ CNAME 桶名.cos-website.地域.myqcloud.com(如 cokode-blog-1304070044.cos-website.ap-singapore.myqcloud.com

✈ 6. 本地安装并配置 coscmd

1
2
pip install coscmd
coscmd config -a 你的SecretId -s 你的SecretKey -b 桶名 -r 地域

SecretId / SecretKey 在 API 密钥管理 获取。

✈ 7. 修改 hexo 配置

_config.yml 中把 url 改为你的域名:

1
url: https://你的域名

package.json 的 scripts 中添加部署脚本:

1
"deploy:cos": "hexo clean && hexo generate && coscmd upload -r -s --delete -y ./public/ /"

✈ 8. 一键部署

1
npm run deploy:cos

上传完成后访问 https://你的域名 验证,DNS 生效一般几分钟到几小时。

🚀 常用命令

命令 说明
npm run deploy:cos 重新生成并同步上传(日常更新用这个)
coscmd upload -r -s --delete -y ./public/ / 只上传、不重新生成
coscmd upload -r ./public/ / 强制全量重传(不用 -s
coscmd upload 文件 目标路径 上传单个文件
coscmd list 查看桶内文件

🚀 踩坑记录

  1. coscmd 没有 sync 命令:用 upload -r -s --delete -y 实现增量同步(跳过相同文件、删除远端多余文件)
  2. hexo c 不会执行 cleanccleanconfig 的歧义缩写,hexo 直接显示帮助信息,什么都不做;用 hexo clean
  3. CNAME 指向默认域名导致 403:必须指向 cos-website 静态网站域名(见步骤 5)
  4. 未备案域名不能用国内地域桶绑自定义域名:国内地域绑定自定义域名必须 ICP 备案,海外地域免备案

🚀 参考资料