docs/en/cloudflare-deploy.md
This project can be deployed as a Cloudflare Worker using the OpenNext adapter, giving you:
workers.dev hostingImportant Windows Note: OpenNext and Wrangler are not fully reliable on native Windows. Recommended options:
- Use GitHub Codespaces (works perfectly)
- OR use WSL (Linux)
Pure Windows builds may fail due to WASM file path issues.
npm install -D wrangler
npx wrangler login
Note: A payment method is only required if you want to enable R2 for ISR caching. Basic Workers deployment is free.
npm install
Cloudflare uses a different file for local testing.
.dev.vars (for Cloudflare local + deploy)cp env.example .dev.vars
Fill in your API keys and configuration.
.env.local also exists (for regular Next.js dev)cp env.example .env.local
Fill in the same values there.
If you don't need ISR caching, you can deploy without R2:
1. Use simple open-next.config.ts:
import { defineCloudflareConfig } from "@opennextjs/cloudflare/config"
export default defineCloudflareConfig({})
2. Use simple wrangler.jsonc (without r2_buckets):
{
"$schema": "node_modules/wrangler/config-schema.json",
"main": ".open-next/worker.js",
"name": "next-ai-draw-io-worker",
"compatibility_date": "2025-12-08",
"compatibility_flags": ["nodejs_compat", "global_fetch_strictly_public"],
"assets": {
"directory": ".open-next/assets",
"binding": "ASSETS"
},
"services": [
{
"binding": "WORKER_SELF_REFERENCE",
"service": "next-ai-draw-io-worker"
}
]
}
Skip to Step 4.
R2 enables Incremental Static Regeneration (ISR) caching. Requires a payment method on your Cloudflare account.
1. Create an R2 bucket in the Cloudflare Dashboard:
next-inc-cache2. Configure open-next.config.ts:
import { defineCloudflareConfig } from "@opennextjs/cloudflare/config"
import r2IncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/r2-incremental-cache"
export default defineCloudflareConfig({
incrementalCache: r2IncrementalCache,
})
3. Configure wrangler.jsonc (with R2):
{
"$schema": "node_modules/wrangler/config-schema.json",
"main": ".open-next/worker.js",
"name": "next-ai-draw-io-worker",
"compatibility_date": "2025-12-08",
"compatibility_flags": ["nodejs_compat", "global_fetch_strictly_public"],
"assets": {
"directory": ".open-next/assets",
"binding": "ASSETS"
},
"r2_buckets": [
{
"binding": "NEXT_INC_CACHE_R2_BUCKET",
"bucket_name": "next-inc-cache"
}
],
"services": [
{
"binding": "WORKER_SELF_REFERENCE",
"service": "next-ai-draw-io-worker"
}
]
}
Important: The
bucket_namemust exactly match the name you created in the Cloudflare dashboard.
Before your first deployment, you need a workers.dev subdomain.
Option 1: Via Cloudflare Dashboard (Recommended)
Visit: https://dash.cloudflare.com → Workers & Pages → Overview → Set up a subdomain
Option 2: During deploy
When you run npm run deploy, Wrangler may prompt:
Would you like to register a workers.dev subdomain? (Y/n)
Type Y and choose a subdomain name.
Note: In CI/CD or non-interactive environments, the prompt won't appear. Register via the dashboard first.
npm run deploy
What the script does:
Your app will be available at:
https://<worker-name>.<your-subdomain>.workers.dev
You need to register a workers.dev subdomainCause: No workers.dev subdomain registered for your account.
Fix: Go to https://dash.cloudflare.com → Workers & Pages → Set up a subdomain.
Please enable R2 through the Cloudflare DashboardCause: R2 is configured in wrangler.jsonc but not enabled on your account.
Fix: Either enable R2 (requires payment method) or use Option A (deploy without R2).
No R2 binding "NEXT_INC_CACHE_R2_BUCKET" foundCause: r2_buckets is missing from wrangler.jsonc.
Fix: Add the r2_buckets section or switch to Option A (without R2).
Can't set compatibility date in the futureCause: compatibility_date in wrangler config is set to a future date.
Fix: Change compatibility_date to today or an earlier date.
resvg.wasm?module (ENOENT)Cause: Windows filenames cannot include ?, but a wasm asset uses ?module in its filename.
Fix: Build/deploy on Linux (WSL, Codespaces, or CI).
Preview the Worker locally before deploying:
npm run preview
| Feature | Without R2 | With R2 |
|---|---|---|
| Cost | Free | Requires payment method |
| ISR Caching | No | Yes |
| Static Pages | Yes | Yes |
| API Routes | Yes | Yes |
| Setup Complexity | Simple | Moderate |
Choose without R2 for testing or simple apps. Choose with R2 for production apps that need ISR caching.