跳至主要內容

CloudflareDeployer

CloudflareDeployer 會封裝 Mastra 伺服器,並產生符合 Cloudflare wrangler 設定wrangler.jsonc 檔案。Cloudflare 會將其部署為 Cloudflare Worker。

安裝
「安裝」的直接連結

若要使用 CloudflareDeployer,請安裝 @mastra/deployer-cloudflare 套件:

npm install @mastra/deployer-cloudflare@latest

使用範例
「使用範例」的直接連結

匯入 CloudflareDeployer,並在 Mastra 設定中將其設為 deployer:

src/mastra/index.ts
import { Mastra } from '@mastra/core'
import { CloudflareDeployer } from '@mastra/deployer-cloudflare'

export const mastra = new Mastra({
deployer: new CloudflareDeployer({
name: 'your-project-name',
routes: [
{
pattern: 'example.com/*',
zone_name: 'example.com',
custom_domain: true,
},
],
vars: {
NODE_ENV: 'production',
},
d1_databases: [
{
binding: 'DB',
database_name: 'my-database',
database_id: 'd1-database-id',
preview_database_id: 'your-preview-database-id',
},
],
kv_namespaces: [
{
binding: 'CACHE',
id: 'kv-namespace-id',
},
],
}),
})

建構函式選項
「建構函式選項」的直接連結

CloudflareDeployer 建構函式接受與 wrangler.jsonc 相同的設定選項。所有可用選項請參閱 Wrangler 設定文件

Secret
「Secret」的直接連結

.env 檔案中的環境變數不會寫入 wrangler.jsonc,以免 secret 被提交至版本控制。

若要讓 Cloudflare Worker 使用 .env 中的 secret,請將它們上傳為 Cloudflare Secrets

npx wrangler secret bulk .env

CloudflareDeployer 建構函式中的 vars 僅應用於 NODE_ENV 等非敏感設定值。

建置輸出
「建置輸出」的直接連結

執行 mastra build 後,deployer 會產生符合 Cloudflare wrangler 設定wrangler.jsonc 檔案。該檔案會指向 .mastra/output 內的檔案,因此使用 Wrangler 部署前必須先執行 mastra build

Cloudflare binding
「Cloudflare binding」的直接連結

使用 Cloudflare deployer 時,可在 Mastra 設定檔中從 cloudflare:workers 匯入執行階段 binding。執行 mastra build 時,Mastra 會自動保留 cloudflare:workers 這類以通訊協定為基礎的執行階段匯入,不會嘗試將其安裝為 npm 相依套件。

src/mastra/index.ts
import { env } from 'cloudflare:workers'
import { Mastra } from '@mastra/core'
import { registerApiRoute } from '@mastra/core/server'
import { CloudflareDeployer } from '@mastra/deployer-cloudflare'

export const mastra = new Mastra({
deployer: new CloudflareDeployer({
name: 'my-worker',
kv_namespaces: [{ binding: 'CACHE', id: 'your-kv-namespace-id' }],
}),
server: {
apiRoutes: [
registerApiRoute('/bindings', {
method: 'GET',
requiresAuth: false,
handler: async c => {
await env.CACHE.put('status', 'ok')
return c.json({ status: await env.CACHE.get('status') })
},
}),
],
},
})
請將 binding 直接放在 new Mastra({...})

Mastra 的 Babel 外掛會延後執行 new Mastra(...),讓執行時可使用 env。該呼叫以外的程式碼會在模組載入時求值,此時 env 尚未填入內容。

// ✅ Works — binding is inside new Mastra(), so it's deferred
export const mastra = new Mastra({
storage: new D1Store({ binding: env.DB }),
})

// ❌ Breaks — env.DB is undefined at module load
const storage = new D1Store({ binding: env.DB })
export const mastra = new Mastra({ storage })