Skip to content
Go back

使用 qshell 将静态站点部署到七牛云

Updated:

这篇笔记记录如何将本地生成的静态站点上传到七牛云对象存储,并通过 CDN 和自定义域名访问。内容从旧站迁移而来,命令已按当前 Astro 项目和新版 qshell 调整。

Table of contents

Open Table of contents

准备七牛云账号和 Bucket

如果是新用户,先在七牛云门户注册账号并完成实名认证,然后进入对象存储空间管理创建一个 Bucket。

创建时需要确认:

本文统一用 <BUCKET_NAME> 表示实际的 Bucket 名称,避免把个人配置写死在文章中。

安装并配置 qshell

从七牛官方的 Qshell 文档下载适合当前操作系统的版本。macOS 或 Linux 下载后,可能需要增加执行权限:

chmod +x qshell

确认工具可以运行:

qshell -v

上传操作需要 AccessKey 和 SecretKey。可以在七牛云密钥管理中查看,然后执行:

qshell account <ACCESS_KEY> <SECRET_KEY> <ACCOUNT_NAME>

ACCOUNT_NAME 是本地保存的账号别名,可以自行设置。

不要提交密钥

不要把真实的 AccessKey、SecretKey 写进 Markdown、脚本、Git 仓库或截图。若密钥已经泄露,应立即在控制台轮换。

可以使用下面的命令查看或切换 qshell 保存的账号:

qshell user ls
qshell user cu <ACCOUNT_NAME>

构建 Astro 静态站点

进入当前 portfolio 项目:

cd /Users/selfknow/blog/portfolio

执行正式构建:

pnpm build

构建成功后,待上传的静态文件位于:

dist/

上传前可以先用本地预览检查页面:

pnpm preview

重点确认文章页面、图片、数学公式、搜索和静态资源都能正常访问。

上传 dist 目录

七牛当前优先推荐使用 qupload2 批量上传目录,不必再单独维护旧版 upload.conf

qshell qupload2 \
  --src-dir=./dist \
  --bucket=<BUCKET_NAME>

需要查看当前版本支持的完整参数时,直接执行:

qshell qupload2 --doc

再次部署时,qshell 会根据文件状态处理上传。需要严格删除 Bucket 中已经不再存在于本地的旧文件时,应先确认删除范围,再单独处理远端对象;不要未经检查就执行批量删除。

开启默认首页

进入七牛云控制台的 Bucket 设置,开启默认首页功能。这样访问目录路径时,服务才能正确返回相应的 index.html

完成上传后,可以先通过七牛提供的测试域名检查:

测试域名适合验证,不适合作为长期公开地址。

配置 CDN 和自定义域名

在七牛云控制台为 Bucket 添加 CDN 加速域名,并按照控制台给出的目标配置 DNS CNAME。

基本流程如下:

  1. 准备一个可用的自定义域名。
  2. 在七牛云中将该域名绑定到对应 Bucket。
  3. 到域名的 DNS 服务商处添加七牛提供的 CNAME 记录。
  4. 等待 DNS 和 CDN 配置生效。
  5. 使用自定义域名检查站点。

如果域名用于中国大陆节点,通常还需要满足 ICP 备案等要求,具体以域名、区域和七牛控制台提示为准。

配置 HTTPS

可以在七牛云的证书管理中购买或上传证书,再为 CDN 域名启用 HTTPS。

上传自有证书时,按照控制台要求准备证书链和私钥。开启 HTTPS 后,检查:

curl -I https://<YOUR_DOMAIN>/

还要在浏览器中确认没有 HTTP 图片、脚本或字体造成的混合内容问题。

部署后的检查

每次上传完成后,至少验证:

如果页面仍显示旧内容,可以在七牛 CDN 控制台执行缓存刷新,再重新检查。

当前项目的最短部署路径

在账号、Bucket、域名和 HTTPS 都已配置完成后,日常发布主要是两步:

pnpm build

qshell qupload2 \
  --src-dir=./dist \
  --bucket=<BUCKET_NAME>

对象存储只负责托管构建产物。文章源文件、站点配置和密钥仍应分别管理:Markdown 与代码进入 Git,dist/ 由构建产生,AK/SK 不进入仓库。

参考资料


Share this post:

Previous Post
阿里云 OSS 与 CDN:证书更新和缓存刷新
Next Post
给决定留一点缓冲时间