cli Cloudflare 自动化方案

整个 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
  • 🎛 可通过菜单选择执行不同操作

No Comments

Send Comment Edit Comment


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
Previous
Next