关于 cloudflare-deployment
cloudflare-deployment 是用于在 Cloudflare 上配置和部署应用及资源的技能,面向使用 Workers、Pages、KV、R2、D1 和 Wrangler 的开发者,也介绍 Grove 基础设施抽象层。
主要功能
- 01初始化并部署 Workers
- 02部署 Pages 网站
- 03配置 KV、R2 和 D1
- 04管理 Worker 密钥与环境
- 05使用 Grove 基础设施接口
适用场景
- 01开发并部署 Cloudflare Worker
- 02通过 Pages 发布静态网站
- 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 | 对象存储 | 文件、图片、备份 |
| D1 | SQLite 数据库 | 结构化数据 |
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