
🎯 本文记录了一个完整的个人网站上线流程:从腾讯云注册域名、绑定 CloudBase 静态托管、到利用 GitHub Actions + acme.sh 实现 SSL 证书自动续期。适合独立开发者和个人博客站长参考。
📖 目录
一、全局架构概览
┌─────────────┐ push ┌──────────────────┐
│ 本地开发 │ ──────────▶ │ GitHub 仓库 │
└─────────────┘ └────────┬─────────┘
│
┌────────────┼────────────┐
▼ ▼
🔨 部署工作流 🔐 SSL 续期工作流
(deploy.yml) (ssl-auto-renew.yml)
│ │
▼ ▼
☁️ CloudBase 静态托管 📜 ssl/ 目录 (证书文件)
│ │
▼ ▼
🌐 自定义域名 jayhai.cn 👩💻 手动粘贴到腾讯云控制台
技术栈一览:
| 组件 | 技术选型 | 说明 |
|---|---|---|
| 🏗️ 静态站点框架 | Astro | 高性能静态站点生成器 |
| ☁️ 托管平台 | 腾讯云 CloudBase | 静态网站托管 + CDN |
| 🌐 域名服务 | 腾讯云 DNSPod | 域名注册 + DNS 解析 |
| 🔐 SSL 证书 | Let’s Encrypt | 免费、自动化、开放的 CA |
| 🤖 自动化 | GitHub Actions + acme.sh | 定时自动申请/续期证书 |
二、域名注册与 ICP 备案
2.1 🛒 注册域名
-
前置条件:腾讯云账号已完成 ✅ 实名认证
-
创建域名信息模板
- 📍 进入 信息模板页面
- 填写域名所有者信息(个人/企业)
- ⏳ 提交后等待审核,通常 1-3 个工作日
-
搜索并注册域名
- 📍 进入 域名注册页面
- 🔍 搜索你心仪的域名,确认可注册
- 选择已审核通过的信息模板,💰 完成支付
⚠️ 注意:域名属于即时产品,注册成功后 不可退款。
2.2 📋 ICP 备案(必须!)
如果网站面向中国大陆用户,CloudBase 绑定自定义域名 强制要求域名已完成 ICP 备案。
- 📍 备案入口:腾讯云网站备案
- ⏳ 备案周期:约 7-20 个工作日
- 💡 备案最小成本方案:购买 Serverless 云函数资源包(每个账号限购 1 个,可备案 2 个网站)
三、CloudBase 静态托管与域名绑定
3.1 ➕ 添加自定义域名
- 📍 登录 云开发控制台
- 进入你的环境 → 左侧菜单 HTTP 访问服务
- 点击 添加域名,填写配置:
- 域名:
jayhai.cn - 证书关联:选择已有证书或上传新证书
- 协议类型:
Http & Https - 接入方式:
云开发 CDN 接入
- 域名:
- 点击 添加该域名路由
3.2 ✅ 域名所有权验证
CloudBase 会要求验证域名所有权,有三种方式(推荐第一种 👇):
| 方式 | 操作 | 推荐度 |
|---|---|---|
| 🥇 CNAME 记录 | 将域名 CNAME 到 xxx.cdn.dnsv1.com | ⭐⭐⭐ |
| 🥈 TXT 记录 | 域名 TXT 记录设为 CloudBase 环境 ID | ⭐⭐ |
| 🥉 子域名 TXT | _cloudbase-challenge.域名 TXT 设为环境 ID | ⭐ |
3.3 🔧 配置 DNS 解析
- 📍 进入 域名服务控制台
- 找到你的域名 → 点击 解析
- 添加 CNAME 记录:
| 主机记录 | 记录类型 | 记录值 | 说明 |
|---|---|---|---|
@ | CNAME | xxx.cdn.dnsv1.com | 根域名 |
www | CNAME | xxx.cdn.dnsv1.com | www 子域名 |
📌 注意:CNAME 记录不能与 A 记录共存,如有冲突需先删除 A 记录。
- ⏳ DNS 解析通常 5-30 分钟 生效,可用命令验证:
nslookup jayhai.cn
四、SSL 证书自动续期方案
4.1 🧠 方案思路
痛点:腾讯云免费 SSL 证书有效期 1 年,每次手动申请很繁琐。
解决方案:利用 GitHub Actions 定时触发 acme.sh,通过腾讯云 DNSPod API 自动完成 DNS 验证,从 Let’s Encrypt 获取免费证书(有效期 90 天),自动续期并提交到仓库。
⏰ 定时触发 (每天凌晨2点)
│
▼
🔧 安装 acme.sh
│
▼
🔑 配置腾讯云 API 密钥
│
▼
📡 DNS-01 验证 (自动添加/删除 TXT 记录)
│
▼
📜 获取证书 → 保存到 ssl/ 目录
│
▼
📤 git commit & push 回仓库
4.2 🔑 准备腾讯云 API 密钥(最小权限原则)
🛡️ 安全第一!只给 DNS 解析相关的最小权限。
第一步:创建权限策略
📍 登录 腾讯云访问管理控制台 → 新建自定义策略 → 按策略语法创建 → 空白模板
{
"statement": [
{
"action": [
"dnspod:DescribeRecordFilterList",
"dnspod:DescribeRecordList",
"dnspod:CreateRecord",
"dnspod:DeleteRecord"
],
"effect": "allow",
"resource": ["*"]
}
],
"version": "2.0"
}
第二步:创建子账号
📍 进入 用户列表 → 新建用户 → 快速创建
- ✅ 勾选 编程访问
- ✅ 只关联刚创建的 DNS 策略
- 🔐 务必保存
SecretId和SecretKey(仅显示一次!)
4.3 🔒 配置 GitHub Secrets
📍 GitHub 仓库 → Settings → Secrets and variables → Actions → New repository secret
| Secret Name | 值 |
|---|---|
TCB_SECRET_ID | 腾讯云子账号的 SecretId |
TCB_SECRET_KEY | 腾讯云子账号的 SecretKey |
4.4 📝 GitHub Actions 工作流
创建文件 .github/workflows/ssl-auto-renew.yml:
name: Auto Renew SSL Certificate
on:
# ⏰ 定时触发:每天 UTC 18:00 (北京时间凌晨 2:00)
schedule:
- cron: '0 18 * * *'
# 🖱️ 手动触发
workflow_dispatch:
permissions:
contents: write
jobs:
renew-ssl:
runs-on: ubuntu-latest
steps:
# 1️⃣ 检出代码
- name: Checkout repository
uses: actions/checkout@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
# 2️⃣ 安装 acme.sh
- name: Install acme.sh
run: |
curl https://get.acme.sh | sh -s email=your-email@example.com
echo "$HOME/.acme.sh" >> $GITHUB_PATH
# 3️⃣ 设置腾讯云 API 环境变量
- name: Set Tencent Cloud Secrets
run: |
echo "Tencent_SecretId=${{ secrets.TCB_SECRET_ID }}" >> $GITHUB_ENV
echo "Tencent_SecretKey=${{ secrets.TCB_SECRET_KEY }}" >> $GITHUB_ENV
# 4️⃣ 申请或续期证书
- name: Issue or Renew Certificate
run: |
~/.acme.sh/acme.sh --issue --dns dns_tencent \
-d jayhai.cn \
-d '*.jayhai.cn' \
--dnssleep 120 \
--server letsencrypt \
--debug
# 5️⃣ 安装证书到仓库目录
- name: Install Certificate to Repository
run: |
mkdir -p ./ssl
~/.acme.sh/acme.sh --install-cert -d jayhai.cn \
--key-file ./ssl/private.key \
--fullchain-file ./ssl/certificate.crt
# 6️⃣ 提交并推送
- name: Commit and Push Certificates
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add ./ssl/
git diff --quiet && git diff --staged --quiet || \
git commit -m "chore: auto-renew SSL certificates"
git push
4.5 ⚠️ 关键参数说明
| 参数 | 说明 | 为什么需要 |
|---|---|---|
--server letsencrypt | 指定 Let’s Encrypt 为 CA | acme.sh v3 默认用 ZeroSSL,其 DNS 验证容易超时卡住 🐛 |
--dnssleep 120 | DNS 记录等待 120 秒 | 给腾讯云 DNSPod TXT 记录足够的传播时间 ⏳ |
--dns dns_tencent | 使用腾讯云 DNS API 插件 | 自动添加/删除验证用的 TXT 记录 🤖 |
--debug | 开启调试日志 | 出问题时方便排查 🔍 |
🐛 踩坑经验:不加
--server letsencrypt时,acme.sh 默认使用 ZeroSSL,DNS-01 验证会卡在processing状态,最终返回retry-after: 86400(24小时),导致 acme.sh 报错退出:The retryafter=86400 value is too large (> 600), will not retry anymore.切换到 Let’s Encrypt 后一次成功 ✅
五、手动更新 CloudBase 证书
🔔 目前 CloudBase CLI 不支持通过命令行上传自定义 SSL 证书,需要手动操作。
5.1 📥 获取证书内容
GitHub Actions 续期成功后,仓库 ssl/ 目录会更新两个文件:
| 文件 | 用途 |
|---|---|
ssl/certificate.crt | 📜 证书内容(fullchain) |
ssl/private.key | 🔑 私钥内容 |
在 GitHub 仓库页面打开这两个文件,分别复制全部内容。
5.2 🔄 在腾讯云控制台更新
- 📍 登录 腾讯云 SSL 证书控制台
- 找到当前绑定的证书 → 点击 更新
- 选择:
- 更新方式:
上传证书✅ - 证书标准:
国际标准✅
- 更新方式:
- 粘贴内容:
- 签名证书:粘贴
certificate.crt的内容 - 签名私钥:粘贴
private.key的内容
- 签名证书:粘贴
- 点击 🔘 提交更新
💡 提交后会自动替换部署在下列云资源上的旧证书,无需额外操作。
5.3 📅 更新频率
Let’s Encrypt 证书有效期 90 天,acme.sh 默认在证书到期前 30 天 自动续期。
实际上你只需要关注:
- 📬 当仓库出现
chore: auto-renew SSL certificates的新提交时 - 🕐 大约每 60 天 去控制台粘贴一次新证书
- 整个操作不超过 2 分钟 ⚡
六、踩坑记录与经验总结
🐛 踩坑 1:ZeroSSL DNS 验证超时
现象:acme.sh 默认使用 ZeroSSL 作为 CA,DNS-01 验证一直卡在 processing,轮询 8 次后服务器返回 retry-after: 86400,acme.sh 放弃。
原因:ZeroSSL 的 DNS 验证服务不稳定,尤其对中国域名。
解决:添加 --server letsencrypt 切换 CA ✅
🐛 踩坑 2:DNS 记录传播太慢
现象:60 秒等待后 CA 仍然查不到 TXT 记录。
解决:将 --dnssleep 从 60 增加到 120 秒 ✅
📌 经验总结
| 💡 经验 | 说明 |
|---|---|
| CA 选 Let’s Encrypt | 比 ZeroSSL 更稳定,社区支持更好 |
| DNS 等待时间给足 | 120 秒比较稳妥,避免验证失败 |
| 最小权限原则 | 子账号只给 DNS 解析的 4 个 API 权限 |
| 证书存仓库 | 方便追踪更新历史,配合 git log 一目了然 |
| 开启 debug | 首次运行务必带 --debug,出问题能快速定位 |
🎉 最终效果
✅ 域名注册 + ICP 备案完成
✅ CloudBase 静态托管 + 自定义域名绑定
✅ GitHub Actions 每天自动检查证书
✅ 证书到期前 30 天自动续期
✅ 新证书自动提交到仓库 ssl/ 目录
✅ 每 60 天花 2 分钟手动粘贴到腾讯云控制台
✅ 是的,我的个人网站已经上线啦😆;欢迎访问JayHai的小站
🤔 未来优化方向:等腾讯云 CloudBase 开放证书更新 API 后,可以在 GitHub Actions 中直接调用 API 自动更新,实现 100% 全自动化 🚀