
Byted Volc Cdn Manage
- 7 installs
- 411 repo stars
- Updated August 4, 2026
- bytedance/agentkit-samples
byted-volc-cdn-manage is a Claude skill that manages Volcengine CDN acceleration domains through the Volcengine CLI, including adding domains and running cache refresh/preload tasks.
About
This skill manages Volcengine CDN acceleration domains through the Volcengine CLI. It adds domains with recommended configurations for web, download, and video business types, and it submits refresh tasks to clear cached content and preload tasks to warm content onto CDN nodes. It first checks for and installs the CLI when needed. A developer uses it to onboard and operate CDN domains on Volcengine.
- Manages Volcengine CDN domains via the ve CLI
- Adds domains with recommended web/download/video configs
- Submits cache refresh and preload tasks
Byted Volc Cdn Manage by the numbers
- 7 all-time installs (skills.sh)
- Ranked #865 of 1,039 Cloud & Infrastructure skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
byted-volc-cdn-manage capabilities & compatibility
Requires a Volcengine account with configured AK/SK and Region.
- Use cases
- devops
- Runs
- Runs locally
- Pricing
- Bring your own API key
What byted-volc-cdn-manage says it does
description: 通过火山引擎 CLI 管理 CDN 域名。支持新增域名和刷新预热, 使用时会先检查并安装 CLI(如需要)。
compatibility: Requires Volcengine CLI >= 1.0.39, access to Volcengine API
npx skills add https://github.com/bytedance/agentkit-samples --skill byted-volc-cdn-manageAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 7 |
|---|---|
| repo stars | ★ 411 |
| Last updated | August 4, 2026 |
| Repository | bytedance/agentkit-samples ↗ |
What it does
Add Volcengine CDN domains and run cache refresh or preload tasks via the Volcengine CLI.
Who is it for?
Onboarding CDN domains and running refresh/preload on Volcengine CDN.
When should I use this skill?
Use when adding a Volcengine CDN domain or submitting a cache refresh or preload task.
By the numbers
- Volcengine CLI >= 1.0.39 required
- 3 business types web/download/video
- 9 usage-scenario examples in references
Files
火山引擎 CLI CDN 管理助手
本 Skill 帮助您通过火山引擎 CLI 管理 CDN 加速域名,包括新增域名、刷新和预热。
---
📋 功能说明
本 Skill 提供以下功能:
1. 新增域名
- 交互式配置
- 支持多种业务类型(web/download/video)
- 自动应用推荐配置
- 支持中国内地和全球加速
2. 刷新预热
- 刷新任务:清除 CDN 节点上的缓存内容(支持文件刷新和目录刷新)
- 预热任务:主动将源站内容预热到 CDN 节点
---
📋 智能流程(新增域名)
本 Skill 会自动执行以下流程:
第一阶段:环境检查 1. 检查 CLI 是否已安装 2. 如果未安装:引导您安装并配置火山引擎 CLI 3. 如果已安装:检查 CLI 版本(需 >= 1.0.39)
第二阶段:需求收集 1. 检查必填项:加速域名、区域、源站信息、业务类型 2. 使用默认值:
- 区域默认:
chinese_mainland(中国内地) - 项目默认:
default
3. 推荐配置:根据业务类型自动应用推荐配置规则:
- web(网页加速):缓存规则、智能压缩、页面优化
- download(下载加速):缓存规则、分片回源、缓存键、302跟随
- video(视频点播):缓存规则、分片回源、缓存键、302跟随、视频拖拽
4. 询问用户:必填项找不到默认值时,引导用户输入
第三阶段:添加域名 1. 收集完整信息后,执行 ve cdn AddCdnDomain 命令 2. 展示执行结果和后续步骤
---
📋 刷新预热流程
提交预热任务: 1. 选择预热操作 2. 输入要预热的 URL 列表 3. 确认并提交任务
提交刷新任务: 1. 选择刷新操作 2. 选择刷新类型(文件/目录) 3. 输入要刷新的 URL 列表 4. 确认并提交任务
---
🚀 快速开始
前置条件
1. 火山引擎 CLI 版本 >= 1.0.39(此版本及以上才支持 CDN 服务) 2. 已配置好 AK/SK 和 Region
验证环境
# 检查 CLI 版本
ve version
# 查看当前配置
ve configure list添加域名
方式一:使用交互式脚本(推荐)
bash scripts/add-cdn-domain.sh方式二:使用快速脚本(命令行参数)
# 格式: bash scripts/add-domain-quick.sh <域名> <源站> [源站2] [源站3] [权重1] [权重2] [权重3] [业务类型] [服务区域]
# 业务类型: web / download / video
# 服务区域: chinese_mainland (默认) / global
# 示例:添加网页加速域名(中国内地)
bash scripts/add-domain-quick.sh www.example.com 1.1.1.1 "" "" 100 "" "" web chinese_mainland
# 示例:添加网页加速域名(全球)
bash scripts/add-domain-quick.sh www.example.com 1.1.1.1 "" "" 100 "" "" web global
# 示例:添加视频点播域名
bash scripts/add-domain-quick.sh video.example.com 1.1.1.1 "" "" 100 "" "" video方式三:直接使用命令(基础版)
BODY='{
"Domain": "www.example.com",
"Origin": [
{
"OriginAction": {
"OriginLines": [
{
"Address": "1.1.1.1",
"InstanceType": "ip",
"OriginType": "primary"
}
]
}
}
],
"Project": "default",
"ServiceRegion": "chinese_mainland",
"ServiceType": "download"
}'
ve cdn AddCdnDomain --body "$BODY"方式四:使用推荐配置命令(推荐版)
网页加速示例:
BODY='{
"Domain": "www.example.com",
"Origin": [
{
"OriginAction": {
"OriginLines": [
{
"Address": "1.1.1.1",
"InstanceType": "ip",
"OriginType": "primary"
}
]
}
}
],
"Project": "default",
"ServiceRegion": "chinese_mainland",
"ServiceType": "web",
"Cache": [
{
"CacheAction": {
"Action": "cache",
"IgnoreCase": false,
"Ttl": 0,
"DefaultPolicy": "no_cache"
},
"Condition": {
"ConditionRule": [
{
"Object": "filetype",
"Operator": "match",
"Type": "url",
"Value": "php;jsp;asp;aspx"
}
]
}
},
{
"CacheAction": {
"Action": "cache",
"IgnoreCase": false,
"Ttl": 2592000,
"DefaultPolicy": "default"
},
"Condition": {
"ConditionRule": [
{
"Object": "path",
"Operator": "match",
"Type": "url",
"Value": "/*"
}
]
}
}
],
"Compression": {
"Switch": true,
"CompressionRules": [
{
"CompressionAction": {
"CompressionType": ["gzip"],
"CompressionFormat": "default",
"CompressionTarget": "*",
"MinFileSizeKB": 0
}
}
]
},
"PageOptimization": {
"PageOptimizationAction": "on"
}
}'
ve cdn AddCdnDomain --body "$BODY"更多业务类型的推荐配置请参考 参数说明。
---
📚 详细文档
| 文档 | 说明 |
|---|---|
| 参数说明 | 完整的 API 参数说明 |
| 使用场景示例 | 9 个常见使用场景示例 |
| 常见问题 | FAQ 常见问题解答 |
| CLI 安装指南 | 火山引擎 CLI 安装和配置指南 |
---
✅ 成功响应示例
{
"ResponseMetadata": {
"Action": "AddCdnDomain",
"Region": "cn-guangzhou",
"RequestId": "20260415170258108D89026C070556E439",
"Service": "cdn",
"Version": "2021-03-01"
},
"Result": {
"ResourceIds": [
"www.example.com"
]
}
}---
🔄 刷新和预热
提交预热任务
方式一:使用交互式脚本(推荐)
bash scripts/cdn-refresh-preload.sh
# 选择 1. 提交预热任务方式二:使用快速脚本
# 格式: bash scripts/submit-preload.sh <url1> <url2> ...
# 示例:预热多个URL
bash scripts/submit-preload.sh https://www.example.com/1.jpg https://www.example.com/2.jpg方式三:直接使用命令
BODY='{
"UrlList": [
"https://www.example.com/1.jpg",
"https://www.example.com/2.jpg"
]
}'
ve cdn SubmitPreloadTask --body "$BODY"提交刷新任务
方式一:使用交互式脚本(推荐)
bash scripts/cdn-refresh-preload.sh
# 选择 2. 提交刷新任务方式二:使用快速脚本
# 格式: bash scripts/submit-refresh.sh [--type <file|directory>] <url1> <url2> ...
# 示例:刷新文件(默认)
bash scripts/submit-refresh.sh https://www.example.com/1.jpg https://www.example.com/2.jpg
# 示例:刷新目录
bash scripts/submit-refresh.sh --type directory https://www.example.com/path/方式三:直接使用命令
刷新文件:
BODY='{
"Type": "file",
"UrlList": [
"https://www.example.com/1.jpg",
"https://www.example.com/2.jpg"
]
}'
ve cdn SubmitRefreshTask --body "$BODY"刷新目录:
BODY='{
"Type": "directory",
"UrlList": [
"https://www.example.com/path/"
]
}'
ve cdn SubmitRefreshTask --body "$BODY"---
📝 添加域名后的步骤
1. 等待生效:创建成功后,域名状态会从「配置中」变为「正常运行」(通常需要 1-5 分钟)
2. 获取 CNAME:
# 可以通过控制台查看,或使用 CLI 查询
ve cdn DescribeCdnConfig --Domain "www.example.com"3. 配置 DNS:在您的 DNS 服务商处将域名解析指向 CNAME
4. 验证访问:等待 DNS 生效后,测试访问
---
🔗 相关文档
#!/bin/bash
# 示例 1: 下载加速 + IP 源站
# 运行方式: bash example-1-ip-source.sh
echo "示例 1: 下载加速 + IP 源站"
echo ""
BODY='{
"Domain": "download.example.com",
"Origin": [
{
"OriginAction": {
"OriginLines": [
{
"Address": "203.0.113.10",
"InstanceType": "ip",
"OriginType": "primary"
}
]
}
}
],
"Project": "default",
"ServiceRegion": "chinese_mainland",
"ServiceType": "download"
}'
echo "请求 Body:"
echo "$BODY"
echo ""
echo "执行命令:"
echo "ve cdn AddCdnDomain --body \"\$BODY\""
echo ""
echo "注意: 请将域名和源站地址替换为您实际的地址后再运行"
使用场景示例
本文档提供火山引擎 CDN 域名创建的常见使用场景示例。
---
场景 1:下载加速 + IP 源站
BODY='{
"Domain": "download.example.com",
"Origin": [
{
"OriginAction": {
"OriginLines": [
{
"Address": "203.0.113.10",
"InstanceType": "ip",
"OriginType": "primary"
}
]
}
}
],
"Project": "default",
"ServiceRegion": "chinese_mainland",
"ServiceType": "download"
}'
ve cdn AddCdnDomain --body "$BODY"---
场景 2:网页加速 + 域名源站
BODY='{
"Domain": "www.example.com",
"Origin": [
{
"OriginAction": {
"OriginLines": [
{
"Address": "origin.example.com",
"InstanceType": "domain",
"OriginType": "primary"
}
]
}
}
],
"Project": "default",
"ServiceRegion": "chinese_mainland",
"ServiceType": "web"
}'
ve cdn AddCdnDomain --body "$BODY"---
场景 3:全球加速
BODY='{
"Domain": "global.example.com",
"Origin": [
{
"OriginAction": {
"OriginLines": [
{
"Address": "1.1.1.1",
"InstanceType": "ip",
"OriginType": "primary"
}
]
}
}
],
"Project": "default",
"ServiceRegion": "global",
"ServiceType": "web"
}'
ve cdn AddCdnDomain --body "$BODY"---
场景 4:自定义回源端口
BODY='{
"Domain": "custom-port.example.com",
"Origin": [
{
"OriginAction": {
"OriginLines": [
{
"Address": "origin.example.com",
"InstanceType": "domain",
"OriginType": "primary",
"HttpPort": "8080",
"HttpsPort": "8443"
}
]
}
}
],
"Project": "default",
"ServiceRegion": "chinese_mainland",
"ServiceType": "web"
}'
ve cdn AddCdnDomain --body "$BODY"---
场景 5:HTTPS 回源
BODY='{
"Domain": "https-origin.example.com",
"OriginProtocol": "https",
"Origin": [
{
"OriginAction": {
"OriginLines": [
{
"Address": "origin.example.com",
"InstanceType": "domain",
"OriginType": "primary"
}
]
}
}
],
"Project": "default",
"ServiceRegion": "chinese_mainland",
"ServiceType": "web"
}'
ve cdn AddCdnDomain --body "$BODY"---
场景 6:自定义回源 Host
BODY='{
"Domain": "custom-host.example.com",
"OriginHost": "img.example.com",
"Origin": [
{
"OriginAction": {
"OriginLines": [
{
"Address": "origin.example.com",
"InstanceType": "domain",
"OriginType": "primary"
}
]
}
}
],
"Project": "default",
"ServiceRegion": "chinese_mainland",
"ServiceType": "web"
}'
ve cdn AddCdnDomain --body "$BODY"---
场景 7:多源站(主备源站)
BODY='{
"Domain": "multi-origin.example.com",
"Origin": [
{
"OriginAction": {
"OriginLines": [
{
"Address": "primary.example.com",
"InstanceType": "domain",
"OriginType": "primary",
"Weight": "100"
},
{
"Address": "backup.example.com",
"InstanceType": "domain",
"OriginType": "backup",
"Weight": "100"
}
]
}
}
],
"Project": "default",
"ServiceRegion": "chinese_mainland",
"ServiceType": "web"
}'
ve cdn AddCdnDomain --body "$BODY"---
场景 8:对象存储源站(TOS)
BODY='{
"Domain": "tos-origin.example.com",
"Origin": [
{
"OriginAction": {
"OriginLines": [
{
"Address": "my-bucket.tos-cn-guangzhou.volces.com",
"InstanceType": "tos",
"OriginType": "primary"
}
]
}
}
],
"Project": "default",
"ServiceRegion": "chinese_mainland",
"ServiceType": "download"
}'
ve cdn AddCdnDomain --body "$BODY"---
场景 9:私有对象存储源站(带鉴权)
BODY='{
"Domain": "private-tos.example.com",
"Origin": [
{
"OriginAction": {
"OriginLines": [
{
"Address": "my-private-bucket.tos-cn-guangzhou.volces.com",
"InstanceType": "tos",
"OriginType": "primary",
"PrivateBucketAccess": true,
"PrivateBucketAuth": {
"Switch": true,
"TosAuthInformation": {
"AccessKeyId": "your-access-key-id",
"AccessKeySecret": "your-access-key-secret"
},
"AuthType": "tos"
}
}
]
}
}
],
"Project": "default",
"ServiceRegion": "chinese_mainland",
"ServiceType": "download"
}'
ve cdn AddCdnDomain --body "$BODY"---
场景 10:视频点播 + 推荐配置
BODY='{
"Domain": "video.example.com",
"Origin": [
{
"OriginAction": {
"OriginLines": [
{
"Address": "1.1.1.1",
"InstanceType": "ip",
"OriginType": "primary"
}
]
}
}
],
"Project": "default",
"ServiceRegion": "chinese_mainland",
"ServiceType": "video",
"Cache": [
{
"CacheAction": {
"Action": "cache",
"IgnoreCase": false,
"Ttl": 2592000,
"DefaultPolicy": "default"
},
"Condition": {
"ConditionRule": [
{
"Object": "path",
"Operator": "match",
"Type": "url",
"Value": "/*"
}
]
}
},
{
"CacheAction": {
"Action": "cache",
"IgnoreCase": false,
"Ttl": 0,
"DefaultPolicy": "no_cache"
},
"Condition": {
"ConditionRule": [
{
"Object": "filetype",
"Operator": "match",
"Type": "url",
"Value": "php;jsp;asp;aspx"
}
]
}
}
],
"Range": {
"Switch": true,
"RangeSize": 1,
"Unit": "MB"
},
"MultiRange": {
"Switch": true
},
"CacheKey": [
{
"CacheKeyAction": {
"CacheKeyComponents": [
{
"Action": "exclude",
"IgnoreCase": false,
"Object": "queryString",
"Subobject": "*"
}
]
},
"Condition": {
"ConditionRule": [
{
"Object": "path",
"Operator": "match",
"Type": "url",
"Value": "/*"
}
]
}
},
{
"CacheKeyAction": {
"CacheKeyComponents": [
{
"Action": "include",
"IgnoreCase": true,
"Object": "queryString",
"Subobject": "*"
}
]
},
"Condition": {
"ConditionRule": [
{
"Name": "",
"Object": "directory",
"Operator": "match",
"Type": "url",
"Value": "/"
}
]
}
}
],
"FollowRedirect": true,
"VideoDrag": {
"Switch": true
}
}'
ve cdn AddCdnDomain --body "$BODY"---
场景 11:网页加速 + 推荐配置
BODY='{
"Domain": "www.example.com",
"Origin": [
{
"OriginAction": {
"OriginLines": [
{
"Address": "origin.example.com",
"InstanceType": "domain",
"OriginType": "primary"
}
]
}
}
],
"Project": "default",
"ServiceRegion": "chinese_mainland",
"ServiceType": "web",
"Cache": [
{
"CacheAction": {
"Action": "cache",
"IgnoreCase": false,
"Ttl": 2592000,
"DefaultPolicy": "default"
},
"Condition": {
"ConditionRule": [
{
"Object": "path",
"Operator": "match",
"Type": "url",
"Value": "/*"
}
]
}
},
{
"CacheAction": {
"Action": "cache",
"IgnoreCase": false,
"Ttl": 0,
"DefaultPolicy": "no_cache"
},
"Condition": {
"ConditionRule": [
{
"Object": "filetype",
"Operator": "match",
"Type": "url",
"Value": "php;jsp;asp;aspx"
}
]
}
}
],
"Compression": {
"Switch": true,
"CompressionRules": [
{
"CompressionAction": {
"CompressionType": ["gzip", "br"],
"CompressionFormat": "default",
"CompressionTarget": "*",
"MinFileSizeKB": 0
}
}
]
},
"PageOptimization": {
"PageOptimizationAction": "on"
}
}'
ve cdn AddCdnDomain --body "$BODY"---
场景 12:下载加速 + 推荐配置
BODY='{
"Domain": "download.example.com",
"Origin": [
{
"OriginAction": {
"OriginLines": [
{
"Address": "203.0.113.10",
"InstanceType": "ip",
"OriginType": "primary"
}
]
}
}
],
"Project": "default",
"ServiceRegion": "chinese_mainland",
"ServiceType": "download",
"Cache": [
{
"CacheAction": {
"Action": "cache",
"IgnoreCase": false,
"Ttl": 2592000,
"DefaultPolicy": "default"
},
"Condition": {
"ConditionRule": [
{
"Object": "path",
"Operator": "match",
"Type": "url",
"Value": "/*"
}
]
}
},
{
"CacheAction": {
"Action": "cache",
"IgnoreCase": false,
"Ttl": 0,
"DefaultPolicy": "no_cache"
},
"Condition": {
"ConditionRule": [
{
"Object": "filetype",
"Operator": "match",
"Type": "url",
"Value": "php;jsp;asp;aspx"
}
]
}
}
],
"Range": {
"Switch": true,
"RangeSize": 1,
"Unit": "MB"
},
"MultiRange": {
"Switch": true
},
"CacheKey": [
{
"CacheKeyAction": {
"CacheKeyComponents": [
{
"Action": "exclude",
"IgnoreCase": false,
"Object": "queryString",
"Subobject": "*"
}
]
},
"Condition": {
"ConditionRule": [
{
"Object": "path",
"Operator": "match",
"Type": "url",
"Value": "/*"
}
]
}
},
{
"CacheKeyAction": {
"CacheKeyComponents": [
{
"Action": "include",
"IgnoreCase": true,
"Object": "queryString",
"Subobject": "*"
}
]
},
"Condition": {
"ConditionRule": [
{
"Name": "",
"Object": "directory",
"Operator": "match",
"Type": "url",
"Value": "/"
}
]
}
}
],
"FollowRedirect": true
}'
ve cdn AddCdnDomain --body "$BODY"常见问题(FAQ)
本文档收集了使用火山引擎 CDN 域名创建时的常见问题和解答。
---
Q1: 提示未找到 've' 命令怎么办?
A: 需要先安装火山引擎 CLI,请参考 [CLI 安装指南进行安装。
---
Q2: 提示 CLI 版本过低怎么办?
A: 需要升级 CLI 到 v1.0.39 或以上版本,请参考 CLI 安装指南重新安装最新版本。
---
Q3: 提示签名错误(SignatureDoesNotMatch)怎么办?
A: 检查 AK/SK 是否配置正确,可以使用以下命令重新配置:
ve configure set --access-key <您的AK> --secret-key <您的SK> --region cn-guangzhou --profile default---
Q4: 如何查看已添加的域名?
A: 可以使用以下命令查看:
ve cdn ListCdnDomains---
Q5: 如何查询域名配置详情?
A: 可以使用以下命令查看:
ve cdn DescribeCdnConfig --Domain "www.example.com"---
Q6: 如何自定义缓存规则?
A: 本脚本已支持智能推荐配置,会根据业务类型自动应用对应的配置规则。如需进一步自定义,可以: 1. 使用交互式脚本创建域名后,登录火山引擎控制台修改 2. 或者使用 UpdateCdnConfig API 进行修改 3. 或者参考 参数说明 中的推荐配置示例进行自定义
推荐配置包含:
- 缓存规则配置
- 智能压缩
- 分片回源
- 视频拖拽
- 缓存键优化等
---
Q7: 可以添加多个源站吗?
A: 可以。交互式脚本已支持添加多个主源站和备源站。您可以按提示逐步添加源站,每个源站可以配置:
- 源站类型(IP/域名)
- 回源协议(http/https/followclient)
- 权重(1-100)
如果需要使用命令行方式,您可以在 OriginLines 数组中添加多个源站配置。
---
Q8: 如何删除已添加的域名?
A: 可以使用以下命令删除:
ve cdn DeleteCdnDomain --Domain "www.example.com"---
Q9: 域名添加成功后,如何获取 CNAME?
A: 可以通过以下方式获取: 1. 登录火山引擎 CDN 控制台查看 2. 使用 CLI 查询:
ve cdn DescribeCdnConfig --Domain "www.example.com"---
Q10: 域名添加后多久生效?
A: 通常需要 1-5 分钟让域名配置生效。状态会从「配置中」变为「正常运行」。
CLI 安装指南
本文档详细介绍如何安装和配置火山引擎 CLI。
---
前置条件
1. 火山引擎账号已开通 CDN 服务 2. 已获取 AccessKey(AK)和 SecretKey(SK)
---
1. 检查系统架构
uname -marm64:Apple Silicon (M1/M2/M3)x86_64:Intel 芯片
---
2. 下载 CLI
Apple Silicon (arm64)
curl -L -s https://github.com/volcengine/volcengine-cli/releases/download/v1.0.39/volcengine-cli_1.0.39_darwin_arm64.zip -o ve.zipIntel (x86_64)
curl -L -s https://github.com/volcengine/volcengine-cli/releases/download/v1.0.39/volcengine-cli_1.0.39_darwin_amd64.zip -o ve.zip---
3. 解压和安装
unzip -q ve.zip
mkdir -p ~/.local/bin
mv ve ~/.local/bin/---
4. 配置环境变量
如果还没有配置环境变量,执行:
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc---
5. 配置访问凭证
ve configure set \
--access-key <您的AK> \
--secret-key <您的SK> \
--region cn-guangzhou \
--profile default常用地域
cn-beijing- 华北2(北京)cn-shanghai- 华东2(上海)cn-guangzhou- 华南1(广州)
---
6. 验证配置
ve version
ve configure list---
7. 升级 CLI(如果需要)
如果 CLI 版本低于 1.0.39,请按以下步骤升级:
Apple Silicon (arm64)
curl -L -s https://github.com/volcengine/volcengine-cli/releases/download/v1.0.39/volcengine-cli_1.0.39_darwin_arm64.zip -o ve.zip
unzip -q -o ve.zip
mv ve ~/.local/bin/Intel (x86_64)
curl -L -s https://github.com/volcengine/volcengine-cli/releases/download/v1.0.39/volcengine-cli_1.0.39_darwin_amd64.zip -o ve.zip
unzip -q -o ve.zip
mv ve ~/.local/bin/---
验证 CLI 版本
ve version确保版本 >= 1.0.39(此版本及以上才支持 CDN 服务)。
参数说明
本文档详细介绍火山引擎 CDN 域名创建的所有参数。
---
基础参数
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|---|---|---|---|
Domain | String | ✅ | 要添加的加速域名 | www.example.com |
ServiceType | String | ✅ | 业务类型:<br>- web(网页)<br>- download(下载)<br>- video(点播) | download |
Origin | Array | ✅ | 源站配置,详见下方 | - |
ServiceRegion | String | - | 加速区域:<br>- chinese_mainland(中国内地,默认)<br>- global(全球)<br>- outside_chinese_mainland(全球不含内地) | chinese_mainland |
Project | String | - | 项目名称,默认 default | default |
OriginProtocol | String | - | 回源请求使用的协议:<br>- http(默认)<br>- https<br>- followclient(与用户请求相同) | http |
OriginHost | String | - | 回源请求访问的站点域名,默认与 Domain 相同。如果源站是对象存储桶,默认值与源站 Address 相同 | img.example.com |
---
源站配置(Origin)
{
"OriginAction": {
"OriginLines": [
{
"Address": "1.1.1.1",
"InstanceType": "ip",
"OriginType": "primary",
"HttpPort": "80",
"HttpsPort": "443",
"Weight": "100"
}
]
}
}OriginAction.OriginLines 参数说明
| 参数 | 类型 | 必填 | 说明 | 可选值 |
|---|---|---|---|---|
Address | String | ✅ | 源站地址,根据 InstanceType 不同有不同说明:<br>- ip:IPv4 或 IPv6 地址<br>- domain:源站域名(不能是泛域名)<br>- tos:对象存储桶域名(阿里云 OSS、腾讯云 COS、AWS S3 等) | 1.1.1.1 |
InstanceType | String | ✅ | 源站类型 | ip、domain、tos |
OriginType | String | ✅ | 源站类别:<br>- primary(主源站,至少需要一个)<br>- backup(备源站,可选) | primary |
HttpPort | String | - | HTTP 回源端口,取值范围 1-65535,默认 80。仅当 InstanceType 为 ip 或 domain 时有效 | 80 |
HttpsPort | String | - | HTTPS 回源端口,取值范围 1-65535,默认 443。仅当 InstanceType 为 ip 或 domain 时有效 | 443 |
Weight | String | - | 源站权重,取值范围 1-100,默认 1。权重越大,被选择概率越大 | 100 |
OriginHost | String | - | 回源站点域名,适用于源站服务器有多个站点的情况。优先级高于全局 OriginHost,默认与全局 OriginHost 相同 | img.example.com |
PrivateBucketAccess | Boolean | - | 存储桶是否是私有桶,仅当 InstanceType 为 tos 时有效,默认 false | false |
PrivateBucketAuth | Object | - | 访问存储桶的凭据,当 PrivateBucketAccess 为 true 时必填 | - |
PrivateBucketAuth 参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
Switch | Boolean | ✅ | 必须为 true |
TosAuthInformation | Object | - | 存储桶访问凭证 |
AuthType | String | - | 鉴权方式:<br>- tos(火山引擎 TOS)<br>- cos(腾讯云 COS)<br>- oss(阿里云 OSS)<br>- aws_common(AWS S3 和 S3 兼容) |
TosAuthInformation 参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
AccessKeyId | String | AccessKey ID(腾讯云称为 SecretId),长度 5-100 字符 |
AccessKeySecret | String | AccessKey Secret(腾讯云称为 SecretKey),长度 5-100 字符 |
Region | String | 当 AuthType 为 aws_common 且 PrivateBucketAccess 为 true 时必填,表示存储桶 region code |
---
推荐配置规则
本项目根据业务类型自动应用推荐配置规则,详细参数说明如下:
点播场景(video)
{
"Cache": [
{
"CacheAction": {
"Action": "cache",
"IgnoreCase": false,
"Ttl": 0,
"DefaultPolicy": "no_cache"
},
"Condition": {
"ConditionRule": [
{
"Object": "filetype",
"Operator": "match",
"Type": "url",
"Value": "php;jsp;asp;aspx"
}
]
}
},
{
"CacheAction": {
"Action": "cache",
"IgnoreCase": false,
"Ttl": 2592000,
"DefaultPolicy": "default"
},
"Condition": {
"ConditionRule": [
{
"Object": "path",
"Operator": "match",
"Type": "url",
"Value": "/*"
}
]
}
}
],
"Range": {
"Switch": true,
"RangeSize": 1,
"Unit": "MB"
},
"MultiRange": {
"Switch": true
},
"CacheKey": [
{
"CacheKeyAction": {
"CacheKeyComponents": [
{
"Action": "exclude",
"IgnoreCase": false,
"Object": "queryString",
"Subobject": "*"
}
]
},
"Condition": {
"ConditionRule": [
{
"Object": "path",
"Operator": "match",
"Type": "url",
"Value": "/*"
}
]
}
},
{
"CacheKeyAction": {
"CacheKeyComponents": [
{
"Action": "include",
"IgnoreCase": true,
"Object": "queryString",
"Subobject": "*"
}
]
},
"Condition": {
"ConditionRule": [
{
"Name": "",
"Object": "directory",
"Operator": "match",
"Type": "url",
"Value": "/"
}
]
}
}
],
"FollowRedirect": true,
"VideoDrag": {
"Switch": true
}
}网页场景(web)
{
"Cache": [
{
"CacheAction": {
"Action": "cache",
"IgnoreCase": false,
"Ttl": 0,
"DefaultPolicy": "no_cache"
},
"Condition": {
"ConditionRule": [
{
"Object": "filetype",
"Operator": "match",
"Type": "url",
"Value": "php;jsp;asp;aspx"
}
]
}
},
{
"CacheAction": {
"Action": "cache",
"IgnoreCase": false,
"Ttl": 2592000,
"DefaultPolicy": "default"
},
"Condition": {
"ConditionRule": [
{
"Object": "path",
"Operator": "match",
"Type": "url",
"Value": "/*"
}
]
}
}
],
"Compression": {
"Switch": true,
"CompressionRules": [
{
"CompressionAction": {
"CompressionType": ["gzip"],
"CompressionFormat": "default",
"CompressionTarget": "*",
"MinFileSizeKB": 0
}
}
]
},
"PageOptimization": {
"PageOptimizationAction": "on"
}
}下载场景(download)
{
"Cache": [
{
"CacheAction": {
"Action": "cache",
"IgnoreCase": false,
"Ttl": 0,
"DefaultPolicy": "no_cache"
},
"Condition": {
"ConditionRule": [
{
"Object": "filetype",
"Operator": "match",
"Type": "url",
"Value": "php;jsp;asp;aspx"
}
]
}
},
{
"CacheAction": {
"Action": "cache",
"IgnoreCase": false,
"Ttl": 2592000,
"DefaultPolicy": "default"
},
"Condition": {
"ConditionRule": [
{
"Object": "path",
"Operator": "match",
"Type": "url",
"Value": "/*"
}
]
}
}
],
"Range": {
"Switch": true,
"RangeSize": 1,
"Unit": "MB"
},
"MultiRange": {
"Switch": true
},
"CacheKey": [
{
"CacheKeyAction": {
"CacheKeyComponents": [
{
"Action": "exclude",
"IgnoreCase": false,
"Object": "queryString",
"Subobject": "*"
}
]
},
"Condition": {
"ConditionRule": [
{
"Object": "path",
"Operator": "match",
"Type": "url",
"Value": "/*"
}
]
}
},
{
"CacheKeyAction": {
"CacheKeyComponents": [
{
"Action": "include",
"IgnoreCase": true,
"Object": "queryString",
"Subobject": "*"
}
]
},
"Condition": {
"ConditionRule": [
{
"Name": "",
"Object": "directory",
"Operator": "match",
"Type": "url",
"Value": "/"
}
]
}
}
],
"FollowRedirect": true
}---
缓存规则(Cache)
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
Cache | Array | - | 缓存规则数组,最多 50 条 |
Cache[].CacheAction | Object | ✅ | 缓存行为配置 |
Cache[].CacheAction.Action | String | ✅ | 固定值 cache |
Cache[].CacheAction.IgnoreCase | Boolean | - | 是否大小写不敏感,默认 false |
Cache[].CacheAction.Ttl | Integer | ✅ | 缓存时长(秒),0-315360000。0 表示不缓存/立即过期 |
Cache[].CacheAction.DefaultPolicy | String | - | 缓存策略:force_cache、default、origin_first、origin_first_Replenish、no_cache,默认 default |
Cache[].Condition | Object | ✅ | 匹配条件 |
Cache[].Condition.ConditionRule | Array | ✅ | 匹配规则数组,最多 1 条 |
Cache[].Condition.ConditionRule[].Object | String | ✅ | 匹配对象:filetype、directory、path、regex |
Cache[].Condition.ConditionRule[].Operator | String | ✅ | 固定值 match |
Cache[].Condition.ConditionRule[].Type | String | ✅ | 固定值 url |
Cache[].Condition.ConditionRule[].Value | String | ✅ | 匹配值,格式随 Object 变化 |
---
分片回源(Range)
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
Range | Object | - | 分片回源配置,优先级高于 OriginRange |
Range.Switch | Boolean | - | 是否启用分片回源,默认 false |
Range.RangeSize | Integer | - | 分片大小:Unit=MB 时 1-40,Unit=KB 时只能填 512,默认 1 |
Range.Unit | String | - | 分片大小单位:KB、MB,默认 MB |
---
多重范围(MultiRange)
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
MultiRange | Object | - | Multi-range 配置 |
MultiRange.Switch | Boolean | - | 是否允许多重 Range 请求,默认 false |
---
缓存键(CacheKey)
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
CacheKey | Array | - | 缓存键规则数组,最多 50 条,最后一条必须是强制默认规则 |
CacheKey[].CacheKeyAction | Object | ✅ | 缓存键行为配置 |
CacheKey[].CacheKeyAction.CacheKeyComponents | Array | ✅ | 缓存键组件数组 |
CacheKey[].CacheKeyAction.CacheKeyComponents[].Action | String | ✅ | 行为类型:include、exclude、includePart、excludePart |
CacheKey[].CacheKeyAction.CacheKeyComponents[].IgnoreCase | Boolean | - | 是否大小写不敏感,默认 false(仅 includePart/excludePart 有效) |
CacheKey[].CacheKeyAction.CacheKeyComponents[].Object | String | ✅ | 固定值 queryString |
CacheKey[].CacheKeyAction.CacheKeyComponents[].Subobject | String | ✅ | include/exclude 时固定为 *,includePart/excludePart 时为参数名,多个用 ; 分隔 |
CacheKey[].Condition | Object | ✅ | 匹配条件(结构同 Cache) |
---
回源重定向跟随(FollowRedirect)
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
FollowRedirect | Boolean | - | 是否跟随回源 3xx 重定向,默认 false |
---
视频拖拽(VideoDrag)
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
VideoDrag | Object | - | 视频拖拽配置 |
VideoDrag.Switch | Boolean | ✅ | 是否启用视频拖拽 |
---
智能压缩(Compression)
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
Compression | Object | - | 智能压缩配置 |
Compression.Switch | Boolean | ✅ | 是否启用智能压缩 |
Compression.CompressionRules | Array | - | 压缩规则数组 |
Compression.CompressionRules[].CompressionAction | Object | ✅ | 压缩行为配置 |
Compression.CompressionRules[].CompressionAction.CompressionType | Array | ✅ | 压缩算法:gzip、br,可同时指定 |
Compression.CompressionRules[].CompressionAction.CompressionFormat | String | - | 压缩格式:default(内置列表)、customize(自定义)、all(全部),指定后 Condition 必须为 null |
Compression.CompressionRules[].CompressionAction.CompressionTarget | String | - | CompressionFormat 为 default/all 时固定为 *,为 customize 时填 MIME 类型,逗号分隔 |
Compression.CompressionRules[].CompressionAction.MinFileSizeKB | Integer | - | 最小压缩文件大小(KB),0-2147483647,默认 0 |
Compression.CompressionRules[].CompressionAction.MaxFileSizeKB | Integer | - | 最大压缩文件大小(KB),0-2147483647,不填表示无上限 |
Compression.CompressionRules[].Condition | Object | - | 匹配条件(结构同 Cache,不支持 regex),与 CompressionFormat 互斥 |
---
CompressionFormat=default 内置 Content-Type 列表
text/html、text/xml、text/plain、text/css、application/javascript、application/x-javascript、application/rss+xml、text/javascript、image/tiff、image/svg+xml、application/json、application/xml、text/plain; charset=utf-8
#!/bin/bash
# 火山引擎 CLI CDN 域名添加脚本(带必填项检查和默认值)
# 使用方法: ./add-cdn-domain.sh [--check]
# --check: 强制重新进行环境检查
set -e
echo "=========================================="
echo " 火山引擎 CLI - CDN 域名添加助手"
echo "=========================================="
echo ""
# 获取脚本所在目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
RECOMMEND_CONFIG_SCRIPT="$SCRIPT_DIR/recommend-config.sh"
# 优先使用项目本地的 CLI
LOCAL_CLI="$PROJECT_DIR/bin/ve"
if [ -f "$LOCAL_CLI" ] && [ -x "$LOCAL_CLI" ]; then
VE_CMD="$LOCAL_CLI"
echo "✅ 使用项目本地 CLI: $LOCAL_CLI"
else
VE_CMD="ve"
fi
# 引入推荐配置逻辑
if [ ! -f "$RECOMMEND_CONFIG_SCRIPT" ]; then
echo "❌ 未找到推荐配置脚本: $RECOMMEND_CONFIG_SCRIPT"
exit 1
fi
# shellcheck source=/dev/null
source "$RECOMMEND_CONFIG_SCRIPT"
# 环境检查标志文件
ENV_CHECK_FILE="$HOME/.volc-cdn-cli-env-check"
# 环境检查有效期(秒)- 1 天
ENV_CHECK_EXPIRE=86400
# 解析命令行参数
FORCE_CHECK=false
if [ "$1" = "--check" ]; then
FORCE_CHECK=true
echo "🔄 强制进行环境检查..."
echo ""
fi
# 检查是否需要环境检测
needs_check=true
if [ "$FORCE_CHECK" = "false" ] && [ -f "$ENV_CHECK_FILE" ]; then
# 检查标志文件是否过期
file_time=$(stat -f "%m" "$ENV_CHECK_FILE" 2>/dev/null || echo 0)
current_time=$(date +%s)
time_diff=$((current_time - file_time))
if [ $time_diff -lt $ENV_CHECK_EXPIRE ]; then
echo "✅ 环境检查未过期,跳过环境检测"
echo ""
needs_check=false
else
echo "🔄 环境检查已过期,重新进行检测"
echo ""
fi
fi
if [ "$needs_check" = "true" ]; then
# ==========================================
# 第一阶段:环境检查
# ==========================================
echo "【第一阶段】环境检查"
echo ""
# 检查 ve 是否可用
echo "🔍 检查火山引擎 CLI..."
if ! "$VE_CMD" --help &>/dev/null; then
echo "❌ 未找到 've' 命令"
echo ""
echo "=========================================="
echo " 需要先安装火山引擎 CLI"
echo "=========================================="
echo ""
echo "请按照以下步骤安装:"
echo ""
# 检测系统架构
ARCH=$(uname -m)
if [ "$ARCH" = "arm64" ]; then
echo "1. 检测到您的系统是 Apple Silicon (arm64)"
DOWNLOAD_URL="https://github.com/volcengine/volcengine-cli/releases/download/v1.0.39/volcengine-cli_1.0.39_darwin_arm64.zip"
elif [ "$ARCH" = "x86_64" ]; then
echo "1. 检测到您的系统是 Intel (x86_64)"
DOWNLOAD_URL="https://github.com/volcengine/volcengine-cli/releases/download/v1.0.39/volcengine-cli_1.0.39_darwin_amd64.zip"
else
echo "⚠️ 无法检测系统架构,请手动选择"
echo ""
echo " Apple Silicon (M1/M2/M3): arm64"
echo " Intel: x86_64"
echo ""
exit 1
fi
echo ""
echo "2. 下载 CLI:"
echo " curl -L -s "$DOWNLOAD_URL" -o ve.zip"
echo ""
echo "3. 解压并安装:"
echo " unzip -q ve.zip"
echo " mkdir -p ~/.local/bin"
echo " mv ve ~/.local/bin/"
echo ""
echo "4. 配置环境变量(如果还没有配置):"
echo " echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc"
echo " source ~/.zshrc"
echo ""
echo "5. 配置访问凭证:"
echo " ve configure set --access-key <您的AK> --secret-key <您的SK> --region cn-guangzhou --profile default"
echo ""
echo "6. 验证安装:"
echo " ve version"
echo ""
echo "安装完成后,请重新运行此脚本!"
exit 1
fi
echo "✅ 火山引擎 CLI 已找到"
# 检查 CDN 命令是否可用(简化版本检查)
echo "🔍 检查 CDN 命令是否可用..."
if ! "$VE_CMD" cdn --help &>/dev/null; then
echo ""
echo "❌ 错误: CDN 命令不可用"
echo " 请升级 CLI 到 1.0.39 或更高版本"
echo ""
echo "升级步骤:"
ARCH=$(uname -m)
if [ "$ARCH" = "arm64" ]; then
DOWNLOAD_URL="https://github.com/volcengine/volcengine-cli/releases/download/v1.0.39/volcengine-cli_1.0.39_darwin_arm64.zip"
else
DOWNLOAD_URL="https://github.com/volcengine/volcengine-cli/releases/download/v1.0.39/volcengine-cli_1.0.39_darwin_amd64.zip"
fi
echo " curl -L -s "$DOWNLOAD_URL" -o ve.zip"
echo " unzip -q -o ve.zip"
echo " mv ve ~/.local/bin/"
echo ""
exit 1
fi
echo "✅ CDN 命令可用"
# 检查配置状态 - 跳过配置文件权限检查,直接进入需求收集
echo "🔍 检查配置状态..."
echo "⚠️ 跳过配置文件检查(权限限制)"
echo " 请确保在执行前已配置好 AK/SK"
echo ""
echo "✅ 配置状态正常"
# 更新环境检查标志文件
touch "$ENV_CHECK_FILE"
echo "✅ 环境检查完成,更新检查标志文件"
echo ""
fi
# ==========================================
# 第二阶段:需求收集
# ==========================================
echo ""
echo "【第二阶段】需求收集"
echo ""
echo "必填项检查:加速域名、区域、源站信息、缓存规则、业务类型"
echo ""
# 1. 加速域名
while true; do
read -p "1. 加速域名 (必填): " DOMAIN
if [ -z "$DOMAIN" ]; then
echo "❌ 加速域名不能为空,请重新输入"
continue
fi
# 域名格式验证
if [[ ! "$DOMAIN" =~ ^([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$ ]]; then
echo "❌ 域名格式不正确,请重新输入(例如:www.example.com)"
continue
fi
break
done
# 2. 源站配置
ORIGIN_LINES=()
ORIGIN_COUNT=0
while true; do
echo ""
echo "2. 源站配置(至少需要一个主源站)"
echo " 当前已添加 $ORIGIN_COUNT 个源站"
echo ""
echo " 1. 添加主源站"
echo " 2. 添加备源站"
echo " 3. 完成源站配置"
read -p "请选择操作 (1-3): " ORIGIN_ACTION
case $ORIGIN_ACTION in
"1" | "2")
# 源站地址
while true; do
read -p " 源站地址 (IP 或域名): " ORIGIN_ADDRESS
if [ -z "$ORIGIN_ADDRESS" ]; then
echo "❌ 源站地址不能为空,请重新输入"
continue
fi
# 源站格式验证
if [[ "$ORIGIN_ADDRESS" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
INSTANCE_TYPE="ip"
break
elif [[ "$ORIGIN_ADDRESS" =~ ^([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$ ]]; then
INSTANCE_TYPE="domain"
break
else
echo "❌ 源站格式不正确,请输入有效的 IP 地址或域名"
continue
fi
done
# 源站类型
echo " 源站类型: $INSTANCE_TYPE"
# 回源协议
echo ""
echo " 回源协议:"
echo " 1. http"
echo " 2. https"
echo " 3. followclient"
while true; do
read -p " 请选择回源协议 (1-3): " ORIGIN_PROTOCOL_CHOICE
case $ORIGIN_PROTOCOL_CHOICE in
"1")
ORIGIN_PROTOCOL="http"
break
;;
"2")
ORIGIN_PROTOCOL="https"
break
;;
"3")
ORIGIN_PROTOCOL="followclient"
break
;;
*)
echo "❌ 无效的选择,请输入 1-3"
;;
esac
done
# 权重
read -p " 权重 (1-100,默认 100): " WEIGHT
WEIGHT=${WEIGHT:-100}
# 源站类别
if [ "$ORIGIN_ACTION" = "1" ]; then
ORIGIN_TYPE="primary"
echo " 源站类别: 主源站"
else
ORIGIN_TYPE="backup"
echo " 源站类别: 备源站"
fi
# 添加到源站列表
ORIGIN_LINES+=(
"{
\"Address\": \"$ORIGIN_ADDRESS\",
\"InstanceType\": \"$INSTANCE_TYPE\",
\"OriginType\": \"$ORIGIN_TYPE\",
\"OriginProtocol\": \"$ORIGIN_PROTOCOL\",
\"Weight\": \"$WEIGHT\"
}"
)
ORIGIN_COUNT=$((ORIGIN_COUNT + 1))
echo ""
echo "✅ 源站添加成功!"
;;
"3")
# 检查是否至少有一个主源站
HAS_PRIMARY=false
PATTERN='OriginType": "primary"'
for line in "${ORIGIN_LINES[@]}"; do
if [[ "$line" =~ $PATTERN ]]; then
HAS_PRIMARY=true
break
fi
done
if [ "$HAS_PRIMARY" = "false" ]; then
echo ""
echo "❌ 至少需要添加一个主源站"
continue
fi
echo ""
echo "✅ 源站配置完成,共添加 $ORIGIN_COUNT 个源站"
break
;;
*)
echo "❌ 无效的选择,请输入 1-3"
;;
esac
done
# 3. 业务类型
echo ""
echo "3. 业务类型 (必填):"
echo " 1. web (网页)"
echo " 2. download (下载)"
echo " 3. video (点播)"
while true; do
read -p "请选择业务类型 (1-3): " SERVICE_TYPE_CHOICE
case $SERVICE_TYPE_CHOICE in
"1")
SERVICE_TYPE="web"
echo " 选择: web (网页)"
break
;;
"2")
SERVICE_TYPE="download"
echo " 选择: download (下载)"
break
;;
"3")
SERVICE_TYPE="video"
echo " 选择: video (点播)"
break
;;
*)
echo "❌ 无效的选择,请输入 1-3"
;;
esac
done
# 4. 区域(使用默认值)
DEFAULT_REGION="chinese_mainland"
read -p "4. 加速区域 (默认: chinese_mainland 中国内地): " SERVICE_REGION
SERVICE_REGION=${SERVICE_REGION:-$DEFAULT_REGION}
if [ "$SERVICE_REGION" = "$DEFAULT_REGION" ]; then
echo " 使用默认值: $SERVICE_REGION (中国内地)"
fi
# 5. 缓存规则(根据业务类型自动应用推荐配置)
echo ""
echo "5. 缓存规则:"
echo " ✅ 根据选择的业务类型自动应用推荐配置规则"
echo " - 点播场景:缓存 30 天,动态文件不缓存,开启 Range 回源、Multi-Range、缓存 Key 忽略全部查询参数、302 跟随、视频拖拽"
echo " - 网页场景:缓存 30 天,动态文件不缓存,开启压缩和页面优化"
echo " - 下载场景:缓存 30 天,动态文件不缓存,开启 Range 回源、Multi-Range、缓存 Key 忽略全部查询参数、302 跟随"
# 项目名称
read -p "6. 项目名称 (默认: default): " PROJECT
PROJECT=${PROJECT:-default}
# ==========================================
# 第三阶段:确认并添加
# ==========================================
echo ""
echo "【第三阶段】配置确认"
echo ""
echo "=========================================="
echo " 配置信息汇总"
echo "=========================================="
echo " 加速域名: $DOMAIN"
echo " 业务类型: $SERVICE_TYPE"
echo " 加速区域: $SERVICE_REGION"
echo " 项目: $PROJECT"
echo " 源站数量: $ORIGIN_COUNT 个"
# 显示源站详情
echo ""
echo " 源站详情:"
echo " ----------------------------------------"
index=1
for line in "${ORIGIN_LINES[@]}"; do
address=$(echo "$line" | grep -Eo '"Address": "[^"]+"' | cut -d '"' -f4)
type=$(echo "$line" | grep -Eo '"InstanceType": "[^"]+"' | cut -d '"' -f4)
origin_type=$(echo "$line" | grep -Eo '"OriginType": "[^"]+"' | cut -d '"' -f4)
protocol=$(echo "$line" | grep -Eo '"OriginProtocol": "[^"]+"' | cut -d '"' -f4)
weight=$(echo "$line" | grep -Eo '"Weight": "[^"]+"' | cut -d '"' -f4)
if [ "$origin_type" = "primary" ]; then
origin_type_str="主源站"
else
origin_type_str="备源站"
fi
echo " $index. $origin_type_str: $address ($type)"
echo " 回源协议: $protocol"
echo " 权重: $weight"
index=$((index + 1))
done
echo " ----------------------------------------"
# 显示推荐配置详情
echo ""
echo " 推荐配置详情:"
echo " ----------------------------------------"
get_recommend_config_desc "$SERVICE_TYPE"
echo " ----------------------------------------"
echo "=========================================="
echo ""
read -p "确认添加此域名? (y/n): " CONFIRM
if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then
echo "已取消操作"
exit 0
fi
# 构建源站配置字符串
ORIGIN_LINES_JSON=$(IFS=,; echo "${ORIGIN_LINES[*]}")
# 构建配置规则(调用共享函数)
CONFIG_RULES=""
CONFIG_CONTENT=$(get_recommend_config "$SERVICE_TYPE")
if [ -n "$CONFIG_CONTENT" ]; then
CONFIG_RULES=",$CONFIG_CONTENT"
fi
# 构建 JSON body
BODY=$(cat <<EOF
{
"Domain": "$DOMAIN",
"Origin": [
{
"OriginAction": {
"OriginLines": [
$ORIGIN_LINES_JSON
]
}
}
],
"Project": "$PROJECT",
"ServiceRegion": "$SERVICE_REGION",
"ServiceType": "$SERVICE_TYPE"
$CONFIG_RULES
}
EOF
)
echo ""
echo "正在调用 AddCdnDomain API..."
echo ""
# 执行命令(带超时设置和错误处理)
set +e
# 设置 30 秒超时
if command -v timeout &>/dev/null; then
echo "⏱️ API 调用超时设置:30 秒"
timeout 30 "$VE_CMD" cdn AddCdnDomain --body "$BODY"
EXIT_CODE=$?
if [ $EXIT_CODE -eq 124 ]; then
echo ""
echo "⏱️ API 调用超时!"
echo " 请检查网络连接或稍后重试"
echo ""
exit 124
fi
else
# 如果系统没有 timeout 命令,使用默认执行
"$VE_CMD" cdn AddCdnDomain --body "$BODY"
EXIT_CODE=$?
fi
set -e
if [ $EXIT_CODE -eq 0 ]; then
echo ""
echo "✅ 命令已执行完成!"
echo ""
echo "📝 后续步骤:"
echo " 1. 等待 1-5 分钟,让域名配置生效"
echo " 2. 登录火山引擎控制台获取 CNAME"
echo " 3. 在您的 DNS 服务商处配置 CNAME 记录"
echo " 4. 验证访问"
echo ""
echo "💡 提示:如需自定义缓存规则,请在域名创建后通过控制台或 API 修改"
else
echo ""
echo "❌ 命令执行失败!"
echo ""
echo "📋 常见问题排查:"
echo " 1. 检查 AK/SK 是否配置正确"
echo " 2. 检查域名是否已存在"
echo " 3. 检查 CLI 版本是否 >= 1.0.39"
echo ""
echo "💡 更多帮助请查看 SKILL.md 中的 FAQ 章节"
exit $EXIT_CODE
fi
#!/bin/bash
# 快速添加域名脚本(支持推荐配置)
# 获取脚本所在目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
VE_CMD="$PROJECT_DIR/bin/ve"
RECOMMEND_CONFIG_SCRIPT="$SCRIPT_DIR/recommend-config.sh"
if [ ! -f "$VE_CMD" ] || [ ! -x "$VE_CMD" ]; then
echo "❌ 未找到 CLI: $VE_CMD"
exit 1
fi
# 引入推荐配置逻辑
if [ ! -f "$RECOMMEND_CONFIG_SCRIPT" ]; then
echo "❌ 未找到推荐配置脚本: $RECOMMEND_CONFIG_SCRIPT"
exit 1
fi
# shellcheck source=/dev/null
source "$RECOMMEND_CONFIG_SCRIPT"
echo "✅ 使用系统配置的 AK/SK"
echo ""
# 默认配置
DOMAIN="${1:-example-domain.com}"
ORIGIN1="${2:-1.1.1.1}"
ORIGIN2="${3:-}"
ORIGIN3="${4:-}"
WEIGHT1="${5:-100}"
WEIGHT2="${6:-100}"
WEIGHT3="${7:-100}"
SERVICE_TYPE="${8:-web}"
# 构建源站配置
ORIGIN_LINES=""
# 主源 1
ORIGIN_LINES+="{
\"Address\": \"$ORIGIN1\",
\"InstanceType\": \"ip\",
\"OriginType\": \"primary\",
\"OriginProtocol\": \"https\",
\"Weight\": \"$WEIGHT1\"
}"
# 主源 2(可选)
if [ -n "$ORIGIN2" ]; then
ORIGIN_LINES+=",
{
\"Address\": \"$ORIGIN2\",
\"InstanceType\": \"ip\",
\"OriginType\": \"primary\",
\"OriginProtocol\": \"https\",
\"Weight\": \"$WEIGHT2\"
}"
fi
# 备源(可选)
if [ -n "$ORIGIN3" ]; then
ORIGIN_LINES+=",
{
\"Address\": \"$ORIGIN3\",
\"InstanceType\": \"domain\",
\"OriginType\": \"backup\",
\"OriginProtocol\": \"https\",
\"Weight\": \"$WEIGHT3\"
}"
fi
# 构建推荐配置(调用共享函数)
RECOMMEND_CONFIG=""
CONFIG_CONTENT=$(get_recommend_config "$SERVICE_TYPE")
if [ -n "$CONFIG_CONTENT" ]; then
RECOMMEND_CONFIG=",$CONFIG_CONTENT"
fi
# 构建 JSON
BODY=$(cat <<EOF
{
"Domain": "$DOMAIN",
"Origin": [
{
"OriginAction": {
"OriginLines": [
$ORIGIN_LINES
]
}
}
],
"Project": "default",
"ServiceRegion": "chinese_mainland",
"ServiceType": "$SERVICE_TYPE"
$RECOMMEND_CONFIG
}
EOF
)
echo "=== 配置信息 ==="
echo "域名: $DOMAIN"
echo "主源1: $ORIGIN1, 权重$WEIGHT1"
if [ -n "$ORIGIN2" ]; then
echo "主源2: $ORIGIN2, 权重$WEIGHT2"
fi
if [ -n "$ORIGIN3" ]; then
echo "备源: $ORIGIN3, 权重$WEIGHT3"
fi
echo "业务类型: $SERVICE_TYPE"
echo "推荐配置: 已启用"
echo ""
echo "=== 执行 ==="
# 执行命令(带超时)
echo "正在调用 AddCdnDomain API(超时时间:30 秒)..."
echo ""
# 检测系统是否支持 timeout 命令
if command -v timeout >/dev/null 2>&1; then
# 使用 timeout 命令
timeout 30 VOLCENGINE_REGION="cn-guangzhou" "$VE_CMD" cdn AddCdnDomain --body "$BODY"
EXIT_CODE=$?
if [ $EXIT_CODE -eq 124 ]; then
echo ""
echo "❌ API 调用超时(30 秒)"
echo "💡 建议:"
echo " 1. 检查网络连接是否正常"
echo " 2. 稍后重试"
exit 124
fi
else
# 不支持 timeout,直接执行
echo "⚠️ 系统不支持 timeout 命令,无超时保护"
VOLCENGINE_REGION="cn-guangzhou" "$VE_CMD" cdn AddCdnDomain --body "$BODY"
fi
#!/bin/bash
# 火山引擎 CLI CDN 刷新预热管理脚本
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
# 优先使用项目本地的 CLI
LOCAL_CLI="$PROJECT_DIR/bin/ve"
if [ -f "$LOCAL_CLI" ] && [ -x "$LOCAL_CLI" ]; then
VE_CMD="$LOCAL_CLI"
echo "✅ 使用项目本地 CLI: $LOCAL_CLI"
else
VE_CMD="ve"
fi
echo "=========================================="
echo " 火山引擎 CLI - CDN 刷新预热管理"
echo "=========================================="
echo ""
# 检查 CLI 是否可用
if ! "$VE_CMD" --help &>/dev/null; then
echo "❌ 未找到 've' 命令"
echo ""
echo "请先安装火山引擎 CLI,参考: $PROJECT_DIR/references/install-guide.md"
exit 1
fi
# 菜单选择
echo "请选择要执行的操作:"
echo "1. 提交预热任务"
echo "2. 提交刷新任务"
echo ""
read -p "请输入选项 (1/2): " choice
case $choice in
1)
echo ""
echo "=== 提交预热任务 ==="
echo ""
echo "请输入要预热的URL列表(每行一个URL,输入空行结束):"
urls=()
while true; do
read -p "URL: " url
if [ -z "$url" ]; then
break
fi
urls+=("$url")
done
if [ ${#urls[@]} -eq 0 ]; then
echo "❌ 未输入任何URL"
exit 1
fi
# 构建JSON
url_list=$(printf '"%s",' "${urls[@]}")
url_list=${url_list%,}
body="{\"UrlList\":[$url_list]}"
echo ""
echo "=== 确认信息 ==="
echo "操作类型: 预热"
echo "URL数量: ${#urls[@]}"
echo "URL列表:"
for url in "${urls[@]}"; do
echo " - $url"
done
echo ""
echo "请求内容: $body"
echo ""
read -p "确认提交? (y/n): " confirm
if [ "$confirm" != "y" ]; then
echo "已取消"
exit 0
fi
echo ""
echo "正在提交预热任务..."
echo ""
VOLCENGINE_REGION="cn-guangzhou" "$VE_CMD" cdn SubmitPreloadTask --body "$body"
;;
2)
echo ""
echo "=== 提交刷新任务 ==="
echo ""
echo "请选择刷新类型:"
echo "1. file(文件刷新)"
echo "2. directory(目录刷新)"
echo ""
read -p "请输入选项 (1/2, 默认 1): " type_choice
case $type_choice in
2)
refresh_type="directory"
;;
*)
refresh_type="file"
;;
esac
echo ""
echo "请输入要刷新的URL列表(每行一个URL,输入空行结束):"
urls=()
while true; do
read -p "URL: " url
if [ -z "$url" ]; then
break
fi
urls+=("$url")
done
if [ ${#urls[@]} -eq 0 ]; then
echo "❌ 未输入任何URL"
exit 1
fi
# 构建JSON
url_list=$(printf '"%s",' "${urls[@]}")
url_list=${url_list%,}
body="{\"Type\":\"$refresh_type\",\"UrlList\":[$url_list]}"
echo ""
echo "=== 确认信息 ==="
echo "操作类型: 刷新"
echo "刷新类型: $refresh_type"
echo "URL数量: ${#urls[@]}"
echo "URL列表:"
for url in "${urls[@]}"; do
echo " - $url"
done
echo ""
echo "请求内容: $body"
echo ""
read -p "确认提交? (y/n): " confirm
if [ "$confirm" != "y" ]; then
echo "已取消"
exit 0
fi
echo ""
echo "正在提交刷新任务..."
echo ""
VOLCENGINE_REGION="cn-guangzhou" "$VE_CMD" cdn SubmitRefreshTask --body "$body"
;;
*)
echo "❌ 无效选项"
exit 1
;;
esac
echo ""
echo "✅ 任务提交完成!"
#!/bin/bash
# 火山引擎 CDN 推荐配置逻辑
# 此文件被其他脚本引用,生成基于业务类型的推荐配置
# 根据业务类型生成推荐配置
# 参数: $1 - 业务类型 (web/download/video)
# 输出: JSON 格式的推荐配置字符串
get_recommend_config() {
local SERVICE_TYPE="$1"
if [ "$SERVICE_TYPE" = "video" ]; then
cat <<EOF
"Cache": [
{
"CacheAction": {
"Action": "cache",
"IgnoreCase": false,
"Ttl": 0,
"DefaultPolicy": "no_cache"
},
"Condition": {
"ConditionRule": [
{
"Object": "filetype",
"Operator": "match",
"Type": "url",
"Value": "php;jsp;asp;aspx"
}
]
}
},
{
"CacheAction": {
"Action": "cache",
"IgnoreCase": false,
"Ttl": 2592000,
"DefaultPolicy": "default"
},
"Condition": {
"ConditionRule": [
{
"Object": "path",
"Operator": "match",
"Type": "url",
"Value": "/*"
}
]
}
}
],
"Range": {
"Switch": true,
"RangeSize": 1,
"Unit": "MB"
},
"MultiRange": {
"Switch": true
},
"CacheKey": [
{
"CacheKeyAction": {
"CacheKeyComponents": [
{
"Action": "exclude",
"IgnoreCase": false,
"Object": "queryString",
"Subobject": "*"
}
]
},
"Condition": {
"ConditionRule": [
{
"Object": "path",
"Operator": "match",
"Type": "url",
"Value": "/*"
}
]
}
},
{
"CacheKeyAction": {
"CacheKeyComponents": [
{
"Action": "include",
"IgnoreCase": true,
"Object": "queryString",
"Subobject": "*"
}
]
},
"Condition": {
"ConditionRule": [
{
"Name": "",
"Object": "directory",
"Operator": "match",
"Type": "url",
"Value": "/"
}
]
}
}
],
"FollowRedirect": true,
"VideoDrag": {
"Switch": true
}
EOF
elif [ "$SERVICE_TYPE" = "web" ]; then
cat <<EOF
"Cache": [
{
"CacheAction": {
"Action": "cache",
"IgnoreCase": false,
"Ttl": 0,
"DefaultPolicy": "no_cache"
},
"Condition": {
"ConditionRule": [
{
"Object": "filetype",
"Operator": "match",
"Type": "url",
"Value": "php;jsp;asp;aspx"
}
]
}
},
{
"CacheAction": {
"Action": "cache",
"IgnoreCase": false,
"Ttl": 2592000,
"DefaultPolicy": "default"
},
"Condition": {
"ConditionRule": [
{
"Object": "path",
"Operator": "match",
"Type": "url",
"Value": "/*"
}
]
}
}
],
"Compression": {
"Switch": true,
"CompressionRules": [
{
"CompressionAction": {
"CompressionType": ["gzip"],
"CompressionFormat": "default",
"CompressionTarget": "*",
"MinFileSizeKB": 0
}
}
]
},
"PageOptimization": {
"PageOptimizationAction": "on"
}
EOF
elif [ "$SERVICE_TYPE" = "download" ]; then
cat <<EOF
"Cache": [
{
"CacheAction": {
"Action": "cache",
"IgnoreCase": false,
"Ttl": 0,
"DefaultPolicy": "no_cache"
},
"Condition": {
"ConditionRule": [
{
"Object": "filetype",
"Operator": "match",
"Type": "url",
"Value": "php;jsp;asp;aspx"
}
]
}
},
{
"CacheAction": {
"Action": "cache",
"IgnoreCase": false,
"Ttl": 2592000,
"DefaultPolicy": "default"
},
"Condition": {
"ConditionRule": [
{
"Object": "path",
"Operator": "match",
"Type": "url",
"Value": "/*"
}
]
}
}
],
"Range": {
"Switch": true,
"RangeSize": 1,
"Unit": "MB"
},
"MultiRange": {
"Switch": true
},
"CacheKey": [
{
"CacheKeyAction": {
"CacheKeyComponents": [
{
"Action": "exclude",
"IgnoreCase": false,
"Object": "queryString",
"Subobject": "*"
}
]
},
"Condition": {
"ConditionRule": [
{
"Object": "path",
"Operator": "match",
"Type": "url",
"Value": "/*"
}
]
}
},
{
"CacheKeyAction": {
"CacheKeyComponents": [
{
"Action": "include",
"IgnoreCase": true,
"Object": "queryString",
"Subobject": "*"
}
]
},
"Condition": {
"ConditionRule": [
{
"Name": "",
"Object": "directory",
"Operator": "match",
"Type": "url",
"Value": "/"
}
]
}
}
],
"FollowRedirect": true
EOF
fi
}
# 根据业务类型获取推荐配置的说明
# 参数: $1 - 业务类型 (web/download/video)
get_recommend_config_desc() {
local SERVICE_TYPE="$1"
if [ "$SERVICE_TYPE" = "video" ]; then
cat <<EOF
📺 视频点播场景优化:
✓ 缓存规则: 所有文件 30 天, 动态文件不缓存
✓ Range 回源: 已启用 (1MB 分片)
✓ MultiRange: 已启用
✓ 缓存键: 忽略所有查询参数
✓ 302 跟随: 已启用
✓ 视频拖拽: 已启用
EOF
elif [ "$SERVICE_TYPE" = "web" ]; then
cat <<EOF
🌐 网页加速场景优化:
✓ 缓存规则: 所有文件 30 天, 动态文件不缓存
✓ 智能压缩: 已启用 (仅 gzip, 默认格式)
✓ 页面优化: 已启用
EOF
elif [ "$SERVICE_TYPE" = "download" ]; then
cat <<EOF
⬇️ 下载加速场景优化:
✓ 缓存规则: 所有文件 30 天, 动态文件不缓存
✓ Range 回源: 已启用 (1MB 分片)
✓ MultiRange: 已启用
✓ 缓存键: 忽略所有查询参数
✓ 302 跟随: 已启用
EOF
fi
}
#!/bin/bash
# 快速提交预热任务脚本
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
# 优先使用项目本地的 CLI
LOCAL_CLI="$PROJECT_DIR/bin/ve"
if [ -f "$LOCAL_CLI" ] && [ -x "$LOCAL_CLI" ]; then
VE_CMD="$LOCAL_CLI"
else
VE_CMD="ve"
fi
if [ $# -eq 0 ]; then
echo "使用方法: $0 <url1> <url2> ..."
echo ""
echo "示例: $0 https://www.example.com/1.jpg https://www.example.com/2.jpg"
exit 1
fi
# 构建URL列表
urls=("$@")
url_list=$(printf '"%s",' "${urls[@]}")
url_list=${url_list%,}
body="{\"UrlList\":[$url_list]}"
echo "=== 预热任务 ==="
echo "URL数量: ${#urls[@]}"
echo "URL列表:"
for url in "${urls[@]}"; do
echo " - $url"
done
echo ""
echo "正在提交..."
echo ""
VOLCENGINE_REGION="cn-guangzhou" "$VE_CMD" cdn SubmitPreloadTask --body "$body"
#!/bin/bash
# 快速提交刷新任务脚本
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
# 优先使用项目本地的 CLI
LOCAL_CLI="$PROJECT_DIR/bin/ve"
if [ -f "$LOCAL_CLI" ] && [ -x "$LOCAL_CLI" ]; then
VE_CMD="$LOCAL_CLI"
else
VE_CMD="ve"
fi
# 解析参数
refresh_type="file"
urls=()
while [ $# -gt 0 ]; do
case $1 in
--type|-t)
refresh_type="$2"
shift 2
;;
*)
urls+=("$1")
shift
;;
esac
done
if [ ${#urls[@]} -eq 0 ]; then
echo "使用方法: $0 [--type <file|directory>] <url1> <url2> ..."
echo ""
echo "示例:"
echo " $0 https://www.example.com/1.jpg https://www.example.com/2.jpg"
echo " $0 --type directory https://www.example.com/path/"
exit 1
fi
# 构建URL列表 - JSON数组
url_list=$(printf '"%s",' "${urls[@]}")
url_list=${url_list%,}
body="{\"Type\":\"$refresh_type\",\"UrlList\":[$url_list]}"
echo "=== 刷新任务 ==="
echo "刷新类型: $refresh_type"
echo "URL数量: ${#urls[@]}"
echo "URL列表:"
for url in "${urls[@]}"; do
echo " - $url"
done
echo ""
echo "正在提交..."
echo ""
VOLCENGINE_REGION="cn-guangzhou" "$VE_CMD" cdn SubmitRefreshTask --body "$body"
Related skills
FAQ
What CLI version is required?
Volcengine CLI version 1.0.39 or above is required to support the CDN service.
What business types are supported for new domains?
web (page acceleration), download, and video, each with its own recommended configuration.