mcpField
C
cloudflare-deployment

cloudflare-deployment

github.com/autumnsgrove云与 DevOps681 次安装5 天前更新
代码仓库

关于 cloudflare-deployment

cloudflare-deployment 是用于在 Cloudflare 上配置和部署应用及资源的技能,面向使用 Workers、Pages、KV、R2、D1 和 Wrangler 的开发者,也介绍 Grove 基础设施抽象层。

主要功能

  1. 01初始化并部署 Workers
  2. 02部署 Pages 网站
  3. 03配置 KV、R2 和 D1
  4. 04管理 Worker 密钥与环境
  5. 05使用 Grove 基础设施接口

适用场景

  1. 01开发并部署 Cloudflare Worker
  2. 02通过 Pages 发布静态网站
  3. 03将应用连接到 KV、R2 或 D1

MCP 相关

技能提到相关文档包含 MCP 服务配置,但没有说明该技能本身具备哪些 MCP 功能。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/autumnsgrove/lattice --skill cloudflare-deployment

安装后在 Claude Code 中输入/cloudflare-deployment确认已加载。

详细介绍

Cloudflare 部署技能

激活时机

在以下情况下激活此技能:

  • 设置 Cloudflare Workers 或 Pages
  • 使用 KV、R2 或 D1 存储
  • 将应用部署到 Cloudflare
  • 配置 wrangler.toml
  • 管理 Cloudflare 资源

快捷命令

# Install wrangler
pnpm add -g wrangler

# Login
wrangler login

# Initialize new Worker
wrangler init my-worker

# Local development
wrangler dev

# Deploy to Cloudflare
wrangler deploy

# View logs
wrangler tail my-worker

服务概览

服务用途使用场景
Workers无服务器函数API 端点、中间件
Pages静态站点 + 函数SvelteKit、Next.js
KV键值存储缓存、会话数据
R2对象存储文件、图片、备份
D1SQLite 数据库结构化数据

Workers 设置

wrangler init my-worker --type javascript
cd my-worker
wrangler dev
wrangler deploy
基础 Worker
export default {
	async fetch(request, env) {
		const url = new URL(request.url);

		if (url.pathname === "/api/hello") {
			return new Response(JSON.stringify({ message: "Hello!" }), {
				headers: { "Content-Type": "application/json" },
			});
		}

		return new Response("Not found", { status: 404 });
	},
};

KV 存储

# Create namespace
wrangler kv namespace create MY_KV

# Add to wrangler.toml
# kv_namespaces = [{ binding = "MY_KV", id = "abc123" }]
// In Worker
export default {
	async fetch(request, env) {
		// Write
		await env.MY_KV.put("key", "value");

		// Read
		const value = await env.MY_KV.get("key");

		return new Response(value);
	},
};

R2 存储

wrangler r2 bucket create my-bucket
# Add: r2_buckets = [{ binding = "MY_BUCKET", bucket_name = "my-bucket" }]
// In Worker
await env.MY_BUCKET.put("file.txt", "content");
const object = await env.MY_BUCKET.get("file.txt");
const text = await object.text();

D1 数据库

wrangler d1 create my-database
wrangler d1 execute my-database --command="CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)"
# Add: d1_databases = [{ binding = "DB", database_name = "my-database", database_id = "..." }]
// In Worker
const { results } = await env.DB.prepare("SELECT * FROM users WHERE id = ?").bind(1).all();

return Response.json(results);

Infra SDK 抽象层

Grove 使用来自 @autumnsgrove/infra 的可移植基础设施接口,而不是直接使用 Cloudflare API。这有助于实现后端可移植性,并在所有服务中采用一致的模式。

Cloudflare 原始接口Infra SDK 接口导入
env.DB (D1Database)GroveDatabase@autumnsgrove/infra
env.STORAGE (R2Bucket)GroveStorage@autumnsgrove/infra
env.CACHE_KV (KVNamespace)GroveKV@autumnsgrove/infra
服务绑定 (Fetcher)GroveServiceBus@autumnsgrove/infra
创建 Grove 上下文

在 Worker 入口点通过 createCloudflareContext() 创建 GroveContext:

import { createCloudflareContext } from "@autumnsgrove/infra/cloudflare";

const ctx = createCloudflareContext({
	db: env.DB,
	storage: env.STORAGE,
	kv: env.CACHE_KV,
});

// Use portable interfaces
const files = await ctx.storage.list("prefix");
const cached = await ctx.kv.get("key");
使用 Amber SDK 管理存储

对于文件和存储管理,请使用 Amber SDK (@autumnsgrove/lattice/amber),它基于 GroveStorage 提供 FileManager、QuotaManager、ExportManager 和 AddonManager:

import { FileManager, QuotaManager } from "@autumnsgrove/lattice/amber";

const fileManager = new FileManager(ctx.storage);
const quotaManager = new QuotaManager(ctx.storage);

// Type-safe file operations
const metadata = await fileManager.upload("user-123/photo.jpg", stream);
const quota = await quotaManager.getUsage("user-123");
类型安全的数据访问

使用来自 @autumnsgrove/lattice/server 的 Rootwork 工具,确保边界处的类型安全:

import { safeJsonParse, parseFormData } from "@autumnsgrove/lattice/server";
import { z } from "zod";

// Parse KV reads safely
const cached = await ctx.kv.get("config");
const config = safeJsonParse(cached, ConfigSchema);

// Parse form data with validation
const formData = await request.formData();
const data = parseFormData(formData, UploadSchema);

Pages 部署

# Deploy static site
wrangler pages deploy ./build --project-name=my-site

# With SvelteKit
pnpm add -D @sveltejs/adapter-cloudflare
pnpm build
wrangler pages deploy .svelte-kit/cloudflare

wrangler.toml 配置

name = "my-worker"
main = "src/index.js"
compatibility_date = "2024-01-01"

# Automatic resource provisioning (v4.45.0+)
kv_namespaces = [{ binding = "MY_KV" }]
r2_buckets = [{ binding = "MY_BUCKET" }]
d1_databases = [{ binding = "DB" }]

开发模式

# Local (simulated resources)
wrangler dev

# Remote (real Cloudflare resources)
wrangler dev --remote

Worker 密钥

# Set secret
wrangler secret put API_KEY --name my-worker

# Access in code
const apiKey = env.API_KEY;

最佳实践

应该 ✅
  • 先使用 wrangler dev 进行本地测试
  • 使用特定于环境的配置
  • 使用 wrangler tail 监控日志
  • 使用自动资源配置
不应该 ❌
  • 硬编码账户 ID
  • 跳过本地测试
  • 提交包含生产环境 ID 的 wrangler.toml
  • 忽视速率限制

常见模式

KV + R2 缓存
export default {
	async fetch(request, env) {
		const url = new URL(request.url);
		const cacheKey = url.pathname;

		// Check KV cache
		let content = await env.MY_KV.get(cacheKey);
		if (content) return new Response(content);

		// Fetch from R2
		const object = await env.MY_BUCKET.get(cacheKey.slice(1));
		if (!object) return new Response("Not found", { status: 404 });

		content = await object.text();

		// Cache in KV
		await env.MY_KV.put(cacheKey, content, { expirationTtl: 3600 });

		return new Response(content);
	},
};

相关资源

完整文档请参阅 AgentUsage/cloudflare_guide.md,其中包括:

  • MCP 服务配置
  • 高级 D1 模式
  • 生产环境部署策略
  • 故障排除指南

评论

支持 Markdown