整个 Cloudflare 自动化方案 整合成一个单文件 Bash 脚本,实现:
- 🔐 API Token 无浏览器登录
- 🌍 多 Worker + 多域名批量创建
- 🧱 KV 自动化创建与绑定
- 📦 一条命令销毁全部资源
- 🤖 可直接在 CI/CD 中运行
- 🎛 菜单选择功能
下面是 完整单文件版:
cf_automation.sh
#!/usr/bin/env bash
set -e
# ==============================
# 配置区
# ==============================
NODE_VERSION="18"
DEFAULT_KV="GLOBAL_KV"
WORKERS=("worker1" "worker2")
DOMAINS=("cf1.cftest.nyc.mn" "cf2.cftest.nyc.mn")
# ==============================
# 环境变量检查
# ==============================
if [ -z "$CF_API_TOKEN" ] || [ -z "$CF_ACCOUNT_ID" ]; then
echo "❌ 请先设置 CF_API_TOKEN 和 CF_ACCOUNT_ID"
echo "例如: export CF_API_TOKEN='xxxx' && export CF_ACCOUNT_ID='xxxx'"
exit 1
fi
export CLOUDFLARE_API_TOKEN="$CF_API_TOKEN"
# ==============================
# 0️⃣ 检查 & 安装 Node.js + npm
# ==============================
install_node() {
echo "🚀 安装 Node.js $NODE_VERSION"
if command -v apt >/dev/null 2>&1; then
sudo apt update
sudo apt install -y curl ca-certificates
curl -fsSL https://deb.nodesource.com/setup_$NODE_VERSION.x | sudo -E bash -
sudo apt install -y nodejs
elif command -v yum >/dev/null 2>&1; then
sudo yum install -y curl
curl -fsSL https://rpm.nodesource.com/setup_$NODE_VERSION.x | sudo bash -
sudo yum install -y nodejs
elif command -v dnf >/dev/null 2>&1; then
sudo dnf install -y curl
curl -fsSL https://rpm.nodesource.com/setup_$NODE_VERSION.x | sudo bash -
sudo dnf install -y nodejs
elif command -v brew >/dev/null 2>&1; then
brew install node
else
echo "❌ 系统不支持自动安装 Node.js"
exit 1
fi
}
if ! command -v node >/dev/null 2>&1 || ! command -v npm >/dev/null 2>&1; then
install_node
else
echo "✅ Node.js 已存在: $(node -v)"
echo "✅ npm 已存在: $(npm -v)"
fi
# ==============================
# 1️⃣ 安装 wrangler
# ==============================
if ! command -v wrangler >/dev/null 2>&1; then
echo "⚠️ 安装 wrangler"
npm install -g wrangler
else
echo "✅ wrangler 已安装"
fi
wrangler --version
# ==============================
# 2️⃣ 检查 API Token
# ==============================
echo "🔐 验证 API Token"
wrangler whoami >/dev/null || { echo "❌ API Token 无效"; exit 1; }
# ==============================
# 函数:创建 Worker
# ==============================
create_worker() {
local name="$1"
echo "📦 创建 / 部署 Worker: $name"
if [ ! -d "$name" ]; then
wrangler init "$name" --type=javascript --no-deploy
fi
cd "$name"
mkdir -p src
cat > src/index.js <<'EOF'
export default {
async fetch(req, env) {
const url = new URL(req.url);
if (url.pathname === "/set") {
await env.GLOBAL_KV.put("hello", "Hello from KV");
return new Response("KV updated");
}
const value = await env.GLOBAL_KV.get("hello");
return new Response(JSON.stringify({ value, host: url.hostname, time: new Date().toISOString() }, null, 2), {
headers: { "Content-Type": "application/json" }
});
}
};
EOF
# KV namespace
KV_ID=$(wrangler kv:namespace list | grep "\"title\": \"$DEFAULT_KV\"" | cut -d\" -f4)
if [ -z "$KV_ID" ]; then
KV_ID=$(wrangler kv:namespace create "$DEFAULT_KV" | cut -d\" -f2)
echo "✅ KV 创建成功: $KV_ID"
else
echo "♻️ KV 已存在: $KV_ID"
fi
# wrangler.toml
cat > wrangler.toml <<EOF
name = "$name"
main = "src/index.js"
compatibility_date = "$(date +%F)"
[[kv_namespaces]]
binding = "$DEFAULT_KV"
id = "$KV_ID"
EOF
# 写入 KV 测试数据
wrangler kv:key put --binding="$DEFAULT_KV" hello "Hello from KV!"
# 部署
wrangler deploy
cd ..
}
# ==============================
# 函数:绑定域名
# ==============================
bind_domain() {
local worker="$1"
local domain="$2"
if ! wrangler route list | grep -q "$domain"; then
wrangler route add "$domain/*" --script "$worker"
echo "✅ 绑定域名 $domain 到 $worker"
else
echo "♻️ 域名 $domain 已绑定"
fi
}
# ==============================
# 函数:销毁全部资源
# ==============================
teardown() {
echo "⚠️ 开始销毁 Worker 与 KV"
for w in $(ls); do
if [ -f "$w/wrangler.toml" ]; then
echo "🗑 删除 Worker $w"
wrangler delete "$w" || true
fi
done
for kv in $(wrangler kv:namespace list | jq -r '.[].id'); do
echo "🗑 删除 KV $kv"
wrangler kv:namespace delete --id "$kv" || true
done
echo "✅ 全部资源已销毁"
}
# ==============================
# 菜单
# ==============================
echo "
请选择操作:
1) 批量创建 / 部署 Worker
2) 批量绑定域名
3) 批量创建 KV
4) 批量全部执行
5) 销毁全部资源
6) 退出
"
read -p "输入数字: " choice
case "$choice" in
1)
for w in "${WORKERS[@]}"; do create_worker "$w"; done
;;
2)
for w in "${WORKERS[@]}"; do
for d in "${DOMAINS[@]}"; do
bind_domain "$w" "$d"
done
done
;;
3)
KV_ID=$(wrangler kv:namespace list | grep "\"title\": \"$DEFAULT_KV\"" | cut -d\" -f4)
if [ -z "$KV_ID" ]; then
KV_ID=$(wrangler kv:namespace create "$DEFAULT_KV" | cut -d\" -f2)
echo "✅ KV 创建成功: $KV_ID"
else
echo "♻️ KV 已存在: $KV_ID"
fi
;;
4)
for w in "${WORKERS[@]}"; do create_worker "$w"; done
for w in "${WORKERS[@]}"; do
for d in "${DOMAINS[@]}"; do
bind_domain "$w" "$d"
done
done
;;
5)
teardown
;;
*)
echo "退出"
exit 0
;;
esac
echo "🎉 操作完成"
✅ 使用方法
chmod +x cf_automation.sh
export CF_API_TOKEN="你的API_TOKEN"
export CF_ACCOUNT_ID="你的ACCOUNT_ID"
./cf_automation.sh
- 菜单选择执行不同功能
- CI 环境直接
export CF_API_TOKEN && export CF_ACCOUNT_ID && ./cf_automation.sh
这个单文件版本已经把原来的模块化功能全部整合,特点:
- 🌍 多 Worker / 多域名批量管理
- 🔐 API Token 无浏览器登录
- 🧱 KV 自动化创建
- 📦 一键销毁全部资源
- 🤖 可用于 CI/CD
- 🎛 可通过菜单选择执行不同操作