diff --git a/.github/workflows/api-links-crawl.yml b/.github/workflows/api-links-crawl.yml deleted file mode 100644 index f15f048411dd81..00000000000000 --- a/.github/workflows/api-links-crawl.yml +++ /dev/null @@ -1,53 +0,0 @@ -name: Crawl API docs links - -# **What it does**: Regularly audits API links in our documentation. -# **Why we have it**: It's too burdensome to check on every commit like we do for internal links. -# **Who does it impact**: PCX team - -on: - schedule: - - cron: "0 0 * * 0" # Run at 00:00 UTC every Sunday - workflow_dispatch: - -jobs: - compile: - name: Compiles - runs-on: ubuntu-22.04 - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 1 - - uses: actions/setup-node@v4 - with: - node-version: 20 - - - name: Get npm cache directory - id: npm-cache-dir - shell: bash - run: echo "dir=$(npm config get cache)" >> ${GITHUB_OUTPUT} - - - uses: actions/cache@v4 - id: npm-cache - with: - path: ${{ steps.npm-cache-dir.outputs.dir }} - key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-node- - - - name: Install dependencies - run: npm install @actions/core@1 puppeteer@22 - - - name: Run API docs link checker - id: check-api-links - run: npm run crawl-api-links - - - name: Create issue - env: - EXPORTED_VARIABLE: ${{ steps.check-api-links.outputs.brokenLinks }} - if: env.EXPORTED_VARIABLE - run: | - # Create the issue and reference the exported variable - curl --silent -X POST -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \ - -H "Accept: application/vnd.github+json" \ - "https://api.github.com/repos/cloudflare/cloudflare-docs/issues" \ - -d "{\"title\": \"Broken API docs links\", \"body\": \"The following API doc links are broken: ${EXPORTED_VARIABLE}\", \"assignees\": [\"haleycode\"]}" diff --git a/astro.config.ts b/astro.config.ts index f0d9bf393ee5e1..91ddced3bfd66e 100644 --- a/astro.config.ts +++ b/astro.config.ts @@ -82,6 +82,7 @@ export default defineConfig({ sidebar, customCss: [ "./src/asides.css", + "./src/badges.css", "./src/code.css", "./src/footnotes.css", "./src/headings.css", @@ -136,6 +137,11 @@ export default defineConfig({ }), icon(), sitemap({ + filter(page) { + return !page.startsWith( + "https://developers.cloudflare.com/style-guide/", + ); + }, serialize(item) { item.lastmod = new Date().toISOString(); return item; diff --git a/bin/crawl-api-links.js b/bin/crawl-api-links.js deleted file mode 100644 index 09c2885e094e0d..00000000000000 --- a/bin/crawl-api-links.js +++ /dev/null @@ -1,111 +0,0 @@ -import puppeteer from "puppeteer"; -import core from "@actions/core"; - -const navigationTimeout = 120000; // Set the navigation timeout to 120 seconds (120,000 milliseconds) - -function arrayToHTMLList(array) { - let html = ""; - - return html; -} - -async function checkLinks() { - const browser = await puppeteer.launch({ - headless: "new", - }); - const page = await browser.newPage(); - - // skip image requests - await page.setRequestInterception(true); - page.on("request", (request) => { - if (request.resourceType() === "image") request.abort(); - else request.continue(); - }); - - const sitemapUrl = "https://developers.cloudflare.com/sitemap-0.xml"; - await page.goto(sitemapUrl, { timeout: navigationTimeout }); - - const sitemapLinks = await page.$$eval("url loc", (elements) => - elements.map((el) => el.textContent), - ); - - const visitedLinks = []; - const brokenLinks = []; - - for (const link of sitemapLinks) { - if (!link) { - continue; // Skip if the link is empty - } - - try { - await page.goto(link, { - waitUntil: "networkidle0", - timeout: navigationTimeout, - }); - } catch (e) { - console.log( - ` WARNING: Error loading Dev Docs page: ${e.message}... Skipping.`, - ); - continue; - } - - const pageLinks = await page.$$eval("a", (elements) => - elements.map((el) => el.href), - ); - - for (const pageLink of pageLinks) { - if (!pageLink || visitedLinks.includes(pageLink)) { - continue; // Skip if the pageLink is empty or has already been visited - } - - if ( - pageLink.includes("developers.cloudflare.com/api/resources/") || - pageLink.startsWith("/api/resources/") - ) { - console.log(`Evaluating link: ${pageLink}`); - - let response = null; - - try { - response = await page.goto(pageLink, { - waitUntil: "networkidle0", - timeout: navigationTimeout, - }); - visitedLinks.push(pageLink); - } catch (e) { - console.log( - ` WARNING: Error loading API page: ${e.message}... Skipping.`, - ); - continue; - } - - if (response) { - if (response.status() === 404) { - brokenLinks.push(pageLink); - } - } else { - console.log(" WARNING: Didn't receive a response... skipping."); - } - } - } - } - - await browser.close(); - console.log("Broken links:"); - console.log(brokenLinks); - if (brokenLinks.length > 0) { - core.setOutput("brokenLinks", arrayToHTMLList(brokenLinks)); - } - process.exit(0); -} - -checkLinks().catch((error) => { - console.error(error); - process.exit(1); -}); diff --git a/package-lock.json b/package-lock.json index 68a1c9c02feb74..0db778b1cb6992 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,18 +17,18 @@ "@astrojs/tailwind": "5.1.4", "@cloudflare/puppeteer": "0.0.14", "@cloudflare/vitest-pool-workers": "0.6.0", - "@cloudflare/workers-types": "4.20250109.0", + "@cloudflare/workers-types": "4.20250121.0", "@codingheads/sticky-header": "1.0.2", "@expressive-code/plugin-collapsible-sections": "0.38.3", "@iarna/toml": "2.2.5", - "@iconify-json/material-symbols": "1.2.12", + "@iconify-json/material-symbols": "1.2.13", "@stoplight/json-schema-tree": "4.0.0", "@types/hast": "3.0.4", "@types/he": "1.2.3", - "@types/node": "22.10.7", + "@types/node": "22.12.0", "@types/react": "19.0.7", "@types/react-dom": "19.0.3", - "@typescript-eslint/parser": "8.20.0", + "@typescript-eslint/parser": "8.21.0", "algoliasearch": "5.19.0", "astro": "4.16.18", "astro-breadcrumbs": "3.3.1", @@ -59,7 +59,7 @@ "prettier-plugin-astro": "0.14.1", "prettier-plugin-tailwindcss": "0.6.9", "pretty-bytes": "6.1.1", - "puppeteer": "24.1.0", + "puppeteer": "24.1.1", "react": "19.0.0", "react-dom": "19.0.0", "react-markdown": "9.0.3", @@ -2251,9 +2251,9 @@ } }, "node_modules/@cloudflare/workers-types": { - "version": "4.20250109.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20250109.0.tgz", - "integrity": "sha512-Y1zgSaEOOevl9ORpzgMcm4j535p3nK2lrblHHvYM2yxR50SBKGh+wvkRFAIxWRfjUGZEU+Fp6923EGioDBbobA==", + "version": "4.20250121.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20250121.0.tgz", + "integrity": "sha512-2bBosmudcwvUOKzuCL/Jum18LDh3QoU0QnTNMXIgcVwuq3LaNzyZnOW14bFXPhLU/84ZjNO3zO5R/U11Zgag2Q==", "dev": true, "license": "MIT OR Apache-2.0" }, @@ -3259,9 +3259,9 @@ "license": "ISC" }, "node_modules/@iconify-json/material-symbols": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@iconify-json/material-symbols/-/material-symbols-1.2.12.tgz", - "integrity": "sha512-2p2T13Kccy7R2HNbdiVsIcHxjp4s9a+iKlfbtt29hldG1pVNaPIlMALNA9bjdEwPjwsVFe06INCbjCRc68JysQ==", + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@iconify-json/material-symbols/-/material-symbols-1.2.13.tgz", + "integrity": "sha512-7sVem5paCT87e1Hvk9tA2CHcmTSCwlJj6UlhouyNfgAqoC0W/Yj2vA9NFOdjviHgvoHT9kDCEfKxT5tpEMH6qA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -5839,9 +5839,9 @@ } }, "node_modules/@types/node": { - "version": "22.10.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", - "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", + "version": "22.12.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.12.0.tgz", + "integrity": "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==", "dev": true, "license": "MIT", "dependencies": { @@ -5979,16 +5979,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.20.0.tgz", - "integrity": "sha512-gKXG7A5HMyjDIedBi6bUrDcun8GIjnI8qOwVLiY3rx6T/sHP/19XLJOnIq/FgQvWLHja5JN/LSE7eklNBr612g==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.21.0.tgz", + "integrity": "sha512-Wy+/sdEH9kI3w9civgACwabHbKl+qIOu0uFZ9IMKzX3Jpv9og0ZBJrZExGrPpFAY7rWsXuxs5e7CPPP17A4eYA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.20.0", - "@typescript-eslint/types": "8.20.0", - "@typescript-eslint/typescript-estree": "8.20.0", - "@typescript-eslint/visitor-keys": "8.20.0", + "@typescript-eslint/scope-manager": "8.21.0", + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/typescript-estree": "8.21.0", + "@typescript-eslint/visitor-keys": "8.21.0", "debug": "^4.3.4" }, "engines": { @@ -6003,6 +6003,83 @@ "typescript": ">=4.8.4 <5.8.0" } }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz", + "integrity": "sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/visitor-keys": "8.21.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.21.0.tgz", + "integrity": "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.21.0.tgz", + "integrity": "sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/visitor-keys": "8.21.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz", + "integrity": "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.21.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/scope-manager": { "version": "8.20.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.20.0.tgz", @@ -16251,18 +16328,18 @@ } }, "node_modules/puppeteer": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.1.0.tgz", - "integrity": "sha512-F+3yKILaosLToT7amR7LIkTKkKMR0EGQPjFBch+MtgS8vRPS+4cPnLJuXDVTfCj2NqfrCnShtOr7yD+9dEgHRQ==", + "version": "24.1.1", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.1.1.tgz", + "integrity": "sha512-fuhceZ5HZuDXVuaMIRxUuDHfCJLmK0pXh8FlzVQ0/+OApStevxZhU5kAVeYFOEqeCF5OoAyZjcWbdQK27xW/9A==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { "@puppeteer/browsers": "2.7.0", - "chromium-bidi": "0.12.0", + "chromium-bidi": "1.1.0", "cosmiconfig": "^9.0.0", "devtools-protocol": "0.0.1380148", - "puppeteer-core": "24.1.0", + "puppeteer-core": "24.1.1", "typed-query-selector": "^2.12.0" }, "bin": { @@ -16273,14 +16350,14 @@ } }, "node_modules/puppeteer-core": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.1.0.tgz", - "integrity": "sha512-ReefWoQgqdyl67uWEBy/TMZ4mAB7hP0JB5HIxSE8B1ot/4ningX1gmzHCOSNfMbTiS/VJHCvaZAe3oJTXph7yw==", + "version": "24.1.1", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.1.1.tgz", + "integrity": "sha512-7FF3gq6bpIsbq3I8mfbodXh3DCzXagoz3l2eGv1cXooYU4g0P4mcHQVHuBD4iSZPXNg8WjzlP5kmRwK9UvwF0A==", "dev": true, "license": "Apache-2.0", "dependencies": { "@puppeteer/browsers": "2.7.0", - "chromium-bidi": "0.11.0", + "chromium-bidi": "1.1.0", "debug": "^4.4.0", "devtools-protocol": "0.0.1380148", "typed-query-selector": "^2.12.0", @@ -16314,14 +16391,14 @@ } }, "node_modules/puppeteer-core/node_modules/chromium-bidi": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.11.0.tgz", - "integrity": "sha512-6CJWHkNRoyZyjV9Rwv2lYONZf1Xm0IuDyNq97nwSsxxP3wf5Bwy15K5rOvVKMtJ127jJBmxFUanSAOjgFRxgrA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-1.1.0.tgz", + "integrity": "sha512-HislCEczCuamWm3+55Lig9XKmMF13K+BGKum9rwtDAzgUAHT4h5jNwhDmD4U20VoVUG8ujnv9UZ89qiIf5uF8w==", "dev": true, "license": "Apache-2.0", "dependencies": { "mitt": "3.0.1", - "zod": "3.23.8" + "zod": "3.24.1" }, "peerDependencies": { "devtools-protocol": "*" @@ -16404,16 +16481,6 @@ "bare-path": "^3.0.0" } }, - "node_modules/puppeteer-core/node_modules/zod": { - "version": "3.23.8", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", - "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, "node_modules/puppeteer/node_modules/@puppeteer/browsers": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.7.0.tgz", @@ -16438,9 +16505,9 @@ } }, "node_modules/puppeteer/node_modules/chromium-bidi": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.12.0.tgz", - "integrity": "sha512-xzXveJmX826GGq1MeE5okD8XxaDT8172CXByhFJ687eY65rbjOIebdbUuQh+jXKaNyGKI14Veb3KjLLmSueaxA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-1.1.0.tgz", + "integrity": "sha512-HislCEczCuamWm3+55Lig9XKmMF13K+BGKum9rwtDAzgUAHT4h5jNwhDmD4U20VoVUG8ujnv9UZ89qiIf5uF8w==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -19655,6 +19722,31 @@ "typescript": ">=4.8.4 <5.8.0" } }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/parser": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.20.0.tgz", + "integrity": "sha512-gKXG7A5HMyjDIedBi6bUrDcun8GIjnI8qOwVLiY3rx6T/sHP/19XLJOnIq/FgQvWLHja5JN/LSE7eklNBr612g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.20.0", + "@typescript-eslint/types": "8.20.0", + "@typescript-eslint/typescript-estree": "8.20.0", + "@typescript-eslint/visitor-keys": "8.20.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, "node_modules/ufo": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", diff --git a/package.json b/package.json index f736454641c78a..7ebcc4e85c54b4 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,6 @@ "check": "npm run check:astro && npm run check:worker", "check:astro": "npm run sync && astro check", "check:worker": "npm run build:worker && npx tsc --noEmit -p ./worker/tsconfig.json", - "crawl-api-links": "node bin/crawl-api-links.js", "dev": "npx astro dev", "format": "npm run format:core && npm run format:data", "format:core": "npx prettier --write \"**/*.{js,jsx,ts,tsx,mjs,css}\"", @@ -36,18 +35,18 @@ "@astrojs/tailwind": "5.1.4", "@cloudflare/puppeteer": "0.0.14", "@cloudflare/vitest-pool-workers": "0.6.0", - "@cloudflare/workers-types": "4.20250109.0", + "@cloudflare/workers-types": "4.20250121.0", "@codingheads/sticky-header": "1.0.2", "@expressive-code/plugin-collapsible-sections": "0.38.3", "@iarna/toml": "2.2.5", - "@iconify-json/material-symbols": "1.2.12", + "@iconify-json/material-symbols": "1.2.13", "@stoplight/json-schema-tree": "4.0.0", "@types/hast": "3.0.4", "@types/he": "1.2.3", - "@types/node": "22.10.7", + "@types/node": "22.12.0", "@types/react": "19.0.7", "@types/react-dom": "19.0.3", - "@typescript-eslint/parser": "8.20.0", + "@typescript-eslint/parser": "8.21.0", "algoliasearch": "5.19.0", "astro": "4.16.18", "astro-breadcrumbs": "3.3.1", @@ -78,7 +77,7 @@ "prettier-plugin-astro": "0.14.1", "prettier-plugin-tailwindcss": "0.6.9", "pretty-bytes": "6.1.1", - "puppeteer": "24.1.0", + "puppeteer": "24.1.1", "react": "19.0.0", "react-dom": "19.0.0", "react-markdown": "9.0.3", diff --git a/public/_redirects b/public/_redirects index 302b51524fb1e9..8f58a33fa3c29f 100644 --- a/public/_redirects +++ b/public/_redirects @@ -290,7 +290,7 @@ /d1/reference/client-api/ /d1/worker-api/ 301 /d1/reference/environments/ /d1/configuration/environments/ 301 /d1/reference/metrics-analytics/ /d1/observability/metrics-analytics/ 301 -/d1/reference/wrangler-commands/ / /d1/wrangler-commands/ 301 +/d1/reference/wrangler-commands/ /d1/wrangler-commands/ 301 /d1/how-to/ /d1/best-practices/ 301 /d1/how-to/query-databases/ /d1/best-practices/query-d1/ 301 /d1/how-to/using-indexes/ /d1/best-practices/use-indexes/ 301 @@ -399,6 +399,7 @@ /durable-objects/api/transactional-storage-api/ /durable-objects/api/storage-api/ 301 /durable-objects/platform/changelog/ /durable-objects/changelog/ 301 /durable-objects/glossary/ /durable-objects/reference/glossary/ 301 +/durable-objects/get-started/walkthrough/ /durable-objects/get-started/tutorial/ 301 # email-routing /email-routing/enable-email-routing/ /email-routing/get-started/enable-email-routing/ 301 @@ -448,7 +449,7 @@ /fundamentals/get-started/how-cloudflare-works/ /fundamentals/concepts/how-cloudflare-works/ 301 /fundamentals/get-started/cloudflare-cookies/ /fundamentals/reference/policies-compliances/cloudflare-cookies/ 301 /fundamentals/get-started/google-analytics/ /fundamentals/reference/google-analytics/ 301 -/fundamentals/get-started/http-request-headers/ /fundamentals/reference/http-request-headers/ 301 +/fundamentals/get-started/http-request-headers/ /fundamentals/reference/http-headers/ 301 /fundamentals/get-started/network-ports/ /fundamentals/reference/network-ports/ 301 /fundamentals/get-started/basic-tasks/improve-seo/ /fundamentals/basic-tasks/improve-seo/ 301 /fundamentals/get-started/basic-tasks/allow-cloudflare-ip-addresses/ /fundamentals/concepts/cloudflare-ip-addresses/ 301 @@ -463,6 +464,7 @@ /fundamentals/internet/ /fundamentals/concepts/the-internet/ 301 /fundamentals/reference/developer-spotlight/ /developer-spotlight/ 301 /fundamentals/reference/the-internet/ /fundamentals/concepts/the-internet/ 301 +/fundamentals/reference/http-request-headers/ /fundamentals/reference/http-headers/ 301 /fundamentals/security/browser-integrity-check/ /waf/tools/browser-integrity-check/ 301 /fundamentals/signed-exchanges/ /speed/optimization/other/signed-exchanges/ 301 /fundamentals/signed-exchanges/amp-real-ulr/ /speed/optimization/other/amp-real-url/ 301 @@ -1563,6 +1565,7 @@ /workers-ai/configuration/workers-ai-sdk/ /workers-ai/configuration/bindings/ 301 /workers-ai/tutorials/creating-a-recommendation-api/ /developer-spotlight/tutorials/creating-a-recommendation-api/ 301 /workers/observability/baselime-integration/ /workers/observability/integrations/baselime-integration/ 301 +/workers-ai/tutorials/image-generator-flux/ /workers-ai/tutorials/image-generation-playground/ 301 # workers KV /kv/platform/environments/ /kv/reference/environments/ 301 diff --git a/public/cloudflare-one/static/list-test.csv b/public/cloudflare-one/static/list-test.csv index 0c976b5cde3f87..52d09011a5038e 100644 --- a/public/cloudflare-one/static/list-test.csv +++ b/public/cloudflare-one/static/list-test.csv @@ -1,2 +1,4 @@ -https://example.com -https://example1.com +value,description +192.0.2.0/24,This is an IP address range in CIDR format +198.51.100.0/24,This is also an IP address range +203.0.113.0/24,This is the third IP address range diff --git a/public/workers-ai-notebooks/cloudflare-workers-ai.ipynb b/public/workers-ai-notebooks/cloudflare-workers-ai.ipynb index df1d53064a58f2..5afef79526c36c 100644 --- a/public/workers-ai-notebooks/cloudflare-workers-ai.ipynb +++ b/public/workers-ai-notebooks/cloudflare-workers-ai.ipynb @@ -29,9 +29,9 @@ "Requirement already satisfied: urllib3<3,>=1.21.1 in /Users/craig/Code/scratch/test-unum-over-bias/venv/lib/python3.12/site-packages (from requests) (2.2.1)\n", "Requirement already satisfied: certifi>=2017.4.17 in /Users/craig/Code/scratch/test-unum-over-bias/venv/lib/python3.12/site-packages (from requests) (2024.2.2)\n", "\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m24.0\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.1.2\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m24.0\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.3.1\u001b[0m\n", "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", - "Requirement already satisfied: cloudflare in /Users/craig/Code/scratch/test-unum-over-bias/venv/lib/python3.12/site-packages (3.0.0b7)\n", + "Requirement already satisfied: cloudflare in /Users/craig/Code/scratch/test-unum-over-bias/venv/lib/python3.12/site-packages (3.1.0)\n", "Requirement already satisfied: anyio<5,>=3.5.0 in /Users/craig/Code/scratch/test-unum-over-bias/venv/lib/python3.12/site-packages (from cloudflare) (4.3.0)\n", "Requirement already satisfied: distro<2,>=1.7.0 in /Users/craig/Code/scratch/test-unum-over-bias/venv/lib/python3.12/site-packages (from cloudflare) (1.9.0)\n", "Requirement already satisfied: httpx<1,>=0.23.0 in /Users/craig/Code/scratch/test-unum-over-bias/venv/lib/python3.12/site-packages (from cloudflare) (0.27.0)\n", @@ -45,7 +45,7 @@ "Requirement already satisfied: annotated-types>=0.4.0 in /Users/craig/Code/scratch/test-unum-over-bias/venv/lib/python3.12/site-packages (from pydantic<3,>=1.9.0->cloudflare) (0.6.0)\n", "Requirement already satisfied: pydantic-core==2.18.1 in /Users/craig/Code/scratch/test-unum-over-bias/venv/lib/python3.12/site-packages (from pydantic<3,>=1.9.0->cloudflare) (2.18.1)\n", "\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m24.0\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.1.2\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m24.0\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.3.1\u001b[0m\n", "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n" ] } @@ -53,7 +53,7 @@ "source": [ "import sys\n", "!{sys.executable} -m pip install python-dotenv requests\n", - "!{sys.executable} -m pip install --pre cloudflare" + "!{sys.executable} -m pip install cloudflare" ] }, { @@ -173,27 +173,33 @@ { "data": { "text/markdown": [ - "Using keyboard shortcuts to execute cells in Jupyter Notebook can save you a lot of time and increase your productivity!\n", + "**Using Keyboard Shortcuts to Execute Cells in Jupyter Notebooks**\n", + "===============================================================\n", "\n", - "Here are some keyboard shortcuts to execute cells in Jupyter Notebook:\n", + "Executing cells in Jupyter Notebooks can be done quickly and efficiently using various keyboard shortcuts, saving you time and effort. Here are the shortcuts you can use:\n", "\n", - "**Mac Users:**\n", + "**Mac**\n", "\n", - "* `Cmd + Enter` (⌘ + Enter) to execute a cell\n", - "* `Shift + Enter` to execute a cell and move to the next cell below\n", - "* `Cmd + Shift + Enter` (⌘ + Shift + Enter) to execute a cell and move to the next cell below without closing the output\n", + "* **Shift + Enter**: Execute the current cell and insert a new cell below.\n", + "* **Ctrl + Enter**: Execute the current cell and insert a new cell below, without creating a new output display.\n", "\n", - "**Windows Users:**\n", + "**Windows/Linux**\n", "\n", - "* `Ctrl + Enter` to execute a cell\n", - "* `Shift + Enter` to execute a cell and move to the next cell below\n", - "* `Ctrl + Shift + Enter` to execute a cell and move to the next cell below without closing the output\n", + "* **Shift + Enter**: Execute the current cell and insert a new cell below.\n", + "* **Ctrl + Enter**: Execute the current cell and move to the next cell.\n", "\n", - "These keyboard shortcuts are Windows-compatible, so you can use them in Jupyter Notebook on your Windows machine!\n", + "**Additional Shortcuts**\n", "\n", - "You can also use the `Escape` key to clear the output of a cell, and `Alt + Enter` to execute a cell recursively (i.e., execute all cells below the current cell).\n", + "* **Alt + Enter**: Execute the current cell and create a new output display below (Mac), or move to the next cell (Windows/Linux).\n", + "* **Ctrl + Shift + Enter**: Execute the current cell and create a new output display below (Mac), or create a new cell below (Windows/Linux).\n", "\n", - "Remember to customize your Jupyter Notebook settings to fit your workflow and preferences!" + "**Tips and Tricks**\n", + "\n", + "* You can also use the **Run Cell** button in the Jupyter Notebook toolbar, or the **Run** menu option (macOS) or **Run -> Run Cell** (Windows/Linux).\n", + "* To execute a selection of cells, use **Shift + Alt + Enter** (Mac) or **Shift + Ctrl + Enter** (Windows/Linux).\n", + "* To execute a cell and move to the next cell, use **Ctrl + Shift + Enter** (all platforms).\n", + "\n", + "By using these keyboard shortcuts, you'll be able to work more efficiently and quickly in your Jupyter Notebooks. Happy coding!" ], "text/plain": [ "" @@ -238,7 +244,7 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "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Ra1R55iX5enx+fMXr376089+98eXH72oZlkY3djtZHSa9HJmT47OUChyRKYQQhSyJJrAamI0QKobg4v+ftcNoyNDWog0ZpkqjEKlhhATEwtqNZHlEVBcYu4jEPqEO88751a7ftO2q/Vm27Y5qYvj5YvnT7Kiur/fhq7f3d43qzV4DwJAarpuQMYujs4+evbkxZOLy5OTxXyeZ1YRAqQkCeIQ47od393tvr1af//+ftd2eWFfnJ98+vTk5eXxk8XsKMtmZCygYkQWFvYcmzjede31bne73t5td+tt02y6cdu5bowuoIjSaO3eL0prpWhaV6BDoFEy9bsIH5LxZKAjnFJywXeD78axG33nfTs4H4LzDoFzrXOlISOclIenedqUUAgZk4+pHdy2bZuudT7YLJvNqvlsVpWlNZlCPUXCJBwlsTASGkNKK23shEVM02T84PdyoCXt5xgAe1GHCdkGQppo5SwJBEmjUgoQrMo/fnJZl9l8uTw6Xi6Xp99++937t1f3t/dN2wVr9ep+LYljrI0ynlPvRmS0VnGKVVU+fXZhbbZab25ubpq2G90YIytQSSRy4CjehRhdSgkItSFNaloQBuAQJ4XNyU0miEz4yeNbfyLRkwgkmUjyxMwhRQjOg6SQUmSlVZbZDhCY+65f36+2m+3R8bIoypOzk67v7jn6zoUYCPQBOOXIAklIHjBW/I3H71GcPpTl00+myCGkvne7pt81Xdv2brIDQQEihZqZmSM85GGAR6oP+Gtx/8PbfdjifXhveTSTENhvKSMBsnAIPqUECEZrRQoRtTYxRUFILIiAirQ24pkBJQi7lFxMeRKBwmbLk2VmdBxdZCGltNGAMmTIio0rRx9cl8chD51J7SDDCN4Je0gRIILwlNf2sYsDAENSkDSQdpvm+us3m9uNEMzqss7Km/v7trOgwvxorihLgder9f/2l//hz//lvw7bWwAPgJvt+z//87uvvvrVq//p1e//8e/+1//H//rv/qd/5+LkWAMhYKbtJx9/fHp89OzJ+fPLp3/18Yuf//XffP/t929fv5fIU0kEsH/iDqq3CBppZs1FVl7O8tPKLgpTGELiyGH0Yed960Izps7HbYxbl5oEjh+79v72lwKYk3l+Ur+6KD55Qk9P5WgmeQaojFPQjul2039fDda4b6/4roP4mwJz/5HXo5/c3xDT3TLt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", "text/plain": [ "" ] @@ -287,7 +293,7 @@ "name": "stdout", "output_type": "stream", "text": [ - " The image features a display of colorful, glowing lava lamps. There are numerous lava lamps of various sizes and colors, arranged in a visually appealing manner. The lamps are placed in a row, with some positioned closer to the front and others further back. The vibrant colors and captivating glow of the lava lamps create an eye-catching and lively scene.\n" + " The image features a display of various colored lava lamps. There are at least 14 lava lamps in the scene, each with a different color and design. The lamps are arranged in a visually appealing manner, with some placed closer to the foreground and others further back. The display creates an eye-catching and vibrant atmosphere, showcasing the diverse range of lava lamps available.\n" ] } ], @@ -363,6 +369,7 @@ "text/plain": [ "{'text': \"Hello there, I'm making a recording for a Jupiter notebook. That's a Python notebook, Jupiter, J-U-P-Y-T-E-R. Not to be confused with the planet. Anyways, let me hear, I'm gonna talk a little bit, I'm gonna make a little bit of noise, say some hard words, I'm gonna say Kubernetes, I'm not actually even talking about Kubernetes, I just wanna see if I can do Kubernetes. Anyway, this is a test of transcription and let's see how we're dead.\",\n", " 'word_count': 84,\n", + " 'vtt': \"WEBVTT\\n\\n00.280 --> 01.840\\nHello there, I'm making a\\n\\n01.840 --> 04.060\\nrecording for a Jupiter notebook.\\n\\n04.060 --> 06.440\\nThat's a Python notebook, Jupiter,\\n\\n06.440 --> 07.720\\nJ -U -P -Y -T\\n\\n07.720 --> 09.420\\n-E -R. Not to be\\n\\n09.420 --> 12.140\\nconfused with the planet. Anyways,\\n\\n12.140 --> 12.940\\nlet me hear, I'm gonna\\n\\n12.940 --> 13.660\\ntalk a little bit, I'm\\n\\n13.660 --> 14.600\\ngonna make a little bit\\n\\n14.600 --> 16.180\\nof noise, say some hard\\n\\n16.180 --> 17.540\\nwords, I'm gonna say Kubernetes,\\n\\n17.540 --> 18.420\\nI'm not actually even talking\\n\\n18.420 --> 19.500\\nabout Kubernetes, I just wanna\\n\\n19.500 --> 20.300\\nsee if I can do\\n\\n20.300 --> 22.120\\nKubernetes. Anyway, this is a\\n\\n22.120 --> 24.080\\ntest of transcription and let's\\n\\n24.080 --> 26.280\\nsee how we're dead.\",\n", " 'words': [{'word': 'Hello',\n", " 'start': 0.2800000011920929,\n", " 'end': 0.7400000095367432},\n", @@ -454,8 +461,7 @@ " {'word': 'see', 'start': 24.079999923706055, 'end': 24.299999237060547},\n", " {'word': 'how', 'start': 24.299999237060547, 'end': 24.559999465942383},\n", " {'word': \"we're\", 'start': 24.559999465942383, 'end': 24.799999237060547},\n", - " {'word': 'dead.', 'start': 24.799999237060547, 'end': 26.280000686645508}],\n", - " 'vtt': \"WEBVTT\\n\\n00.280 --> 01.840\\nHello there, I'm making a\\n\\n01.840 --> 04.060\\nrecording for a Jupiter notebook.\\n\\n04.060 --> 06.440\\nThat's a Python notebook, Jupiter,\\n\\n06.440 --> 07.720\\nJ -U -P -Y -T\\n\\n07.720 --> 09.420\\n-E -R. Not to be\\n\\n09.420 --> 12.140\\nconfused with the planet. Anyways,\\n\\n12.140 --> 12.940\\nlet me hear, I'm gonna\\n\\n12.940 --> 13.660\\ntalk a little bit, I'm\\n\\n13.660 --> 14.600\\ngonna make a little bit\\n\\n14.600 --> 16.180\\nof noise, say some hard\\n\\n16.180 --> 17.540\\nwords, I'm gonna say Kubernetes,\\n\\n17.540 --> 18.420\\nI'm not actually even talking\\n\\n18.420 --> 19.500\\nabout Kubernetes, I just wanna\\n\\n19.500 --> 20.300\\nsee if I can do\\n\\n20.300 --> 22.120\\nKubernetes. Anyway, this is a\\n\\n22.120 --> 24.080\\ntest of transcription and let's\\n\\n24.080 --> 26.280\\nsee how we're dead.\"}" + " {'word': 'dead.', 'start': 24.799999237060547, 'end': 26.280000686645508}]}" ] }, "execution_count": 10, @@ -597,11 +603,11 @@ { "data": { "text/plain": [ - "[TextClassification(label='BURRITO', score=0.9999678134918213),\n", - " TextClassification(label='GUACAMOLE', score=8.525597877451219e-06),\n", - " TextClassification(label='BAGEL', score=4.702816113422159e-06),\n", - " TextClassification(label='SPATULA', score=4.094248197361594e-06),\n", - " TextClassification(label='POTPIE', score=3.0966698432166595e-06)]" + "[TextClassification(label='BURRITO', score=0.9999679327011108),\n", + " TextClassification(label='GUACAMOLE', score=8.516660273016896e-06),\n", + " TextClassification(label='BAGEL', score=4.689153229264775e-06),\n", + " TextClassification(label='SPATULA', score=4.075985089002643e-06),\n", + " TextClassification(label='POTPIE', score=3.0849002996546915e-06)]" ] }, "execution_count": 13, diff --git a/src/assets/images/hyperdrive/changelog/hyperdrive-edge-caching-metrics.png b/src/assets/images/hyperdrive/changelog/hyperdrive-edge-caching-metrics.png new file mode 100644 index 00000000000000..e05d2d05ee5a87 Binary files /dev/null and b/src/assets/images/hyperdrive/changelog/hyperdrive-edge-caching-metrics.png differ diff --git a/src/assets/images/hyperdrive/configuration/hyperdrive-private-database-architecture.png b/src/assets/images/hyperdrive/configuration/hyperdrive-private-database-architecture.png new file mode 100644 index 00000000000000..db4f833a25dcc8 Binary files /dev/null and b/src/assets/images/hyperdrive/configuration/hyperdrive-private-database-architecture.png differ diff --git a/src/assets/images/hyperdrive/configuration/hyperdrive-private-database-automatic-configuration.png b/src/assets/images/hyperdrive/configuration/hyperdrive-private-database-automatic-configuration.png new file mode 100644 index 00000000000000..f55069a12e0e03 Binary files /dev/null and b/src/assets/images/hyperdrive/configuration/hyperdrive-private-database-automatic-configuration.png differ diff --git a/src/assets/images/magic-transit/tunnel-health-check-packets.png b/src/assets/images/magic-transit/tunnel-health-check-packets.png deleted file mode 100644 index 060168d881b01e..00000000000000 Binary files a/src/assets/images/magic-transit/tunnel-health-check-packets.png and /dev/null differ diff --git a/src/assets/images/pages/configuration/ghpreviewurls.png b/src/assets/images/pages/configuration/ghpreviewurls.png new file mode 100644 index 00000000000000..e0b7abe644f943 Binary files /dev/null and b/src/assets/images/pages/configuration/ghpreviewurls.png differ diff --git a/src/assets/images/workers/platform/ci-cd/gh-status-check-runs.png b/src/assets/images/workers/platform/ci-cd/gh-status-check-runs.png new file mode 100644 index 00000000000000..681a2add78334d Binary files /dev/null and b/src/assets/images/workers/platform/ci-cd/gh-status-check-runs.png differ diff --git a/src/assets/images/workers/platform/ci-cd/github-repository-access.png b/src/assets/images/workers/platform/ci-cd/github-repository-access.png new file mode 100644 index 00000000000000..a6d55f7d41d615 Binary files /dev/null and b/src/assets/images/workers/platform/ci-cd/github-repository-access.png differ diff --git a/src/assets/images/workers/platform/ci-cd/gl-commit-status.png b/src/assets/images/workers/platform/ci-cd/gl-commit-status.png new file mode 100644 index 00000000000000..e4d0c4890b2b40 Binary files /dev/null and b/src/assets/images/workers/platform/ci-cd/gl-commit-status.png differ diff --git a/src/assets/images/workers/platform/ci-cd/gl-status-checks.png b/src/assets/images/workers/platform/ci-cd/gl-status-checks.png new file mode 100644 index 00000000000000..dcc773a8ea6a04 Binary files /dev/null and b/src/assets/images/workers/platform/ci-cd/gl-status-checks.png differ diff --git a/src/assets/images/workers/platform/ci-cd/workers-builds-gh-check-runs.png b/src/assets/images/workers/platform/ci-cd/workers-builds-gh-check-runs.png new file mode 100644 index 00000000000000..f76ca3082a5819 Binary files /dev/null and b/src/assets/images/workers/platform/ci-cd/workers-builds-gh-check-runs.png differ diff --git a/src/assets/images/workers/platform/ci-cd/workers-git-provider.png b/src/assets/images/workers/platform/ci-cd/workers-git-provider.png new file mode 100644 index 00000000000000..63bf637e3fdeb1 Binary files /dev/null and b/src/assets/images/workers/platform/ci-cd/workers-git-provider.png differ diff --git a/src/badges.css b/src/badges.css new file mode 100644 index 00000000000000..001beab380fc96 --- /dev/null +++ b/src/badges.css @@ -0,0 +1,85 @@ +.sl-badge { + /* Unset Starlight styling */ + border: none; + font-family: var(--__sl-font); + overflow-wrap: unset; + + /* Apply styling from https://www.npmjs.com/package/@cloudflare/component-label */ + align-items: center; + border-radius: 50px; + display: inline-flex; + font-size: 12px; + font-weight: 400; + line-height: 1; + user-select: none; + white-space: nowrap; + padding: 4px 8px; +} + +:root { + .sl-badge { + &.note { + background-color: theme("colors.cl1.blue.8") !important; + color: theme("colors.cl1.blue.2") !important; + } + + &.danger { + background-color: theme("colors.cl1.red.8") !important; + color: theme("colors.cl1.red.2") !important; + } + + &.success { + background-color: theme("colors.cl1.green.8") !important; + color: theme("colors.cl1.green.2") !important; + } + + &.caution { + background-color: theme("colors.cl1.orange.8") !important; + color: theme("colors.cl1.orange.2") !important; + } + + &.tip { + background-color: theme("colors.cl1.violet.8") !important; + color: theme("colors.cl1.violet.1") !important; + } + + &.default { + background-color: theme("colors.cl1.gray.9") !important; + color: theme("colors.cl1.gray.2") !important; + } + } +} + +:root[data-theme="dark"] { + .sl-badge { + &.note { + background-color: theme("colors.cl1.blue.7") !important; + color: theme("colors.cl1.blue.0") !important; + } + + &.danger { + background-color: theme("colors.cl1.red.8") !important; + color: theme("colors.cl1.red.0") !important; + } + + &.success { + background-color: theme("colors.cl1.green.7") !important; + color: theme("colors.cl1.green.0") !important; + } + + &.caution { + background-color: theme("colors.cl1.orange.8") !important; + color: theme("colors.cl1.orange.0") !important; + } + + &.tip { + background-color: theme("colors.cl1.violet.8") !important; + color: theme("colors.cl1.violet.0") !important; + } + + &.default { + background-color: theme("colors.cl1.gray.8") !important; + color: theme("colors.cl1.gray.3") !important; + } + } +} diff --git a/src/components/InlineBadge.astro b/src/components/InlineBadge.astro index 430296e96f013c..67705395d6e4f2 100644 --- a/src/components/InlineBadge.astro +++ b/src/components/InlineBadge.astro @@ -23,7 +23,7 @@ if (preset) { } case "beta": { text = "Beta"; - variant = "default"; + variant = "caution"; break; } case "deprecated": { diff --git a/src/components/ModelCatalog.tsx b/src/components/ModelCatalog.tsx index 6d5ed3ba90a7b9..e65eb0f4144643 100644 --- a/src/components/ModelCatalog.tsx +++ b/src/components/ModelCatalog.tsx @@ -240,11 +240,7 @@ const ModelCatalog = ({ models }: { models: WorkersAIModelsSchema[] }) => { {model.model_display_name} - {isBeta && ( - - Beta - - )} + {isBeta && Beta}
diff --git a/src/components/Type.astro b/src/components/Type.astro index 1f18743c5f0b0a..9f36a01f8c6650 100644 --- a/src/components/Type.astro +++ b/src/components/Type.astro @@ -15,7 +15,6 @@ const { text } = props.parse(Astro.props); ; const props = z.object({ @@ -18,9 +20,7 @@ const data = await getEntries(products); { data.map((product) => ( - - {product.data.product.title} - + )) } diff --git a/src/components/fields/FieldBadges.tsx b/src/components/fields/FieldBadges.tsx index 4739f088cde421..16cc2c0c5036fb 100644 --- a/src/components/fields/FieldBadges.tsx +++ b/src/components/fields/FieldBadges.tsx @@ -1,12 +1,9 @@ const FieldBadges = ({ badges }: { badges: string[] }) => { return ( -
    +
      {badges.map((badge) => ( -
    • - {badge} +
    • + {badge}
    • ))}
    diff --git a/src/components/models/ModelBadges.tsx b/src/components/models/ModelBadges.tsx index 7da99cd2772537..5392cd5cede048 100644 --- a/src/components/models/ModelBadges.tsx +++ b/src/components/models/ModelBadges.tsx @@ -30,13 +30,10 @@ const ModelBadges = ({ model }: { model: WorkersAIModelsSchema }) => { }); return ( -
      +
        {badges.map((badge) => ( -
      • - {badge.text} +
      • + {badge.text}
      • ))}
      diff --git a/src/components/overrides/PageTitle.astro b/src/components/overrides/PageTitle.astro index 2cef29cdeb4aba..60ffa467065270 100644 --- a/src/components/overrides/PageTitle.astro +++ b/src/components/overrides/PageTitle.astro @@ -16,7 +16,6 @@ import { getEntry } from "astro:content"; const spotlightDetails = Astro.props.entry.data.spotlight; const updated = Astro.props.entry.data.updated; -const badge = Astro.props.entry.data.sidebar?.badge; const summary = Astro.props.entry.data.summary; const slug = Astro.props.entry.slug; @@ -97,8 +96,6 @@ const hideBreadcrumbs = Astro.props.hideBreadcrumbs; {!hideTitle && } -{badge && } - {updated && } { diff --git a/src/components/overrides/Sidebar.astro b/src/components/overrides/Sidebar.astro index c94f3bfae50d31..8141e7b96dc8a4 100644 --- a/src/components/overrides/Sidebar.astro +++ b/src/components/overrides/Sidebar.astro @@ -31,6 +31,28 @@ interface Group { order: number; } +function inferBadgeVariant(badge: ComponentProps) { + if (badge.variant === "default") { + switch (badge.text) { + case "Beta": { + badge.variant = "caution"; + break; + } + case "New": { + badge.variant = "note"; + break; + } + case "Deprecated": + case "Legacy": { + badge.variant = "danger"; + break; + } + } + } + + return badge; +} + const currentSection = slug?.split("/")[0]; let filtered = sidebar.filter( @@ -78,7 +100,10 @@ async function handleGroup(group: Group): Promise { group.label = frontmatter.sidebar.group?.label ?? frontmatter.title; group.order = frontmatter.sidebar.order ?? Number.MAX_VALUE; - group.badge = frontmatter.sidebar.group?.badge; + + if (frontmatter.sidebar.group?.badge) { + group.badge = inferBadgeVariant(frontmatter.sidebar.group?.badge); + } if (frontmatter.hideChildren) { return { @@ -129,6 +154,10 @@ async function handleLink(link: Link): Promise { const frontmatter = page.data; link.order = frontmatter.sidebar.order ?? Number.MAX_VALUE; + if (link.badge) { + link.badge = inferBadgeVariant(link.badge); + } + if (slug === currentSection) { link.order = 0; } @@ -141,6 +170,7 @@ async function handleLink(link: Link): Promise { badge: frontmatter.external_link.startsWith("/api") ? { text: "API", + variant: "note", } : undefined, }; diff --git a/src/content/changelogs-next/2024-12-11-hyperdrive-caching-at-edge.mdx b/src/content/changelogs-next/2024-12-11-hyperdrive-caching-at-edge.mdx new file mode 100644 index 00000000000000..6cc85e45a894e8 --- /dev/null +++ b/src/content/changelogs-next/2024-12-11-hyperdrive-caching-at-edge.mdx @@ -0,0 +1,21 @@ +--- +title: Up to 10x faster cached queries for Hyperdrive +description: Hyperdrive now caches queries in all Cloudflare locations decreasing cache hit latency by up to 90% +products: + - hyperdrive +date: 2024-12-11T18:00:00Z +--- + +Hyperdrive now caches queries in all Cloudflare locations, decreasing cache hit latency by up to 90%. + +When you make a query to your database and Hyperdrive has cached the query results, Hyperdrive will now return the results from the nearest cache. By caching data closer to your users, the latency for cache hits reduces by up to 90%. + +This reduction in cache hit latency is reflected in a reduction of the session duration for all queries (cached and uncached) from Cloudflare Workers to Hyperdrive, as illustrated below. + +![Hyperdrive edge caching improves average session duration for database queries](~/assets/images/hyperdrive/changelog/hyperdrive-edge-caching-metrics.png) + +_P50, P75, and P90 Hyperdrive session latency for all client connection sessions (both cached and uncached queries) for Hyperdrive configurations with caching enabled during the rollout period._ + +This performance improvement is applied to all new and existing Hyperdrive configurations that have caching enabled. + +For more details on how Hyperdrive performs query caching, refer to the [Hyperdrive documentation](/hyperdrive/configuration/how-hyperdrive-works/#query-caching). diff --git a/src/content/changelogs-next/2025-01-15-workflows-more-steps.mdx b/src/content/changelogs-next/2025-01-15-workflows-more-steps.mdx new file mode 100644 index 00000000000000..dbdac3b8d98c06 --- /dev/null +++ b/src/content/changelogs-next/2025-01-15-workflows-more-steps.mdx @@ -0,0 +1,17 @@ +--- +title: Workflows +description: More steps per Workflow + pause/resume now supported +products: + - workflows +date: 2025-01-15 +--- + +[Workflows](/workflows/) (beta) now allows you to define up to 1024 [steps](/workflows/build/workers-api/#workflowstep). `sleep` steps do not count against this limit. + +We've also added: + +* `instanceId` as property to the [`WorkflowEvent`](/workflows/build/workers-api/#workflowevent) type, allowing you to retrieve the current instance ID from within a running Workflow instance +* Improved queueing logic for Workflow instances beyond the current maximum concurrent instances, reducing the cases where instances are stuck in the queued state. +* Support for [`pause` and `resume`](/workflows/build/workers-api/#pause) for Workflow instances in a queued state. + +We're continuing to work on increases to the number of concurrent Workflow instances, steps, and support for a new `waitForEvent` API over the coming weeks. diff --git a/src/content/changelogs-next/2025-01-27-kv-increased-namespaces-limits.mdx b/src/content/changelogs-next/2025-01-27-kv-increased-namespaces-limits.mdx new file mode 100644 index 00000000000000..c18885b2c68b2b --- /dev/null +++ b/src/content/changelogs-next/2025-01-27-kv-increased-namespaces-limits.mdx @@ -0,0 +1,13 @@ +--- +title: Workers KV namespace limits increased to 1000 +description: You can now have up to 1000 Workers KV namespaces per account. +products: + - kv +date: 2025-01-28T14:00:00Z +--- + +You can now have up to 1000 Workers KV namespaces per account. + +Workers KV namespace limits were increased from 200 to 1000 for all accounts. Higher limits for Workers KV namespaces enable better organization of key-value data, such as by category, tenant, or environment. + +Consult the [Workers KV limits documentation](/kv/platform/limits/) for the rest of the limits. This increased limit is available for both the Free and Paid [Workers plans](/workers/platform/pricing/). diff --git a/src/content/changelogs-next/2025-01-28-hyperdrive-automated-private-database-configuration.mdx b/src/content/changelogs-next/2025-01-28-hyperdrive-automated-private-database-configuration.mdx new file mode 100644 index 00000000000000..0c54cf613b7820 --- /dev/null +++ b/src/content/changelogs-next/2025-01-28-hyperdrive-automated-private-database-configuration.mdx @@ -0,0 +1,17 @@ +--- +title: Automatic configuration for private databases on Hyperdrive +description: Hyperdrive now automatically configures your Cloudflare Tunnel to connect to your private database. +products: + - hyperdrive +date: 2025-01-28T18:00:00Z +--- + +Hyperdrive now automatically configures your Cloudflare Tunnel to connect to your private database. + +![Automatic configuration of Cloudflare Access and Service Token in the Cloudflare dashboard for Hyperdrive.](~/assets/images/hyperdrive/configuration/hyperdrive-private-database-automatic-configuration.png) + +When creating a Hyperdrive configuration for a private database, you only need to provide your database credentials and set up a Cloudflare Tunnel within the private network where your database is accessible. Hyperdrive will automatically create the Cloudflare Access, Service Token, and Policies needed to secure and restrict your Cloudflare Tunnel to the Hyperdrive configuration. + +To create a Hyperdrive for a private database, you can follow the [Hyperdrive documentation](/hyperdrive/configuration/connect-to-private-database/). You can still manually create the Cloudflare Access, Service Token, and Policies if you prefer. + +This feature is available from the Cloudflare dashboard. diff --git a/src/content/changelogs-next/2025-01-28-nodejs-compat-improvements.mdx b/src/content/changelogs-next/2025-01-28-nodejs-compat-improvements.mdx new file mode 100644 index 00000000000000..6d35bd073a7cb9 --- /dev/null +++ b/src/content/changelogs-next/2025-01-28-nodejs-compat-improvements.mdx @@ -0,0 +1,86 @@ +--- +title: Support for Node.js DNS, Net, and Timer APIs in Workers +description: Node.js APIs from the node:dns, node:net, and node:timers modules are now available when using nodejs_compat. +products: + - workers +date: 2025-01-28T13:00:00Z +--- + +import { Render, PackageManagers, TypeScriptExample } from "~/components"; + +When using a Worker with the [`nodejs_compat`](/workers/runtime-apis/nodejs/) compatibility flag enabled, you can now use the following Node.js APIs: + +- [`node:net`](/workers/runtime-apis/nodejs/net/) +- [`node:dns`](/workers/runtime-apis/nodejs/dns/) +- [`node:timers`](/workers/runtime-apis/nodejs/timers/) + +#### node:net + +You can use [`node:net`](https://nodejs.org/api/net.html) to create a direct connection to servers via a TCP sockets +with [`net.Socket`](https://nodejs.org/api/net.html#class-netsocket). + + +```ts +import net from "node:net"; + +const exampleIP = "127.0.0.1"; + +export default { + async fetch(req): Promise { + const socket = new net.Socket(); + socket.connect(4000, exampleIP, function () { + console.log("Connected"); + }); + + socket.write("Hello, Server!"); + socket.end(); + + return new Response("Wrote to server", { status: 200 }); + }, +} satisfies ExportedHandler; +```` + + +Additionally, you can now use other APIs incliding [`net.BlockList`](https://nodejs.org/api/net.html#class-netblocklist) and +[`net.SocketAddress`](https://nodejs.org/api/net.html#class-netsocketaddress). + +Note that [`net.Server`](https://nodejs.org/api/net.html#class-netserver) is not supported. + +#### node:dns + +You can use [`node:dns`](https://nodejs.org/api/dns.html) for name resolution via [DNS over HTTPS](/1.1.1.1/encryption/dns-over-https/) using +[Cloudflare DNS](https://www.cloudflare.com/application-services/products/dns/) at 1.1.1.1. + + +```ts +import dns from 'node:dns'; + +let responese = await dns.promises.resolve4('cloudflare.com', 'NS'); +```` + + + +All `node:dns` functions are available, except `lookup`, `lookupService`, and `resolve` which throw "Not implemented" errors when called. + +#### node:timers + +You can use [`node:timers`](https://nodejs.org/api/timers.html) to schedule functions to be called at some future period of time. + +This includes [`setTimeout`](https://nodejs.org/api/timers.html#settimeoutcallback-delay-args) for calling a function after a delay, +[`setInterval`](https://nodejs.org/api/timers.html#setintervalcallback-delay-args) for calling a function repeatedly, +and [`setImmediate`](https://nodejs.org/api/timers.html#setimmediatecallback-args) for calling a function in the next iteration of the event loop. + + +```ts +import timers from "node:timers"; + +console.log("first"); +timers.setTimeout(() => { + console.log("last"); +}, 10); + +timers.setTimeout(() => { + console.log("next"); +}); +``` + diff --git a/src/content/changelogs/ai-gateway.yaml b/src/content/changelogs/ai-gateway.yaml index 57ee466815836d..938312e4a49c74 100644 --- a/src/content/changelogs/ai-gateway.yaml +++ b/src/content/changelogs/ai-gateway.yaml @@ -5,11 +5,15 @@ productLink: "/ai-gateway/" productArea: Developer platform productAreaLink: /workers/platform/changelog/platform/ entries: + - publish_date: "2025-01-23" + title: Request timeouts for Universal gateways and fallback providers + description: |- + * Added [request timeouts](/ai-gateway/configuration/fallbacks/#request-timeouts) as a configuration option for fallback providers. This property triggers a fallback proivder based on a predetermined response time (measured in milliseconds). - publish_date: "2025-01-02" title: DeepSeek description: |- * **Configuration**: Added [DeepSeek](/ai-gateway/providers/deepseek/) as a new provider. - + - publish_date: "2024-12-17" title: AI Gateway Dashboard description: |- diff --git a/src/content/changelogs/dlp.yaml b/src/content/changelogs/dlp.yaml index bfb3dea1ccbba7..5c227bb3c75617 100644 --- a/src/content/changelogs/dlp.yaml +++ b/src/content/changelogs/dlp.yaml @@ -9,6 +9,10 @@ entries: title: Source code confidence levels description: |- DLP now supports setting a confidence level for [source code profiles](/cloudflare-one/policies/data-loss-prevention/dlp-profiles/predefined-profiles/#source-code). + - publish_date: "2025-01-15" + title: Payload log match visibility + description: |- + When viewing decrypted payload log matches, DLP now provides more context by listing multiple DLP matches and the matching DLP profile. - publish_date: "2024-11-25" title: Profile confidence levels description: |- diff --git a/src/content/changelogs/dns.yaml b/src/content/changelogs/dns.yaml index 5965fb8f7efd69..234a07eef9b52a 100644 --- a/src/content/changelogs/dns.yaml +++ b/src/content/changelogs/dns.yaml @@ -5,6 +5,12 @@ productLink: "/dns/" productArea: Core platform productAreaLink: /fundamentals/reference/changelog/performance/ entries: + - publish_date: "2025-01-27" + title: Zone IDs and names on individual DNS records + description: |- + Records returned by the API will no longer contain the `zone_id` and `zone_name` fields. + This change may take up to four weeks to fully roll out. + The affected fields were deprecated with an End of Life (EOL) date of November 30, 2024. - publish_date: "2024-10-15" title: Quote validation for TXT records added via dashboard description: |- diff --git a/src/content/changelogs/hyperdrive.yaml b/src/content/changelogs/hyperdrive.yaml index 5c097c65fc298c..8d1bf39089e162 100644 --- a/src/content/changelogs/hyperdrive.yaml +++ b/src/content/changelogs/hyperdrive.yaml @@ -5,6 +5,14 @@ productLink: "/hyperdrive/" productArea: Developer platform productAreaLink: /workers/platform/changelog/platform/ entries: + - publish_date: "2025-01-28" + title: Hyperdrive automatically configures your Cloudflare Tunnel to connect to your private database. + description: |- + When creating a Hyperdrive configuration for a private database, you only need to provide your database credentials and set up a Cloudflare Tunnel within the private network where your database is accessible. + + Hyperdrive will automatically create the Cloudflare Access, Service Token and Policies needed to secure and restrict your Cloudflare Tunnel to the Hyperdrive configuration. + + Refer to [documentation on how to configure Hyperdrive to connect to a private database](/hyperdrive/configuration/connect-to-private-database/). - publish_date: "2024-12-11" title: Hyperdrive now caches queries in all Cloudflare locations decreasing cache hit latency by up to 90% description: |- diff --git a/src/content/changelogs/load-balancing.yaml b/src/content/changelogs/load-balancing.yaml index c50774a9295e19..d45a2b7ba22ba0 100644 --- a/src/content/changelogs/load-balancing.yaml +++ b/src/content/changelogs/load-balancing.yaml @@ -5,6 +5,10 @@ productLink: "/load-balancing/" productArea: Application performance productAreaLink: /fundamentals/reference/changelog/performance/ entries: + - publish_date: "2025-01-24" + title: Update to Cloudflare Tunnel Steering + description: |- + Introduced changes to the resolution of proxied domains that are backed by Cloudflare Tunnels on the same zone. These changes correct how orange-clouded records are steered to Cloudflare Tunnels via Cloudflare Load Balancers. - publish_date: "2025-01-16" title: Update to Pool Health Monitoring description: |- diff --git a/src/content/changelogs/queues.yaml b/src/content/changelogs/queues.yaml index 4af0d1031004bb..825169372613d8 100644 --- a/src/content/changelogs/queues.yaml +++ b/src/content/changelogs/queues.yaml @@ -64,7 +64,7 @@ entries: description: |- Queue consumers will soon automatically scale up concurrently as a queues' backlog grows in order to keep overall message processing latency down. Concurrency will be enabled on all existing queues by 2023-03-28. - **To opt-out, or to configure a fixed maximum concurrency**, set `max_concurrency = 1` in your `wrangler.toml` file or via [the queues dashboard](https://dash.cloudflare.com/?to=/:account/queues). + **To opt-out, or to configure a fixed maximum concurrency**, set `max_concurrency = 1` in your `wrangler.toml / wrangler.json` file or via [the queues dashboard](https://dash.cloudflare.com/?to=/:account/queues). **To opt-in, you do not need to take any action**: your consumer will begin to scale out as needed to keep up with your message backlog. It will scale back down as the backlog shrinks, and/or if a consumer starts to generate a higher rate of errors. To learn more about how consumers scale, refer to the [consumer concurrency](/queues/configuration/consumer-concurrency/) documentation. - publish_date: "2023-03-02" diff --git a/src/content/changelogs/rules.yaml b/src/content/changelogs/rules.yaml index 8f4cd9686b7b24..1b55e3f79a5100 100644 --- a/src/content/changelogs/rules.yaml +++ b/src/content/changelogs/rules.yaml @@ -5,6 +5,10 @@ productLink: "/rules/" productArea: Application performance productAreaLink: /fundamentals/reference/changelog/performance/ entries: + - publish_date: "2025-01-29" + title: New Snippets code editor + description: |- + The new Snippets code editor is now live, allowing users to edit both Snippets code and rules from a single page. This update simplifies the workflow and introduces features such as code formatting, refactoring, and auto-complete. The updated editor is available within the Snippets interface. - publish_date: "2025-01-09" title: New Rules Overview page description: |- diff --git a/src/content/docs/1.1.1.1/faq.mdx b/src/content/docs/1.1.1.1/faq.mdx index 34310c8cf34370..57569899c5f734 100644 --- a/src/content/docs/1.1.1.1/faq.mdx +++ b/src/content/docs/1.1.1.1/faq.mdx @@ -3,7 +3,7 @@ pcx_content_type: faq title: FAQ structured_data: true sidebar: - order: 8 + order: 12 slug: 1.1.1.1/faq --- diff --git a/src/content/docs/1.1.1.1/setup/index.mdx b/src/content/docs/1.1.1.1/setup/index.mdx index cd0590d5144bfe..9b50e91e5ac0b7 100644 --- a/src/content/docs/1.1.1.1/setup/index.mdx +++ b/src/content/docs/1.1.1.1/setup/index.mdx @@ -8,6 +8,7 @@ head: - tag: title content: Set up Cloudflare 1.1.1.1 resolver slug: 1.1.1.1/setup +description: Learn how to set up Cloudflare's 1.1.1.1 DNS resolver for enhanced security and privacy. Protect against malware and adult content with easy configuration. --- diff --git a/src/content/docs/1.1.1.1/terms-of-use.mdx b/src/content/docs/1.1.1.1/terms-of-use.mdx index 070c4e9c2a07d4..2a9687a7bff29f 100644 --- a/src/content/docs/1.1.1.1/terms-of-use.mdx +++ b/src/content/docs/1.1.1.1/terms-of-use.mdx @@ -2,7 +2,7 @@ pcx_content_type: reference title: Terms of use sidebar: - order: 7 + order: 10 slug: 1.1.1.1/terms-of-use --- diff --git a/src/content/docs/1.1.1.1/setup/reporting-issues.mdx b/src/content/docs/1.1.1.1/troubleshooting.mdx similarity index 89% rename from src/content/docs/1.1.1.1/setup/reporting-issues.mdx rename to src/content/docs/1.1.1.1/troubleshooting.mdx index 2499955ad0b1bf..34405246ec0db1 100644 --- a/src/content/docs/1.1.1.1/setup/reporting-issues.mdx +++ b/src/content/docs/1.1.1.1/troubleshooting.mdx @@ -1,18 +1,19 @@ --- pcx_content_type: troubleshooting -title: Reporting Issues with Cloudflare's DNS Resolver +title: Troubleshooting +description: Learn how to diagnose and report issues with Cloudflare's DNS Resolver sidebar: - order: 3 + order: 8 head: - tag: title - content: Reporting Issues with Cloudflare's DNS Resolver + content: Troubleshooting DNS Resolver slug: 1.1.1.1/troubleshooting --- import { Render } from "~/components" -This guide will help you diagnose and resolve common issues with Cloudflare's DNS Resolver. Before proceeding with manual troubleshooting steps, you can use our [diagnostic tool](https://one.one.one.one/help/) to automatically gather relevant information. +This guide will help you diagnose and resolve common issues with Cloudflare's DNS Resolver. Before proceeding with manual troubleshooting steps, you can [verify your connection](/1.1.1.1/check/) to automatically gather relevant information. ## Name resolution issues @@ -136,4 +137,5 @@ If your traceroute fails at the first hop, the issue is likely hardware-related. ## Additional resources - [1.1.1.1 DNS Resolver homepage](https://1.1.1.1) -- [DNS-over-TLS documentation](/1.1.1.1/encryption/dns-over-tls/) +- [DNS over TLS documentation](/1.1.1.1/encryption/dns-over-tls/) +- [Diagnostic tool](https://one.one.one.one/help/) diff --git a/src/content/docs/agents/capabilities/control-web-browsers.mdx b/src/content/docs/agents/capabilities/control-web-browsers.mdx new file mode 100644 index 00000000000000..08618a97c854a2 --- /dev/null +++ b/src/content/docs/agents/capabilities/control-web-browsers.mdx @@ -0,0 +1,10 @@ +--- +pcx_content_type: navigation +title: Control Web Browsers (Browser Rendering API) +external_link: /browser-rendering/ +sidebar: + order: 1 +head: [] +description: The Workers Browser Rendering API allows developers to programmatically control and interact with a headless browser instance and create automation flows for their applications and products. + +--- diff --git a/src/content/docs/agents/capabilities/index.mdx b/src/content/docs/agents/capabilities/index.mdx new file mode 100644 index 00000000000000..dfcca68ba21de9 --- /dev/null +++ b/src/content/docs/agents/capabilities/index.mdx @@ -0,0 +1,14 @@ +--- +pcx_content_type: reference +title: Capabilities +sidebar: + order: 2 + group: + hideIndex: true +--- + +import { DirectoryListing } from "~/components"; + +Capabilities + + diff --git a/src/content/docs/agents/capabilities/run-models.mdx b/src/content/docs/agents/capabilities/run-models.mdx new file mode 100644 index 00000000000000..86a14253478d37 --- /dev/null +++ b/src/content/docs/agents/capabilities/run-models.mdx @@ -0,0 +1,9 @@ +--- +pcx_content_type: navigation +title: Run models (Workers AI) +external_link: /workers-ai/ +sidebar: + order: 2 +head: [] +description: Run popular open-source AI models on Cloudflare's network. +--- \ No newline at end of file diff --git a/src/content/docs/agents/capabilities/send-email.mdx b/src/content/docs/agents/capabilities/send-email.mdx new file mode 100644 index 00000000000000..b23feac138d75a --- /dev/null +++ b/src/content/docs/agents/capabilities/send-email.mdx @@ -0,0 +1,11 @@ +--- +pcx_content_type: navigation +title: Send Email +external_link: /email-routing/email-workers/send-email-workers/ +sidebar: + order: 2 +head: [] +description: Send emails from your Worker for async updates to a user. +--- + + diff --git a/src/content/docs/agents/capabilities/webrtc-realtime.mdx b/src/content/docs/agents/capabilities/webrtc-realtime.mdx new file mode 100644 index 00000000000000..3acddf48f2e141 --- /dev/null +++ b/src/content/docs/agents/capabilities/webrtc-realtime.mdx @@ -0,0 +1,9 @@ +--- +pcx_content_type: navigation +title: Realtime voice (WebRTC) +external_link: /calls/ +sidebar: + order: 4 +head: [] +description: Build real-time serverless video, audio and data applications. +--- \ No newline at end of file diff --git a/src/content/docs/agents/index.mdx b/src/content/docs/agents/index.mdx new file mode 100644 index 00000000000000..c396697639ca9f --- /dev/null +++ b/src/content/docs/agents/index.mdx @@ -0,0 +1,529 @@ +--- +title: Build agents on Cloudflare +type: overview +pcx_content_type: overview +sidebar: + order: 1 +head: + - tag: title + content: Agents +--- + +import { + CardGrid, + Description, + Feature, + LinkButton, + LinkTitleCard, + Plan, + RelatedProduct, + Render, + TabItem, + Tabs, +} from "~/components"; + +Build AI-powered agents that can autonomously perform tasks, persist state, browse the web, and communicate back to users in real-time over any channel. + +- **Non I/O bound pricing:** don't pay for long-running processes when your code is not executing. Cloudflare Workers is designed to scale down and [only charge you for CPU time](https://blog.cloudflare.com/workers-pricing-scale-to-zero/), as opposed to wall-clock time. +- **Designed for durable execution:** [Durable Objects](/durable-objects/) and [Workflows](/workflows) are built for a programming model that enables guaranteed execution for async tasks like long-running deep thinking LLM calls, human-in-the-loop, or unreliable API calls. +- **Scalable, and reliable, without compromising on performance:** by running on Cloudflare's network, agents can execute tasks close to the user without introducing latency for real-time experiences. + +## Start building + + + + +Build agents that can execute complex tasks, progressively save state, and call out to _any_ third party API they need to using [Workflows](/workflows/). Send emails or [text messages](/workflows/examples/twilio/), [browse the web](/browser-rendering/), process and summarize documents, and/or query your database. + +```sh +npm create cloudflare@latest workflows-starter -- --template "cloudflare/workflows-starter" +cd workflows-starter +npm i resend +``` + +```ts collapse={30-1000} +import { WorkflowEntrypoint, WorkflowStep, WorkflowEvent } from 'cloudflare:workers'; +import { Resend } from 'resend'; + +type Env = { + MY_WORKFLOW: Workflow; + RESEND_API_KEY: string; +}; + +type Params = { + email: string; + metadata: Record; +}; + +export class MyWorkflow extends WorkflowEntrypoint { + async run(event: WorkflowEvent, step: WorkflowStep) { + + const files = await step.do('my first step', async () => { + // Fetch a list of files from $SOME_SERVICE + return { + files: [ + 'doc_7392_rev3.pdf', + 'report_x29_final.pdf', + 'memo_2024_05_12.pdf', + 'file_089_update.pdf', + 'proj_alpha_v2.pdf', + 'data_analysis_q2.pdf', + 'notes_meeting_52.pdf', + 'summary_fy24_draft.pdf', + ], + }; + }); + + const summaries = await step.do('summarize text', async () => { + const results = {}; + for (const filename of files.files) { + const fileContent = await this.env.MY_BUCKET.get(filename); + if (!fileContent) continue; + + const text = await fileContent.text(); + const summary = await this.env.WORKERS_AI.run('@cf/meta/llama-3.2-3b-instruct', { + messages: [{ + role: 'user', + content: `Please summarize the following text concisely: ${text}` + }] + }); + results[filename] = summary.response; + } + return results; + }); + + await step.sleep('wait on something', '1 minute'); + + let summaryKey = await step.do( + 'store summaries in R2', + async () => { + const summaryKey = `summaries-${Date.now()}.json`; + await this.env.MY_BUCKET.put(summaryKey, JSON.stringify(summaries)); + return summaryKey; + }, + ); + + await step.do( + 'email summaries', + { + retries: { + limit: 3, + delay: '5 second', + backoff: 'exponential', + } + }, + async () => { + const summaryText = Object.entries(summaries) + .map(([filename, summary]) => `${filename}:\n${summary}\n\n`) + .join(''); + + const resend = new Resend(this.env.RESEND_API_KEY); + + await resend.emails.send({ + from: 'notifications@yourdomain.com', + to: event.payload.email, + subject: 'Your Document Summaries', + text: summaryText, + }); + } + ); + + return summaryKey; + } +} + +export default { + async fetch(req: Request, env: Env): Promise { + let id = new URL(req.url).searchParams.get('instanceId'); + + if (id) { + let instance = await env.MY_WORKFLOW.get(id); + return Response.json({ + status: await instance.status(), + }); + } + + let instance = await env.MY_WORKFLOW.create(); + return Response.json({ + id: instance.id, + details: await instance.status(), + }); + }, +}; +``` + + + + +Use [Durable Objects](/durable-objects/) — stateful, serverless, long-running micro-servers — to ship interactive, real-time agents that can connect to the latest AI models. + +Stream responses over [WebSockets](/durable-objects/best-practices/websockets/), and don't time out while waiting for the latest chain-of-thought models — including `o1` or `deepseek-r1` — to respond. + +```ts +npm i openai +``` + +```ts collapse={30-1000} +import { DurableObject } from "cloudflare:workers"; + +export interface Env { + DURABLE_AGENT: DurableObjectNamespace; + OPENAI_API_KEY: string; +} + +export default { + async fetch(request: Request, env: Env, ctx: ExecutionContext) { + if (request.url.endsWith("/agent/chat")) { + const upgradeHeader = request.headers.get("Upgrade"); + if (!upgradeHeader || upgradeHeader !== "websocket") { + return Response.json( + { error: "Durable Object expected Upgrade: websocket" }, + { status: 426 } + ); + } + + const url = new URL(request.url); + const agentId = url.searchParams.get("id") || (await crypto.randomUUID()); + + let id = env.DURABLE_AGENT.idFromName(agentId); + let agent = env.DURABLE_AGENT.get(id); + + return agent.fetch(request); + } + + return Response.json({ message: "Bad Request" }, { status: 400 }); + }, +}; + +export class DurableAgent extends DurableObject { + constructor(private state: DurableObjectState, private env: Env) { + super(); + } + + async fetch(request: Request): Promise { + const webSocketPair = new WebSocketPair(); + const [client, server] = Object.values(webSocketPair); + + this.ctx.acceptWebSocket(server); + + return new Response(null, { + status: 101, + webSocket: client, + }); + } + + async webSocketMessage(ws: WebSocket, message: ArrayBuffer | string) { + try { + const openai = new OpenAI({ + apiKey: this.env.OPENAI_API_KEY, + timeout: 10 * 60 * 1000, // Don't let it think TOO long. + }); + + // Stream the response to immediately start sending chunks to the client, + // rather than buffering the entire response and making the user wait + const stream = await openai.chat.completions.create({ + model: "o1", + messages: [{ role: "user", content: message.toString() }], + stream: true, + }); + + for await (const chunk of stream) { + const content = chunk.choices[0]?.delta?.content; + if (content) { + ws.send(content); + } + } + } catch (error) { + ws.send( + JSON.stringify({ + error: "OpenAI request failed", + message: error.message, + }) + ); + } + } + + async webSocketClose(ws: WebSocket, code: number, reason: string, wasClean: boolean) { + ws.close(code, "Durable Object is closing WebSocket"); + } +} +``` + + + + +Use the [Browser Rendering API](/browser-rendering/) to allow your agents to search the web, take screenshots, and directly interact with websites. + +```sh +npm install @cloudflare/puppeteer --save-dev +``` + +```ts collapse={30-1000} +import puppeteer from "@cloudflare/puppeteer"; + +interface Env { + MYBROWSER: Fetcher; + BROWSER_KV_DEMO: KVNamespace; +} + +export default { + async fetch(request: Request, env: Env): Promise { + const { searchParams } = new URL(request.url); + const url = searchParams.get("url"); + + if (!url) { + return new Response("Please add an ?url=https://example.com/ parameter"); + } + + const normalizedUrl = new URL(url).toString(); + let img = await env.BROWSER_KV_DEMO.get(normalizedUrl, { type: "arrayBuffer" }); + + if (img === null) { + const browser = await puppeteer.launch(env.MYBROWSER); + const page = await browser.newPage(); + await page.goto(normalizedUrl); + img = await page.screenshot() as Buffer; + + await env.BROWSER_KV_DEMO.put(normalizedUrl, img, { + expirationTtl: 60 * 60 * 24, // 24 hours + }); + + await browser.close(); + } + + return new Response(img, { + headers: { + "content-type": "image/jpeg", + }, + }); + }, +}; +``` + + + + +Use [AI Gateway](/ai-gateway/) to cache, log, retry and run [evals](/ai-gateway/evaluations/) (evaluations) for your agents, no matter where they're deployed. + +```py collapse={30-1000} +from anthropic import Anthropic + +anthropic = Anthropic( + api_key="", + # Route, cache, fallback and log prompt-response pairs between your app + # and your AI model provider. + base_url="https://gateway.ai.cloudflare.com/v1/${accountId}/${gatewayId}/anthropic" +) + +message = anthropic.messages.create( + model="claude-3-opus-20240229", + max_tokens=1000, + messages=[{ + "role": "user", + "content": "Generate a Cloudflare Worker that returns a simple JSON payload based on a query param", + }] +) + +print(message.content) +``` + + + + +## Use your favorite AI framework + +Build agents using your favorite AI frameworks, and deploy it directly to [Cloudflare Workers](/workers/). + + + + +Use [LangChain](https://js.langchain.com/docs/integrations/text_embedding/cloudflare_ai/) to build Retrieval-Augmented Generation (RAG) applications using [Workers AI](/workers-ai/) and [Vectorize](/vectorize/). + +Give your agents more context and the ability to search across content, reply to user queries, and expand their domain knowledge. + +```sh +npm i @langchain/cloudflare hono +``` + +```ts collapse={30-1000} +import { + CloudflareVectorizeStore, + CloudflareWorkersAIEmbeddings +} from "@langchain/cloudflare"; +import { VectorizeIndex } from "@cloudflare/workers-types"; +import { Ai } from "@cloudflare/ai"; +import { Hono } from "hono"; + +export interface Env { + VECTORIZE_INDEX: VectorizeIndex; + AI: Ai; +} + +const app = new Hono<{ Bindings: Env }>(); + +app.get("/", async (c) => { + const embeddings = new CloudflareWorkersAIEmbeddings({ + binding: c.env.AI, + model: "@cf/baai/bge-small-en-v1.5", + }); + + const store = new CloudflareVectorizeStore(embeddings, { + index: c.env.VECTORIZE_INDEX, + }); + + const results = await store.similaritySearch("hello", 5); + return c.json(results); +}); + +app.post("/load", async (c) => { + const embeddings = new CloudflareWorkersAIEmbeddings({ + binding: c.env.AI, + model: "@cf/baai/bge-small-en-v1.5", + }); + + const store = new CloudflareVectorizeStore(embeddings, { + index: c.env.VECTORIZE_INDEX, + }); + + const documents = [ + { pageContent: "hello", metadata: {} }, + { pageContent: "world", metadata: {} }, + { pageContent: "hi", metadata: {} } + ]; + + await store.addDocuments(documents, { + ids: ["id1", "id2", "id3"] + }); + + return c.json({ success: true }); +}); + +app.delete("/clear", async (c) => { + const embeddings = new CloudflareWorkersAIEmbeddings({ + binding: c.env.AI, + model: "@cf/baai/bge-small-en-v1.5", + }); + + const store = new CloudflareVectorizeStore(embeddings, { + index: c.env.VECTORIZE_INDEX, + }); + + await store.delete({ ids: ["id1", "id2", "id3"] }); + return c.json({ success: true }); +}); + +export default app; +``` + + + + +Ship faster with the [AI SDK](https://sdk.vercel.ai/docs/introduction): make it easier to generate text, tool call and/or get structured output from your AI models (and then deploy it [Workers](/workers/). + +```sh +npm i ai workers-ai-provider +``` + +```ts collapse={30-1000} +import { createWorkersAI } from 'workers-ai-provider'; +import { streamText } from 'ai'; + +type Env = { + AI: Ai; +}; + +export default { + async fetch(_: Request, env: Env) { + const workersai = createWorkersAI({ binding: env.AI }); + const result = streamText({ + model: workersai('@cf/meta/llama-3.2-3b-instruct'), + prompt: 'Write short essay on why you like Cloudflare Durable Objects.', + }); + + return result.toTextStreamResponse({ + headers: { + 'Content-Type': 'text/x-unknown', + 'content-encoding': 'identity', + 'transfer-encoding': 'chunked', + }, + }); + }, +}; +``` + + + + +Use any model provider with OpenAI compatible endpoints, including [ChatGPT](https://platform.openai.com/docs/quickstart), [DeepSeek](https://api-docs.deepseek.com/) and [Workers AI](/workers-ai/configuration/open-ai-compatibility/), directly from Cloudflare Workers. + +```sh +npm i openai +``` + +```ts collapse={30-1000} +import OpenAI from "openai"; + +export interface Env { + OPENAI_API_KEY: string; +} + +export default { + async fetch(request: Request, env: Env) { + const url = new URL(request.url); + const prompt = url.searchParams.get('prompt') || "Make some robot noises"; + + const openai = new OpenAI({ + apiKey: env.OPENAI_API_KEY + }); + + const chatCompletion = await openai.chat.completions.create({ + messages: [{ role: "user", content: prompt }], + model: "gpt-3.5-turbo", + }); + + const embeddings = await openai.embeddings.create({ + model: "text-embedding-ada-002", + input: "Cloudflare Agents documentation", + }); + + return new Response(JSON.stringify({ chatCompletion, embeddings })); + } +} +``` + + + + +*** + +## All the products you need in one platform + + + +Observe and control your AI applications with caching, rate limiting, request retries, model fallback, and more. + + + + + +Build full-stack AI applications with Vectorize, Cloudflare’s vector database. Adding Vectorize enables you to perform tasks such as semantic search, recommendations, anomaly detection or can be used to provide context and memory to an LLM. + + + + + +Run machine learning models, powered by serverless GPUs, on Cloudflare's global network. + + + + + +Build real-time serverless video, audio and data applications with WebRTC running on Cloudflare's network. + + + + + +Build stateful agents that guarantee executions, including automatic retries, persistent state that runs for minutes, hours, days, or weeks. + + \ No newline at end of file diff --git a/src/content/docs/agents/products/ai-gateway.mdx b/src/content/docs/agents/products/ai-gateway.mdx new file mode 100644 index 00000000000000..152bb1879e435b --- /dev/null +++ b/src/content/docs/agents/products/ai-gateway.mdx @@ -0,0 +1,11 @@ +--- +pcx_content_type: navigation +title: AI Gateway +external_link: /ai-gateway/ +sidebar: + order: 3 +head: [] +description: Observe and control your AI applications. +--- + + diff --git a/src/content/docs/agents/products/durable-objects.mdx b/src/content/docs/agents/products/durable-objects.mdx new file mode 100644 index 00000000000000..955c94ff44a712 --- /dev/null +++ b/src/content/docs/agents/products/durable-objects.mdx @@ -0,0 +1,11 @@ +--- +pcx_content_type: navigation +title: Durable Objects +external_link: /durable-objects/ +sidebar: + order: 6 +head: [] +description: Create collaborative applications, real-time chat, multiplayer games and more without needing to coordinate state or manage infrastructure. +--- + + diff --git a/src/content/docs/agents/products/email-workers.mdx b/src/content/docs/agents/products/email-workers.mdx new file mode 100644 index 00000000000000..f2a3ccc62285ae --- /dev/null +++ b/src/content/docs/agents/products/email-workers.mdx @@ -0,0 +1,11 @@ +--- +pcx_content_type: navigation +title: Email Workers +external_link: /email-routing/email-workers/ +sidebar: + order: 4 +head: [] +description: Implement any logic you need to process your emails and create complex rules +--- + + diff --git a/src/content/docs/agents/products/index.mdx b/src/content/docs/agents/products/index.mdx new file mode 100644 index 00000000000000..0fce7832787300 --- /dev/null +++ b/src/content/docs/agents/products/index.mdx @@ -0,0 +1,14 @@ +--- +pcx_content_type: reference +title: Products +sidebar: + order: 3 + group: + hideIndex: true +--- + +import { DirectoryListing } from "~/components"; + +Example Reference Architectures + + diff --git a/src/content/docs/agents/products/real-time.mdx b/src/content/docs/agents/products/real-time.mdx new file mode 100644 index 00000000000000..3d86980d7cc2e4 --- /dev/null +++ b/src/content/docs/agents/products/real-time.mdx @@ -0,0 +1,11 @@ +--- +pcx_content_type: navigation +title: Real Time +external_link: /calls/ +sidebar: + order: 10 +head: [] +description: Build real-time serverless video, audio and data applications. +--- + + diff --git a/src/content/docs/agents/products/workers-ai.mdx b/src/content/docs/agents/products/workers-ai.mdx new file mode 100644 index 00000000000000..fb54c8993df240 --- /dev/null +++ b/src/content/docs/agents/products/workers-ai.mdx @@ -0,0 +1,11 @@ +--- +pcx_content_type: navigation +title: Workers AI +external_link: /workers-ai/ +sidebar: + order: 2 +head: [] +description: Run machine learning models, powered by serverless GPUs, on Cloudflare's global network. +--- + + diff --git a/src/content/docs/agents/products/workflows.mdx b/src/content/docs/agents/products/workflows.mdx new file mode 100644 index 00000000000000..eeb7aca8b0d2bc --- /dev/null +++ b/src/content/docs/agents/products/workflows.mdx @@ -0,0 +1,11 @@ +--- +pcx_content_type: navigation +title: Workflows +external_link: /workflows/ +sidebar: + order: 5 +head: [] +description: Build durable multi-step applications on Cloudflare Workers with Workflows. +--- + + diff --git a/src/content/docs/agents/reference-architectures/index.mdx b/src/content/docs/agents/reference-architectures/index.mdx new file mode 100644 index 00000000000000..e1dd3af47f3a47 --- /dev/null +++ b/src/content/docs/agents/reference-architectures/index.mdx @@ -0,0 +1,14 @@ +--- +pcx_content_type: reference +title: Reference Architectures +sidebar: + order: 1 + group: + hideIndex: true +--- + +import { DirectoryListing } from "~/components"; + +Example Reference Architectures + + diff --git a/src/content/docs/agents/reference-architectures/rag.mdx b/src/content/docs/agents/reference-architectures/rag.mdx new file mode 100644 index 00000000000000..7154404f2de659 --- /dev/null +++ b/src/content/docs/agents/reference-architectures/rag.mdx @@ -0,0 +1,9 @@ +--- +pcx_content_type: navigation +title: Retrieval Augmented Generation +external_link: /reference-architecture/diagrams/ai/ai-rag/ +sidebar: + order: 2 +head: [] +description: Build RAG architectures on Cloudflare +--- \ No newline at end of file diff --git a/src/content/docs/agents/reference-architectures/text-and-call.mdx b/src/content/docs/agents/reference-architectures/text-and-call.mdx new file mode 100644 index 00000000000000..5471f0d78645de --- /dev/null +++ b/src/content/docs/agents/reference-architectures/text-and-call.mdx @@ -0,0 +1,9 @@ +--- +pcx_content_type: navigation +title: Send text messages from agents +external_link: /workflows/examples/twilio/ +sidebar: + order: 3 +head: [] +description: Send text messages and accept phone calls from your agent +--- \ No newline at end of file diff --git a/src/content/docs/ai-gateway/configuration/fallbacks.mdx b/src/content/docs/ai-gateway/configuration/fallbacks.mdx index 98fc7395ccb25f..fdbb454ead8605 100644 --- a/src/content/docs/ai-gateway/configuration/fallbacks.mdx +++ b/src/content/docs/ai-gateway/configuration/fallbacks.mdx @@ -9,11 +9,15 @@ import { Render } from "~/components"; Specify model or provider fallbacks with your [Universal endpoint](/ai-gateway/providers/universal/) to handle request failures and ensure reliability. -Fallbacks are currently triggered only when a request encounters an error. We are working to expand fallback functionality to include time-based triggers, which will allow requests that exceed a predefined response time to timeout and fallback. +Cloudflare can trigger your fallback provider in response to [request errors](#request-failures) or [predetermined request timeouts](#request-timeouts). The [response header `cf-aig-step`](#response-headercf-aig-step) indicates which step successfully processed the request. -## Example +## Request failures -In the following example, a request first goes to the [Workers AI](/workers-ai/) Inference API. If the request fails, it falls back to OpenAI. The response header `cf-aig-step` indicates which provider successfully processed the request. +By default, Cloudflare triggers your fallback if a model request returns an error. + +### Request failure example + +In the following example, a request first goes to the [Workers AI](/workers-ai/) Inference API. If the request fails, it falls back to OpenAI. 1. Sends a request to Workers AI Inference API. 2. If that request fails, proceeds to OpenAI. @@ -32,6 +36,84 @@ You can add as many fallbacks as you need, just by adding another object in the +--- + +## Request timeouts + +If set, a request timeout triggers a fallback provider based on a predetermined response time (measured in milliseconds). This feature is helpful for latency-sensitive applications because your gateway does not have to wait for a [request error](#request-failure) before moving to a fallback provider. + +You can configure request timeouts by using one or more of the following properties, which are listed in order of priority: + +| Priority | Property | +| -------- | ---------------------------------------------------------------------------------------------------------------------- | +| 1 | `requestTimeout` (added as a universal attribute) | +| 2 | `cf-aig-request-timeout` (header included at the [provider level](/ai-gateway/providers/universal/#payload-reference)) | +| 3 | `cf-aig-request-timeout` (header included at the request level) | + +Your gateway follows this hierarchy to determine the timeout duration before implementing a fallback. + +### Request timeout example + +These request timeout values can interact to customize the behavior of your universal gateway. + +In this example, the request will try to answer `What is Cloudflare?` within 1000 milliseconds using the normal `@cf/meta/llama-3.1-8b-instruct` model. The `requestTimeout` property takes precedence over the `cf-aig-request-timeout` for `@cf/meta/llama-3.1-8b-instruct`. + +If that fails, then the gateway will timeout and move to the fallback `@cf/meta/llama-3.1-8b-instruct-fast` model. This model has 3000 milliseconds - determined by the request-level `cf-aig-request-timeout` value - to complete the request and provide an answer. + +```bash title="Request" collapse={36-50} {2,11,13-15} +curl 'https://gateway.ai.cloudflare.com/v1/{account_id}/{gateway_id}' \ + --header 'cf-aig-request-timeout: 3000' \ + --header 'Content-Type: application/json' \ + --data '[ + { + "provider": "workers-ai", + "endpoint": "@cf/meta/llama-3.1-8b-instruct", + "headers": { + "Authorization": "Bearer {cloudflare_token}", + "Content-Type": "application/json", + "cf-aig-request-timeout": "2000" + }, + "config": { + "requestTimeout": 1000 + }, + "query": { + "messages": [ + { + "role": "system", + "content": "You are a friendly assistant" + }, + { + "role": "user", + "content": "What is Cloduflare?" + } + ] + } + }, + { + "provider": "workers-ai", + "endpoint": "@cf/meta/llama-3.1-8b-instruct-fast", + "headers": { + "Authorization": "Bearer {cloudflare_token}", + "Content-Type": "application/json" + }, + "query": { + "messages": [ + { + "role": "system", + "content": "You are a friendly assistant" + }, + { + "role": "user", + "content": "What is Cloudflare?" + } + ] + } + } +]' +``` + +--- + ## Response header(cf-aig-step) When using the [Universal endpoint](/ai-gateway/providers/universal/) with fallbacks, the response header `cf-aig-step` indicates which model successfully processed the request by returning the step number. This header provides visibility into whether a fallback was triggered and which model ultimately processed the response. diff --git a/src/content/docs/ai-gateway/evaluations/set-up-evaluations.mdx b/src/content/docs/ai-gateway/evaluations/set-up-evaluations.mdx index ec7db10020eb14..8fa842320959af 100644 --- a/src/content/docs/ai-gateway/evaluations/set-up-evaluations.mdx +++ b/src/content/docs/ai-gateway/evaluations/set-up-evaluations.mdx @@ -24,6 +24,24 @@ Please keep in mind that datasets currently use `AND` joins, so there can only b ::: +### List of available filters + +| Filter category | Filter options | Filter by description | +| --------------- | ------------------------------------------------------------ | ----------------------------------------- | +| Status | error, status | error type or status. | +| Cache | cached, not cached | based on whether they were cached or not. | +| Provider | specific providers | the selected AI provider. | +| AI Models | specific models | the selected AI model. | +| Cost | less than, greater than | cost, specifying a threshold. | +| Request type | Universal, Workers AI Binding, WebSockets | the type of request. | +| Tokens | Total tokens, Tokens In, Tokens Out | token count (less than or greater than). | +| Duration | less than, greater than | request duration. | +| Feedback | equals, does not equal (thumbs up, thumbs down, no feedback) | feedback type. | +| Metadata Key | equals, does not equal | specific metadata keys. | +| Metadata Value | equals, does not equal | specific metadata values. | +| Log ID | equals, does not equal | a specific Log ID. | +| Event ID | equals, does not equal | a specific Event ID. | + ## 2. Select evaluators After creating a dataset, choose the evaluation parameters: diff --git a/src/content/docs/ai-gateway/integrations/agents.mdx b/src/content/docs/ai-gateway/integrations/agents.mdx new file mode 100644 index 00000000000000..235f6ea5ebfd11 --- /dev/null +++ b/src/content/docs/ai-gateway/integrations/agents.mdx @@ -0,0 +1,10 @@ +--- +pcx_content_type: navigation +title: Agents +external_link: /agents/ +sidebar: + order: 10 +head: [] +description: Build AI-powered Agents on Cloudflare +--- + diff --git a/src/content/docs/ai-gateway/integrations/aig-workers-ai-binding.mdx b/src/content/docs/ai-gateway/integrations/aig-workers-ai-binding.mdx index 056c35ebc79dc9..787608b9a2603a 100644 --- a/src/content/docs/ai-gateway/integrations/aig-workers-ai-binding.mdx +++ b/src/content/docs/ai-gateway/integrations/aig-workers-ai-binding.mdx @@ -4,7 +4,7 @@ pcx_content_type: tutorial updated: 2024-10-17 --- -import { Render, PackageManagers } from "~/components"; +import { Render, PackageManagers, WranglerConfig } from "~/components"; This guide will walk you through setting up and deploying a Workers AI project. You will use [Workers](/workers/), an AI Gateway binding, and a large language model (LLM), to deploy your first AI-powered application on the Cloudflare global network. @@ -35,7 +35,7 @@ Running `npm create cloudflare@latest` will prompt you to install the create-clo This will create a new `hello-ai` directory. Your new `hello-ai` directory will include: - A "Hello World" Worker at `src/index.ts`. -- A `wrangler.toml` configuration file. +- A `wrangler.json` configuration file. Go to your application directory: @@ -47,9 +47,7 @@ cd hello-ai You must create an AI binding for your Worker to connect to Workers AI. Bindings allow your Workers to interact with resources, like Workers AI, on the Cloudflare Developer Platform. -To bind Workers AI to your Worker, add the following to the end of your `wrangler.toml` file: - -import { WranglerConfig } from "~/components"; +To bind Workers AI to your Worker, add the following to the end of your `wrangler.json` file: @@ -72,7 +70,7 @@ Update the `index.ts` file in your `hello-ai` application directory with the fol ```typescript title="src/index.ts" {78-81} export interface Env { - // If you set another name in wrangler.toml as the value for 'binding', + // If you set another name in the `wrangler.toml / wrangler.json` file as the value for 'binding', // replace "AI" with the variable name you defined. AI: Ai; } diff --git a/src/content/docs/ai-gateway/integrations/vercel-ai-sdk.mdx b/src/content/docs/ai-gateway/integrations/vercel-ai-sdk.mdx index bd18fa2fb39a54..8931c75192fe63 100644 --- a/src/content/docs/ai-gateway/integrations/vercel-ai-sdk.mdx +++ b/src/content/docs/ai-gateway/integrations/vercel-ai-sdk.mdx @@ -35,6 +35,18 @@ const anthropic = createAnthropic({ }); ``` +### Google AI Studio + +If you're using the Google AI Studio provider in AI SDK, you need to append `/v1beta` to your Google AI Studio-compatible AI Gateway URL to avoid errors. The `/v1beta` path is required because Google AI Studio's API includes this in its endpoint structure, and the AI SDK sets the model name separately. This ensures compatibility with Google's API versioning. + +```typescript +import { createGoogleGenerativeAI } from '@ai-sdk/google'; + +const google = createGoogleGenerativeAI({ + baseURL: `https://gateway.ai.cloudflare.com/v1/{account_id}/{gateway_id}/google-ai-studio/v1beta`, +}); +``` + ### Other providers For other providers that are not listed above, you can follow a similar pattern by creating a custom instance for any AI provider, and passing your AI Gateway URL. For help finding your provider-specific AI Gateway URL, refer to the [Supported providers page](/ai-gateway/providers). diff --git a/src/content/docs/ai-gateway/integrations/worker-binding-methods.mdx b/src/content/docs/ai-gateway/integrations/worker-binding-methods.mdx new file mode 100644 index 00000000000000..237a7b0f9e2c8d --- /dev/null +++ b/src/content/docs/ai-gateway/integrations/worker-binding-methods.mdx @@ -0,0 +1,122 @@ +--- +title: AI Gateway Binding Methods +pcx_content_type: tutorial +updated: 2025-01-28 +--- + +import { Render, PackageManagers } from "~/components"; + +This guide provides an overview of how to use the latest Cloudflare Workers AI Gateway binding methods. You will learn how to set up an AI Gateway binding, access new methods, and integrate them into your Workers. + +## Prerequisites + +- Ensure your Worker project is configured with an AI Gateway binding in `wrangler.json`. +- Install and use the `@cloudflare/workers-types` library, version `4.20250124.3` or above. + +## 1. Add an AI Binding to your Worker + +To connect your Worker to Workers AI, add the following to your `wrangler.toml` file: + +import { WranglerConfig } from "~/components"; + + + +```toml title="wrangler.toml" +[ai] +binding = "AI" +``` + + + +This configuration sets up the AI binding accessible in your Worker code as `env.AI`. + +## 2. Basic Usage with Workers AI + Gateway + +To perform an inference task using Workers AI and an AI Gateway, you can use the following code: + +```typescript title="src/index.ts" +const resp = await env.AI.run("@cf/meta/llama-3.1-8b-instruct", { + prompt: "tell me a joke" +}, { + gateway: { + id: "my-gateway" + } +}); +``` + +Additionally, you can access the latest request log ID with: + +```typescript +const myLogId = env.AI.aiGatewayLogId; +``` + +## 3. Access the Gateway Binding + +You can access your AI Gateway binding using the following code: + +```typescript +const gateway = env.AI.gateway("my-gateway"); +``` + +Once you have the gateway instance, you can use the following methods: + +### 3.1. `patchLog`: Send Feedback + +The `patchLog` method allows you to send feedback, score, and metadata for a specific log ID. All object properties are optional, so you can include any combination of the parameters: + +```typescript +gateway.patchLog('my-log-id', { + feedback: 1, + score: 100, + metadata: { + user: "123" + } +}); +``` + +- **Returns**: `Promise` (Make sure to `await` the request.) +- **Example Use Case**: Update a log entry with user feedback or additional metadata. + +### 3.2. `getLog`: Read Log Details + +The `getLog` method retrieves details of a specific log ID. It returns an object of type `Promise`. You can import the `AiGatewayLog` type from the `@cloudflare/workers-types` library. + +```typescript +const log = await gateway.getLog("my-log-id"); +``` + +- **Returns**: `Promise` +- **Example Use Case**: Retrieve log information for debugging or analytics. + +### 3.3. `run`: Universal Requests + +The `run` method allows you to execute universal requests. Users can pass either a single universal request object or an array of them. This method supports all AI Gateway providers. + +Refer to the [Universal endpoint documentation](/ai-gateway/providers/universal/) for details about the available inputs. + +```typescript +const resp = await gateway.run({ + provider: "workers-ai", + endpoint: "@cf/meta/llama-3.1-8b-instruct", + headers: { + authorization: "Bearer my-api-token" + }, + query: { + prompt: "tell me a joke" + } +}); +``` + +- **Returns**: `Promise` +- **Example Use Case**: Perform a universal AI request to any supported provider. + +## Conclusion + +With the new AI Gateway binding methods, you can now: + +- Send feedback and update metadata with `patchLog`. +- Retrieve detailed log information using `getLog`. +- Execute universal requests to any AI Gateway provider with `run`. + +These methods offer greater flexibility and control over your AI integrations, empowering you to build more sophisticated applications on the Cloudflare Workers platform. + diff --git a/src/content/docs/ai-gateway/observability/logging/index.mdx b/src/content/docs/ai-gateway/observability/logging/index.mdx index 32b577f7bdcf3c..599975e783fa8a 100644 --- a/src/content/docs/ai-gateway/observability/logging/index.mdx +++ b/src/content/docs/ai-gateway/observability/logging/index.mdx @@ -62,3 +62,21 @@ This setting is useful for maintaining continuous logging while staying within t ### Manual deletion To manually delete logs, navigate to the Logs tab in the dashboard. Use the available filters such as status, cache, provider, cost, or any other options in the dropdown to refine the logs you wish to delete. Once filtered, select Delete logs to complete the action. + +See full list of available filters and their descriptions below: + +| Filter category | Filter options | Filter by description | +| --------------- | ------------------------------------------------------------ | ----------------------------------------- | +| Status | error, status | error type or status. | +| Cache | cached, not cached | based on whether they were cached or not. | +| Provider | specific providers | the selected AI provider. | +| AI Models | specific models | the selected AI model. | +| Cost | less than, greater than | cost, specifying a threshold. | +| Request type | Universal, Workers AI Binding, WebSockets | the type of request. | +| Tokens | Total tokens, Tokens In, Tokens Out | token count (less than or greater than). | +| Duration | less than, greater than | request duration. | +| Feedback | equals, does not equal (thumbs up, thumbs down, no feedback) | feedback type. | +| Metadata Key | equals, does not equal | specific metadata keys. | +| Metadata Value | equals, does not equal | specific metadata values. | +| Log ID | equals, does not equal | a specific Log ID. | +| Event ID | equals, does not equal | a specific Event ID. | diff --git a/src/content/docs/ai-gateway/providers/universal.mdx b/src/content/docs/ai-gateway/providers/universal.mdx index 09fe85e847a76c..9c8faedbd85c8a 100644 --- a/src/content/docs/ai-gateway/providers/universal.mdx +++ b/src/content/docs/ai-gateway/providers/universal.mdx @@ -16,18 +16,24 @@ https://gateway.ai.cloudflare.com/v1/{account_id}/{gateway_id} AI Gateway offers multiple endpoints for each Gateway you create - one endpoint per provider, and one Universal Endpoint. The Universal Endpoint requires some adjusting to your schema, but supports additional features. Some of these features are, for example, retrying a request if it fails the first time, or configuring a [fallback model/provider](/ai-gateway/configuration/fallbacks/). +## Payload reference + You can use the Universal endpoint to contact every provider. The payload is expecting an array of message, and each message is an object with the following parameters: -- `provider` : the name of the provider you would like to direct this message to. Can be OpenAI, workers-ai, or any of our supported providers. +- `provider` : the name of the provider you would like to direct this message to. Can be OpenAI, Workers AI, or any of our supported providers. - `endpoint`: the pathname of the provider API you’re trying to reach. For example, on OpenAI it can be `chat/completions`, and for Workers AI this might be [`@cf/meta/llama-3.1-8b-instruct`](/workers-ai/models/llama-3.1-8b-instruct/). See more in the sections that are specific to [each provider](/ai-gateway/providers/). -- `authorization`: the content of the Authorization HTTP Header that should be used when contacting this provider. This usually starts with “Token” or “Bearer”. +- `headers`: + - `Authorization`: the content of the Authorization HTTP Header that should be used when contacting this provider. This usually starts with "Token" or "Bearer". + - Any other custom header in a model's [configuration](/ai-gateway/configuration/), such as [Caching](/ai-gateway/configuration/caching/) or [Custom Metadata](/ai-gateway/configuration/custom-metadata/). - `query`: the payload as the provider expects it in their official API. ## cURL example +The following example shows a simple setup with a primary model and a [fallback](/ai-gateway/configuration/fallbacks/) option. + -The above will send a request to Workers AI Inference API, if it fails it will proceed to OpenAI. You can add as many fallbacks as you need, just by adding another JSON in the array. +The above will send a request to Workers AI Inference API, if it fails it will proceed to OpenAI. You can add as many [fallbacks](/ai-gateway/configuration/fallbacks/) as you need, just by adding another JSON in the array. ## WebSockets API diff --git a/src/content/docs/ai-gateway/providers/workersai.mdx b/src/content/docs/ai-gateway/providers/workersai.mdx index 79422005b577ac..5d8cc4334f4097 100644 --- a/src/content/docs/ai-gateway/providers/workersai.mdx +++ b/src/content/docs/ai-gateway/providers/workersai.mdx @@ -114,6 +114,6 @@ Workers AI supports the following parameters for AI gateways: - `id` string - Name of your existing [AI Gateway](/ai-gateway/get-started/#create-gateway). Must be in the same account as your Worker. - `skipCache` boolean(default: false) - - Controls whether the request should [skip the cache](/ai-gateway/configuration/caching/#skip-cache-cf-skip-cache). + - Controls whether the request should [skip the cache](/ai-gateway/configuration/caching/#skip-cache-cf-aig-skip-cache). - `cacheTtl` number - - Controls the [Cache TTL](/ai-gateway/configuration/caching/#cache-ttl-cf-cache-ttl). + - Controls the [Cache TTL](/ai-gateway/configuration/caching/#cache-ttl-cf-aig-cache-ttl). diff --git a/src/content/docs/analytics/account-and-zone-analytics/zone-analytics.mdx b/src/content/docs/analytics/account-and-zone-analytics/zone-analytics.mdx index a7ab91f8332507..446c72e72e28cb 100644 --- a/src/content/docs/analytics/account-and-zone-analytics/zone-analytics.mdx +++ b/src/content/docs/analytics/account-and-zone-analytics/zone-analytics.mdx @@ -89,21 +89,6 @@ The metrics aggregated under this tab span multiple Cloudflare services.  The p * **Origin Performance (Argo)** (add-on service) - Displays metrics related to response time between the Cloudflare edge network and origin servers for the last 48 hours.  For additional details, refer to [Argo Analytics](/argo-smart-routing/analytics/). * **Overview** - Displays a set of pie charts for: **Client HTTP Version Used**, **Bandwidth Saved**, and **Content Type Breakdown**. If available, the expandable **Details** link display a table with numerical data. -### DNS - -:::note[New DNS analytics] -The **Analytics** > **DNS** tab will be deprecated soon. - -To access the new analytics dashboard, go to **DNS** > **Analytics**. Refer to [Analytics and logs](/dns/additional-options/analytics/) for details. -::: - -The DNS tab presents statistics for DNS queries.  Note that metrics are available as long as Cloudflare is the site’s authoritative DNS server, even if the site is not proxied by Cloudflare. Therefore, DNS metrics are not offered for sites with a [CNAME Setup](/dns/zone-setups/partial-setup/). - -The metrics panels available under the DNS tab may include: - -* **DNS Queries** - Displays area charts and data tables for DNS record metrics. For free plans, this section includes *Queries by Response Code* and, for Pro and above, this section also includes *Queries by Record Type*. Records that return an *NXDOMAIN* response (dns record doesn’t exist) are also considered. For zones in Enterprise plan, you can also filter by one or several DNS records by entering record names (for example, [www.example.com](http://www.example.com)) in the dropdown near the top. -* **DNS Queries by Data Center** - Displays DNS query distribution across Cloudflare’s data centers. Metrics appear as interactive maps and data tables, and include statistics for *DNS Traffic*, *NXDOMAIN*, and *NOERROR*. This section is available to zones in Pro plan or above. - ### Workers This panel features metrics for Cloudflare Workers. To learn more, read [Cloudflare analytics with Workers](/analytics/account-and-zone-analytics/analytics-with-workers/). diff --git a/src/content/docs/analytics/analytics-engine/get-started.mdx b/src/content/docs/analytics/analytics-engine/get-started.mdx index 10e30f6c323c90..a37dd476312dce 100644 --- a/src/content/docs/analytics/analytics-engine/get-started.mdx +++ b/src/content/docs/analytics/analytics-engine/get-started.mdx @@ -9,13 +9,11 @@ head: --- -import { DirectoryListing } from "~/components" +import { DirectoryListing, WranglerConfig } from "~/components" ## 1. Name your dataset and add it to your Worker -Add the following to your `wrangler.toml` file to create a [binding](/workers/runtime-apis/bindings/) to a Workers Analytics Engine dataset. A dataset is like a table in SQL: the rows and columns should have consistent meaning. - -import { WranglerConfig } from "~/components"; +Add the following to your `wrangler.toml / wrangler.json` file to create a [binding](/workers/runtime-apis/bindings/) to a Workers Analytics Engine dataset. A dataset is like a table in SQL: the rows and columns should have consistent meaning. diff --git a/src/content/docs/analytics/analytics-engine/worker-querying.mdx b/src/content/docs/analytics/analytics-engine/worker-querying.mdx index e6e37857cb2355..b45aaeaade6738 100644 --- a/src/content/docs/analytics/analytics-engine/worker-querying.mdx +++ b/src/content/docs/analytics/analytics-engine/worker-querying.mdx @@ -8,6 +8,9 @@ head: content: Querying Workers Analytics Engine from a Worker --- + +import { WranglerConfig } from "~/components"; + If you want to access Analytics Engine data from within a Worker you can use `fetch` to access the SQL API. The API can return JSON data that is easy to interact with in JavaScript. ## Authentication @@ -46,9 +49,7 @@ The following is a sample Worker which executes a query against a dataset of wea First the environment variables are set up with the account ID and API token. -The account ID is set in `wrangler.toml`: - -import { WranglerConfig } from "~/components"; +The account ID is set in the `wrangler.toml / wrangler.json` file: diff --git a/src/content/docs/analytics/graphql-api/getting-started/explore-graphql-schema.mdx b/src/content/docs/analytics/graphql-api/getting-started/explore-graphql-schema.mdx index 358b8b08c4c8f0..ccfd40a5bfffd9 100644 --- a/src/content/docs/analytics/graphql-api/getting-started/explore-graphql-schema.mdx +++ b/src/content/docs/analytics/graphql-api/getting-started/explore-graphql-schema.mdx @@ -6,7 +6,7 @@ sidebar: --- -Many GraphQL clients are support browsing GraphQL schema by taking care of +Many GraphQL clients support browsing the GraphQL schema by taking care of [introspection][1]. In this page, we will cover GraphiQL and Altair clients. [GraphiQL][2] and [Altair][3] are open-source GraphQL clients that provide a diff --git a/src/content/docs/analytics/network-analytics/configure/displayed-data.mdx b/src/content/docs/analytics/network-analytics/configure/displayed-data.mdx index cd357de5698983..253a06b964231b 100644 --- a/src/content/docs/analytics/network-analytics/configure/displayed-data.mdx +++ b/src/content/docs/analytics/network-analytics/configure/displayed-data.mdx @@ -67,3 +67,18 @@ Note that some filters will not be added to the new Magic Firewall rule definiti Enable the **Show annotations** toggle to show or hide annotations for advertised/withdrawn IP prefix events in the **Network Analytics** view. Select each annotation to get more details. ![Network Analytics chart displaying IP prefix-related annotations.](~/assets/images/analytics/network-analytics/view-annotations.png) + +## View logged or monitored traffic + +[Network DDoS managed rules](/ddos-protection/managed-rulesets/network/) and [Advanced DDoS Protection systems](/ddos-protection/advanced-ddos-systems/overview/) provide a `log` or `monitoring` mode that does not drop traffic. These `log` and `monitoring` mode events are based on **Verdict** and **Outcome**/**Action** fields. + +To filter for these traffic events: + +1. Log in to the [Cloudflare dashboard](https://dash.cloudflare.com/) and select your account. +2. Go to **Analytics & Logs** > **Network Analytics** > **DDoS managed rules**. +3. Select **Add filter**. + - Set `Verdict equals drop`. + - Set `Action equals pass`. +4. Select **Apply**. + +By setting `verdict` to `drop` and `outcome` as `pass`, we are filtering for traffic that was marked as a detection (that is, verdict was `drop`) but was not dropped (for example, outcome was `pass`). \ No newline at end of file diff --git a/src/content/docs/analytics/types-of-analytics.mdx b/src/content/docs/analytics/types-of-analytics.mdx index 6499fb517de7ea..3be09c4af5b47f 100644 --- a/src/content/docs/analytics/types-of-analytics.mdx +++ b/src/content/docs/analytics/types-of-analytics.mdx @@ -42,7 +42,6 @@ Data available under the **Analytics & Logs** section includes: * **Security** - Total Threats, Top Crawlers/Bots, Rate Limiting, Total Threats Stopped. * **Performance** - Origin Performance, Bandwidth Saved. * **Edge Reachability** - [Last mile insights](/network-error-logging/) for Enterprise customers. -* **DNS** - DNS Queries by Response Code, Record Type, and Cloudflare Data Center. [Available metrics](/analytics/account-and-zone-analytics/zone-analytics/#dns) vary according to the zone plan. For information on the new DNS analytics refer to [Analytics and logs](/dns/additional-options/analytics/). * **Workers** - [Detailed information](/workers/observability/metrics-and-analytics/) related to your Workers per zone, and Workers KV per account. * **Logs** - [Detailed logs](/logs/) of the metadata generated by Cloudflare products for Enterprise customers. * **Instant logs** - [Live stream of traffic](/logs/instant-logs/) for your domain. Enterprise customers can access this live stream from the Cloudflare dashboard or from a command-line interface (CLI). diff --git a/src/content/docs/api-shield/security/api-discovery.mdx b/src/content/docs/api-shield/security/api-discovery.mdx index 44382ffbb5144b..e4cc45a2e5f162 100644 --- a/src/content/docs/api-shield/security/api-discovery.mdx +++ b/src/content/docs/api-shield/security/api-discovery.mdx @@ -55,7 +55,7 @@ By adding endpoints to Endpoint Management, you will unlock further [security](/ To restore any errantly ignored endpoints, you can filter by **Ignored** and select **Restore**. -Check back regularly for new API Discovery results. A badge with the number of endpoints needing review will show in the API Shield dashboard. +API Discovery is an ongoing process. Check back regularly for new API Discovery results. A badge with the number of endpoints needing review will show in the API Shield dashboard. You may see the quantities in the **Needs Review** and **Ignored** metrics change over time. As your actual API or traffic patterns to your APIs change, API Discovery results that are not saved can disappear. :::note diff --git a/src/content/docs/bots/reference/javascript-detections.mdx b/src/content/docs/bots/reference/javascript-detections.mdx index 5f77af3553144f..cec48aeb22b45c 100644 --- a/src/content/docs/bots/reference/javascript-detections.mdx +++ b/src/content/docs/bots/reference/javascript-detections.mdx @@ -24,6 +24,8 @@ For more details on how to set up bot protection, see [Get started](/bots/get-st + + ## Limitations ### If you enabled Bot Management before June 2020 diff --git a/src/content/docs/browser-rendering/get-started/browser-rendering-with-DO.mdx b/src/content/docs/browser-rendering/get-started/browser-rendering-with-DO.mdx index 299e8aff7227fe..6a40018be18649 100644 --- a/src/content/docs/browser-rendering/get-started/browser-rendering-with-DO.mdx +++ b/src/content/docs/browser-rendering/get-started/browser-rendering-with-DO.mdx @@ -14,7 +14,7 @@ sidebar: order: 2 --- -import { Render, PackageManagers } from "~/components"; +import { Render, PackageManagers, WranglerConfig } from "~/components"; By following this guide, you will create a Worker that uses the Browser Rendering API along with [Durable Objects](/durable-objects/) to take screenshots from web pages and store them in [R2](/r2/). @@ -69,13 +69,11 @@ wrangler r2 bucket list After running the `list` command, you will see all bucket names, including the ones you have just created. -## 5. Configure `wrangler.toml` +## 5. Configure your Wrangler configuration file -Configure your `browser-worker` project's [`wrangler.toml`](/workers/wrangler/configuration/) file by adding a browser [binding](/workers/runtime-apis/bindings/) and a [Node.js compatibility flag](/workers/configuration/compatibility-flags/#nodejs-compatibility-flag). Browser bindings allow for communication between a Worker and a headless browser which allows you to do actions such as taking a screenshot, generating a PDF and more. +Configure your `browser-worker` project's [`wrangler.toml / wrangler.json` file](/workers/wrangler/configuration/) by adding a browser [binding](/workers/runtime-apis/bindings/) and a [Node.js compatibility flag](/workers/configuration/compatibility-flags/#nodejs-compatibility-flag). Browser bindings allow for communication between a Worker and a headless browser which allows you to do actions such as taking a screenshot, generating a PDF and more. -Update your `wrangler.toml` configuration file with the Browser Rendering API binding, the R2 bucket you created and a Durable Object: - -import { WranglerConfig } from "~/components"; +Update your `wrangler.toml / wrangler.json` file with the Browser Rendering API binding, the R2 bucket you created and a Durable Object: diff --git a/src/content/docs/browser-rendering/get-started/reuse-sessions.mdx b/src/content/docs/browser-rendering/get-started/reuse-sessions.mdx index 68fc77f791b703..f6637b5678fb5f 100644 --- a/src/content/docs/browser-rendering/get-started/reuse-sessions.mdx +++ b/src/content/docs/browser-rendering/get-started/reuse-sessions.mdx @@ -5,7 +5,7 @@ sidebar: order: 3 --- -import { Render, PackageManagers } from "~/components"; +import { Render, PackageManagers, WranglerConfig } from "~/components"; The best way to improve the performance of your browser rendering worker is to reuse sessions. One way to do that is via [Durable Objects](/browser-rendering/get-started/browser-rendering-with-do/), which allows you to keep a long running connection from a worker to a browser. Another way is to keep the browser open after you've finished with it, and connect to that session each time you have a new request. @@ -35,15 +35,16 @@ Create a new Worker project named `browser-worker` by running: ## 2. Install Puppeteer -In your `browser-worker` directory, install Cloudflare’s [fork of Puppeteer](/browser-rendering/platform/puppeteer/): +In your `browser-worker` directory, install Cloudflare's [fork of Puppeteer](/browser-rendering/platform/puppeteer/): ```sh npm install @cloudflare/puppeteer --save-dev ``` -## 3. Configure `wrangler.toml` +## 3. Configure the `wrangler.toml / wrangler.json` file -``` + +```toml name = "browser-worker" main = "src/index.ts" compatibility_date = "2023-03-14" @@ -51,6 +52,7 @@ compatibility_flags = [ "nodejs_compat" ] browser = { binding = "MYBROWSER" } ``` + ## 4. Code diff --git a/src/content/docs/browser-rendering/get-started/screenshots.mdx b/src/content/docs/browser-rendering/get-started/screenshots.mdx index e9e6f30a3b4dcb..4f565bd92a6822 100644 --- a/src/content/docs/browser-rendering/get-started/screenshots.mdx +++ b/src/content/docs/browser-rendering/get-started/screenshots.mdx @@ -5,7 +5,7 @@ sidebar: order: 1 --- -import { Render, TabItem, Tabs, PackageManagers } from "~/components"; +import { Render, TabItem, Tabs, PackageManagers, WranglerConfig } from "~/components"; By following this guide, you will create a Worker that uses the Browser Rendering API to take screenshots from web pages. This is a common use case for browser automation. @@ -56,17 +56,15 @@ npx wrangler kv:namespace create BROWSER_KV_DEMO --preview Take note of the IDs for the next step. -## 4. Configure `wrangler.toml` +## 4. Configure the `wrangler.toml / wrangler.json` file -Configure your `browser-worker` project's [`wrangler.toml`](/workers/wrangler/configuration/) file by adding a browser [binding](/workers/runtime-apis/bindings/) and a [Node.js compatibility flag](/workers/configuration/compatibility-flags/#nodejs-compatibility-flag). Bindings allow your Workers to interact with resources on the Cloudflare developer platform. Your browser `binding` name is set by you, this guide uses the name `MYBROWSER`. Browser bindings allow for communication between a Worker and a headless browser which allows you to do actions such as taking a screenshot, generating a PDF and more. +Configure your `browser-worker` project's [`wrangler.toml / wrangler.json` file](/workers/wrangler/configuration/) by adding a browser [binding](/workers/runtime-apis/bindings/) and a [Node.js compatibility flag](/workers/configuration/compatibility-flags/#nodejs-compatibility-flag). Bindings allow your Workers to interact with resources on the Cloudflare developer platform. Your browser `binding` name is set by you, this guide uses the name `MYBROWSER`. Browser bindings allow for communication between a Worker and a headless browser which allows you to do actions such as taking a screenshot, generating a PDF and more. -Update your `wrangler.toml` configuration file with the Browser Rendering API binding and the KV namespaces you created: - -import { WranglerConfig } from "~/components"; +Update your `wrangler.toml / wrangler.json` file with the Browser Rendering API binding and the KV namespaces you created: -```toml +```toml title="wrangler.toml" name = "browser-worker" main = "src/index.js" compatibility_date = "2023-03-14" diff --git a/src/content/docs/browser-rendering/how-to/ai.mdx b/src/content/docs/browser-rendering/how-to/ai.mdx index d95ab64425c9df..7bf88493d1a0cd 100644 --- a/src/content/docs/browser-rendering/how-to/ai.mdx +++ b/src/content/docs/browser-rendering/how-to/ai.mdx @@ -4,9 +4,9 @@ sidebar: order: 2 --- -import { Aside } from "~/components"; +import { Aside, WranglerConfig } from "~/components"; -The ability to browse websites can be crucial when building workflows with AI. Here, we provide an example where we use Browser Rendering to visit +The ability to browse websites can be crucial when building workflows with AI. Here, we provide an example where we use Browser Rendering to visit `https://news.ycombinator.com/` and then, using a machine learning model available in [Workers AI](/workers-ai/), extract the first post as JSON with a specified schema. ## Prerequisites @@ -30,16 +30,20 @@ npm i zod npm i zod-to-json-schema ``` -3. Activate the nodejs compatibility flag and add your Browser Rendering binding to your new `wrangler.toml` configuration: +3. Activate the nodejs compatibility flag and add your Browser Rendering binding to your new Wrangler configuration: + ```toml compatibility_flags = [ "nodejs_compat" ] ``` + + ```toml [browser] binding = "MY_BROWSER" ``` + 4. In order to use [Workers AI](/workers-ai/), you need to get your [Account ID and API token](/workers-ai/get-started/rest-api/#1-get-api-token-and-account-id). Once you have those, create a [`.dev.vars`](/workers/configuration/environment-variables/#add-environment-variables-via-wrangler) file and set them there: diff --git a/src/content/docs/browser-rendering/how-to/pdf-generation.mdx b/src/content/docs/browser-rendering/how-to/pdf-generation.mdx index c5ea765a3556dc..22a40c370f7163 100644 --- a/src/content/docs/browser-rendering/how-to/pdf-generation.mdx +++ b/src/content/docs/browser-rendering/how-to/pdf-generation.mdx @@ -5,7 +5,7 @@ sidebar: order: 1 --- -import { Aside } from "~/components"; +import { Aside, WranglerConfig } from "~/components"; As seen in the [Getting Started guide](/browser-rendering/get-started/screenshots/), Browser Rendering can be used to generate screenshots for any given URL. Alongside screenshots, you can also generate full PDF documents for a given webpage, and can also provide the webpage markup and style ourselves. @@ -23,11 +23,13 @@ npm create cloudflare@latest -- browser-worker npm install @cloudflare/puppeteer --save-dev ``` -3. Add your Browser Rendering binding to your new `wrangler.toml` configuration: +3. Add your Browser Rendering binding to your new Wrangler configuration: + ```toml browser = { binding = "BROWSER" } ``` + 4. Replace the contents of `src/index.ts` (or `src/index.js` for JavaScript projects) with the following skeleton script: diff --git a/src/content/docs/browser-rendering/platform/wrangler.mdx b/src/content/docs/browser-rendering/platform/wrangler.mdx index f94f7bad96e7f6..91cd57c36cdca8 100644 --- a/src/content/docs/browser-rendering/platform/wrangler.mdx +++ b/src/content/docs/browser-rendering/platform/wrangler.mdx @@ -19,7 +19,7 @@ To install Wrangler, refer to [Install and Update Wrangler](/workers/wrangler/in [Bindings](/workers/runtime-apis/bindings/) allow your Workers to interact with resources on the Cloudflare developer platform. A browser binding will provide your Worker with an authenticated endpoint to interact with a dedicated Chromium browser instance. -To deploy a Browser Rendering Worker, you must declare a [browser binding](/workers/runtime-apis/bindings/) in your Worker's `wrangler.toml` configuration file. +To deploy a Browser Rendering Worker, you must declare a [browser binding](/workers/runtime-apis/bindings/) in your Worker's Wrangler configuration file. diff --git a/src/content/docs/byoip/address-maps/index.mdx b/src/content/docs/byoip/address-maps/index.mdx index 67997a8f8d7e9d..0fb1d1e254b3af 100644 --- a/src/content/docs/byoip/address-maps/index.mdx +++ b/src/content/docs/byoip/address-maps/index.mdx @@ -27,7 +27,7 @@ For zones using [Cloudflare's authoritative DNS](/dns/), Cloudflare typically re Address maps do not change [how Cloudflare reaches the configured origin](/fundamentals/concepts/how-cloudflare-works/#how-cloudflare-works-as-a-reverse-proxy). The IP addresses defined on the **DNS** > **Records** under your zone continue to instruct Cloudflare how to reach the origin. :::caution -Depending on whether you use static IPs or BYOIP, the process to [create an address map](/byoip/address-maps/setup/#create-address-maps) is different. +Depending on whether you use static IPs or BYOIP, the process to [create an address map](/byoip/address-maps/setup/) is different. ::: ### Static IPs or BYOIP @@ -44,4 +44,4 @@ Some customers may only proxy zones through BYOIP addresses, and are prohibited It is still possible to create more specific zone-level address maps with specific BYOIPs, but DNS will fall back to the account-wide address map without one. -To specify different addresses for certain zones, [create a new address map](/byoip/address-maps/setup/#create-address-maps). \ No newline at end of file +To specify different addresses for certain zones, [create a new address map](/byoip/address-maps/setup/). \ No newline at end of file diff --git a/src/content/docs/byoip/address-maps/setup.mdx b/src/content/docs/byoip/address-maps/setup.mdx index 9acfb13cc58486..c4ea246f0cd92e 100644 --- a/src/content/docs/byoip/address-maps/setup.mdx +++ b/src/content/docs/byoip/address-maps/setup.mdx @@ -10,6 +10,10 @@ import { GlossaryTooltip } from "~/components"; Consider the sections below to learn how to set up address maps. +:::note +There is **no expected downtime** when setting up or updating your address maps. +::: + ## Create address maps To avoid any errors if you have [static IPs](/byoip/concepts/static-ips/), Cloudflare creates an address map during the static IP onboarding process, meaning you cannot create a new address map with your static IPs. You may only edit the Cloudflare-created map and add or edit your zones within the existing map. diff --git a/src/content/docs/byoip/concepts/irr-entries/best-practices.mdx b/src/content/docs/byoip/concepts/irr-entries/best-practices.mdx index 3b8563b4b059fe..17958789de3adb 100644 --- a/src/content/docs/byoip/concepts/irr-entries/best-practices.mdx +++ b/src/content/docs/byoip/concepts/irr-entries/best-practices.mdx @@ -81,10 +81,6 @@ Add or update IRR entries when they meet any of these criteria: * The entry is incomplete or inaccurate — for example, when the route object does not show the correct origin. * The entry is complete but requires updating — for example, when they correspond to supernets but need to correspond to subnets used in Magic Transit. -You are strongly encouraged to verify IRR entries for the exact prefixes you will use to onboard with Cloudflare. - -IRR entries for less specific prefixes are acceptable as long as you understand and accept the following risk: if you modify your IRR entries in the future (for example, by changing your ASN) and the IRR entry for the supernet no longer matches the prefix or origin mapping in your Magic Transit configuration, the prefix will have reduced reachability due to networks Cloudflare peers with automatically filtering the prefix. Having specific IRR entries helps minimize (but not entirely remove) this risk. - ### IRR entry verification methods To verify your prefix and ASN route, use the tools and methods outlined on the table below: diff --git a/src/content/docs/byoip/get-started.mdx b/src/content/docs/byoip/get-started.mdx index eedc04a990e4be..0c0da10e4ce13d 100644 --- a/src/content/docs/byoip/get-started.mdx +++ b/src/content/docs/byoip/get-started.mdx @@ -11,22 +11,23 @@ import { GlossaryTooltip } from "~/components" To bring your own IPs, you must work with your account team to understand everything you need to ensure a smooth transition during the onboarding process. :::note - -BYOIP is ingress only. +BYOIP is ingress only. ::: -## Overview - Cloudflare requires a service-specific configuration for your prefixes, as well as some requirements common to all BYOIP customers regardless of service type. These requirements are common to all products compatible with BYOIP, such as [Magic Transit](/magic-transit/), [Spectrum](/spectrum/), and [CDN services](/cache/). ## Prerequisites There are two major prerequisites before Cloudflare can begin onboarding your IP space. -1. You must verify your [Internet Routing Registry (IRR)](/byoip/concepts/irr-entries/) records are up to date with the correct prefix or ASN information. -2. Cloudflare must receive a [Letter of Agency (LOA)](/byoip/concepts/loa/) to announce your prefixes, which we will share with our transit partners as evidence that we are allowed to announce the route. +1. Cloudflare must receive a [Letter of Agency (LOA)](/byoip/concepts/loa/) to announce your prefixes, which we will share with our transit partners as evidence that we are allowed to announce the route. +2. You must verify that your [Internet Routing Registry (IRR)](/byoip/concepts/irr-entries/) records are up to date and contain: + - `route` or `route6` objects matching the exact prefixes you want to onboard + - `origin` matching the correct ASN you want to onboard -Optionally, if you use the Resource Public Key Infrastructure (RPKI) protocol to sign your routes, Cloudflare can help with this as well. Contact your account team if you are interested in using RPKI. +:::caution[RPKI validation] +You are not required to use Resource Public Key Infrastructure (RPKI). However, if you do, make sure your ROAs are accurate. You can use [Cloudflare's RPKI Portal](https://rpki.cloudflare.com/?view=validator) and a second source such as [Routinator](https://rpki-validator.ripe.net/ui/) to double check your prefixes. +::: After onboarding, [Border Gateway Protocol (BGP)](https://www.cloudflare.com/learning/security/glossary/what-is-bgp/) announcements for customer prefixes can be controlled with the [Dynamic Advertisement](/byoip/concepts/dynamic-advertisement/) API or via the Cloudflare dashboard. @@ -47,5 +48,5 @@ To protect your network using a Cloudflare IP address, contact your account mana :::note -When you use a Cloudflare-managed IP space, you do not need to provide a Letter of Agency (LOA) and advertise your prefixes that are associated with bringing your own IP. +When you use a Cloudflare-managed IP space, you do not need to provide a Letter of Agency (LOA) and advertise your prefixes that are associated with bringing your own IP. ::: diff --git a/src/content/docs/byoip/index.mdx b/src/content/docs/byoip/index.mdx index deba21519c58b6..48c1eeeadf7fd8 100644 --- a/src/content/docs/byoip/index.mdx +++ b/src/content/docs/byoip/index.mdx @@ -12,11 +12,6 @@ import { LinkButton, Plan } from "~/components"; -With **Bringing Your Own IPs** (BYOIP), Cloudflare announces your IPs in all our locations. Use your IPs with Magic Transit, Spectrum, CDN services, or Gateway DNS. +With **Bringing Your Own IPs** (BYOIP), Cloudflare announces your IPs in all our locations. Use your IPs with [Magic Transit](/magic-transit/), [Spectrum](/spectrum/), [CDN services](/cache/), or [Gateway DNS](/cloudflare-one/policies/gateway/dns-policies/). -BYOIP is compatible with [Magic Transit](/magic-transit/), [Spectrum](/spectrum/), [CDN services](/cache/), and [Gateway DNS](/cloudflare-one/policies/gateway/dns-policies/). - -{" "} - - Get started - +Learn how to [get started](/byoip/get-started/). diff --git a/src/content/docs/cache/concepts/revalidation.mdx b/src/content/docs/cache/concepts/revalidation.mdx index e59f12a7bba79b..2ad5b0591a9461 100644 --- a/src/content/docs/cache/concepts/revalidation.mdx +++ b/src/content/docs/cache/concepts/revalidation.mdx @@ -6,9 +6,11 @@ pcx_content_type: concept import { GlossaryTooltip } from "~/components" -Revalidation is a caching mechanism that involves checking the [freshness](/cache/concepts/retention-vs-freshness/) of cached data before serving it to a client or user. If a cached object is no longer [fresh](/cache/concepts/retention-vs-freshness/#freshness-ttl) and Cloudflare receives a request for it, a request is made to the origin to revalidate the object in the Cloudflare cache. +Revalidation is a caching mechanism that checks the [freshness](/cache/concepts/retention-vs-freshness/#freshness-ttl) of cached data before serving it to users. If a cached object is no longer fresh and Cloudflare receives a request for it, the system makes a request to the origin to revalidate the object in the Cloudflare cache. By using headers like `If-Modified-Since` and `ETag`, Cloudflare validates content without fully re-fetching it. When these headers are missing, Smart Edge Revalidation generates a `Last-Modified` header, ensuring efficient updates and delivery of fresh content while reducing origin traffic. -## Example scenarios +## Revalidation towards origin + +For stale (expired TTL) content, Cloudflare will send a revalidation request to the origin. If the stale content is still valid Cloudflare will set a new TTL. If the content is expired, then the origin will provide new fresh content to replace the old. Consider the following example scenarios. @@ -19,3 +21,7 @@ One-thousand (1,000) requests arrive simultaneously at Cloudflare's network, and ### Example 2 One-thousand (1,000) requests arrive simultaneously at a single Cloudflare data center, and the requested asset is not in Cloudflare's cache (a cache miss). These requests will use a cache lock to communicate with your origin. This means that only the first request will go to origin to fetch the asset. The remaining 999 requests wait for the first request to fetch the data, after which the response is [streamed](https://blog.cloudflare.com/introducing-concurrent-streaming-acceleration/) to all the waiting requests. The cache lock ensures that Cloudflare only sends the origin one request at a time for a given asset from a location in Cloudflare's network, preventing the origin from getting too much traffic. + +## Smart revalidation towards users + +When both [`Last-Modified`](https://datatracker.ietf.org/doc/html/rfc7232?cf_history_state=%7B%22guid%22%3A%22C255D9FF78CD46CDA4F76812EA68C350%22%2C%22historyId%22%3A15%2C%22targetId%22%3A%226C8153BAEF7BC0C5A331E28F8BCF1ABA%22%7D#section-2.2) and [`Etag`](https://datatracker.ietf.org/doc/html/rfc7232?cf_history_state=%7B%22guid%22%3A%22C255D9FF78CD46CDA4F76812EA68C350%22%2C%22historyId%22%3A13%2C%22targetId%22%3A%226C8153BAEF7BC0C5A331E28F8BCF1ABA%22%7D#section-2.3) headers are absent from the origin server response, Smart Edge Revalidation will use the time the object was cached on Cloudflare's global network as the `Last-Modified` header value. When a browser sends a revalidation request to Cloudflare using `If-Modified-Since` or `If-None-Match`, our global network can answer those revalidation questions using the `Last-Modified` header generated from Smart Edge Revalidation. In this way, our global network can ensure efficient revalidation even if the headers are not sent from the origin. \ No newline at end of file diff --git a/src/content/docs/cache/how-to/cache-keys.mdx b/src/content/docs/cache/how-to/cache-keys.mdx index d8c13121cbceb6..b9114660b5e201 100644 --- a/src/content/docs/cache/how-to/cache-keys.mdx +++ b/src/content/docs/cache/how-to/cache-keys.mdx @@ -119,8 +119,8 @@ Additionally, you cannot include the following headers: Host determines which host header to include in the Cache Key. -* If `resolved: false`, Cloudflare includes the `Host` header in the HTTP request sent to the origin. -* If `resolved: true`, Cloudflare includes the `Host` header that was resolved to get the `origin IP` for the request. In this scenario, the `Host` header may be different from the header actually sent if the [Cloudflare Resolve Override](/rules/page-rules/how-to/override-url-or-ip-address/) feature is used. +* If `Use original host` (`resolved: false` in the API), Cloudflare includes the `Host` header in the HTTP request sent to the origin. +* If `Resolved host` (`resolved: true` in the API), Cloudflare includes the `Host` header that was resolved to get the `origin IP` for the request. The `Host` header may be different from the header actually sent if the [Cloudflare Resolve Override](/rules/page-rules/how-to/override-url-or-ip-address/) feature is used. ### Cookie diff --git a/src/content/docs/cache/how-to/cache-rules/examples/custom-cache-key.mdx b/src/content/docs/cache/how-to/cache-rules/examples/custom-cache-key.mdx index 748e3d400b267b..103f8469d5ae39 100644 --- a/src/content/docs/cache/how-to/cache-rules/examples/custom-cache-key.mdx +++ b/src/content/docs/cache/how-to/cache-rules/examples/custom-cache-key.mdx @@ -27,3 +27,5 @@ import { Example, Render } from "~/components" * **Query string**: All query string parameters + +Refer to [cache keys](/cache/how-to/cache-keys/) for more information on possible settings when configuring a custom cache key. diff --git a/src/content/docs/calls/turn/faq.mdx b/src/content/docs/calls/turn/faq.mdx index 9228b2f110c274..545d0a25e8f97c 100644 --- a/src/content/docs/calls/turn/faq.mdx +++ b/src/content/docs/calls/turn/faq.mdx @@ -3,16 +3,12 @@ pcx_content_type: get-started title: FAQ sidebar: order: 20 - --- - ## General ### What is Cloudflare Calls TURN pricing? How exactly is it calculated? - - Cloudflare TURN pricing is based on the data sent from the Cloudflare edge to the TURN client, as described in [RFC 8656 Figure 1](https://datatracker.ietf.org/doc/html/rfc8656#fig-turn-model). This means data sent from the TURN server to the TURN client and captures all data, including TURN overhead, following successful authentication. Pricing for Cloudflare Calls Serverless SFU and TURN services is $0.05 per GB of data used. @@ -27,211 +23,109 @@ Traffic between Cloudflare Calls TURN and Cloudflare Calls SFU or Cloudflare Str
- ### Is Calls TURN HIPAA/GDPR/FedRAMP compliant? - - - - Please view Cloudflare's [certifications and compliance resources](https://www.cloudflare.com/trust-hub/compliance-resources/) and contact your Cloudflare enterprise account manager for more information. ### Is Calls TURN end-to-end encrypted? - - - - - - TURN protocol, [RFC 8656](https://datatracker.ietf.org/doc/html/rfc8656), does not discuss encryption beyond wrapper protocols such as TURN over TLS. If you are using TURN with WebRTC will encrypt data at the WebRTC level. - - ### What regions does Cloudflare Calls TURN operate at? - - - - Cloudflare Calls TURN server runs on [Cloudflare's global network](https://www.cloudflare.com/network) - a growing global network of thousands of machines distributed across hundreds of locations, with the notable exception of the Cloudflare's [China Network](/china-network/). - - ### Does Cloudflare Calls TURN use the Cloudflare Backbone or is there any "magic" Cloudflare do to speed connection up? - - - - Cloudflare Calls TURN allocations are homed in the nearest available Cloudflare data center to the TURN client via anycast routing. If both ends of a connection are using Cloudflare Calls TURN, Cloudflare will be able to control the routing and, if possible, route TURN packets through the Cloudflare backbone. - - ### What is the difference between Cloudflare Calls TURN with a enterprise plan vs self-serve (pay with your credit card) plans? - - - - There is no performance or feature level difference for Cloudflare Calls TURN service in enterprise or self-serve plans, however those on [enterprise plans](https://www.cloudflare.com/enterprise/) will get the benefit of priority support, predictable flat-rate pricing and SLA guarantees. - ### Does Cloudflare Calls TURN run in the Cloudflare China Network? - - - - - Cloudflare's [China Network](/china-network/) does not participate in serving Calls traffic and TURN traffic from China will connect to Cloudflare locations outside of China. - - - ### How long does it take for TURN activity to be available in analytics? - - - TURN usage shows up in analytics in 30 seconds. - ## Technical ### I need to allowlist (whitelist) Cloudflare Calls TURN IP addresses. Which IP addresses should I use? - - - - - Cloudflare Calls TURN is easy to use by IT administrators who have strict firewalls because it requires very few IP addresses to be allowlisted compared to other providers. You must allowlist both IPv6 and IPv4 addresses. Please allowlist the following IP addresses: -* `2a06:98c1:3200::1/128` -* `2606:4700:48::1/128` -* `141.101.90.1/32` -* `162.159.207.1/32` +- `2a06:98c1:3200::1/128` +- `2606:4700:48::1/128` +- `141.101.90.1/32` +- `162.159.207.1/32` :::caution[Watch for IP changes] - Cloudflare tries to, but cannot guarantee that the IP addresses used for the TURN service won't change. If you are allowlisting IP addresses and do not have a enterprise contract, you must set up alerting that detects changes the DNS response from `turn.cloudflare.com` (A and AAAA records) and update the hardcoded IP address(es) accordingly within 14 days of the DNS change. For more details about static IPs, guarantees and other arrangements please discuss with your enterprise account team. Your enterprise team will be able to provide additional addresses to allowlist as future backup to achieve address diversity while still keeping a short list of IPs. - ::: - ### I would like to hardcode IP addresses used for TURN in my application to save a DNS lookup - - - - - Although this is not recommended, we understand there is a very small set of circumstances where hardcoding IP addresses might be useful. In this case, you must set up alerting that detects changes the DNS response from `turn.cloudflare.com` (A and AAAA records) and update the hardcoded IP address(es) accordingly within 14 days of the DNS change. Note that this DNS response could return more than one IP address. In addition, you must set up a failover to a DNS query if there is a problem connecting to the hardcoded IP address. Cloudflare tries to, but cannot guarantee that the IP address used for the TURN service won't change unless this is in your enterprise contract. For more details about static IPs, guarantees and other arrangements please discuss with your enterprise account team. +### I see that TURN IP are published above. Do you also publish IPs for STUN? +TURN service at `turn.cloudflare.com` will also respond to binding requests ("STUN requests"). ### Does Cloudflare Calls TURN support the expired IETF RFC draft "draft-uberti-behave-turn-rest-00"? - - - - The Cloudflare Calls credential generation function returns a JSON structure similar to the [expired RFC draft "draft-uberti-behave-turn-rest-00"](https://datatracker.ietf.org/doc/html/draft-uberti-behave-turn-rest-00), but it does not include the TTL value. If you need a response in this format, you can modify the JSON from the Cloudflare Calls credential generation endpoint to the required format in your backend server or Cloudflare Workers. - - ### I am observing packet loss when using Cloudflare Calls TURN - how can I debug this? - - - - Packet loss is normal in UDP and can happen occasionally even on reliable connections. However, if you observe systematic packet loss, consider the following: -* Are you sending or receiving data at a high rate (>50-100Mbps) from a single TURN client? Calls TURN might be dropping packets to signal you to slow down. -* Are you sending or receiving large amounts of data with very small packet sizes (high packet rate > 5-10kpps) from a single TURN client? Cloudflare Calls might be dropping packets. -* Are you sending packets to new unique addresses at a high rate resembling to [port scanning](https://en.wikipedia.org/wiki/Port_scanner) behavior? - - +- Are you sending or receiving data at a high rate (>50-100Mbps) from a single TURN client? Calls TURN might be dropping packets to signal you to slow down. +- Are you sending or receiving large amounts of data with very small packet sizes (high packet rate > 5-10kpps) from a single TURN client? Cloudflare Calls might be dropping packets. +- Are you sending packets to new unique addresses at a high rate resembling to [port scanning](https://en.wikipedia.org/wiki/Port_scanner) behavior? ### I plan to use Calls TURN at scale. What is the rate at which I can issue credentials? - - - - There is no defined limit for credential issuance. Start at 500 credentials/sec and scale up linearly. Ensure you use more than 50% of the issued credentials. - ### What is the maximum value I can use for TURN credential expiry time? - You can set a expiration time for a credential up to 48 hours in the future. If you need your TURN allocation to last longer than this, you will need to [update](https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/setConfiguration) the TURN credentials. - - ### Does Calls TURN support IPv6? - - - Yes. Cloudflare Calls is available over both IPv4 and IPv6 for TURN Client to TURN server communication, however it does not issue relay addresses in IPv6 as described in [RFC 6156](https://datatracker.ietf.org/doc/html/rfc6156). - - ### Does Calls TURN issue IPv6 relay addresses? - - - - No. Calls TURN will not respect `REQUESTED-ADDRESS-FAMILY` STUN attribute if specified and will issue IPv4 addresses only. - ### Does Calls TURN support TCP relaying? - - - - - No. Calls does not implement [RFC6062](https://datatracker.ietf.org/doc/html/rfc6062) and will not respect `REQUESTED-TRANSPORT` STUN attribute. - - - ### I am unable to make CreatePermission or ChannelBind requests with certain IP addresses. Why is that? - - - Cloudflare Calls denies CreatePermission or ChannelBind requests if private IP ranges (e.g loopback addresses, linklocal unicast or multicast blocks) or IP addresses that are part of [BYOIP](/byoip/) are used. If you are a Cloudflare BYOIP customer and wish to connect to your BYOIP ranges with Calls TURN, please reach out to your account manager for further details. - - ### When I send packets to relayed address without using TURN, the packets don't arrive - - - - Cloudflare Calls denies CreatePermission or ChannelBind requests if private IP ranges (e.g loopback addresses, linklocal unicast or multicast blocks) or IP addresses that are part of [BYOIP](/byoip/) are used. If you are a Cloudflare BYOIP customer and wish to connect to your BYOIP ranges with Calls TURN, please reach out to your account manager for further details. - - ### What will happen if TURN credentials expire while the TURN allocation is in use? -Cloudflare Calls will immediately stop billing and recording usage for analytics. After a short delay, the connection will be disconnected. \ No newline at end of file +Cloudflare Calls will immediately stop billing and recording usage for analytics. After a short delay, the connection will be disconnected. diff --git a/src/content/docs/cloudflare-for-platforms/workers-for-platforms/configuration/outbound-workers.mdx b/src/content/docs/cloudflare-for-platforms/workers-for-platforms/configuration/outbound-workers.mdx index 7eec498aa71076..d3d86e065bef2b 100644 --- a/src/content/docs/cloudflare-for-platforms/workers-for-platforms/configuration/outbound-workers.mdx +++ b/src/content/docs/cloudflare-for-platforms/workers-for-platforms/configuration/outbound-workers.mdx @@ -4,7 +4,9 @@ title: Outbound Workers --- -Outbound Workers sit between your customer’s Workers and the public Internet. They give you visibility into all outgoing `fetch()` requests from user Workers. +import { WranglerConfig } from "~/components"; + +Outbound Workers sit between your customer's Workers and the public Internet. They give you visibility into all outgoing `fetch()` requests from user Workers. ![Outbound Workers diagram information](~/assets/images/cloudflare-for-platforms/outbound-worker-diagram.png) @@ -25,8 +27,6 @@ To use Outbound Workers: Make sure that you have `wrangler@3.3.0` or later [installed](/workers/wrangler/install-and-update/). -import { WranglerConfig } from "~/components"; - ```toml diff --git a/src/content/docs/cloudflare-for-platforms/workers-for-platforms/get-started/configuration.mdx b/src/content/docs/cloudflare-for-platforms/workers-for-platforms/get-started/configuration.mdx index cfd397c1a1ccbc..7750a40cacd968 100644 --- a/src/content/docs/cloudflare-for-platforms/workers-for-platforms/get-started/configuration.mdx +++ b/src/content/docs/cloudflare-for-platforms/workers-for-platforms/get-started/configuration.mdx @@ -5,7 +5,7 @@ sidebar: order: 1 --- -import { Render, PackageManagers } from "~/components"; +import { Render, PackageManagers, WranglerConfig } from "~/components"; ## Prerequisites: @@ -113,9 +113,7 @@ Change to your project's directory: cd my-dispatcher ``` -Open the `wrangler.toml` file in your project directory, and add the dispatch namespace binding: - -import { WranglerConfig } from "~/components"; +Open the Wrangler file in your project directory, and add the dispatch namespace binding: diff --git a/src/content/docs/cloudflare-for-platforms/workers-for-platforms/get-started/developing-with-wrangler.mdx b/src/content/docs/cloudflare-for-platforms/workers-for-platforms/get-started/developing-with-wrangler.mdx index 76665dbd288b85..5b886dfa8728cc 100644 --- a/src/content/docs/cloudflare-for-platforms/workers-for-platforms/get-started/developing-with-wrangler.mdx +++ b/src/content/docs/cloudflare-for-platforms/workers-for-platforms/get-started/developing-with-wrangler.mdx @@ -5,7 +5,7 @@ sidebar: order: 3 --- -import { Render, PackageManagers } from "~/components"; +import { Render, PackageManagers, WranglerConfig } from "~/components"; To test your [Dispatch Worker](/cloudflare-for-platforms/workers-for-platforms/reference/how-workers-for-platforms-works/#dynamic-dispatch-worker), [user Worker](/cloudflare-for-platforms/workers-for-platforms/reference/how-workers-for-platforms-works/#user-workers) and [Outbound Worker](/cloudflare-for-platforms/workers-for-platforms/configuration/outbound-workers/) before deploying to production, you can use [Wrangler](/workers/wrangler) for development and testing. @@ -52,9 +52,7 @@ export default { }; ``` -Update the `wrangler.toml` file for customer-worker-1 and add the dispatch namespace: - -import { WranglerConfig } from "~/components"; +Update the Wrangler file for customer-worker-1 and add the dispatch namespace: @@ -111,7 +109,7 @@ export default { }; ``` -Update the `wrangler.toml` file for dispatch-worker and add the dispatch namespace binding: +Update the Wrangler file for dispatch-worker and add the dispatch namespace binding: diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/adobe-sign-saas.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/adobe-sign-saas.mdx index a9bc1d27d64562..069e4a022cd5e6 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/adobe-sign-saas.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/adobe-sign-saas.mdx @@ -44,9 +44,8 @@ This guide covers how to configure [Adobe Acrobat Sign](https://helpx.adobe.com/ * **Entity ID**: Entity ID/SAML Audience from Adobe Acrobat Sign SAML SSO configuration. * **Assertion Consumer Service URL**: Assertion Consumer URL from Adobe Acrobat Sign SAML SSO configuration. * **Name ID format**: *Email* -2. Select **Save configuration**. -3. Configure [Access policies](/cloudflare-one/policies/access/) for the application. -4. Select **Done**. +2. Configure [Access policies](/cloudflare-one/policies/access/) for the application. +3. Save the application. ## 4. Test the integration and finalize configuration diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/area-1.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/area-1.mdx index 9eaf8545005737..c1bc57ec8483f3 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/area-1.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/area-1.mdx @@ -32,21 +32,11 @@ sidebar: | **Assertion Consumer Service URL** | `https://horizon.area1security.com/api/users/saml` | | **Name ID Format** | *Email* | -6. (Optional) Configure [App Launcher settings](/cloudflare-one/applications/app-launcher/) for the application. +6. Configure [Access policies](/cloudflare-one/policies/access/) for the application. -7. Choose the **Identity providers** you want to enable for your application. +7. Save the application. -8. Turn on **Instant Auth** if you are selecting only one login method for your application, and would like your end users to skip the identity provider selection step. - -9. Select **Next**. - -## 2. Add an Access policy - -1. To control who can access your application, [create an Access policy](/cloudflare-one/policies/access/). - -2. Select **Next**. - -## 3. Configure SSO for Area 1 +## 2. Configure SSO for Area 1 Finally, you will need to configure Area 1 to allow users to log in through Cloudflare Access. @@ -74,6 +64,4 @@ Finally, you will need to configure Area 1 to allow users to log in through Clou 7. Select **Update Settings**. -8. In Zero Trust, select **Done**. - -Your application will appear on the **Applications** page. If you added the application to your App Launcher, you can test the integration by going to `.cloudflareaccess.com`. +If you added the application to your App Launcher, you can test the integration by going to `.cloudflareaccess.com`. diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/asana-saas.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/asana-saas.mdx index aeebf64cf0a0e9..9a57671a43568c 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/asana-saas.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/asana-saas.mdx @@ -26,9 +26,8 @@ This guide covers how to configure [Asana](https://help.asana.com/hc/en-us/artic * **Assertion Consumer Service URL**: `https://app.asana.com/-/saml/consume` * **Name ID format**: *Email* 7. Copy the **SSO endpoint** and **Public key**. -8. Select **Save configuration**. -9. Configure [Access policies](/cloudflare-one/policies/access/) for the application. -10. Select **Done**. +8. Configure [Access policies](/cloudflare-one/policies/access/) for the application. +9. Save the application. ## 2. Add a SAML SSO provider to Asana diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/atlassian-saas.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/atlassian-saas.mdx index 9d148d90c5e0c4..474bca09a18b6b 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/atlassian-saas.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/atlassian-saas.mdx @@ -24,7 +24,7 @@ This guide covers how to configure [Atlassian Cloud](https://support.atlassian.c 4. For the authentication protocol, select **SAML**. 5. Select **Add application**. 6. Copy the **Access Entity ID or Issuer**, **Public key**, and **SSO endpoint**. -7. Keep this window open without selecting **Select configuration**. You will finish this configuration in step [4. Finish adding a SaaS application to Cloudflare Zero Trust](#4-finish-adding-a-saas-application-to-cloudflare-zero-trust). +7. Keep this window open. You will finish this configuration in step [4. Finish adding a SaaS application to Cloudflare Zero Trust](#4-finish-adding-a-saas-application-to-cloudflare-zero-trust). ## 2. Create a x.509 certificate @@ -38,13 +38,9 @@ This guide covers how to configure [Atlassian Cloud](https://support.atlassian.c 3. For **Directory name**, enter your desired name. For example, you could enter `Cloudflare Access`. 4. Select **Add** > **Set up SAML single sign-on** > **Next**. -:::note - - -This screen will advise you to create an authentication policy before proceeding. You will do this in step [5. Create an application policy to test integration](#5-create-an-authentication-policy-to-test-integration). - - -::: + :::note + This screen will advise you to create an authentication policy before proceeding. You will do this in step [5. Create an application policy to test integration](#5-create-an-authentication-policy-to-test-integration). + ::: 5. Fill in the following fields: * **Identity provider Entity ID**: Access Entity ID or Issuer from application configuration in Cloudflare Zero Trust. @@ -60,11 +56,10 @@ This screen will advise you to create an authentication policy before proceeding 1. In your open Zero Trust window, fill in the following fields: * **Entity ID**: Service provider entity URL from Atlassian Cloud SAML SSO set-up. - * **Assertion Consumer Service URL**: Service provider assertion comsumer service URL from Atlassian Cloud SAML SSO set-up. + * **Assertion Consumer Service URL**: Service provider assertion consumer service URL from Atlassian Cloud SAML SSO set-up. * **Name ID format**: *Email* -2. Select **Save configuration**. -3. Configure [Access policies](/cloudflare-one/policies/access/) for the application. -4. Select **Done**. +2. Configure [Access policies](/cloudflare-one/policies/access/) for the application. +3. Save the application. ## 5. Create an authentication policy to test integration diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/aws-sso-saas.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/aws-sso-saas.mdx index f988b586729eb1..7fcc3506ce72ad 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/aws-sso-saas.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/aws-sso-saas.mdx @@ -40,9 +40,8 @@ Next, we will obtain **Identity provider metadata** from Zero Trust. 1. Copy the **SAML Metadata endpoint**. 2. In a separate browser window, go to the SAML Metadata endpoint (`https://.cloudflareaccess.com/cdn-cgi/access/sso/saml/xxx/saml-metadata`). 3. Save the page as `access_saml_metadata.xml`. -9. Save your SaaS application configuration. -10. Configure [Access policies](/cloudflare-one/policies/access/) for the application. -11. Select **Done**. +9. Configure [Access policies](/cloudflare-one/policies/access/) for the application. +10. Save the application. ## 3. Complete AWS configuration @@ -60,7 +59,7 @@ Access for SaaS does not currently support [SCIM provisioning](/cloudflare-one/i 1. Users are created in both your identity provider and AWS. 2. Users have matching usernames in your identity provider and AWS. -3. Usernames are email addresses. This is the only format AWS supports with third-party SSO providers. +3. Usernames are email addresses. This is the only format AWS supports with third-party SSO providers. ::: ## 4. Test the integration diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/braintree-saas.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/braintree-saas.mdx index 865b76f7000c5c..7e7c6f78c3f590 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/braintree-saas.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/braintree-saas.mdx @@ -26,9 +26,8 @@ This guide covers how to configure [Braintree](https://developer.paypal.com/brai * **Assertion Consumer Service URL**: `https://www.placeholder.com` * **Name ID format**: *Email* 7. Copy the **SSO endpoint** and **Public key**. -8. Select **Save configuration**. -9. Configure [Access policies](/cloudflare-one/policies/access/) for the application. -10. Select **Done**. +8. Configure [Access policies](/cloudflare-one/policies/access/) for the application. +9. Save the application. ## 2. Enable SSO Configuration in Braintree diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/coupa-saas.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/coupa-saas.mdx index 371a1c310c04c2..9f8386faf11b65 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/coupa-saas.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/coupa-saas.mdx @@ -28,9 +28,8 @@ This guide covers how to configure [Coupa](https://compass.coupa.com/en-us/produ * **Name ID format**: *Email* 7. Copy the **Access Entity ID or Issuer** and **SAML Metadata Endpoint**. 8. In **Default relay state**, enter `https://.coupahost.com/sessions/saml_post`. -9. Select **Save configuration**. -10. Configure [Access policies](/cloudflare-one/policies/access/) for the application. -11. Select **Done**. +9. Configure [Access policies](/cloudflare-one/policies/access/) for the application. +10. Save the application. ## 2. Download the metadata file diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/digicert-saas.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/digicert-saas.mdx index d5986d5bef4214..92ccbb9c8d2567 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/digicert-saas.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/digicert-saas.mdx @@ -27,9 +27,8 @@ This guide covers how to configure [Digicert](https://docs.digicert.com/en/certc * **Assertion Consumer Service URL**: `https://www.digicert.com/account/sso/` * **Name ID format**: *Email* 7. Copy the **SAML Metadata endpoint**. -8. Select **Save configuration**. -9. Configure [Access policies](/cloudflare-one/policies/access/) for the application. -10. Select **Done**. +8. Configure [Access policies](/cloudflare-one/policies/access/) for the application. +9. Save the application. ## 2. Add a SAML SSO provider in Digicert diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/docusign-access.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/docusign-access.mdx index ec871675a13d0d..0bab2519bf5390 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/docusign-access.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/docusign-access.mdx @@ -45,20 +45,17 @@ This guide covers how to configure [Docusign](https://support.docusign.com/s/doc 7. Set an Access policy (for example, create a policy based on _Emails ending in @example.com_). -8. Copy and save SSO Endpoint, Entity ID and Public Key. +8. Copy and save the **SSO Endpoint**, **Entity ID** and **Public Key**. - :::note +9. Transform the **Public Key** into a fingerprint: - The Public key must be transformed into a fingerprint. To do that: + 1. Copy the **Public Key** Value. -9. Copy the Public Key Value. + 2. Paste the **Public Key** into VIM or another code editor. -10. Paste the Public Key into VIM or another code editor. + 3. Wrap the value in `-----BEGIN CERTIFICATE-----` and `-----END CERTIFICATE-----`. -11. Wrap the value in `-----BEGIN CERTIFICATE-----` and `-----END CERTIFICATE-----`. - -12. Set the file extension to `.crt` and save. - ::: + 4. Set the file extension to `.crt` and save. ## 2. Configure your DocuSign SSO instance diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/dropbox-saas.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/dropbox-saas.mdx index 0e86f0db764ff2..209fbcc30cf62b 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/dropbox-saas.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/dropbox-saas.mdx @@ -26,9 +26,8 @@ This guide covers how to configure [Dropbox](https://help.dropbox.com/security/s * **Assertion Consumer Service URL**: `https://www.dropbox.com/saml_login` * **Name ID format**: *Email* 7. Copy the **SSO endpoint** and **Public key**. -8. Select **Save configuration**. -9. Configure [Access policies](/cloudflare-one/policies/access/) for the application. -10. Select **Done**. +8. Configure [Access policies](/cloudflare-one/policies/access/) for the application. +9. Save the application. ## 2. Create a certificate file diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/generic-oidc-saas.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/generic-oidc-saas.mdx index 26ab8a83e176ca..947d924f17f740 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/generic-oidc-saas.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/generic-oidc-saas.mdx @@ -62,24 +62,22 @@ Some SaaS applications provide the Redirect URL after you [configure the SSO pro | Key endpoint | Returns the current public keys used to [verify the Access JWT](/cloudflare-one/identity/authorization-cookie/validating-json/)
`https://.cloudflareaccess.com/cdn-cgi/access/sso/oidc//jwks` | | User info endpoint | Returns all user claims in JSON format
`https://.cloudflareaccess.com/cdn-cgi/access/sso/oidc//userinfo` | -11. (Optional) Configure [App Launcher settings](/cloudflare-one/applications/app-launcher/) by turning on **Enable App in App Launcher** and, in **App Launcher URL**, entering the URL that users should be sent to when they select the tile. +11. Add [Access policies](/cloudflare-one/policies/access/) to control who can connect to your application. All Access applications are deny by default -- a user must match an Allow policy before they are granted access. -12. +12. -13. +13. Select **Next**. -14. Select **Save configuration**. +14. (Optional) Configure [App Launcher settings](/cloudflare-one/applications/app-launcher/) for the application. -## 3. Add an Access policy +15. -1. To control who can access the SaaS application, [create an Access policy](/cloudflare-one/policies/access/). +16. Select **Save application**. -2. Select **Done**. - -## 4. Configure SSO in your SaaS application +## 3. Configure SSO in your SaaS application Next, configure your SaaS application to require users to log in through Cloudflare Access. Refer to your SaaS application documentation for instructions on how to configure a third-party OIDC SSO provider. -## 5. Test the integration +## 4. Test the integration Open an incognito browser window and go to the SaaS application's login URL. You will be redirected to the Cloudflare Access login screen and prompted to sign in with your identity provider. diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/generic-saml-saas.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/generic-saml-saas.mdx index 446dfec843ade6..5a207f5178194f 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/generic-saml-saas.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/generic-saml-saas.mdx @@ -48,19 +48,17 @@ Obtain the following URLs from your SaaS application account: If you are using Okta, Microsoft Entra ID (formerly Azure AD), Google Workspace, or GitHub as your IdP, Access will automatically send a SAML attribute titled `groups` with all of the user's associated groups as attribute values. ::: -11. (Optional) Configure [App Launcher settings](/cloudflare-one/applications/app-launcher/) for the application. +11. Add [Access policies](/cloudflare-one/policies/access/) to control who can connect to your application. All Access applications are deny by default -- a user must match an Allow policy before they are granted access. -12. +12. -13. +13. Select **Next**. -14. Select **Save configuration**. +14. (Optional) Configure [App Launcher settings](/cloudflare-one/applications/app-launcher/) for the application. -## 2. Add an Access policy +15. -1. To control who can access the SaaS application, [create an Access policy](/cloudflare-one/policies/access/). - -2. Select **Done**. +16. Select **Save application**. ## 3. Configure SSO in your SaaS application diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/github-saas.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/github-saas.mdx index dd8ca0ea731c72..18a5682af1ae73 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/github-saas.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/github-saas.mdx @@ -27,9 +27,8 @@ This guide covers how to configure [GitHub Enterprise Cloud](https://docs.github * **Assertion Consumer Service URL**: `https://github.com/orgs//saml/consume` * **Name ID format**: *Email* 7. Copy the **SSO endpoint**, **Access Entity ID or Issuer**, and **Public key**. -8. Select **Save configuration**. -9. Configure [Access policies](/cloudflare-one/policies/access/) for the application. -10. Select **Done**. +8. Configure [Access policies](/cloudflare-one/policies/access/) for the application. +9. Save the application. ## 2. Create a x.509 certificate diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/google-cloud-saas.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/google-cloud-saas.mdx index f3d0505feb2c46..9ae073c28f7242 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/google-cloud-saas.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/google-cloud-saas.mdx @@ -19,7 +19,7 @@ When configuring Google Cloud with Access, the following limitations apply: - The integration of Access as a single sign-on provider for your Google Cloud account does not work for Google super admins. It will work for other users. ::: -## Prerequistes +## Prerequisites - An [identity provider](/cloudflare-one/identity/idp-integration/) configured in Cloudflare Zero Trust - Admin access to a Google Workspace account @@ -37,9 +37,8 @@ When configuring Google Cloud with Access, the following limitations apply: - **Assertion Consumer Service URL**: `https://www.google.com/a//acs` - **Name ID format**: _Email_ 7. Copy the **SSO endpoint**, **Access Entity ID or Issuer**, and **Public key**. -8. Select **Save configuration**. -9. Configure [Access policies](/cloudflare-one/policies/access/) for the application. -10. Select **Done**. +8. Configure [Access policies](/cloudflare-one/policies/access/) for the application. +9. Save the application. ## 2. Create a x.509 certificate diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/google-workspace-saas.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/google-workspace-saas.mdx index b25f2a480d568e..9268be6fd8a860 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/google-workspace-saas.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/google-workspace-saas.mdx @@ -16,7 +16,7 @@ The integration of Access as a single sign-on provider for your Google Workspace ::: -## Prerequistes +## Prerequisites - An [identity provider](/cloudflare-one/identity/idp-integration/) configured in Cloudflare Zero Trust - Admin access to a Google Workspace account @@ -38,9 +38,11 @@ The integration of Access as a single sign-on provider for your Google Workspace When you put your Google Workspace behind Access, users will not be able to log in using [Google](/cloudflare-one/identity/idp-integration/google/) or [Google Workspace](/cloudflare-one/identity/idp-integration/gsuite/) as an identity provider. ::: -4. On the next page, [create an Access policy](/cloudflare-one/policies/access/) for your application. For example, you could allow users with an `@your_domain.com` email address. +4. [Create an Access policy](/cloudflare-one/policies/access/) for your application. For example, you could allow users with an `@your_domain.com` email address. -5. On the next page, you will see your **SSO endpoint**, **Access Entity ID or Issuer**, and **Public key**. These values will be used to configure Google Workspace. +5. Copy the **SSO endpoint**, **Access Entity ID or Issuer**, and **Public key**. These values will be used to configure Google Workspace. + +6. Save the application. ## 2. Create a certificate from your public key diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/grafana-cloud-saas-oidc.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/grafana-cloud-saas-oidc.mdx index 11ef1b207a94e4..2fc1b65b3e195e 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/grafana-cloud-saas-oidc.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/grafana-cloud-saas-oidc.mdx @@ -25,10 +25,9 @@ This guide covers how to configure [Grafana Cloud](https://grafana.com/docs/graf 7. In **Redirect URLs**, enter `https:///login/generic_oauth`. 8. (Optional) Enable [Proof of Key Exchange (PKCE)](https://www.oauth.com/oauth2-servers/pkce/) if the protocol is supported by your IdP. PKCE will be performed on all login attempts. 9. Copy the **Client secret**, **Client ID**, **Token endpoint**, and **Authorization endpoint**. -10. Select **Save configuration**. -11. (Optional) configure [App Launcher settings](/cloudflare-one/applications/app-launcher/) by turning on **Enable App in App Launcher** and, in **App Launcher URL**, entering `https:///login`. -12. Configure [Access policies](/cloudflare-one/policies/access/) for the application. -13. Select **Done**. +10. Configure [Access policies](/cloudflare-one/policies/access/) for the application. +11. (Optional) In **Experience settings**, configure [App Launcher settings](/cloudflare-one/applications/app-launcher/) by turning on **Enable App in App Launcher** and, in **App Launcher URL**, entering `https:///login`. +12. Save the application. ## 2. Add a SSO provider to Grafana Cloud diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/grafana-saas-oidc.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/grafana-saas-oidc.mdx index 89cf2235b94f7a..48b3e8ba1e387e 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/grafana-saas-oidc.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/grafana-saas-oidc.mdx @@ -15,11 +15,7 @@ This guide covers how to configure [Grafana](https://grafana.com/docs/grafana/la * Admin access to a Grafana account :::note - - You can also configure OIDC SSO for Grafana using a [configuration file](https://grafana.com/docs/grafana/latest/setup-grafana/configure-security/configure-authentication/generic-oauth/#configure-generic-oauth-authentication-client-using-the-grafana-configuration-file) instead of using Grafana's user interface (UI), as documented in this guide. - - ::: ## 1. Add a SaaS application to Cloudflare Zero Trust @@ -33,10 +29,9 @@ You can also configure OIDC SSO for Grafana using a [configuration file](https:/ 7. In **Redirect URLs**, enter `https:///login/generic_oauth`. 8. (Optional) Enable [Proof of Key Exchange (PKCE)](https://www.oauth.com/oauth2-servers/pkce/) if the protocol is supported by your IdP. PKCE will be performed on all login attempts. 9. Copy the **Client secret**, **Client ID**, **Token endpoint**, and **Authorization endpoint**. -10. Select **Save configuration**. -11. (Optional) configure [App Launcher settings](/cloudflare-one/applications/app-launcher/) by turning on **Enable App in App Launcher** and, in **App Launcher URL**, entering `https:///login`. -12. Configure [Access policies](/cloudflare-one/policies/access/) for the application. -13. Select **Done**. +10. Configure [Access policies](/cloudflare-one/policies/access/) for the application. +11. (Optional) In **Experience settings**, configure [App Launcher settings](/cloudflare-one/applications/app-launcher/) by turning on **Enable App in App Launcher** and, in **App Launcher URL**, entering `https:///login`. +12. Save the application. ## 2. Add a SSO provider to Grafana diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/greenhouse-saas.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/greenhouse-saas.mdx index d3ea8b77af42be..fb43009202bd5a 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/greenhouse-saas.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/greenhouse-saas.mdx @@ -22,7 +22,7 @@ This guide covers how to configure [Greenhouse Recruiting](https://support.green 4. For the authentication protocol, select **SAML**. 5. Select **Add application**. 6. Copy the **SAML Metadata endpoint**. -7. Keep this window open without selecting **Select configuration**. You will finish this configuration in step [4. Finish adding a SaaS application to Cloudflare Zero Trust](#4-finish-adding-a-saas-application-to-cloudflare-zero-trust). +7. Keep this window open. You will finish this configuration in step [4. Finish adding a SaaS application to Cloudflare Zero Trust](#4-finish-adding-a-saas-application-to-cloudflare-zero-trust). ## 2. Download the metadata file @@ -43,9 +43,8 @@ This guide covers how to configure [Greenhouse Recruiting](https://support.green * **Entity ID**: `greenhouse.io` * **Assertion Consumer Service URL**: SSO Assertion Consumer URL from SSO configuration in Greenhouse Recruiting. * **Name ID format**: *Email* -2. Select **Save configuration**. -3. Configure [Access policies](/cloudflare-one/policies/access/) for the application. -4. Select **Done**. +2. Configure [Access policies](/cloudflare-one/policies/access/) for the application. +3. Save the application. ## 5. Test the integration and finalize configuration diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/hubspot-saas.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/hubspot-saas.mdx index 7057d4c0496c5d..7128843f1b69c9 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/hubspot-saas.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/hubspot-saas.mdx @@ -30,19 +30,21 @@ This guide covers how to configure [Hubspot](https://knowledge.hubspot.com/accou | Hubspot values | Cloudflare values | | -------------- | ------------------------------ | - | Audience URI | EntityID | + | Audience URI | Entity ID | | Sign On URL | Assertion Consumer Service URL | 4. Set **NameID** to *Email*. 5. Add any desired [Access policies](/cloudflare-one/policies/access/) to your application. -6. Copy SSO endpoint and Access Entity ID. +6. Copy the **SSO endpoint** and **Access Entity ID**. -## 3. Create the certificate +7. Save the application. -1. Wrap the certificate in `-----BEGIN CERTIFICATE-----` and `-----END CERTIFICATE-----`. -2. Paste the certificate contents into the Certificate field. +## 3. Create a x.509 certificate + +1. Paste the **Public key** in a text editor. +2. Wrap the certificate in `-----BEGIN CERTIFICATE-----` and `-----END CERTIFICATE-----`. ## 4. Finalize Hubspot configuration diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/ironclad-saas.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/ironclad-saas.mdx index ba4a825556d518..a0319e2ffffdf5 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/ironclad-saas.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/ironclad-saas.mdx @@ -22,7 +22,7 @@ This guide covers how to configure [Ironclad](https://support.ironcladapp.com/hc 4. For the authentication protocol, select **SAML**. 5. Select **Add application**. 6. Copy the **SSO Endpoint** and **Public key**. -7. Keep this window open without selecting **Select configuration**. You will finish this configuration in step [3. Finish adding a SaaS application to Cloudflare Zero Trust](#3-finish-adding-a-saas-application-to-cloudflare-zero-trust). +7. Keep this window open. You will finish this configuration in step [3. Finish adding a SaaS application to Cloudflare Zero Trust](#3-finish-adding-a-saas-application-to-cloudflare-zero-trust). ## 2. Add a SAML SSO provider to Ironclad @@ -40,9 +40,8 @@ This guide covers how to configure [Ironclad](https://support.ironcladapp.com/hc * **Entity ID**: `ironcladapp.com` * **Assertion Consumer Service URL**: Callback from Ironclad SAML SSO set-up. * **Name ID format**: *Email* -2. Select **Save configuration**. -3. Configure [Access policies](/cloudflare-one/policies/access/) for the application. -4. Select **Done**. +2. Configure [Access policies](/cloudflare-one/policies/access/) for the application. +3. Save the application. ## 4. Add a test user to Ironclad and test the integration diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/jamf-pro-saas.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/jamf-pro-saas.mdx index 61d857fa2ccef3..55ef40c805ac63 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/jamf-pro-saas.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/jamf-pro-saas.mdx @@ -33,9 +33,8 @@ This guide covers how to configure [Jamf Pro](https://learn.jamf.com/en-US/bundl * **Assertion Consumer Service URL**: Assertion Consumer Service value from Jamf Pro metadata file. * **Name ID format**: *Email* 7. Copy the **SAML Metadata endpoint**. -8. Select **Save configuration**. -9. Configure [Access policies](/cloudflare-one/policies/access/) for the application. -10. Select **Done**. +8. Configure [Access policies](/cloudflare-one/policies/access/) for the application. +9. Save the application. ## 3. Edit Access SAML Metadata @@ -57,11 +56,7 @@ This guide covers how to configure [Jamf Pro](https://learn.jamf.com/en-US/bundl 5. Turn on **Single Sign On**. :::note - - The Failover Login URL located on this page can be used to log in if your SSO does not work. - - ::: ## 5. Test the Integration diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/miro-saas.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/miro-saas.mdx index 32dd9de72fd8b9..88d9f890fad49a 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/miro-saas.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/miro-saas.mdx @@ -29,9 +29,8 @@ This guide covers how to configure [Miro](https://help.miro.com/hc/articles/3600 * **Assertion Consumer Service URL**: `https://miro.com/sso/saml` * **Name ID format**: *Email* 7. Copy the **SSO endpoint** and **Public key**. -8. Select **Save configuration**. -9. Configure [Access policies](/cloudflare-one/policies/access/) for the application. -10. Select **Done**. +8. Configure [Access policies](/cloudflare-one/policies/access/) for the application. +9. Save the application. ## 2. Add a SAML SSO provider to Miro @@ -52,9 +51,5 @@ This guide covers how to configure [Miro](https://help.miro.com/hc/articles/3600 In the Miro SAML/SSO configuration page, select **Test SSO Configuration**. You will be redirected to the Cloudflare Access login screen and prompted to sign in with your identity provider. If the login is successful, you will receive a **SSO configuration test was successful** message. :::note - - When testing the integration, you do not have to use an email from a domain you have configured for SSO or a user configured in Miro. The only requirement is that the user is already configured in your identity provider. - - ::: diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/pagerduty-saml-saas.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/pagerduty-saml-saas.mdx index 5149743a46b4ab..abfa66b10f6760 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/pagerduty-saml-saas.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/pagerduty-saml-saas.mdx @@ -26,9 +26,8 @@ This guide covers how to configure [PagerDuty](https://support.pagerduty.com/doc * **Assertion Consumer Service URL**: ` https://.pagerduty.com/sso/saml/consume` * **Name ID format**: *Email* 7. Copy the **SSO endpoint** and **Public key**. -8. Select **Save configuration**. -9. Configure [Access policies](/cloudflare-one/policies/access/) for the application. -10. Select **Done**. +8. Configure [Access policies](/cloudflare-one/policies/access/) for the application. +9. Save the application. ## 2. Create a x.509 certificate diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/pingboard-saas.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/pingboard-saas.mdx index b55b2ae5cd90b2..fc202fc9863e9b 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/pingboard-saas.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/pingboard-saas.mdx @@ -26,9 +26,8 @@ This guide covers how to configure [Pingboard](https://support.pingboard.com/hc/ * **Assertion Consumer Service URL**: `https://sso-demo.pingboard.com/auth/saml/consume` * **Name ID format**: *Email* 7. Copy the **SAML Metadata endpoint**. -8. Select **Save configuration**. -9. Configure [Access policies](/cloudflare-one/policies/access/) for the application. -10. Select **Done**. +8. Configure [Access policies](/cloudflare-one/policies/access/) for the application. +9. Save the application. ## 2. Add a SAML SSO provider to Pingboard diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/salesforce-saas-oidc.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/salesforce-saas-oidc.mdx index a6c13e2e5bb2dd..4514b2af287171 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/salesforce-saas-oidc.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/salesforce-saas-oidc.mdx @@ -32,10 +32,9 @@ This guide covers how to configure [Salesforce](https://help.salesforce.com/s/ar * **Authorization endpoint** * **Token endpoint** * **User info endpoint** -10. (Optional) configure [App Launcher settings](/cloudflare-one/applications/app-launcher/) by turning on **Enable App in App Launcher** and, in **App Launcher URL**, entering `https://.my.salesforce.com`. -11. Select **Save configuration**. -12. Configure [Access policies](/cloudflare-one/policies/access/) for the application. -13. Select **Done**. +10. Configure [Access policies](/cloudflare-one/policies/access/) for the application. +11. (Optional) In **Experience settings**, configure [App Launcher settings](/cloudflare-one/applications/app-launcher/) by turning on **Enable App in App Launcher** and, in **App Launcher URL**, entering `https://.my.salesforce.com`. +12. Save the application. ## 2. Add a SSO provider to Salesforce diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/salesforce-saas-saml.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/salesforce-saas-saml.mdx index cf23bc7d0dde6a..4811a20700c52e 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/salesforce-saas-saml.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/salesforce-saas-saml.mdx @@ -29,17 +29,12 @@ This guide covers how to configure [Salesforce](https://help.salesforce.com/s/ar * **Name ID format**: *Email* :::note - - If you are unsure of which URL to use in the **Entity ID** and **Assertion Consumer Service URL** fields, you can check your Salesforce account's metadata. In Salesforce, go to the **Single Sign-On Settings** page and select **Download Metadata**. In this file, you will find the correct URLs to use. - - ::: 7. Copy the **SSO endpoint**, **Public key**, and **Access Entity ID or Issuer**. -8. Select **Save configuration**. -9. Configure [Access policies](/cloudflare-one/policies/access/) for the application. -10. Select **Done**. +8. Configure [Access policies](/cloudflare-one/policies/access/) for the application. +9. Save the application. ## 2. Create a certificate file @@ -58,11 +53,11 @@ If you are unsure of which URL to use in the **Entity ID** and **Assertion Consu * **Issuer:** Paste the Access Entity ID or Issuer from application configuration in Cloudflare Zero Trust. * **Identity Provider Certificate**: Upload the `.crt` certificate file from [2. Create a certificate file](#2-create-a-certificate-file). * **Entity ID**: `https://.my.salesforce.com` - * **SAML Identity type:** If the user's Salesforce username is their email address, select *Assertion contains the User's Salesforce username*. Otherwise, select *Assertion contains the Federation ID from the User object* and make sure the user's Federation ID matches their email address. + * **SAML Identity type:** If the user's Salesforce username is their email address, select *Assertion contains the User's Salesforce username*. Otherwise, select *Assertion contains the Federation ID from the User object* and make sure the user's Federation ID matches their email address.
1. In the **Quick Find** box, enter `users` and select **Users**. 2. Select the user. - 3. Verify that the user's **Federation ID** matches the email address used to authenticate to Cloudflare Access. + 3. Verify that the user's **Federation ID** matches the email address used to authenticate to Cloudflare Access.
* **Identity Provider Login URL**: SSO endpoint provided in Cloudflare Zero Trust for this application. 5. Select **Save**. diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/servicenow-saas-oidc.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/servicenow-saas-oidc.mdx index b309ff64f2a757..be4aafe79e4a5c 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/servicenow-saas-oidc.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/servicenow-saas-oidc.mdx @@ -25,11 +25,9 @@ This guide covers how to configure [ServiceNow](https://docs.servicenow.com/bund 7. In **Redirect URLs**, enter `https://.service-now.com/navpage.do`. 8. (Optional) Enable [Proof of Key Exchange (PKCE)](https://www.oauth.com/oauth2-servers/pkce/) if the protocol is supported by your IdP. PKCE will be performed on all login attempts. 9. Copy the **Client secret** and **Client ID**. -10. Select **Save configuration**. -11. (Optional) configure [App Launcher settings](/cloudflare-one/applications/app-launcher/) by turning on **Enable App in App Launcher** and, in **App Launcher URL**, entering `https://.service-now.com`. -12. Configure [Access policies](/cloudflare-one/policies/access/) for the application. -13. Select **Done**. - +10. Configure [Access policies](/cloudflare-one/policies/access/) for the application. +11. (Optional) In **Experience settings**, configure [App Launcher settings](/cloudflare-one/applications/app-launcher/) by turning on **Enable App in App Launcher** and, in **App Launcher URL**, entering `https://.service-now.com`. +12. Save the application. ## 2. Add the Multiple Provider Single Sign-On Installer Plugin to ServiceNow 1. In ServiceNow, select **All**. diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/servicenow-saas-saml.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/servicenow-saas-saml.mdx index bd42669af865b3..aa3f6132d9e871 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/servicenow-saas-saml.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/servicenow-saas-saml.mdx @@ -26,9 +26,8 @@ This guide covers how to configure [ServiceNow](https://docs.servicenow.com/bund * **Assertion Consumer Service URL**: `https://.service-now.com/navpage.do` * **Name ID format**: *Email* 7. Copy the **SAML Metadata endpoint**. -8. Select **Save configuration**. -9. Configure [Access policies](/cloudflare-one/policies/access/) for the application. -10. Select **Done**. +8. Configure [Access policies](/cloudflare-one/policies/access/) for the application. +9. Save the application. ## 2. Add the Multiple Provider Single Sign-On Installer Plugin to ServiceNow diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/slack-saas.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/slack-saas.mdx index 32ec7f8b6a4e82..1953a1ad2ff80b 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/slack-saas.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/slack-saas.mdx @@ -28,9 +28,8 @@ This guide covers how to configure [Slack](https://slack.com/help/articles/20377 * **Assertion Consumer Service URL**: `https://.slack.com/sso/saml` * **Name ID format**: The format expected by Slack, usually *Email* 7. Copy the **SSO endpoint**, **Access Entity ID or Issuer**, and **Public key**. -8. Select **Save configuration**. -9. Configure [Access policies](/cloudflare-one/policies/access/) for the application. -10. Select **Done**. +8. Configure [Access policies](/cloudflare-one/policies/access/) for the application. +9. Save the application. ## 2. Create a x.509 certificate diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/smartsheet-saas.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/smartsheet-saas.mdx index 30dd398d30c41d..d984dba2d6ddeb 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/smartsheet-saas.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/smartsheet-saas.mdx @@ -16,11 +16,7 @@ This guide covers how to configure [Smartsheet](https://help.smartsheet.com/arti * A [domain](https://help.smartsheet.com/articles/2483051-domain-management) verified in Smartsheet :::note - - In Smartsheet, SSO is configured for a domain. If you have multiple plans using the same domain, the SSO configuration will apply to all Smartsheet users in that domain, regardless of their plan type. - - ::: ## 1. Add a SaaS application to Cloudflare Zero Trust @@ -35,9 +31,8 @@ In Smartsheet, SSO is configured for a domain. If you have multiple plans using * **Assertion Consumer Service URL**: `https://saml.authn.smartsheet.com/saml2/idpresponse` * **Name ID format**: *Unique ID* 7. Copy the **SAML Metadata endpoint**. -8. Select **Save configuration**. -9. Configure [Access policies](/cloudflare-one/policies/access/) for the application. -10. Select **Done**. +8. Configure [Access policies](/cloudflare-one/policies/access/) for the application. +9. Save the application. ## 2. Create and test a SAML SSO provider in Smartsheet diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/sparkpost-saas.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/sparkpost-saas.mdx index b23d116cbc35aa..ddb29f7fa09262 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/sparkpost-saas.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/sparkpost-saas.mdx @@ -32,9 +32,8 @@ This guide covers how to configure [SparkPost or SparkPost EU](https://support.s * `https:///api/v1/users/saml/consume` for SparkPost accounts with dedicated tenants * **Name ID format**: *Email* 7. Copy the **SAML Metadata endpoint**. -8. Select **Save configuration**. -9. Configure [Access policies](/cloudflare-one/policies/access/) for the application. -10. Select **Done**. +8. Configure [Access policies](/cloudflare-one/policies/access/) for the application. +9. Save the application. ## 2. Download the metadata file @@ -57,5 +56,5 @@ This guide covers how to configure [SparkPost or SparkPost EU](https://support.s :::note -The SparkPost SSO login link is `https://app.sparkpost.com/auth/sso`. Alternatively, you can go to the usual sign in page and select **Log in with Single Sign-On**. +The SparkPost SSO login link is `https://app.sparkpost.com/auth/sso`. Alternatively, you can go to the usual sign in page and select **Log in with Single Sign-On**. ::: diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/tableau-saml-saas.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/tableau-saml-saas.mdx index a6a062a938cfab..60b45d0ec550c4 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/tableau-saml-saas.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/tableau-saml-saas.mdx @@ -22,7 +22,7 @@ This guide covers how to configure [Tableau Cloud](https://help.tableau.com/curr 4. For the authentication protocol, select **SAML**. 5. Select **Add application**. 6. Copy the **SAML Metadata endpoint**. -7. Keep this window open without selecting **Select configuration**. You will finish this configuration in step [4. Finish adding a SaaS application to Cloudflare Zero Trust](#4-finish-adding-a-saas-application-to-cloudflare-zero-trust). +7. Keep this window open. You will finish this configuration in step [4. Finish adding a SaaS application to Cloudflare Zero Trust](#4-finish-adding-a-saas-application-to-cloudflare-zero-trust). ## 2. Download the metadata file @@ -34,7 +34,7 @@ This guide covers how to configure [Tableau Cloud](https://help.tableau.com/curr 1. In Tableau Cloud, go to **Settings** > **Authentication**. 2. Turn on **Enable an additional authentication method**. For **select authentication type**, select *SAML*. 3. Under **1. Get Tableau Cloud metadata**, copy the **Tableau Cloud entity ID** and **Tableau Cloud ACS URL**. -4. Under **4. Upload metatdata to Tableau**, select **Choose a file**, and upload the `.xml` file created in step [2. Download the metadata file](#2-download-the-metadata-file) +4. Under **4. Upload metadata to Tableau**, select **Choose a file**, and upload the `.xml` file created in step [2. Download the metadata file](#2-download-the-metadata-file) 5. Under **5. Map attributes**, turn on **Full name**. For **Name (full name)**, enter `name`. 6. (Optional) Choose whether users who are accessing embedded views will **Authenticate in a separate pop-up window** or **Authenticate using an inline frame**. 7. Select **Save Changes**. @@ -45,9 +45,8 @@ This guide covers how to configure [Tableau Cloud](https://help.tableau.com/curr * **Entity ID**: Tableau Cloud entity ID from Tableau Cloud SAML SSO set-up. * **Assertion Consumer Service URL**: Tableau Cloud ACS URL from Tableau Cloud SAML SSO set-up. * **Name ID format**: *Email* -2. Select **Save configuration**. -3. Configure [Access policies](/cloudflare-one/policies/access/) for the application. -4. Select **Done**. +2. Configure [Access policies](/cloudflare-one/policies/access/) for the application. +3. Save the application. ## 5. Test the integration and set default authentication type diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/workday-saas.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/workday-saas.mdx index f4ca54c9e05c94..90cf78c84f459f 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/workday-saas.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/workday-saas.mdx @@ -26,9 +26,8 @@ This guide covers how to configure [Workday](https://doc.workday.com/admin-guide * **Assertion Consumer Service URL**: `https://.myworkday.com//login-saml.flex` for a production account or `https://-impl.myworkday.com//login-saml.flex` for a preview sandbox account * **Name ID format**: *Email* 7. Copy the **SSO endpoint**, **Access Entity ID or Issuer**, and **Public key**. -8. Select **Save configuration**. -9. Configure [Access policies](/cloudflare-one/policies/access/) for the application. -10. Select **Done**. +8. Configure [Access policies](/cloudflare-one/policies/access/) for the application. +9. Save the application. ## 2. Download the metadata file @@ -59,11 +58,7 @@ This guide covers how to configure [Workday](https://doc.workday.com/admin-guide ## 4. Test the integration :::note - - If you encounter a situation where one or more users get locked out of Workday, the user can use this backup URL provided by Workday to sign in with their username and password: `https:///login.flex?redirect=n`. - - ::: 1. In Workday, create an [authentication rule](https://doc.workday.com/admin-guide/en-us/authentication-and-security/authentication/authentication-policies/dan1370796466772.html). diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/zendesk-sso-saas.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/zendesk-sso-saas.mdx index 24b4a5d019b150..2173b827f5c507 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/zendesk-sso-saas.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/zendesk-sso-saas.mdx @@ -40,23 +40,27 @@ This guide covers how to configure [Zendesk](https://support.zendesk.com/hc/en-u 6. To determine who can access Zendesk, [create an Access policy](/cloudflare-one/policies/access/). -7. Copy the values from the Cloudflare IdP fields and add them to the following Zendesk fields: +7. Copy the **SSO Endpoint** and **Public Key**. - | Cloudflare IdP field | Zendesk field | - | ------------------------------------------- | --------------------------- | - | **SSO Endpoint** | **SAML SSO URL** | - | **Public Key** (transformed to fingerprint) | **Certificate Fingerprint** | +8. Transform the public key into a fingerprint: + + 1. Open a [fingerprint calculator](https://www.samltool.com/fingerprint.php). - To transform the public key into a fingerprint, use a [fingerprint calculator](https://www.samltool.com/fingerprint.php): + 2. Paste the **Public Key** into **X.509 cert**. - 1. Copy the public key value and paste it into **X.509 cert**. + 3. Wrap the value with `-----BEGIN CERTIFICATE-----` and `-----END CERTIFICATE-----`. - 2. Wrap the value with `-----BEGIN CERTIFICATE-----` and `-----END CERTIFICATE-----`. + 4. Set **Algorithm** to _SHA256_ and select **Calculate Fingerprint**. - 3. Set **Algorithm** to _SHA256_ and select **Calculate Fingerprint**. + 5. Copy the **Formatted FingerPrint** value. - 4. Copy the **Formatted FingerPrint** value. +9. Add the Cloudflare values to the following Zendesk fields: + + | Cloudflare IdP field | Zendesk field | + | ------------------------------------------- | --------------------------- | + | **SSO Endpoint** | **SAML SSO URL** | + | **Public Key** (transformed to fingerprint) | **Certificate Fingerprint** | -8. Go to `https://.zendesk.com/admin/security/staff_members` and enable **External Authentication** > **Single Sign On**. +10. Go to `https://.zendesk.com/admin/security/staff_members` and enable **External Authentication** > **Single Sign On**. Users should now be able to log in to Zendesk if their Email address exists in the Zendesk user list. diff --git a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/zoom-saas.mdx b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/zoom-saas.mdx index cbbc5749464a1f..41f72e814d5dc0 100644 --- a/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/zoom-saas.mdx +++ b/src/content/docs/cloudflare-one/applications/configure-apps/saas-apps/zoom-saas.mdx @@ -28,9 +28,8 @@ This guide covers how to configure [Zoom](https://support.zoom.com/hc/en/article * **Assertion Consumer Service URL**: `https://.zoom.us/saml/SSO` * **Name ID format**: *Email* 7. Copy the **Access Entity ID or Issuer**, **Public key**, and **SSO endpoint**. -8. Select **Save configuration**. -9. Configure [Access policies](/cloudflare-one/policies/access/) for the application. -10. Select **Done**. +8. Configure [Access policies](/cloudflare-one/policies/access/) for the application. +9. Save the application. ## 2. Add a SAML SSO provider in Zoom diff --git a/src/content/docs/cloudflare-one/connections/connect-devices/agentless/pac-files.mdx b/src/content/docs/cloudflare-one/connections/connect-devices/agentless/pac-files.mdx index d294ca9815035a..d4a492130a71c7 100644 --- a/src/content/docs/cloudflare-one/connections/connect-devices/agentless/pac-files.mdx +++ b/src/content/docs/cloudflare-one/connections/connect-devices/agentless/pac-files.mdx @@ -13,7 +13,7 @@ Only available on Enterprise plans. You can apply Gateway HTTP and DNS policies at the browser level by configuring a Proxy Auto-Configuration (PAC) file. - + When end users visit a website, their browser will send the request to a Cloudflare proxy server associated with your account to be filtered by Gateway. Note that Gateway [cannot filter every type of HTTP traffic](#limitations) proxied using PAC files. @@ -215,19 +215,17 @@ To get the domain of a proxy endpoint: --header "Authorization: Bearer " ``` - ```json {10} output + ```json {8} output { - "success": true, - "result": { - "id": "ed35569b41ce4d1facfe683550f54086", - "created_at": "2014-01-01T05:20:00.12345Z", - "ips": [ - "192.0.2.1/32" - ], - "name": "DevOps team", - "subdomain": "oli3n9zkz5.proxy.cloudflare-gateway.com", - "updated_at": "2014-01-01T05:20:00.12345Z" - } + "success": true, + "result": { + "id": "ed35569b41ce4d1facfe683550f54086", + "created_at": "2014-01-01T05:20:00.12345Z", + "ips": ["192.0.2.1/32"], + "name": "DevOps team", + "subdomain": "oli3n9zkz5.proxy.cloudflare-gateway.com", + "updated_at": "2014-01-01T05:20:00.12345Z" + } } ``` diff --git a/src/content/docs/cloudflare-one/connections/connect-devices/user-side-certificates/automated-deployment.mdx b/src/content/docs/cloudflare-one/connections/connect-devices/user-side-certificates/automated-deployment.mdx index 47e4aa6b23a896..bd22817eee97ae 100644 --- a/src/content/docs/cloudflare-one/connections/connect-devices/user-side-certificates/automated-deployment.mdx +++ b/src/content/docs/cloudflare-one/connections/connect-devices/user-side-certificates/automated-deployment.mdx @@ -6,7 +6,7 @@ sidebar: head: [] description: Automatically deploy a root certificate on desktop devices. banner: - content: The default global Cloudflare root certificate will expire on 2025-02-02. If you installed the default Cloudflare certificate before 2024-10-17, you must generate a new certificate and activate it for your Zero Trust organization to avoid inspection errors. + content: The default global Cloudflare root certificate will expire on 2025-02-02. If you installed the default Cloudflare certificate before 2024-10-17, you must generate a new certificate and activate it for your Zero Trust organization to avoid inspection errors. --- import { Details } from "~/components"; diff --git a/src/content/docs/cloudflare-one/connections/connect-devices/user-side-certificates/custom-certificate.mdx b/src/content/docs/cloudflare-one/connections/connect-devices/user-side-certificates/custom-certificate.mdx index 3fdfecc1201967..9cdc0840bac358 100644 --- a/src/content/docs/cloudflare-one/connections/connect-devices/user-side-certificates/custom-certificate.mdx +++ b/src/content/docs/cloudflare-one/connections/connect-devices/user-side-certificates/custom-certificate.mdx @@ -7,7 +7,7 @@ head: [] description: Configure WARP to use a custom root certificate instead of the Cloudflare certificate. banner: - content: The default global Cloudflare root certificate will expire on 2025-02-02. If you installed the default Cloudflare certificate before 2024-10-17, you must generate a new certificate and activate it for your Zero Trust organization to avoid inspection errors. + content: The default global Cloudflare root certificate will expire on 2025-02-02. If you installed the default Cloudflare certificate before 2024-10-17, you must generate a new certificate and activate it for your Zero Trust organization to avoid inspection errors. --- import { Render, Tabs, TabItem } from "~/components"; diff --git a/src/content/docs/cloudflare-one/connections/connect-devices/user-side-certificates/index.mdx b/src/content/docs/cloudflare-one/connections/connect-devices/user-side-certificates/index.mdx index da1c6488b6e986..3818f7eed063fd 100644 --- a/src/content/docs/cloudflare-one/connections/connect-devices/user-side-certificates/index.mdx +++ b/src/content/docs/cloudflare-one/connections/connect-devices/user-side-certificates/index.mdx @@ -11,7 +11,7 @@ import { Tabs, TabItem } from "~/components"; Advanced security features such as [HTTPS traffic inspection](/cloudflare-one/policies/gateway/http-policies/tls-decryption/), [Data Loss Prevention](/cloudflare-one/policies/data-loss-prevention/), [anti-virus scanning](/cloudflare-one/policies/gateway/http-policies/antivirus-scanning/), [Access for Infrastructure](/cloudflare-one/applications/non-http/infrastructure-apps/), and [Browser Isolation](/cloudflare-one/policies/browser-isolation/) require users to install and trust a root certificate on their device. You can either install the certificate provided by Cloudflare (default option), or generate your own custom certificate and upload it to Cloudflare. -Gateway [generates a unique root CA](#generate-a-cloudflare-root-certificate) for each Zero Trust account and deploys it across the Cloudflare global network. Alternatively, Enterprise users can upload and deploy their own [custom certificate](/cloudflare-one/connections/connect-devices/user-side-certificates/custom-certificate/). +Zero Trust [generates a unique root CA](#generate-a-cloudflare-root-certificate) for each account and deploys it across the Cloudflare global network. Alternatively, Enterprise users can upload and deploy their own [custom certificate](/cloudflare-one/connections/connect-devices/user-side-certificates/custom-certificate/). ## Certificate status @@ -121,4 +121,4 @@ curl --request PUT \ -You can set multiple certificates to **Available**, but you can only turn on one certificate for use in inspection at a time. Setting a certificate as **In-Use** will set any other turned on certificates as **Available** and prevent them from being used for inspection until turned on again. +You can set multiple certificates to **Available**, but you can only turn on one certificate for use in inspection at a time. Setting a certificate as **In-Use** will set any other in-use certificates as **Available** only and prevent them from being used for inspection until turned on again. diff --git a/src/content/docs/cloudflare-one/connections/connect-devices/user-side-certificates/manual-deployment.mdx b/src/content/docs/cloudflare-one/connections/connect-devices/user-side-certificates/manual-deployment.mdx index 3d87f75d714dcb..e10de82710a346 100644 --- a/src/content/docs/cloudflare-one/connections/connect-devices/user-side-certificates/manual-deployment.mdx +++ b/src/content/docs/cloudflare-one/connections/connect-devices/user-side-certificates/manual-deployment.mdx @@ -7,23 +7,23 @@ head: [] description: Manually add a Cloudflare certificate to mobile devices and individual applications. banner: - content: The default global Cloudflare root certificate will expire on 2025-02-02. If you installed the default Cloudflare certificate before 2024-10-17, you must generate a new certificate and activate it for your Zero Trust organization to avoid inspection errors. + content: The default global Cloudflare root certificate will expire on 2025-02-02. If you installed the default Cloudflare certificate before 2024-10-17, you must generate a new certificate and activate it for your Zero Trust organization to avoid inspection errors. --- import { Details, Render, TabItem, Tabs } from "~/components"; :::note - This procedure is only required to enable specific Cloudflare Zero Trust features, and should only be done at the direction of your IT department. This procedure is not required to enable the WARP client for consumers. - ::: If your device does not support [certificate installation via WARP](/cloudflare-one/connections/connect-devices/user-side-certificates/automated-deployment/), you can manually install a Cloudflare certificate. You must add the certificate to both the [system keychain](#add-the-certificate-to-operating-systems) and to [individual application stores](#add-the-certificate-to-applications). These steps must be performed on each new device that is to be subject to HTTP filtering. +Zero Trust will only inspect traffic using installed certificates set to [**Available** and **In-Use**](/cloudflare-one/connections/connect-devices/user-side-certificates/#activate-a-root-certificate). + ## Download the Cloudflare root certificate :::note[Download limitation] -You can only download certificates from the Zero Trust dashboard. +You can only download Cloudflare-generated certificates from the Zero Trust dashboard or with WARP. ::: First, [generate](/cloudflare-one/connections/connect-devices/user-side-certificates/#generate-a-cloudflare-root-certificate) and download a Cloudflare certificate. The certificate is available in both `.pem` and `.crt` file format. Certain applications require the certificate to be in a specific file type, so ensure you download the most appropriate file for your use case. @@ -33,6 +33,8 @@ First, [generate](/cloudflare-one/connections/connect-devices/user-side-certific 3. Select the certificate you want to download. 4. Depending on which format you want, choose **Download .pem** and/or **Download .crt**. +Alternatively, you can download and install a certificate [using WARP](/cloudflare-one/connections/connect-devices/user-side-certificates/automated-deployment/#install-a-certificate-using-warp). WARP will add the certificates to the device's system certificate store in `installed_certs/.pem`. + ### Verify the downloaded certificate To verify your download, use a terminal to check that the downloaded certificate's hash matches the thumbprint listed under **Certificate thumbprint**. For example: @@ -715,20 +717,22 @@ To trust a Cloudflare root certificate in the Google Drive desktop application, -1. In the Finder menu bar, go to **Go** > **Go to Folder**. Enter `/Applications/Google Drive.app/Contents/Resources`. +1. In a terminal, copy the contents of the Google Drive certificate file to a new certificate file in a permanent location, such as your Documents folder. For example: -2. Find `roots.pem` and copy it to a permanent location, such as your Documents folder. + ```sh + cat /Applications/"Google Drive.app"/Contents/Resources/roots.pem > ~/Documents/gdrivecerts.pem + ``` -3. Append the contents of `cloudflare.pem` to the end of `roots.pem`. +2. Append the contents of the downloaded certificate to the end of the new file. For example: ```sh - cat ~/Downloads/certificate.pem >> path/to/roots.pem + cat ~/Downloads/certificate.pem >> ~/Documents/gdrivecerts.pem ``` -4. Apply the newly created root certificate to your Google Drive application. +3. Apply the newly created root certificate to your Google Drive application. For example: ```sh - sudo defaults write /Library/Preferences/com.google.drivefs.settings TrustedRootCertsFile -string "path/to/roots.pem" + sudo defaults write /Library/Preferences/com.google.drivefs.settings TrustedRootCertsFile "/Users/$(whoami)/Documents/gdrivecerts.pem" ``` You can verify the update with the following command. @@ -741,26 +745,28 @@ defaults read /Library/Preferences/com.google.drivefs.settings -1. In File Explorer, go to `\Program Files\Google\Drive File Stream\\config\`. +1. In an administrator PowerShell terminal, copy the contents of the Google Drive certificate file to a new certificate file in a permanent location, such as your Documents folder. For example: -2. Find `roots.pem` and copy it to a permanent location, such as your Documents folder. + ```powershell + Get-Content "C:\Program Files\Google\Drive File Stream\roots.pem" | Set-Content "$HOME\Documents\gdrivecerts.pem" + ``` -3. Append the contents of `cloudflare.pem` to the end of `roots.pem`. +2. Append the contents of the downloaded certificate to the end of the new file. For example: ```powershell - cat ~\Downloads\certificate.pem >> path\to\roots.pem + Get-Content "$HOME\Downloads\certificate.pem" | Add-Content "$HOME\Documents\gdrivecerts.pem" ``` -4. Update the Google Drive registry key. +3. Apply the newly created root certificate to your Google Drive application. For example: ```powershell - reg ADD "HKEY_LOCAL_MACHINE\Software\Google\DriveFS" /v TrustedRootCertsFile /t REG_SZ /d "path\to\roots.pem" + Set-ItemProperty -Path "HKLM:\SOFTWARE\Google\DriveFS" -Name "TrustedRootCertsFile" -Value "$HOME\Documents\gdrivecerts.pem" ``` You can verify the update with the following command. ```powershell -reg QUERY "HKEY_LOCAL_MACHINE\Software\Google\DriveFS" /v TrustedRootCertsFile" +Get-ItemProperty -Path "HKLM:\SOFTWARE\Google\DriveFS" | Select-Object TrustedRootCertsFile ``` diff --git a/src/content/docs/cloudflare-one/connections/connect-devices/warp/configure-warp/warp-settings/index.mdx b/src/content/docs/cloudflare-one/connections/connect-devices/warp/configure-warp/warp-settings/index.mdx index 49244e86c2680d..d9c49d6389c327 100644 --- a/src/content/docs/cloudflare-one/connections/connect-devices/warp/configure-warp/warp-settings/index.mdx +++ b/src/content/docs/cloudflare-one/connections/connect-devices/warp/configure-warp/warp-settings/index.mdx @@ -199,7 +199,7 @@ We recommend keeping this set to a very low value — usually just enough time f **Value:** - `0`: Allow the switch to stay in the off position indefinitely until the user turns it back on. -- `1` to `86400`: Turn switch back on automatically after the specified number of seconds. +- `1` to `1440`: Turn switch back on automatically after the specified number of minutes. ### Support URL diff --git a/src/content/docs/cloudflare-one/connections/connect-devices/warp/deployment/mdm-deployment/parameters.mdx b/src/content/docs/cloudflare-one/connections/connect-devices/warp/deployment/mdm-deployment/parameters.mdx index 574bf7272035f8..bee0cef29bb157 100644 --- a/src/content/docs/cloudflare-one/connections/connect-devices/warp/deployment/mdm-deployment/parameters.mdx +++ b/src/content/docs/cloudflare-one/connections/connect-devices/warp/deployment/mdm-deployment/parameters.mdx @@ -75,14 +75,14 @@ Requires the `auth_client_id` parameter. ### `auto_connect` -If switch has been turned off by user, the client will automatically turn itself back on after the specified number of seconds. We recommend keeping this set to a very low value — usually just enough time for a user to log in to hotel or airport Wi-Fi. If any value is specified for `auto_connect` the default state of the WARP client will always be Connected (for example, after the initial install or a reboot). +If switch has been turned off by user, the client will automatically turn itself back on after the specified number of minutes. We recommend keeping this set to a very low value — usually just enough time for a user to log in to hotel or airport Wi-Fi. If any value is specified for `auto_connect` the default state of the WARP client will always be Connected (for example, after the initial install or a reboot). **Value Type:** `integer` **Value:** * `0` — Allow the switch to stay in the off position indefinitely until the user turns it back on. -* `1` to `86400` — Turn switch back on automatically after the specified number of seconds. +* `1` to `1440` — Turn switch back on automatically after the specified number of minutes. :::note @@ -249,4 +249,4 @@ An optional property. `is_browser` will help the Cloudflare One Agent applicatio **Value Type**: `boolean` -**Value**: If the value is `true`, identifies the application defined in `app_identifier` as a browser. The default value is `false` and `is_browser` is an optional property. +**Value**: If the value is `true`, identifies the application defined in `app_identifier` as a browser. The default value is `false` and `is_browser` is an optional property. \ No newline at end of file diff --git a/src/content/docs/cloudflare-one/connections/connect-devices/warp/deployment/mdm-deployment/partners/fleet.mdx b/src/content/docs/cloudflare-one/connections/connect-devices/warp/deployment/mdm-deployment/partners/fleet.mdx index 6039f4a5871403..962a2e4285a6c9 100644 --- a/src/content/docs/cloudflare-one/connections/connect-devices/warp/deployment/mdm-deployment/partners/fleet.mdx +++ b/src/content/docs/cloudflare-one/connections/connect-devices/warp/deployment/mdm-deployment/partners/fleet.mdx @@ -133,7 +133,7 @@ echo -e "\n organization\n your-team-name\ curl -fsSL https://pkg.cloudflareclient.com/pubkey.gpg | sudo gpg --yes --dearmor --output /usr/share/keyrings/cloudflare-warp-archive-keyring.gpg # Add this repo to your apt repositories -echo "deb [signed-by=/usr/share/keyrings/cloudflare-warp-archive-keyring.gpg] https://pkg.cloudflareclient.com/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflare-client.list +echo "deb [signed-by=/usr/share/keyrings/cloudflare-warp-archive-keyring.gpg] https://pkg.cloudflareclient.com/ any main" | sudo tee /etc/apt/sources.list.d/cloudflare-client.list # Install sudo apt-get -y update && sudo apt-get -y install cloudflare-warp diff --git a/src/content/docs/cloudflare-one/connections/connect-devices/warp/download-warp/beta-releases.mdx b/src/content/docs/cloudflare-one/connections/connect-devices/warp/download-warp/beta-releases.mdx index 74d65b2f96d1cf..19e1e60942939a 100644 --- a/src/content/docs/cloudflare-one/connections/connect-devices/warp/download-warp/beta-releases.mdx +++ b/src/content/docs/cloudflare-one/connections/connect-devices/warp/download-warp/beta-releases.mdx @@ -5,18 +5,22 @@ sidebar: order: 3 --- -import { Render, Details, WARPReleases } from "~/components"; +import { Render, Details, LinkButton, WARPReleases } from "~/components"; -Cloudflare tests new WARP features and improvements in an unstable beta release before adding them to the stable release. To get early access to new features, download the latest beta client from the links below. +Cloudflare tests new WARP features and improvements in an unstable beta release before adding them to the [stable release](/cloudflare-one/connections/connect-devices/warp/download-warp/). Beta releases are not recommended for production environments. To get early access to new features, download the latest beta client from the links below. ## Windows +Download latest beta release + ## macOS +Download latest beta release + \ No newline at end of file diff --git a/src/content/docs/cloudflare-one/connections/connect-devices/warp/download-warp/index.mdx b/src/content/docs/cloudflare-one/connections/connect-devices/warp/download-warp/index.mdx index 58c7c915d3c6ee..3776777d2dc760 100644 --- a/src/content/docs/cloudflare-one/connections/connect-devices/warp/download-warp/index.mdx +++ b/src/content/docs/cloudflare-one/connections/connect-devices/warp/download-warp/index.mdx @@ -6,24 +6,32 @@ sidebar: label: Stable releases --- -import { Render, Details, WARPReleases } from "~/components"; +import { Render, Details, LinkButton, WARPReleases } from "~/components"; -Download the WARP client from one of the following links after checking requirements. +This page contains the stable WARP client releases currently supported by Cloudflare. We recommend using stable releases for production environments. You can download stable releases from the links below after checking requirements. + +Cloudflare also offers an unstable beta release track with the latest features and improvements. To preview new features before they are available in a stable release, refer to the [beta release page](/cloudflare-one/connections/connect-devices/warp/download-warp/beta-releases/). ## Windows +Download latest stable release + ## macOS +Download latest stable release + ## Linux +Package repository + diff --git a/src/content/docs/cloudflare-one/connections/connect-devices/warp/download-warp/update-warp.mdx b/src/content/docs/cloudflare-one/connections/connect-devices/warp/download-warp/update-warp.mdx index aa9f3af6d3628c..18d5e154e8835e 100644 --- a/src/content/docs/cloudflare-one/connections/connect-devices/warp/download-warp/update-warp.mdx +++ b/src/content/docs/cloudflare-one/connections/connect-devices/warp/download-warp/update-warp.mdx @@ -18,7 +18,7 @@ We also recognize that there is a cost associated for a business to go through a Cloudflare does not operate on a major-release upgrade cycle; all releases for the WARP client are incremental. With this in mind, you should choose which releases make the most sense for your business. -Cloudflare publishes release notes for WARP in the official [download repositories](/cloudflare-one/connections/connect-devices/warp/download-warp/) and in the [WARP changelog](/cloudflare-one/changelog/warp/). You can look at the release notes to determine whether there is an explicit reason for updating to the latest release. +Cloudflare publishes release notes for WARP on the [Downloads page](/cloudflare-one/connections/connect-devices/warp/download-warp/) and in the [WARP changelog](/cloudflare-one/changelog/warp/). You can look at the release notes to determine whether there is an explicit reason for updating to the latest release. ### Support lifecycle diff --git a/src/content/docs/cloudflare-one/connections/connect-devices/warp/troubleshooting/known-limitations.mdx b/src/content/docs/cloudflare-one/connections/connect-devices/warp/troubleshooting/known-limitations.mdx index a04dff999b5c07..01f5f0a1ad4a18 100644 --- a/src/content/docs/cloudflare-one/connections/connect-devices/warp/troubleshooting/known-limitations.mdx +++ b/src/content/docs/cloudflare-one/connections/connect-devices/warp/troubleshooting/known-limitations.mdx @@ -80,7 +80,7 @@ Cisco Meraki devices have a bug where WARP traffic can sometimes be identified a ## Windows Teredo -The [Windows Teredo](https://learn.microsoft.com/en-us/windows/win32/teredo/about-teredo) interface conflicts with the WARP client. Since Teredo and WARP will fight for control over IPv6 traffic routing, you must disable Terado on your Windows device. This allows the WARP client to provide IPv6 connectivity on the device. +The [Windows Teredo](https://learn.microsoft.com/en-us/windows/win32/teredo/about-teredo) interface conflicts with the WARP client. Since Teredo and WARP will fight for control over IPv6 traffic routing, you must disable Teredo on your Windows device. This allows the WARP client to provide IPv6 connectivity on the device. ## Docker on Linux with bridged networking @@ -101,3 +101,7 @@ docker network create -o "com.docker.network.driver.mtu=1420" my-docker-network ``` The MTU value should be set to the MTU of your host's default interface minus 80 bytes for the WARP protocol overhead. Most MTUs are 1500, therefore 1420 should work for most people. + +## Windows 10 in Microsoft 365 Cloud PC is not supported + +Use of the WARP client in a Microsoft 365 Windows 10 Cloud PC is not supported. To work around this limitation, use Windows 11. diff --git a/src/content/docs/cloudflare-one/connections/connect-networks/get-started/create-remote-tunnel.mdx b/src/content/docs/cloudflare-one/connections/connect-networks/get-started/create-remote-tunnel.mdx index 290a4e33f4263b..e3f91cbe5ff87a 100644 --- a/src/content/docs/cloudflare-one/connections/connect-networks/get-started/create-remote-tunnel.mdx +++ b/src/content/docs/cloudflare-one/connections/connect-networks/get-started/create-remote-tunnel.mdx @@ -26,6 +26,8 @@ Follow these steps to connect an application through your tunnel. If you are loo +If you add a multi-level subdomain (more than one level of subdomain), you must [order an Advanced Certificate for the hostname](/cloudflare-one/faq/troubleshooting/#i-see-this-site-cant-provide-a-secure-connection). + The application is now publicly available on the Internet. To allow or block specific users, [create an Access application](/cloudflare-one/applications/configure-apps/self-hosted-public-app/). ## 2b. Connect a network @@ -43,4 +45,3 @@ To configure Zero Trust policies and connect as a user, refer to [Connect privat After saving the tunnel, you will be redirected to the **Tunnels** page. Look for your new tunnel to be listed along with its active connector. ![Tunnel appearing in the Tunnels table](~/assets/images/cloudflare-one/connections/connect-apps/tunnel-table.png) - diff --git a/src/content/docs/cloudflare-one/faq/getting-started-faq.mdx b/src/content/docs/cloudflare-one/faq/getting-started-faq.mdx index d5aa0ed421f458..24978f770020d5 100644 --- a/src/content/docs/cloudflare-one/faq/getting-started-faq.mdx +++ b/src/content/docs/cloudflare-one/faq/getting-started-faq.mdx @@ -14,9 +14,9 @@ description: Review FAQs about getting started with Cloudflare Zero Trust. You can sign up today at [this link](https://dash.cloudflare.com/sign-up/teams). Follow the onboarding steps, choose a team name and a payment plan, and start protecting your network in just a few minutes. -## What's a team domain/team name? +## What is a team domain/team name? -Your team domain is a unique subdomain assigned to your Cloudflare account; for example, `.cloudflareaccess.com`. Setting up a team domain is an essential step in your Zero Trust configuration. This is where your users will find the apps you have secured behind Cloudflare Zero Trust — displayed in the [App Launcher](/cloudflare-one/applications/app-launcher/) — and will be able to make login requests to them. The customizable portion of your team domain is called **team name**. You can view your team name and team domain in Zero Trust under **Settings** > **Custom Pages**. +Your team domain is a unique subdomain assigned to your Cloudflare account, for example, `.cloudflareaccess.com`. [Setting up a team domain](/cloudflare-one/setup/#create-a-zero-trust-organization) is an essential step in your Zero Trust configuration. This is where your users will find the apps you have secured behind Cloudflare Zero Trust — displayed in the [App Launcher](/cloudflare-one/applications/app-launcher/) — and will be able to make login requests to them. The customizable portion of your team domain is called **team name**. You can view your team name and team domain in Zero Trust under **Settings** > **Custom Pages**. | team name | team domain | | ---------------- | --------------------------------------- | @@ -29,6 +29,20 @@ You can change your team name at any time, unless you have the Cloudflare dashbo If you change your team name, you need to update your organization's identity providers (IdPs) and the WARP client to reflect the new team name in order to avoid any mismatch errors. ::: +### Why is my old team name is still showing up on the Login page and App Launcher? + +After changing your team name, you will need to check your Block page, Login page, and App Launcher settings to make sure the new team name is reflected. + +To verify that your team name change is successfully rendering on the Block page, Login page and App Launcher: + +1. In [Zero Trust](https://one.dash.cloudflare.com/), go to **Settings** > **Custom Pages**. +2. Find the **Block page** and **Login page** > select **Customize** next to the page you would like to review first. +3. Review that the value in **Your Organization's name** matches your new team name. +4. If the desired name is not already displayed, change the value to your desired team name and select **Save**. +5. Check both pages (**Block page** and **Login page**) to set **Your Organization's name** as your desired team name. + +The App Launcher will display the same team name set on the Login page, so you do not need to update the **Your Organization's name** field in the App Launcher page. + ## How do I change my subscription plan? To make changes to your subscription, visit the Billing section under Account in [Zero Trust](https://one.dash.cloudflare.com/). You can change or cancel your subscription at any time. Just remember - if you downgrade your plan during a billing cycle, your downgraded pricing will apply in the next billing cycle. If you upgrade during a billing cycle, you will be billed for the upgraded plan at the moment you select it. diff --git a/src/content/docs/cloudflare-one/faq/troubleshooting.mdx b/src/content/docs/cloudflare-one/faq/troubleshooting.mdx index 16d9c86888c408..7a5dad59db6e3f 100644 --- a/src/content/docs/cloudflare-one/faq/troubleshooting.mdx +++ b/src/content/docs/cloudflare-one/faq/troubleshooting.mdx @@ -180,3 +180,9 @@ If you need to unblock port `25`, contact your account team. This issue can occur when communicating with an origin that partially supports HTTP/2. In these scenarios, the connection from Gateway to the website starts using HTTP/2 but requests a downgrade to HTTP/1.1 for some requests. For example, servers such as [Microsoft Internet Information Services (IIS)](https://learn.microsoft.com/iis/get-started/whats-new-in-iis-10/http2-on-iis#when-is-http2-not-supported) do not support authentication over HTTP/2. When errors occur, the website may send back a `RST_STREAM` frame with the error code `HTTP_1_1_REQUIRED`, which indicates that the browser should retry the request over HTTP/1.1. Gateway translates any received upstream `RST_STREAM` frames to a pseudo socket close, so this appears as a `502 Bad Gateway` exception page. The browser will not indicate why it failed. Gateway does not support this downgrade mechanism. When receiving the `HTTP_1_1_REQUIRED` error code, Gateway will not reissue requests over HTTP/1.1. To make the connection from Gateway to the website successfully, you will need to disable HTTP/2 at the origin. + +## I see `This site can't provide a secure connection.` + +If you see an error with the title `This site can't provide a secure connection` and a subtitle of ` uses an unsupported protocol`, you must [order an Advanced Certificate](/ssl/edge-certificates/advanced-certificate-manager/manage-certificates/#create-a-certificate). + +If you added a [multi-level subdomain](/cloudflare-one/connections/connect-networks/get-started/create-remote-tunnel/#2a-connect-an-application) (more than one level of subdomain), you must [order an Advanced Certificate for the hostname](/cloudflare-one/connections/connect-networks/get-started/create-remote-tunnel/#2a-connect-an-application) as Cloudflare's Universal certificate will not cover the public hostname by default. diff --git a/src/content/docs/cloudflare-one/identity/devices/service-providers/index.mdx b/src/content/docs/cloudflare-one/identity/devices/service-providers/index.mdx index 82025299f5f43c..035b4475a8a4d3 100644 --- a/src/content/docs/cloudflare-one/identity/devices/service-providers/index.mdx +++ b/src/content/docs/cloudflare-one/identity/devices/service-providers/index.mdx @@ -23,5 +23,6 @@ Service-to-service integrations allow the WARP client to get device posture data | [Kolide](/cloudflare-one/identity/devices/service-providers/kolide/) | ✅ | ✅ | ✅ | ❌ | ❌ | | [Microsoft Endpoint Manager](/cloudflare-one/identity/devices/service-providers/microsoft/) | ✅ | ✅ | ❌ | ❌ | ❌ | | [SentinelOne](/cloudflare-one/identity/devices/service-providers/sentinelone/) | ✅ | ✅ | ✅ | ❌ | ❌ | +| [Tanium](/cloudflare-one/identity/devices/service-providers/taniums2s/) | ✅ | ✅ | ✅ | ❌ | ❌ | | [Uptycs](/cloudflare-one/identity/devices/service-providers/uptycs/) | ✅ | ✅ | ✅ | ❌ | ❌ | | [Workspace ONE](/cloudflare-one/identity/devices/service-providers/workspace-one/) | ✅ | ✅ | ✅ | ❌ | ❌ | diff --git a/src/content/docs/cloudflare-one/identity/idp-integration/okta.mdx b/src/content/docs/cloudflare-one/identity/idp-integration/okta.mdx index 58fceda3eef086..051bf61ca19ae8 100644 --- a/src/content/docs/cloudflare-one/identity/idp-integration/okta.mdx +++ b/src/content/docs/cloudflare-one/identity/idp-integration/okta.mdx @@ -40,7 +40,7 @@ Additionally, you can configure Okta to use risk information from Zero Trust [us 9. Set the **Groups claim filter** to _Matches regex_ and its value to `.*`. :::note - Groups managed outside of Okta (for example, Microsoft Entra ID or Google groups) may require different regex values. For more information, refer to the [Okta documentation](https://support.okta.com/help/s/article/Why-isnt-my-Groups-claim-returning-Active-Directory-groups). + Groups managed outside of Okta (for example, Microsoft Entra ID or Google groups) may require different regex values. For more information, refer to the Okta documentation on [Groups Claims](https://support.okta.com/help/s/article/Why-isnt-my-Groups-claim-returning-Active-Directory-groups) and [OpenID Connect Claims](https://support.okta.com/help/s/article/Can-we-retrieve-both-Active-Directory-and-Okta-groups-in-OpenID-Connect-claims). ::: 10. In the **General** tab, copy the **Client ID** and **Client secret**. @@ -94,10 +94,7 @@ If you would like to only maintain one Okta app instance, Okta does support SAML ### 1. Enable SCIM in Zero Trust - + ### 2. Configure SCIM in Okta @@ -135,17 +132,17 @@ If you would like to only maintain one Okta app instance, Okta does support SAML 13. Select **Save** to complete the configuration. -14. In the **Assignments** tab, add the users you want to synchronize with Cloudflare Access. You can add users in batches by assigning a group. If a user is removed from the application assignment via a either direct user assignment or removed from the group that was assigned to the app, this will trigger a deprovisioning event from Okta to Cloudflare. +14. In the **Assignments** tab, add the users you want to synchronize with Cloudflare Access. You can add users in batches by assigning a group. If a user is removed from the application assignment via a either direct user assignment or removed from the group that was assigned to the app, this will trigger a deprovisioning event from Okta to Cloudflare. 15. In the **Push Groups** tab, add the Okta groups you want to synchronize with Cloudflare Access. These groups will display in the Access policy builder and are the group memberships that will be added and removed upon membership change in Okta. - :::note - Groups in this SCIM app Push Groups integration should match the groups in your base [OIDC app integration](/cloudflare-one/identity/idp-integration/okta/#set-up-okta-as-an-oidc-provider). Because SCIM group membership updates will overwrite any groups in a user's identity, assigning the same groups to each app ensures consistent policy evaluation. - ::: + :::note + Groups in this SCIM app Push Groups integration should match the groups in your base [OIDC app integration](/cloudflare-one/identity/idp-integration/okta/#set-up-okta-as-an-oidc-provider). Because SCIM group membership updates will overwrite any groups in a user's identity, assigning the same groups to each app ensures consistent policy evaluation. + ::: To verify the integration, select **View Logs** in the Okta SCIM application. - + ## Example API Configuration diff --git a/src/content/docs/cloudflare-one/implementation-guides/index.mdx b/src/content/docs/cloudflare-one/implementation-guides/index.mdx index 456ff33bd365cf..db0d2a648681ab 100644 --- a/src/content/docs/cloudflare-one/implementation-guides/index.mdx +++ b/src/content/docs/cloudflare-one/implementation-guides/index.mdx @@ -3,12 +3,30 @@ pcx_content_type: navigation title: Implementation guides sidebar: order: 3 - group: - hideIndex: true head: [] description: View implementation guides for Cloudflare Zero Trust. --- -import { DirectoryListing } from "~/components"; +import { CardGrid, LinkTitleCard } from "~/components"; - +Implementation guides cover deployment steps and best practices for specific Cloudflare One use cases. + + + + + Provide your users and networks with a secure, performant, and flexible path to the Internet. + + + + Give users secure, auditable network and application access. + + + + Secure access to internal web applications without a device client. + + + + Use Cloudflare's Email Security to protect your Microsoft 365 email inbox from phishing and malware attacks. + + + \ No newline at end of file diff --git a/src/content/docs/cloudflare-one/insights/dex/ip-visibility.mdx b/src/content/docs/cloudflare-one/insights/dex/ip-visibility.mdx new file mode 100644 index 00000000000000..0a3ebd8cacf525 --- /dev/null +++ b/src/content/docs/cloudflare-one/insights/dex/ip-visibility.mdx @@ -0,0 +1,61 @@ +--- +pcx_content_type: reference +title: IP visibility +sidebar: + order: 7 +--- + +import { Render } from "~/components"; + +DEX's IP visibility gives administrators insight into three different IP types per device: + +1. **Device**: The private IP address of an end-user device. +2. **ISP**: The public IP assigned by the ISP that the end-user device is being routed though. +3. **Gateway**: The router's private IP (the router the end device is connected to.) + +:::note + +The ISP IP is only visible to users with the [Zero Trust PII role](/cloudflare-one/roles-permissions/#cloudflare-zero-trust-pii). + +::: + +DEX's IP visibility supports both IPv6 and IPv4 addresses. + +IP information is crucial for IT administrators to accurately troubleshoot network issues and identify user locations. IT administrators face challenges like: + +- Pinpointing the exact location of a user experiencing issues ("AP 87 is bad.") +- Identifying network access control policy violations ("NAC Policies is not applied properly.") +- Troubleshooting firewall restrictions ("Firewall on VLAN 93 is blocking.") +- Resolving Layer 2 and DHCP related problems. +- Indirectly determining user identity and device location. + +## View a device's IP information + +To view IP information for a user device: + +1. In [Zero Trust](https://one.dash.cloudflare.com/), go to **My team** > **Devices**. +2. Select a device, then select **View details**. +3. Under **Details**, scroll down to **IP details**. +4. Review the IP details for your selected device's most recent session. + +## View a device's IP history + +DEX's IP visibility allows you to review an event log of a device's IP history for the last seven days. To view a device's IP history: + +1. In [Zero Trust](https://one.dash.cloudflare.com/), go to **My team** > **Devices**. +2. Select a device > **View details** > under **Details**, scroll down to **IP details**. +3. Select **View device history**. +4. View the device's IP history and status from the last seven days. +5. Select a time to view more information about the device at that time. + +Refer to [Available metrics](/cloudflare-one/insights/dex/fleet-status/#available-metrics) to review **Status** and **Mode** descriptions. + +## Troubleshoot with IP visibility + +While IP visibility allows you to inspect a device's IP information, use [DEX's live analytics](/cloudflare-one/insights/dex/fleet-status/#available-metrics) to review which Cloudflare data center the device is connected to. When traffic leaves a WARP-connected end-user device, it will hit a [Cloudflare data center](/support/troubleshooting/general-troubleshooting/gathering-information-for-troubleshooting-sites/#identify-the-cloudflare-data-center-serving-your-request). + +To find which Cloudflare data center a device is connected to: + +1. Follow the steps listed in [View IP information](#view-a-devices-ip-history) to find a device's IP information. +2. Select **Device Monitoring** above **Device event log**. +3. Find **Colo** in the **Device details** table to review which Cloudflare data center your selected device's egress traffic is connected to. diff --git a/src/content/docs/cloudflare-one/insights/email-monitoring/email-details.mdx b/src/content/docs/cloudflare-one/insights/email-monitoring/email-details.mdx new file mode 100644 index 00000000000000..0a7d5ef58876c2 --- /dev/null +++ b/src/content/docs/cloudflare-one/insights/email-monitoring/email-details.mdx @@ -0,0 +1,47 @@ +--- +title: Email details +pcx_content_type: reference +sidebar: + order: 6 +--- + +Email Security shows you the following email detail information: + +- Details +- Action log +- Raw message +- Mail trace + +### Details + +Email Security displays the following details: + +1. **Threat type**: Threat type of the email, for example, [credential harvester](/cloudflare-one/email-security/reference/how-es-detects-phish/#credential-harvesters), and [IP-based spam](/cloudflare-one/email-security/reference/how-es-detects-phish/#ip-based-spam). +2. **Validation**: Email validation methods [SPF](https://www.cloudflare.com/learning/dns/dns-records/dns-spf-record/), [DKIM](https://www.cloudflare.com/learning/dns/dns-records/dns-dkim-record/), [DMARC](https://www.cloudflare.com/learning/dns/dns-records/dns-dmarc-record/). +3. **Sender details**: Information include: + - IP address + - Registered domain + - Autonomous sys number: This number identifies your [autonomous system (AS)](https://www.cloudflare.com/en-gb/learning/network-layer/what-is-an-autonomous-system/). + - Autonomous sys name: This name identifies your autonomous system (AS). + - Country +4. **Links identified**: A list of malicious links identified by Email Security. +5. **Reasons for disposition**: Description of why the email was deemed as malicious, suspicious, or spam. + +### Action log + +Action log allows you to review post-delivery actions performed on your selected message. The action log displays: + +- **Date**: Date when the post-delivery action was performed. +- **Activity**: The activity taken on an email. For example, moving the email to the trash folder, releasing a quarantined email, and more. + +### Raw message + +Raw message allows you to view the raw details of the message. You can also choose to download the email message. To download the message, select **Download .EML**. + +### Mail trace + +Mail trace allows you to track the path your selected message took from the sender to the recipient. Mail trace displays: + +- **Date**: The date and time when the mail was tracked. +- **Type**: An email can be inbound (email sent to you from another email), or outbound (emails sent from your email address). +- **Activity**: The activity taken on an email. For example, moving the email to the trash folder, releasing a quarantined email, and more. \ No newline at end of file diff --git a/src/content/docs/cloudflare-one/insights/email-monitoring/search-email.mdx b/src/content/docs/cloudflare-one/insights/email-monitoring/search-email.mdx index c58d792a8e9daf..0d0d29c739252c 100644 --- a/src/content/docs/cloudflare-one/insights/email-monitoring/search-email.mdx +++ b/src/content/docs/cloudflare-one/insights/email-monitoring/search-email.mdx @@ -133,7 +133,7 @@ To view status and actions for each email: 1. On the **Investigation** page, select the three dots. 2. Selecting the three dots will show you the following options: - If the email is quarantined: - - **View details**: Refer to [Email details](/cloudflare-one/roles-permissions/#email-details) to learn more. + - **View details**: Refer to [Email details](/cloudflare-one/insights/email-monitoring/email-details/) to learn more. - **View similar emails**: Find similar emails based on the `value_edf_hash` (Electronic Detection Fingerprint hash). - **Release**: Email Security will no longer quarantine your chosen messages. - **Reclassify**: Choose the dispositions of your messages if they are incorrect. Refer to [Reclassify messages](/cloudflare-one/insights/email-monitoring/search-email/#reclassify-messages) to learn more. diff --git a/src/content/docs/cloudflare-one/policies/access/external-evaluation.mdx b/src/content/docs/cloudflare-one/policies/access/external-evaluation.mdx index b5ed268f0a3221..b5e3e1b6a0637e 100644 --- a/src/content/docs/cloudflare-one/policies/access/external-evaluation.mdx +++ b/src/content/docs/cloudflare-one/policies/access/external-evaluation.mdx @@ -5,7 +5,7 @@ sidebar: order: 4 --- -import { GlossaryTooltip, Example } from "~/components"; +import { GlossaryTooltip, Example, WranglerConfig } from "~/components"; With Cloudflare Access, you can create Allow or Block policies which evaluate the user based on custom criteria. This is done by adding an **External Evaluation** rule to your policy. The **External Evaluation** selector requires two values: @@ -53,12 +53,14 @@ You can set up External Evaluation rules using any API service, but to get start id = "YOUR_KV_NAMESPACE_ID" ``` -4. Open `wrangler.toml` in a text editor and insert the following: +4. Open the `wrangler.toml / wrangler.json` file in an editor and insert the following: - `[[kv_namespaces]]`: Add the output generated in the previous step. - ``: your Cloudflare Zero Trust team name. - ```txt + + + ```toml name = "my-worker" workers_dev = true compatibility_date = "2024-08-06" @@ -73,6 +75,7 @@ You can set up External Evaluation rules using any API service, but to get start TEAM_DOMAIN=".cloudflareaccess.com" DEBUG=false ``` + ### 2. Program your business logic @@ -136,7 +139,7 @@ To debug your External Evaluation rule: cd my-worker ``` -2. Open `wrangler.toml` in a text editor and set the `debug` variable to `TRUE`. +2. Open the `wrangler.toml / wrangler.json` file in an editor and set the `debug` variable to `TRUE`. 3. Deploy your changes. diff --git a/src/content/docs/cloudflare-one/policies/access/policy-management.mdx b/src/content/docs/cloudflare-one/policies/access/policy-management.mdx index c2bf24263b1cf4..f24c4ae0f0295d 100644 --- a/src/content/docs/cloudflare-one/policies/access/policy-management.mdx +++ b/src/content/docs/cloudflare-one/policies/access/policy-management.mdx @@ -75,7 +75,7 @@ To migrate legacy policies to reusable policies: 1. [Create a reusable policy](#create-a-policy) that will replace the legacy policy. 2. Go to the Access application associated with the legacy policy. 3. Add the reusable policy to the application and remove the legacy policy. -4. Repeat these steps for each legacy policy. If you have duplicate legacy policies, you can replace them with a single reuseable policy. +4. Repeat these steps for each legacy policy. If you have duplicate legacy policies, you can replace them with a single reusable policy. ### Convert a legacy policy diff --git a/src/content/docs/cloudflare-one/policies/browser-isolation/isolation-policies.mdx b/src/content/docs/cloudflare-one/policies/browser-isolation/isolation-policies.mdx index 3d6779a8d0e011..bc8feefac6f359 100644 --- a/src/content/docs/cloudflare-one/policies/browser-isolation/isolation-policies.mdx +++ b/src/content/docs/cloudflare-one/policies/browser-isolation/isolation-policies.mdx @@ -43,53 +43,79 @@ You can choose to disable isolation for certain destinations or categories. The ## Policy settings -The following optional settings appear in the Gateway HTTP policy builder when you select the _Isolate_ action. Enable these settings to [prevent data loss](https://blog.cloudflare.com/data-protection-browser/) when users interact with untrusted websites in the remote browser. - -### Disable copy / paste - -Prohibits users from copying and pasting content between a remote web page and their local machine. +The following optional settings appear in the Gateway HTTP policy builder when you select the _Isolate_ action. Configure these settings to [prevent data loss](https://blog.cloudflare.com/data-protection-browser/) when users interact with untrusted websites in the remote browser. + +### Copy (from remote to client) + +```mermaid + flowchart LR + subgraph remotebrowser[Remote browser] + siteA["Isolated + website"]--Data-->remoteclip["Remote + clipboard"] + end + subgraph client[Client] + localclip["Local + clipboard"] + end + remoteclip-->localclip +``` -### Disable printing +- _Allow_: (Default) Users can copy content from an isolated website to their local clipboard. +- _Allow only within isolated browser_: Users can only copy content from an isolated website to the remote clipboard. Users cannot copy content out of the remote browser to the local clipboard. You can use this setting alongside [**Paste (from client to remote)**: _Allow only within isolated browser_](/cloudflare-one/policies/browser-isolation/isolation-policies/#paste-from-client-to-remote) to only allow copy-pasting between isolated websites. +- _Do not allow_: Prohibits users from copying content from an isolated website. + +### Paste (from client to remote) + +```mermaid + flowchart LR + subgraph client[Client] + localclip["Local + clipboard"] + end + subgraph remotebrowser[Remote browser] + remoteclip["Remote + clipboard"]-->siteA["Isolated + website"] + end + localclip--Data-->remoteclip +``` -Prohibits users from printing remote web pages to their local machine. +- _Allow_: (Default) Users can paste content from their local clipboard to an isolated website. +- _Allow only within isolated browser_: Users can only paste content from the remote clipboard to an isolated website. Users cannot paste content from their local clipboard to the remote browser. You can use this setting alongside [**Copy (from remote to client)**: _Allow only within isolated browser_](/cloudflare-one/policies/browser-isolation/isolation-policies/#copy-from-remote-to-client) to only allow copy-pasting between isolated websites. +- _Do not allow_: Prohibits users from pasting content into an isolated website. -### Disable keyboard +### File downloads -Prohibits users from performing keyboard input into the remote web page. +- _Allow_: (Default) User can download files from an isolated website to their local machine. +- _Do not allow_: Prohibits users from downloading files from an isolated website to their local machine. :::note - -Mouse input remains available (to allow users to browse a website by following hyperlinks and scrolling). This does not prevent user input into third-party virtual keyboards within a remote web page. +This option does not prevent files from being downloaded into the remote browser. To prevent files being downloaded into the remote browser, use HTTP Policies to block by [Download Mime Type](/cloudflare-one/policies/gateway/http-policies/#download-and-upload-mime-type). ::: -### Disable upload +### File uploads -Prohibits users from uploading files from their local machine into a remote web page. +- _Allow_: (Default) Users can upload files from their local machine into an isolated website. +- _Do not allow_: Prohibits users from uploading files from their local machine into an isolated website. :::note - This option does not prevent files being uploaded to websites from third-party cloud file managers or files downloaded into the remote browser download bar from other isolated websites. To prevent files being uploaded from the remote browser into an isolated website, use HTTP Policies to block by [Upload Mime Type](/cloudflare-one/policies/gateway/http-policies/#download-and-upload-mime-type). ::: -### Disable download +### Keyboard -Prohibits users from exporting files from the remote browser to their local machine. +- _Allow_: (Default) Users can perform keyboard inputs into an isolated website. +- _Do not allow_: Prohibits users from performing keyboard inputs into an isolated website. :::note - -This option does not prevent files from being downloaded into the remote browser. To prevent files being downloaded into the remote browser, use HTTP Policies to block by [Download Mime Type](/cloudflare-one/policies/gateway/http-policies/#download-and-upload-mime-type). +Mouse input remains available to allow users to browse a website by following hyperlinks and scrolling. This does not prevent user input into third-party virtual keyboards within an isolated website. ::: -### Disable clipboard redirection +### Printing -Prevents copying isolated content from the remote browser to their local clipboard and pasting content from their local clipboard into isolated pages. - -:::note - -This option does not prevent clipboard interactions between isolated websites. Use [Disable copy / paste](/cloudflare-one/policies/browser-isolation/isolation-policies/#disable-copy--paste) to prohibit clipboard use on sensitive isolated applications. - -Disable copy / paste and Disable clipboard redirection are mutually exclusive and cannot be used in conjunction with each other. -::: +- _Allow_: (Default) Users can print isolated web pages to their local machine. +- _Do not allow_: Prohibits users from printing isolated web pages to their local machine. ## Common policies diff --git a/src/content/docs/cloudflare-one/policies/gateway/egress-policies/index.mdx b/src/content/docs/cloudflare-one/policies/gateway/egress-policies/index.mdx index c67a7317731f6c..e1074b01a0df81 100644 --- a/src/content/docs/cloudflare-one/policies/gateway/egress-policies/index.mdx +++ b/src/content/docs/cloudflare-one/policies/gateway/egress-policies/index.mdx @@ -16,6 +16,8 @@ When your users connect to the Internet through Cloudflare Gateway, by default t Egress policies allow you to control which dedicated egress IP is used and when, based on attributes such as identity, IP address, and geolocation. Traffic that does not match an egress policy will default to using the most performant dedicated egress IP. +Cloudflare does not publish WARP egress IP ranges. WARP egress IPs are not documented at [Cloudflare's IP Ranges](https://cloudflare.com/ips). To obtain a dedicated WARP egress IP, contact your account team. + ## Force IP version To control whether only IPv4 or IPv6 is used to egress, ensure you are [filtering DNS traffic](/cloudflare-one/policies/gateway/initial-setup/dns/), then create a DNS policy to [block AAAA or A records](/cloudflare-one/policies/gateway/dns-policies/common-policies/#control-ip-version). diff --git a/src/content/docs/cloudflare-one/policies/gateway/proxy.mdx b/src/content/docs/cloudflare-one/policies/gateway/proxy.mdx index 47802fdb426e9f..499d43e77d773d 100644 --- a/src/content/docs/cloudflare-one/policies/gateway/proxy.mdx +++ b/src/content/docs/cloudflare-one/policies/gateway/proxy.mdx @@ -11,7 +11,38 @@ You can forward [HTTP](/cloudflare-one/policies/gateway/initial-setup/http/) and The Gateway proxy is required for filtering HTTP and network traffic via the WARP client in Gateway with WARP mode. To proxy HTTP traffic without deploying the WARP client, you can configure [PAC files](/cloudflare-one/connections/connect-devices/agentless/pac-files/) on your devices. -## Proxy protocols +## Proxy algorithm + +Gateway uses the [Happy Eyeballs algorithm](https://datatracker.ietf.org/doc/html/rfc6555) to proxy traffic in the following order: + +1. The user's browser initiates the TCP handshake by sending Gateway a TCP SYN segment. +2. Gateway sends a SYN segment to the origin server. +3. If the origin server sends a SYN-ACK segment back, Gateway establishes distinct TCP connections between the user and Gateway and between Gateway and the origin server. +4. Gateway inspects and filters traffic received from the user. +5. If the traffic passes inspection, Gateway proxies traffic bidirectionally between the user and the origin server. + +```mermaid +flowchart TD + %% Accessibility + accTitle: How Gateway proxy works + accDescr: Flowchart describing how the Gateway proxy uses the Happy Eyeballs algorithm to establish TCP connections and proxy user traffic. + + %% Flowchart + A[User's device sends TCP SYN to Gateway] --> B[Gateway sends TCP SYN to origin server] + B --> C{{Origin server responds with TCP SYN-ACK?}} + C -->|Yes| E[TCP handshakes completed] + C -->|No| D[Connection fails] + E --> F{{Connection allowed?}} + F -->|Yes| G[Gateway proxies traffic bidirectionally] + F -->|No| H[Connection blocked by firewall policies] + + %% Styling + style D stroke:#D50000 + style G stroke:#00C853 + style H stroke:#D50000 +``` + +## Supported protocols Gateway supports proxying TCP, UDP, and ICMP traffic. diff --git a/src/content/docs/cloudflare-one/roles-permissions.mdx b/src/content/docs/cloudflare-one/roles-permissions.mdx index ace1c4c58e0e1c..84341ff57a2563 100644 --- a/src/content/docs/cloudflare-one/roles-permissions.mdx +++ b/src/content/docs/cloudflare-one/roles-permissions.mdx @@ -30,47 +30,4 @@ The Cloudflare Zero Trust PII role should be considered an add-on role, to be co :::note The Cloudflare Zero Trust PII role does not apply to Access audit logs. PII is always visible in Access logs. -::: - -## Email details - -Email Security shows you the following email detail information: - -- Details -- Action log -- Raw message -- Mail trace - -### Details - -Email Security displays the following details: - -1. **Threat type**: Threat type of the email, for example, [credential harvester](/cloudflare-one/email-security/reference/how-es-detects-phish/#credential-harvesters), and [IP-based spam](/cloudflare-one/email-security/reference/how-es-detects-phish/#ip-based-spam). -2. **Validation**: Email validation methods [SPF](https://www.cloudflare.com/en-gb/learning/dns/dns-records/dns-spf-record/), [DKIM](https://www.cloudflare.com/en-gb/learning/dns/dns-records/dns-dkim-record/), [DMARC](https://www.cloudflare.com/en-gb/learning/dns/dns-records/dns-dmarc-record/). -3. **Sender details**: Information include: - - IP address - - Registered domain - - Autonomous sys number: This number identifies your [autonomous system (AS)](https://www.cloudflare.com/en-gb/learning/network-layer/what-is-an-autonomous-system/). - - Autonomous sys name: This name identifies your autonomous system (AS). - - Country -4. **Links identified**: A list of malicious links identified by Email Security. -5. **Reasons for disposition**: Description of why the email was deemed as malicious, suspicious, or spam. - -### Action log - -Action log allows you to review post-delivery actions performed on your selected message. The action log displays: - -- **Date**: Date when the post-delivery action was performed. -- **Activity**: The activity taken on an email. For example, moving the email to the trash folder, releasing a quarantined email, and more. - -### Raw message - -Raw message allows you to view the raw details of the message. You can also choose to download the email message. To download the message, select **Download .EML**. - -### Mail trace - -Mail trace allows you to track the path your selected message took from the sender to the recipient. Mail trace displays: - -- **Date**: The date and time when the mail was tracked. -- **Type**: An email can be inbound (email sent to you from another email), or outbound (emails sent from your email address). -- **Activity**: The activity taken on an email. For example, moving the email to the trash folder, releasing a quarantined email, and more. \ No newline at end of file +::: \ No newline at end of file diff --git a/src/content/docs/cloudflare-one/tutorials/entra-id-risky-users.mdx b/src/content/docs/cloudflare-one/tutorials/entra-id-risky-users.mdx index 6e7590add20715..515c05a805c65d 100644 --- a/src/content/docs/cloudflare-one/tutorials/entra-id-risky-users.mdx +++ b/src/content/docs/cloudflare-one/tutorials/entra-id-risky-users.mdx @@ -80,7 +80,7 @@ To get started quickly, deploy our example Cloudflare Workers script by followin cd risky-users ``` -3. Modify `wrangler.toml` to include the following values: +3. Modify the `wrangler.toml / wrangler.json` file to include the following values: - ``: your Cloudflare [account ID](/fundamentals/setup/find-account-and-zone-ids/). - ``: your Entra ID **Directory (tenant) ID**, obtained when [setting up Entra ID as an identity provider](#1-set-up-entra-id-as-an-identity-provider). diff --git a/src/content/docs/cloudflare-one/tutorials/extend-sso-with-workers.mdx b/src/content/docs/cloudflare-one/tutorials/extend-sso-with-workers.mdx index 0e9e33d380cc27..d917b8aa44e9af 100644 --- a/src/content/docs/cloudflare-one/tutorials/extend-sso-with-workers.mdx +++ b/src/content/docs/cloudflare-one/tutorials/extend-sso-with-workers.mdx @@ -6,7 +6,7 @@ pcx_content_type: tutorial title: Send SSO attributes to Access-protected origins with Workers --- -import { Render, GlossaryTooltip, PackageManagers } from "~/components" +import { Render, GlossaryTooltip, PackageManagers, WranglerConfig } from "~/components" This tutorial will walk you through extending the single-sign-on (SSO) capabilities of [Cloudflare Access](/cloudflare-one/policies/access/) with our serverless computing platform, [Cloudflare Workers](/workers/). Specifically, this guide will demonstrate how to modify requests sent to your secured origin to include additional information from the Cloudflare Access authentication event. @@ -185,9 +185,7 @@ Below is an example of a user identity that includes the `disk_encryption` and ` ## 3. Route the Worker to your application -In `wrangler.toml`, [set up a route](/workers/configuration/routing/routes/) that maps the Worker to your Access application domain: - -import { WranglerConfig } from "~/components"; +In the `wrangler.toml / wrangler.json` file, [set up a route](/workers/configuration/routing/routes/) that maps the Worker to your Access application domain: diff --git a/src/content/docs/constellation/platform/client-api.mdx b/src/content/docs/constellation/platform/client-api.mdx index 329dc99b644207..550376d7dccaa8 100644 --- a/src/content/docs/constellation/platform/client-api.mdx +++ b/src/content/docs/constellation/platform/client-api.mdx @@ -213,7 +213,7 @@ const session = new InferenceSession( ); ``` -* **env.PROJECT** is the project binding defined in your `wrangler.toml` configuration. +* **env.PROJECT** is the project binding defined in your Wrangler configuration. * **0ae7bd14...** is the model ID inside the project. Use Wrangler to list the models and their IDs in a project. #### async session.run() diff --git a/src/content/docs/d1/best-practices/local-development.mdx b/src/content/docs/d1/best-practices/local-development.mdx index 5d3d38b1c15986..98e2ed772a364c 100644 --- a/src/content/docs/d1/best-practices/local-development.mdx +++ b/src/content/docs/d1/best-practices/local-development.mdx @@ -5,6 +5,8 @@ sidebar: order: 8 --- +import { WranglerConfig } from "~/components"; + D1 has fully-featured support for local development, running the same version of D1 as Cloudflare runs globally. Local development uses [Wrangler](/workers/wrangler/install-and-update/), the command-line interface for Workers, to manage local development sessions and state. ## Start a local development session @@ -52,13 +54,11 @@ To start a local development session: [b] open a browser, [d] open Devtools, [l] turn off local mode, [c] clear console, [x] to exit ``` -In this example, the Worker has access to local-only D1 database. The corresponding D1 binding in your `wrangler.toml` configuration file would resemble the following: - -import { WranglerConfig } from "~/components"; +In this example, the Worker has access to local-only D1 database. The corresponding D1 binding in your `wrangler.toml / wrangler.json` file would resemble the following: -```toml title="wrangler.toml" +```toml [[d1_databases]] binding = "DB" database_name = "test-db" @@ -73,21 +73,19 @@ Refer to the [`wrangler dev` documentation](/workers/wrangler/commands/#dev) to ## Develop locally with Pages -You can only develop against a _local_ D1 database when using [Cloudflare Pages](/pages/) by creating a minimal `wrangler.toml` in the root of your Pages project. This can be useful when creating schemas, seeding data or otherwise managing a D1 database directly, without adding to your application logic. +You can only develop against a _local_ D1 database when using [Cloudflare Pages](/pages/) by creating a minimal `wrangler.toml / wrangler.json` file in the root of your Pages project. This can be useful when creating schemas, seeding data or otherwise managing a D1 database directly, without adding to your application logic. :::caution[Local development for remote databases] It is currently not possible to develop against a _remote_ D1 database when using [Cloudflare Pages](/pages/). ::: -Your `wrangler.toml` should resemble the following: - - +your `wrangler.toml / wrangler.json` file should resemble the following: ```toml -# If you are only using Pages + D1, you only need the below in your wrangler.toml to interact with D1 locally. +# If you are only using Pages + D1, you only need the below in your Wrangler config file to interact with D1 locally. [[d1_databases]] binding = "DB" # Should match preview_database_id database_name = "YOUR_DATABASE_NAME" @@ -160,11 +158,9 @@ console.log(results); ### `unstable_dev` -Wrangler exposes an [`unstable_dev()`](/workers/wrangler/api/) that allows you to run a local HTTP server for testing Workers and D1. Run [migrations](/d1/reference/migrations/) against a local database by setting a `preview_database_id` in your `wrangler.toml` configuration. - -Given the below `wrangler.toml` configuration: - +Wrangler exposes an [`unstable_dev()`](/workers/wrangler/api/) that allows you to run a local HTTP server for testing Workers and D1. Run [migrations](/d1/reference/migrations/) against a local database by setting a `preview_database_id` in your Wrangler configuration. +Given the below Wrangler configuration: diff --git a/src/content/docs/d1/configuration/environments.mdx b/src/content/docs/d1/configuration/environments.mdx index 2f4a62c1e3e49a..18d9d451d4943d 100644 --- a/src/content/docs/d1/configuration/environments.mdx +++ b/src/content/docs/d1/configuration/environments.mdx @@ -6,11 +6,11 @@ sidebar: --- -[Environments](/workers/wrangler/environments/) are different contexts that your code runs in. Cloudflare Developer Platform allows you to create and manage different environments. Through environments, you can deploy the same project to multiple places under multiple names. +import { WranglerConfig } from "~/components"; -To specify different D1 databases for different environments, use the following syntax in your `wrangler.toml` file: +[Environments](/workers/wrangler/environments/) are different contexts that your code runs in. Cloudflare Developer Platform allows you to create and manage different environments. Through environments, you can deploy the same project to multiple places under multiple names. -import { WranglerConfig } from "~/components"; +To specify different D1 databases for different environments, use the following syntax in your Wrangler file: @@ -32,11 +32,9 @@ d1_databases = [ In the code above, the `staging` environment is using a different database (`DATABASE_NAME_1`) than the `production` environment (`DATABASE_NAME_2`). -## Anatomy of `wrangler.toml` file - -If you need to specify different D1 databases for different environments, your `wrangler.toml` may contain bindings that resemble the following: - +## Anatomy of Wrangler file +If you need to specify different D1 databases for different environments, your `wrangler.toml / wrangler.json` file may contain bindings that resemble the following: diff --git a/src/content/docs/d1/examples/d1-and-hono.mdx b/src/content/docs/d1/examples/d1-and-hono.mdx index 9a2784c5f6e405..a77e6abc9dfed8 100644 --- a/src/content/docs/d1/examples/d1-and-hono.mdx +++ b/src/content/docs/d1/examples/d1-and-hono.mdx @@ -18,14 +18,14 @@ Hono is a fast web framework for building API-first applications, and it include When using Workers: -* Ensure you have configured [`wrangler.toml`](/d1/get-started/#3-bind-your-worker-to-your-d1-database) to bind your D1 database to your Worker. +* Ensure you have configured your [`wrangler.toml / wrangler.json` file](/d1/get-started/#3-bind-your-worker-to-your-d1-database) to bind your D1 database to your Worker. * You can access your D1 databases via Hono's [`Context`](https://hono.dev/api/context) parameter: [bindings](https://hono.dev/getting-started/cloudflare-workers#bindings) are exposed on `context.env`. If you configured a [binding](/pages/functions/bindings/#d1-databases) named `DB`, then you would access [D1 Workers Binding API](/d1/worker-api/prepared-statements/) methods via `c.env.DB`. * Refer to the Hono documentation for [Cloudflare Workers](https://hono.dev/getting-started/cloudflare-workers). If you are using [Pages Functions](/pages/functions/): 1. Bind a D1 database to your [Pages Function](/pages/functions/bindings/#d1-databases). -2. Pass the `--d1 BINDING_NAME=DATABASE_ID` flag to `wrangler dev` when developing locally. `BINDING_NAME` should match what call in your code, and `DATABASE_ID` should match the `database_id` defined in your wrangler.toml: for example, `--d1 DB=xxxx-xxxx-xxxx-xxxx-xxxx`. +2. Pass the `--d1 BINDING_NAME=DATABASE_ID` flag to `wrangler dev` when developing locally. `BINDING_NAME` should match what call in your code, and `DATABASE_ID` should match the `database_id` defined in your `wrangler.toml / wrangler.json` file: for example, `--d1 DB=xxxx-xxxx-xxxx-xxxx-xxxx`. 3. Refer to the Hono guide for [Cloudflare Pages](https://hono.dev/getting-started/cloudflare-pages). The following examples show how to access a D1 database bound to `DB` from both a Workers script and a Pages Function: diff --git a/src/content/docs/d1/examples/d1-and-remix.mdx b/src/content/docs/d1/examples/d1-and-remix.mdx index 3cf86ffd579eef..bd706040910ea8 100644 --- a/src/content/docs/d1/examples/d1-and-remix.mdx +++ b/src/content/docs/d1/examples/d1-and-remix.mdx @@ -20,7 +20,7 @@ To set up a new Remix site on Cloudflare Pages that can query D1: 1. **Refer to [the Remix guide](/pages/framework-guides/deploy-a-remix-site/)**. 2. Bind a D1 database to your [Pages Function](/pages/functions/bindings/#d1-databases). -3. Pass the `--d1 BINDING_NAME=DATABASE_ID` flag to `wrangler dev` when developing locally. `BINDING_NAME` should match what call in your code, and `DATABASE_ID` should match the `database_id` defined in your wrangler.toml: for example, `--d1 DB=xxxx-xxxx-xxxx-xxxx-xxxx`. +3. Pass the `--d1 BINDING_NAME=DATABASE_ID` flag to `wrangler dev` when developing locally. `BINDING_NAME` should match what call in your code, and `DATABASE_ID` should match the `database_id` defined in your `wrangler.toml / wrangler.json` file: for example, `--d1 DB=xxxx-xxxx-xxxx-xxxx-xxxx`. The following example shows you how to define a Remix [`loader`](https://remix.run/docs/en/main/route/loader) that has a binding to a D1 database. diff --git a/src/content/docs/d1/examples/d1-and-sveltekit.mdx b/src/content/docs/d1/examples/d1-and-sveltekit.mdx index 12b48a3785dba5..e2b9885736907b 100644 --- a/src/content/docs/d1/examples/d1-and-sveltekit.mdx +++ b/src/content/docs/d1/examples/d1-and-sveltekit.mdx @@ -22,7 +22,7 @@ To set up a new SvelteKit site on Cloudflare Pages that can query D1: 1. **Refer to [the SvelteKit guide](/pages/framework-guides/deploy-a-svelte-kit-site/) and Svelte's [Cloudflare adapter](https://kit.svelte.dev/docs/adapter-cloudflare)**. 2. Install the Cloudflare adapter within your SvelteKit project: `npm i -D @sveltejs/adapter-cloudflare`. 3. Bind a D1 database [to your Pages Function](/pages/functions/bindings/#d1-databases). -4. Pass the `--d1 BINDING_NAME=DATABASE_ID` flag to `wrangler dev` when developing locally. `BINDING_NAME` should match what call in your code, and `DATABASE_ID` should match the `database_id` defined in your wrangler.toml: for example, `--d1 DB=xxxx-xxxx-xxxx-xxxx-xxxx`. +4. Pass the `--d1 BINDING_NAME=DATABASE_ID` flag to `wrangler dev` when developing locally. `BINDING_NAME` should match what call in your code, and `DATABASE_ID` should match the `database_id` defined in your `wrangler.toml / wrangler.json` file: for example, `--d1 DB=xxxx-xxxx-xxxx-xxxx-xxxx`. The following example shows you how to create a server endpoint configured to query D1. diff --git a/src/content/docs/d1/examples/query-d1-from-python-workers.mdx b/src/content/docs/d1/examples/query-d1-from-python-workers.mdx index e5a2f198f6358d..a135c34270a1dd 100644 --- a/src/content/docs/d1/examples/query-d1-from-python-workers.mdx +++ b/src/content/docs/d1/examples/query-d1-from-python-workers.mdx @@ -11,6 +11,8 @@ sidebar: description: Learn how to query D1 from a Python Worker --- +import { WranglerConfig } from "~/components"; + The Cloudflare Workers platform supports [multiple languages](/workers/languages/), including TypeScript, JavaScript, Rust and Python. This guide shows you how to query a D1 database from [Python](/workers/languages/python/) and deploy your application globally. :::note @@ -31,7 +33,7 @@ If you are new to Cloudflare Workers, refer to the [Get started guide](/workers/ ## Query from Python -This example assumes you have an existing D1 database. To allow your Python Worker to query your database, you first need to create a [binding](/workers/runtime-apis/bindings/) between your Worker and your D1 database and define this in your `wrangler.toml` configuration file. +This example assumes you have an existing D1 database. To allow your Python Worker to query your database, you first need to create a [binding](/workers/runtime-apis/bindings/) between your Worker and your D1 database and define this in your `wrangler.toml / wrangler.json` file. You will need the `database_name` and `database_id` for a D1 database. You can use the `wrangler` CLI to create a new database or fetch the ID for an existing database as follows: @@ -55,9 +57,7 @@ npx wrangler d1 info some-existing-db ### 1. Configure bindings -In your `wrangler.toml` file, create a new `[[d1_databases]]` configuration block and set `database_name` and `database_id` to the name and id (respectively) of the D1 database you want to query: - -import { WranglerConfig } from "~/components"; +In your Wrangler file, create a new `[[d1_databases]]` configuration block and set `database_name` and `database_id` to the name and id (respectively) of the D1 database you want to query: @@ -79,7 +79,7 @@ The value of `binding` is how you will refer to your database from within your W ### 2. Create your Python Worker -To create a Python Worker, create an empty file at `src/entry.py`, matching the value of `main` in your `wrangler.toml` file with the contents below: +To create a Python Worker, create an empty file at `src/entry.py`, matching the value of `main` in your Wrangler file with the contents below: ```python from js import Response @@ -94,7 +94,7 @@ async def on_fetch(request, env): ``` -The value of `binding` in your `wrangler.toml` file exactly must match the name of the variable in your Python code. This example refers to the database via a `DB` binding, and query this binding via `await env.DB.prepare(...)`. +The value of `binding` in your Wrangler file exactly must match the name of the variable in your Python code. This example refers to the database via a `DB` binding, and query this binding via `await env.DB.prepare(...)`. You can then deploy your Python Worker directly: @@ -119,8 +119,8 @@ Your Worker will be available at `https://python-and-d1.YOUR_SUBDOMAIN.workers.d If you receive an error deploying: -- Make sure you have configured your `wrangler.toml` with the `database_id` and `database_name` of a valid D1 database. -- Ensure `compatibility_flags = ["python_workers"]` is set in your `wrangler.toml`, which is required for Python. +- Make sure you have configured your `wrangler.toml / wrangler.json` file with the `database_id` and `database_name` of a valid D1 database. +- Ensure `compatibility_flags = ["python_workers"]` is set in your `wrangler.toml / wrangler.json` file, which is required for Python. - Review the [list of error codes](/workers/observability/errors/), and ensure your code does not throw an uncaught exception. ## Next steps diff --git a/src/content/docs/d1/get-started.mdx b/src/content/docs/d1/get-started.mdx index a2477f988e6575..db4a97528d73e4 100644 --- a/src/content/docs/d1/get-started.mdx +++ b/src/content/docs/d1/get-started.mdx @@ -19,7 +19,7 @@ import { This guide instructs you through: -- Creating your first database using D1, Cloudflare’s native serverless SQL database. +- Creating your first database using D1, Cloudflare's native serverless SQL database. - Creating a schema and querying your database via the command-line. - Connecting a [Cloudflare Worker](/workers/) to your D1 database to query your D1 database programmatically. @@ -67,13 +67,13 @@ Create a new Worker as the means to query your database. - testconfig.json - vitest.config.mts - worker-configuration.d.ts - - **wrangler.toml** + - **wrangler.json** Your new `d1-tutorial` directory includes: - A `"Hello World"` [Worker](/workers/get-started/guide/#3-write-code) in `index.ts`. - - A [`wrangler.toml`](/workers/wrangler/configuration/) configuration file. `wrangler.toml` is how your `d1-tutorial` Worker accesses your D1 database. + - A [`wrangler.toml / wrangler.json` file](/workers/wrangler/configuration/). This file is how your `d1-tutorial` Worker accesses your D1 database. @@ -170,12 +170,12 @@ To bind your D1 database to your Worker: -You create bindings by updating your `wrangler.toml` file. +You create bindings by updating your Wrangler file. 1. Copy the lines obtained from [step 2](/d1/get-started/#2-create-a-database) from your terminal. -2. Add them to the end of your `wrangler.toml` file. +2. Add them to the end of your Wrangler file. @@ -230,7 +230,7 @@ You create bindings by adding them to the Worker you have created. -With `wrangler.toml` configured properly, set up your database. Use the example `schema.sql` file below to initialize your database. +After correctly preparing your `wrangler.toml / wrangler.json` file, set up your database. Use the example `schema.sql` file below to initialize your database. 1. Copy the following code and save it as a `schema.sql` file in the `d1-tutorial` Worker directory you created in step 1: @@ -309,7 +309,7 @@ After you have set up your database, run an SQL query from within your Worker. ```typescript export interface Env { - // If you set another name in wrangler.toml as the value for 'binding', + // If you set another name in the Wrangler config file for the value for 'binding', // replace "DB" with the variable name you defined. DB: D1Database; } @@ -338,7 +338,7 @@ After you have set up your database, run an SQL query from within your Worker. In the code above, you: - 1. Define a binding to your D1 database in your TypeScript code. This binding matches the `binding` value you set in `wrangler.toml` under `[[d1_databases]]`. + 1. Define a binding to your D1 database in your TypeScript code. This binding matches the `binding` value you set in the `wrangler.toml / wrangler.json` file under `[[d1_databases]]`. 2. Query your database using `env.DB.prepare` to issue a [prepared query](/d1/worker-api/d1-database/#prepare) with a placeholder (the `?` in the query). 3. Call `bind()` to safely and securely bind a value to that placeholder. In a real application, you would allow a user to define the `CompanyName` they want to list results for. Using `bind()` prevents users from executing arbitrary SQL (known as "SQL injection") against your application and deleting or otherwise modifying your database. 4. Execute the query by calling `all()` to return all rows (or none, if the query returns none). diff --git a/src/content/docs/d1/reference/migrations.mdx b/src/content/docs/d1/reference/migrations.mdx index ca152a6bc53a5d..363b0df10c0e31 100644 --- a/src/content/docs/d1/reference/migrations.mdx +++ b/src/content/docs/d1/reference/migrations.mdx @@ -6,6 +6,8 @@ sidebar: --- +import { WranglerConfig } from "~/components"; + Database migrations are a way of versioning your database. Each migration is stored as an `.sql` file in your `migrations` folder. The `migrations` folder is created in your project directory when you create your first migration. This enables you to store and track changes throughout database development. ## Features @@ -22,9 +24,7 @@ Every migration file in the `migrations` folder has a specified version number i By default, migrations are created in the `migrations/` folder in your Worker project directory. Creating migrations will keep a record of applied migrations in the `d1_migrations` table found in your database. -This location and table name can be customized in your `wrangler.toml` file, inside the D1 binding. - -import { WranglerConfig } from "~/components"; +This location and table name can be customized in your Wrangler file, inside the D1 binding. diff --git a/src/content/docs/d1/tutorials/build-a-comments-api/index.mdx b/src/content/docs/d1/tutorials/build-a-comments-api/index.mdx index 012173de452f1a..aa97a6c69c271a 100644 --- a/src/content/docs/d1/tutorials/build-a-comments-api/index.mdx +++ b/src/content/docs/d1/tutorials/build-a-comments-api/index.mdx @@ -13,7 +13,7 @@ languages: - SQL --- -import { Render, PackageManagers, Stream } from "~/components"; +import { Render, PackageManagers, Stream, WranglerConfig } from "~/components"; In this tutorial, you will learn how to use D1 to add comments to a static blog site. To do this, you will construct a new D1 database, and build a JSON API that allows the creation and retrieval of comments. @@ -88,9 +88,7 @@ You will now create a D1 database. In Wrangler v2, there is support for the `wra npx wrangler d1 create d1-example ``` -Reference your created database in your Worker code by creating a [binding](/workers/runtime-apis/bindings/) inside of your `wrangler.toml` file, Wrangler's configuration file. Bindings allow us to access Cloudflare resources, like D1 databases, KV namespaces, and R2 buckets, using a variable name in code. In `wrangler.toml`, set up the binding `DB` and connect it to the `database_name` and `database_id`: - -import { WranglerConfig } from "~/components"; +Reference your created database in your Worker code by creating a [binding](/workers/runtime-apis/bindings/) inside of your Wrangler file, Wrangler's configuration file. Bindings allow us to access Cloudflare resources, like D1 databases, KV namespaces, and R2 buckets, using a variable name in code. In the `wrangler.toml / wrangler.json` file, set up the binding `DB` and connect it to the `database_name` and `database_id`: @@ -103,7 +101,7 @@ database_id = "4e1c28a9-90e4-41da-8b4b-6cf36e5abb29" -With your binding configured in your `wrangler.toml` file, you can interact with your database from the command line, and inside your Workers function. +With your binding configured in your Wrangler file, you can interact with your database from the command line, and inside your Workers function. ## 4. Interact with D1 @@ -149,7 +147,7 @@ npx wrangler d1 execute d1-example --remote --file schemas/schema.sql ## 5. Execute SQL -In earlier steps, you created a SQL database and populated it with initial data. Now, you will add a route to your Workers function to retrieve data from that database. Based on your `wrangler.toml` configuration in previous steps, your D1 database is now accessible via the `DB` binding. In your code, use the binding to prepare SQL statements and execute them, for example, to retrieve comments: +In earlier steps, you created a SQL database and populated it with initial data. Now, you will add a route to your Workers function to retrieve data from that database. Based on your Wrangler configuration in previous steps, your D1 database is now accessible via the `DB` binding. In your code, use the binding to prepare SQL statements and execute them, for example, to retrieve comments: ```js app.get("/api/posts/:slug/comments", async (c) => { @@ -205,7 +203,7 @@ With your application ready for deployment, use Wrangler to build and deploy you Begin by running `wrangler whoami` to confirm that you are logged in to your Cloudflare account. If you are not logged in, Wrangler will prompt you to login, creating an API key that you can use to make authenticated requests automatically from your local machine. -After you have logged in, confirm that your `wrangler.toml` file is configured similarly to what is seen below. You can change the `name` field to a project name of your choice: +After you have logged in, confirm that your Wrangler file is configured similarly to what is seen below. You can change the `name` field to a project name of your choice: diff --git a/src/content/docs/d1/tutorials/build-a-staff-directory-app/index.mdx b/src/content/docs/d1/tutorials/build-a-staff-directory-app/index.mdx index 486bc38f373ea1..ae25e1d87afd4a 100644 --- a/src/content/docs/d1/tutorials/build-a-staff-directory-app/index.mdx +++ b/src/content/docs/d1/tutorials/build-a-staff-directory-app/index.mdx @@ -13,6 +13,8 @@ languages: - SQL --- +import { WranglerConfig } from "~/components"; + In this tutorial, you will learn how to use D1 to build a staff directory. This application will allow users to access information about an organization's employees and give admins the ability to add new employees directly within the app. To do this, you will first need to set up a [D1 database](/d1/get-started/) to manage data seamlessly, then you will develop and deploy your application using the [HonoX Framework](https://github.com/honojs/honox) and [Cloudflare Pages](/pages). @@ -68,11 +70,9 @@ To create a database for your project, use the Cloudflare CLI tool, [Wrangler](/ npx wrangler d1 create staff-directory ``` -After creating your database, you will need to set up a [binding](/workers/runtime-apis/bindings/) in the Wrangler configuration file to integrate your database with your application. +After creating your database, you will need to set up a [binding](/workers/runtime-apis/bindings/) in the `wrangler.toml / wrangler.json` file to integrate your database with your application. -This binding enables your application to interact with Cloudflare resources such as D1 databases, KV namespaces, and R2 buckets. To configure this, create a `wrangler.toml` file in your project's root directory and input the basic setup information: - -import { WranglerConfig } from "~/components"; +This binding enables your application to interact with Cloudflare resources such as D1 databases, KV namespaces, and R2 buckets. To configure this, create a Wrangler file in your project's root directory and input the basic setup information: @@ -83,7 +83,7 @@ compatibility_date = "2023-12-01" -Next, add the database binding details to your `wrangler.toml` file. This involves specifying a binding name (in this case, `DB`), which will be used to reference the database within your application, along with the `database_name` and `database_id` provided when you created the database: +Next, add the database binding details to your Wrangler file. This involves specifying a binding name (in this case, `DB`), which will be used to reference the database within your application, along with the `database_name` and `database_id` provided when you created the database: @@ -173,7 +173,7 @@ To execute the schema locally and seed data into your local directory, pass the ## 5. Create SQL statements -After setting up your D1 database and configuring the `wrangler.toml` file as outlined in previous steps, your database is accessible in your code through the `DB` binding. This allows you to directly interact with the database by preparing and executing SQL statements. In the following step, you will learn how to use this binding to perform common database operations such as retrieving data and inserting new records. +After setting up your D1 database and configuring the Wrangler file as outlined in previous steps, your database is accessible in your code through the `DB` binding. This allows you to directly interact with the database by preparing and executing SQL statements. In the following step, you will learn how to use this binding to perform common database operations such as retrieving data and inserting new records. ### Retrieve data from database @@ -377,7 +377,7 @@ Use the `wrangler r2 bucket create` command to create a bucket: wrangler r2 bucket create employee-avatars ``` -Once the bucket is created, add the R2 bucket binding to your `wrangler.toml` file: +Once the bucket is created, add the R2 bucket binding to your Wrangler file: @@ -428,7 +428,7 @@ if (imageFile instanceof File) { With your application ready for deployment, you can use Wrangler to build and deploy your project to the Cloudflare Network. Ensure you are logged in to your Cloudflare account by running the `wrangler whoami` command. If you are not logged in, Wrangler will prompt you to login by creating an API key that you can use to make authenticated requests automatically from your computer. -After successful login, confirm that your `wrangler.toml` file is configured similarly to the code block below: +After successful login, confirm that your Wrangler file is configured similarly to the code block below: diff --git a/src/content/docs/d1/tutorials/build-an-api-to-access-d1/index.mdx b/src/content/docs/d1/tutorials/build-an-api-to-access-d1/index.mdx index bb92a93b867cce..d69f1becdea36b 100644 --- a/src/content/docs/d1/tutorials/build-an-api-to-access-d1/index.mdx +++ b/src/content/docs/d1/tutorials/build-an-api-to-access-d1/index.mdx @@ -220,7 +220,7 @@ Make a note of the displayed `database_name` and `database_id`. You will use thi ## 7. Add a binding -1. From your `d1-http` folder, open the `wrangler.toml` file, Wrangler's configuration file. +1. From your `d1-http` folder, open the Wrangler file, Wrangler's configuration file. 2. Add the following binding in the file. Make sure that the `database_name` and the `database_id` are correct. diff --git a/src/content/docs/d1/tutorials/d1-and-prisma-orm/index.mdx b/src/content/docs/d1/tutorials/d1-and-prisma-orm/index.mdx index 7542b338e88da6..19c11b7aca284b 100644 --- a/src/content/docs/d1/tutorials/d1-and-prisma-orm/index.mdx +++ b/src/content/docs/d1/tutorials/d1-and-prisma-orm/index.mdx @@ -11,6 +11,8 @@ languages: - SQL --- +import { WranglerConfig } from "~/components"; + ## What is Prisma ORM? [Prisma ORM](https://www.prisma.io/orm) is a next-generation JavaScript and TypeScript ORM that unlocks a new level of developer experience when working with databases thanks to its intuitive data model, automated migrations, type-safety and auto-completion. @@ -112,9 +114,7 @@ database_id = "__YOUR_D1_DATABASE_ID__" You now have a D1 database in your Cloudflare account with a binding to your Cloudflare Worker. -Copy the last part of the command output and paste it into your `wrangler.toml` file. It should look similar to this: - -import { WranglerConfig } from "~/components"; +Copy the last part of the command output and paste it into your Wrangler file. It should look similar to this: diff --git a/src/content/docs/d1/worker-api/d1-database.mdx b/src/content/docs/d1/worker-api/d1-database.mdx index 4054166f9375da..993939f1f33ce1 100644 --- a/src/content/docs/d1/worker-api/d1-database.mdx +++ b/src/content/docs/d1/worker-api/d1-database.mdx @@ -11,7 +11,7 @@ To interact with your D1 database from your Worker, you need to access it throug ```js async fetch(request, env) { - // D1 database is 'env.DB', where "DB" is the binding name from the Wrangler.toml file. + // D1 database is 'env.DB', where "DB" is the binding name from the `wrangler.toml / wrangler.json` file. } ``` diff --git a/src/content/docs/data-localization/how-to/index.mdx b/src/content/docs/data-localization/how-to/index.mdx index 73e9ef59490a67..9bf6b48d10307a 100644 --- a/src/content/docs/data-localization/how-to/index.mdx +++ b/src/content/docs/data-localization/how-to/index.mdx @@ -3,10 +3,9 @@ title: Configuration guides pcx_content_type: navigation sidebar: order: 7 - --- -import { DirectoryListing } from "~/components" +import { DirectoryListing } from "~/components"; Learn how to use Cloudflare products with the Data Localization Suite. @@ -24,6 +23,6 @@ curl -X GET -I https:/// 2>&1 | grep cf-ray curl -s https:///cdn-cgi/trace | grep "colo=" ``` -The first command will return a three-letter IATA code in the [CF-Ray](/fundamentals/reference/http-request-headers/#cf-ray) header, indicating the Cloudflare data center location of processing and/or TLS termination. The second command will directly return the three-letter IATA code. +The first command will return a three-letter IATA code in the [Cf-Ray](/fundamentals/reference/http-headers/#cf-ray) header, indicating the Cloudflare data center location of processing and/or TLS termination. The second command will directly return the three-letter IATA code. For example, when a hostname is configured to use the region European Union (EU), the three-letter IATA code will always return a data center inside of the EU. diff --git a/src/content/docs/ddos-protection/advanced-ddos-systems/concepts.mdx b/src/content/docs/ddos-protection/advanced-ddos-systems/concepts.mdx index 48a4783509e09f..64a73c5fdb9277 100644 --- a/src/content/docs/ddos-protection/advanced-ddos-systems/concepts.mdx +++ b/src/content/docs/ddos-protection/advanced-ddos-systems/concepts.mdx @@ -58,7 +58,8 @@ Besides defining rules with one of the above scopes, you must also select the [p The Advanced TCP Protection system constantly learns your TCP connections to mitigate DDoS attacks. Advanced TCP Protection rules can have one of the following execution modes: monitoring, mitigation (enabled), or disabled. - **Monitoring** - - In this mode, Advanced TCP Protection will not impact any packets. Instead, the protection system will learn your legitimate TCP connections and show you what it would have mitigated. Check Network Analytics to visualize what actions Advanced TCP Protection would have taken on incoming packets, according to the current configuration. + - In this mode, Advanced TCP Protection will not impact any packets. Instead, the protection system will learn your legitimate TCP connections and show you what it would have mitigated. Check Network Analytics to visualize what actions Advanced TCP Protection would have taken on incoming packets, according to the current configuration. + - **​​Mitigation (Enabled)** - In this mode, Advanced TCP Protection will learn your legitimate TCP connections and perform mitigation actions on incoming TCP DDoS attacks based on the rule configuration (burst and rate sensitivity) and your [allowlist](/ddos-protection/advanced-ddos-systems/concepts/#allowlist). @@ -99,7 +100,9 @@ The default rate sensitivity and recommended setting is _Low_. You should only i ## Filter - The filter expression can reference source and destination IP addresses and ports. Each system component (SYN flood protection and out-of-state TCP protection) should have one or more [rules](#rule), but filters are optional. + + +The filter expression can reference source and destination IP addresses and ports. Each system component (SYN flood protection and out-of-state TCP protection) should have one or more [rules](#rule), but filters are optional. Each system component has its own filters. You can configure a filter for each execution mode: diff --git a/src/content/docs/ddos-protection/managed-rulesets/network/override-parameters.mdx b/src/content/docs/ddos-protection/managed-rulesets/network/override-parameters.mdx index 74e719712975c6..f50027b67b3426 100644 --- a/src/content/docs/ddos-protection/managed-rulesets/network/override-parameters.mdx +++ b/src/content/docs/ddos-protection/managed-rulesets/network/override-parameters.mdx @@ -26,7 +26,7 @@ The action performed for packets that match specific rules of Cloudflare's DDoS - **Log** - API value: `"log"`. - - Only available on Enterprise plans. Logs requests that match the expression of a rule detecting network layer DDoS attacks. Recommended for validating a rule before committing to a more severe action. + - Only available on Enterprise plans. Logs requests that match the expression of a rule detecting network layer DDoS attacks. Recommended for validating a rule before committing to a more severe action. - **Block** - API value: `"block"`. diff --git a/src/content/docs/developer-spotlight/index.mdx b/src/content/docs/developer-spotlight/index.mdx index 2c39852e98fa30..f4c3f6617b81a3 100644 --- a/src/content/docs/developer-spotlight/index.mdx +++ b/src/content/docs/developer-spotlight/index.mdx @@ -13,6 +13,13 @@ Applications are currently open until Thursday, the 24th of October 2024. To app ## View latest contributions + + By Mackenly Jones + + - -```sh -pnpm create cloudflare@latest -``` - - - -```sh -npm create cloudflare@latest -``` - - - -```sh -yarn create cloudflare@latest -``` - - + In this tutorial, the Worker will be named `cms-sitemap`. @@ -90,15 +72,13 @@ yarn add @sanity/client -## Configure wrangler.toml - -A default `wrangler.toml` was generated in the previous step. +## Configure Wrangler -The `wrangler.toml` file is a configuration file used to specify project settings and deployment configurations in a structured format. +A default `wrangler.json` was generated in the previous step. -For this tutorial your `wrangler.toml` should be similar to the following: +The Wrangler file is a configuration file used to specify project settings and deployment configurations in a structured format. -import { WranglerConfig } from "~/components"; +For this tutorial your `wrangler.toml / wrangler.json` file should be similar to the following: @@ -122,7 +102,7 @@ You must update the `[vars]` section to match your needs. See the inline comment :::caution -Secrets do not belong in `wrangler.toml`. If you need to add secrets, use `.dev.vars` for local secrets and the `wranger secret put` command for deploying secrets. For more information, refer to [Secrets](/workers/configuration/secrets/). +Secrets do not belong in `wrangler.toml / wrangler.json` files. If you need to add secrets, use `.dev.vars` for local secrets and the `wranger secret put` command for deploying secrets. For more information, refer to [Secrets](/workers/configuration/secrets/). ::: @@ -145,7 +125,7 @@ Paste the following code into the existing `index.ts|js` file: * - Open a browser tab at http://localhost:8787/ to see your worker in action * - Run `npm run deploy` to publish your worker * - * Bind resources to your worker in `wrangler.toml`. After adding bindings, a type definition for the + * Bind resources to your worker in Wrangler config file. After adding bindings, a type definition for the * `Env` object can be regenerated with `npm run cf-typegen`. * * Learn more at https://developers.cloudflare.com/workers/ diff --git a/src/content/docs/developer-spotlight/tutorials/creating-a-recommendation-api.mdx b/src/content/docs/developer-spotlight/tutorials/creating-a-recommendation-api.mdx index 4de7150c02e40b..17fd82faf6b456 100644 --- a/src/content/docs/developer-spotlight/tutorials/creating-a-recommendation-api.mdx +++ b/src/content/docs/developer-spotlight/tutorials/creating-a-recommendation-api.mdx @@ -22,7 +22,13 @@ sidebar: order: 2 --- -import { Render, TabItem, Tabs } from "~/components"; +import { + Render, + TabItem, + Tabs, + PackageManagers, + WranglerConfig, +} from "~/components"; E-commerce and media sites often work on increasing the average transaction value to boost profitability. One of the strategies to increase the average transaction value is "cross-selling," which involves recommending related products. Cloudflare offers a range of products designed to build mechanisms for retrieving data related to the products users are viewing or requesting. In this tutorial, you will experience developing functionalities necessary for cross-selling by creating APIs for related product searches and product recommendations. @@ -61,25 +67,11 @@ First, let's create a Cloudflare Workers project. To efficiently create and manage multiple APIs, let's use [`Hono`](https://hono.dev). Hono is an open-source application framework released by a Cloudflare Developer Advocate. It is lightweight and allows for the creation of multiple API paths, as well as efficient request and response handling. Open your command line interface (CLI) and run the following command: - - -```sh -npm create cloudflare@latest cross-sell-api -- --framework hono -``` - - - -```sh -yarn create cloudflare@latest cross-sell-api -- --framework hono -``` - - - -```sh -pnpm create cloudflare@latest cross-sell-api -- --framework hono -``` - - + If this is your first time running the `C3` command, you will be asked whether you want to install it. Confirm that the package name for installation is `create-cloudflare` and answer `y`. @@ -173,13 +165,13 @@ Let's start implementing step-by-step. ### Bind Workers AI and Vectorize to your Worker -This API requires the use of Workers AI and Vectorize. To use these resources from a Worker, you will need to first create the resources then [bind](/workers/runtime-apis/bindings/#what-is-a-binding) them to a Worker. First, let's create a Vectorize index with Wrangler using the command `wrangler vectorize create {index_name} --dimensions={number_of_dimensions} --metric={similarity_metric}`. The values for `dimensions` and `metric` depend on the type of [Text Embedding Model](/workers-ai/models/#text-embeddings) you are using for data vectorization (Embedding). For example, if you are using the `bge-large-en-v1.5` model, the command is: +This API requires the use of Workers AI and Vectorize. To use these resources from a Worker, you will need to first create the resources then [bind](/workers/runtime-apis/bindings/#what-is-a-binding) them to a Worker. First, let's create a Vectorize index with Wrangler using the command `wrangler vectorize create {index_name} --dimensions={number_of_dimensions} --metric={similarity_metric}`. The values for `dimensions` and `metric` depend on the type of [Text Embedding Model](/workers-ai/models/) you are using for data vectorization (Embedding). For example, if you are using the `bge-large-en-v1.5` model, the command is: ```sh npx wrangler vectorize create stripe-products --dimensions=1024 --metric=cosine ``` -When this command executes successfully, you will see a message like the following. It provides the items you need to add to `wrangler.toml` to bind the Vectorize index with your Worker application. Copy the three lines starting with `[[vectorize]]`. +When this command executes successfully, you will see a message like the following. It provides the items you need to add to the `wrangler.toml / wrangler.json` file to bind the Vectorize index with your Worker application. Copy the three lines starting with `[[vectorize]]`. ```sh ✅ Successfully created a new Vectorize index: 'stripe-products' @@ -190,9 +182,7 @@ binding = "VECTORIZE_INDEX" index_name = "stripe-products" ``` -To use the created Vectorize index from your Worker, let's add the binding. Open `wrangler.toml` and add the copied lines. - -import { WranglerConfig } from "~/components"; +To use the created Vectorize index from your Worker, let's add the binding. Open the `wrangler.toml / wrangler.json` file and add the copied lines. @@ -208,9 +198,7 @@ index_name = "stripe-products" -Additionally, let's add the configuration to use Workers AI in `wrangler.toml`. - - +Additionally, let's add the configuration to use Workers AI in the `wrangler.toml / wrangler.json` file. diff --git a/src/content/docs/developer-spotlight/tutorials/custom-access-control-for-files.mdx b/src/content/docs/developer-spotlight/tutorials/custom-access-control-for-files.mdx index 1edce6b17cd6dc..040332d4b8b92e 100644 --- a/src/content/docs/developer-spotlight/tutorials/custom-access-control-for-files.mdx +++ b/src/content/docs/developer-spotlight/tutorials/custom-access-control-for-files.mdx @@ -17,7 +17,7 @@ spotlight: author_bio_source: GitHub --- -import { Render, PackageManagers } from "~/components"; +import { Render, PackageManagers, WranglerConfig } from "~/components"; This tutorial gives you an overview on how to create a TypeScript-based Cloudflare Worker which allows you to control file access based on a simple username and password authentication. To achieve this, we will use a [D1 database](/d1/) for user management and an [R2 bucket](/r2/) for file storage. @@ -70,9 +70,7 @@ Replace `` with the name you want to use for your database. After the database is successfully created, you will see the data for the binding displayed as an output. The binding declaration will start with `[[d1_databases]]` and contain the binding name, database name and ID. -To use the database in your worker, you will need to add the binding to your `wrangler.toml` file, by copying the declaration and pasting it into the wrangler file, as shown in the example below. - -import { WranglerConfig } from "~/components"; +To use the database in your worker, you will need to add the binding to your Wrangler file, by copying the declaration and pasting it into the wrangler file, as shown in the example below. @@ -96,7 +94,7 @@ npx wrangler r2 bucket create ``` This works similar to the D1 database creation, where you will need to replace `` with the name you want to use for your bucket. -To do this, go to the `wrangler.toml` file again and then add the following lines: +To do this, go to the Wrangler file again and then add the following lines: @@ -112,7 +110,7 @@ bucket_name = "" Now that you have prepared the Wrangler configuration, you should update the `worker-configuration.d.ts` file to include the new bindings. This file will then provide TypeScript with the correct type definitions for the bindings, which allows for type checking and code completion in your editor. -You could either update it manually or run the following command in the directory of your project to update it automatically based on the wrangler configuration file (recommended). +You could either update it manually or run the following command in the directory of your project to update it automatically based on the `wrangler.toml / wrangler.json` file (recommended). ```sh npm run cf-typegen diff --git a/src/content/docs/developer-spotlight/tutorials/fullstack-authentication-with-next-js-and-cloudflare-d1.mdx b/src/content/docs/developer-spotlight/tutorials/fullstack-authentication-with-next-js-and-cloudflare-d1.mdx new file mode 100644 index 00000000000000..228132595a5190 --- /dev/null +++ b/src/content/docs/developer-spotlight/tutorials/fullstack-authentication-with-next-js-and-cloudflare-d1.mdx @@ -0,0 +1,451 @@ +--- +updated: 2025-01-13 +difficulty: Intermediate +content_type: 📝 Tutorial +pcx_content_type: tutorial +title: Setup Fullstack Authentication with Next.js, Auth.js, and Cloudflare D1 +products: + - Workers + - D1 +languages: + - TypeScript +spotlight: + author: Mackenly Jones + author_bio_link: https://github.com/mackenly + author_bio_source: GitHub +--- + +import { + Render, + PackageManagers, + Type, + TypeScriptExample, + FileTree, +} from "~/components"; + +In this tutorial, you will build a [Next.js app](/workers/frameworks/framework-guides/nextjs/) with authentication powered by Auth.js, Resend, and [Cloudflare D1](/d1/). + +Before continuing, make sure you have a Cloudflare account and have installed and [authenticated Wrangler](https://developers.cloudflare.com/workers/wrangler/commands/#login). Some experience with HTML, CSS, and JavaScript/TypeScript is helpful but not required. In this tutorial, you will learn: + +- How to create a Next.js application and run it on Cloudflare Workers +- How to bind a Cloudflare D1 database to your Next.js app and use it to store authentication data +- How to use Auth.js to add serverless fullstack authentication to your Next.js app + +You can find the finished code for this project on [GitHub](https://github.com/mackenly/auth-js-d1-example). + +## Prerequisites + + + +3. Create or login to a [Resend account](https://resend.com/signup) and get an [API key](https://resend.com/docs/dashboard/api-keys/introduction#add-api-key). +4. [Install and authenticate Wrangler](/workers/wrangler/install-and-update/). + +## 1. Create a Next.js app using Workers + +From within the repository or directory where you want to create your project run: + + + + + +This will create a new Next.js project using [OpenNext](https://opennext.js.org/cloudflare) that will run in a Worker using [Workers Static Assets](/workers/frameworks/framework-guides/nextjs/#static-assets). + +Before we get started, open your project's `tsconfig.json` file and add the following to the `compilerOptions` object to allow for top level await needed to let our application get the Cloudflare context: + +```json title="tsconfig.json" +{ + "compilerOptions": { + "target": "ES2022", + } +} +``` + +Throughout this tutorial, we'll add several values to Cloudflare Secrets. For [local development](/workers/configuration/secrets/#local-development-with-secrets), add those same values to a file in the top level of your project called `.dev.vars` and make sure it is not committed into version control. This will let you work with Secret values locally. Go ahead and copy and paste the following into `.dev.vars` for now and replace the values as we go. + +```sh title=".dev.vars" +AUTH_SECRET = "" +AUTH_RESEND_KEY = "" +AUTH_EMAIL_FROM = "onboarding@resend.dev" +AUTH_URL = "http://localhost:8787/" +``` + +:::note[Manually set URL] +Within the Workers environment, the `AUTH_URL` doesn't always get picked up automatically by Auth.js, hence why we're specifying it manually here (we'll need to do the same for prod later). +::: + +## 2. Install Auth.js + +Following the [installation instructions](https://authjs.dev/getting-started/installation?framework=Next.js) from Auth.js, begin by installing Auth.js: + + + +Now run the following to generate an `AUTH_SECRET`: + +```sh +npx auth secret +``` + +Now, deviating from the standard Auth.js setup, locate your generated secret (likely in a file named `.env.local`) and [add the secret to your Workers application](/workers/configuration/secrets/#adding-secrets-to-your-project) by running the following and completing the steps to add a secret's value that we just generated: + +```sh +npx wrangler secret put AUTH_SECRET +``` + +After adding the secret, update your `.dev.vars` file to include an `AUTH_SECRET` value (this secret should be different from the one you generated earlier for security purposes): + +```sh title=".dev.vars" +# ... +AUTH_SECRET = "" +# ... +``` + +Next, go into the newly generated `env.d.ts` file and add the following to the interface: + +```ts title="env.d.ts" +interface CloudflareEnv { + AUTH_SECRET: string; +} +``` + +## 3. Install Cloudflare D1 Adapter + +Now, install the Auth.js D1 adapter by running: + + + +Create a D1 database using the following command: + +```sh title="Create D1 database" +npx wrangler d1 create auth-js-d1-example-db +``` + +When finished you should see instructions to add the database binding to your `wrangler.toml`. Example binding: + +```toml title="wrangler.toml" +[[d1_databases]] +binding = "DB" +database_name = "auth-js-d1-example-db" +database_id = "" +``` + +Now, within your `env.d.ts`, add your D1 binding, like: + +```ts title="env.d.ts" +interface CloudflareEnv { + DB: D1Database; + AUTH_SECRET: string; +} +``` + +## 4. Configure Credentials Provider + +Auth.js provides integrations for many different [credential providers](https://authjs.dev/getting-started/authentication) such as Google, GitHub, etc. For this tutorial we're going to use [Resend for magic links](https://authjs.dev/getting-started/authentication/email). You should have already created a Resend account and have an [API key](https://resend.com/docs/dashboard/api-keys/introduction#add-api-key). + +Using either a [Resend verified domain email address](https://resend.com/docs/dashboard/domains/introduction) or `onboarding@resend.dev`, add a new Secret to your Worker containing the email your magic links will come from: + +```sh title="Add Resend email to secrets" +npx wrangler secret put AUTH_EMAIL_FROM +``` + +Next, ensure the `AUTH_EMAIL_FROM` environment variable is updated in your `.dev.vars` file with the email you just added as a secret: + +```sh title=".dev.vars" +# ... +AUTH_EMAIL_FROM = "onboarding@resend.dev" +# ... +``` + +Now [create a Resend API key](https://resend.com/docs/dashboard/api-keys/introduction) with `Sending access` and add it to your Worker's Secrets: + +```sh title="Add Resend API key to secrets" +npx wrangler secret put AUTH_RESEND_KEY +``` + +As with previous secrets, update your `.dev.vars` file with the new secret value for `AUTH_RESEND_KEY` to use in local development: + +```sh title=".dev.vars" +# ... +AUTH_RESEND_KEY = "" +# ... +``` + +After adding both of those Secrets, your `env.d.ts` should now include the following: + +```ts title="env.d.ts" +interface CloudflareEnv { + DB: D1Database; + AUTH_SECRET: string; + AUTH_RESEND_KEY: string; + AUTH_EMAIL_FROM: string; +} +``` + +Credential providers and database adapters are provided to Auth.js through a configuration file called `auth.ts`. Create a file within your `src/app/` directory called `auth.ts` with the following contents: + + +```ts +import NextAuth from "next-auth"; +import { NextAuthResult } from "next-auth"; +import { D1Adapter } from "@auth/d1-adapter"; +import Resend from "next-auth/providers/resend"; +import { getCloudflareContext } from "@opennextjs/cloudflare"; + +const authResult = async (): Promise => { + return NextAuth({ + providers: [ + Resend({ + apiKey: (await getCloudflareContext()).env.AUTH_RESEND_KEY, + from: (await getCloudflareContext()).env.AUTH_EMAIL_FROM, + }), + ], + adapter: D1Adapter((await getCloudflareContext()).env.DB), + }); +}; + +export const { handlers, signIn, signOut, auth } = await authResult(); +``` + + +Now, lets add the route handler and middleware used to authenticate and persist sessions. + +Create a new directory structure and route handler within `src/app/api/auth/[...nextauth]` called `route.ts`. The file should contain: + + +```ts +import { handlers } from "../../../auth"; + +export const { GET, POST } = handlers; +``` + + +Now, within the `src/` directory, create a `middleware.ts` file to persist session data containing the following: + + +```ts +export { auth as middleware } from "./app/auth"; +``` + + +## 5. Create Database Tables + +The D1 adapter requires that tables be created within your database. It [recommends](https://authjs.dev/getting-started/adapters/d1#migrations) using the exported `up()` method to complete this. Within `src/app/api/` create a directory called `setup` containing a file called `route.ts`. Within this route handler, add the following code: + + +```ts +import type { NextRequest } from 'next/server'; +import { up } from "@auth/d1-adapter"; +import { getCloudflareContext } from "@opennextjs/cloudflare"; + +export async function GET(request: NextRequest) { + try { + await up((await getCloudflareContext()).env.DB) + } catch (e: any) { + console.log(e.cause.message, e.message) + } + return new Response('Migration completed'); +} + +``` + + +You'll need to run this once on your production database to create the necessary tables. If you're following along with this tutorial, we'll run it together in a few steps. + +:::note[Clean up] +Running this multiple times won't hurt anything since the tables are only created if they do not already exist, but it's a good idea to remove this route from your production code once you've run it since you won't need it anymore. +::: + +Before we go further, make sure you've created all of the necessary files: + +- src/ + - app/ + - api/ + - auth/ + - [...nextauth]/ + - route.ts + - setup/ + - route.ts + - auth.ts + - page.ts + - middleware.ts +- env.d.ts +- wrangler.toml + + +## 6. Build Sign-in Interface +We've completed the backend steps for our application. Now, we need a way to sign in. First, let's install [shadcn](https://ui.shadcn.com/): +```sh title="Install shadcn" +npx shadcn@latest init -d +``` + +Next, run the following to add a few components: +```sh title="Add components" +npx shadcn@latest add button input card avatar label +``` + +To make it easy, we've provided a basic sign-in interface for you below that you can copy into your app. You will likely want to customize this to fit your needs, but for now, this will let you sign in, see your account details, and update your user's name. + +Replace the contents of `page.ts` from within the `app/` directory with the following: + +```ts title="src/app/page.ts" +import { redirect } from 'next/navigation'; +import { signIn, signOut, auth } from './auth'; +import { updateRecord } from '@auth/d1-adapter'; +import { getCloudflareContext } from '@opennextjs/cloudflare'; +import { Button } from '@/components/ui/button'; +import { Input } from '@/components/ui/input'; +import { Card, CardContent, CardDescription, CardHeader, CardTitle, CardFooter } from '@/components/ui/card'; +import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; +import { Label } from '@/components/ui/label'; + +async function updateName(formData: FormData): Promise { + 'use server'; + const session = await auth(); + if (!session?.user?.id) { + return; + } + const name = formData.get('name') as string; + if (!name) { + return; + } + const query = `UPDATE users SET name = $1 WHERE id = $2`; + await updateRecord((await getCloudflareContext()).env.DB, query, [name, session.user.id]); + redirect('/'); +} + +export default async function Home() { + const session = await auth(); + return ( +
+ + + {session ? 'User Profile' : 'Login'} + + {session ? 'Manage your account' : 'Welcome to the auth-js-d1-example demo'} + + + + {session ? ( +
+
+ + + {session.user?.name?.[0] || 'U'} + +
+

{session.user?.name || 'No name set'}

+

{session.user?.email}

+
+
+
+

User ID: {session.user?.id}

+
+
+ + + +
+
+ ) : ( +
{ + 'use server'; + await signIn('resend', { email: formData.get('email') as string }); + }} + className="space-y-4" + > +
+ +
+ +
+ )} +
+ {session && ( + +
{ + 'use server'; + await signOut(); + Response.redirect('/'); + }} + > + +
+
+ )} +
+
+ ); +} +``` + +## 7. Preview and Deploy + +Now, it's time to preview our app. Run the following to preview your application: + + + +:::caution[Windows support] +OpenNext has [limited Windows support](https://opennext.js.org/cloudflare#windows-support) and recommends using WSL2 if developing on Windows. +::: + +You should see our login form. But wait, we're not done yet. Remember to create your database tables by visiting `/api/setup`. You should see `Migration completed`. This means your database is ready to go. + +Navigate back to your application's homepage. Enter your email and sign in (use the same email as your Resend account if you used the `onboarding@resend.dev` address). You should receive an email in your inbox (check spam). Follow the link to sign in. If everything is configured correctly, you should now see a basic user profile letting your update your name and sign out. + +Now let's deploy our application to production. From within the project's directory run: + + + +This will build and deploy your application as a Worker. Note that you may need to select which account you want to deploy your Worker to. After your app is deployed, Wrangler should give you the URL on which it was deployed. It might look something like this: `https://auth-js-d1-example.example.workers.dev`. Add your URL to your Worker using: + +```sh title="Add URL to secrets" +npx wrangler secret put AUTH_URL +``` + +After the changes are deployed, you should now be able to access and try out your new application. + +You have successfully created, configured, and deployed a fullstack Next.js application with authentication powered by Auth.js, Resend, and Cloudflare D1. + +## Related resources + +To build more with Workers, refer to [Tutorials](/workers/tutorials/). + +Find more information about the tools and services used in this tutorial at: + +- [Auth.js](https://authjs.dev/getting-started) +- [Resend](https://resend.com/) +- [Cloudflare D1](/d1/) + +If you have any questions, need assistance, or would like to share your project, join the Cloudflare Developer community on [Discord](https://discord.cloudflare.com) to connect with other developers and the Cloudflare team. diff --git a/src/content/docs/dns/additional-options/dns-zone-defaults.mdx b/src/content/docs/dns/additional-options/dns-zone-defaults.mdx index ab41eb6128202a..ac1ba3ed3c228a 100644 --- a/src/content/docs/dns/additional-options/dns-zone-defaults.mdx +++ b/src/content/docs/dns/additional-options/dns-zone-defaults.mdx @@ -1,12 +1,11 @@ --- pcx_content_type: how-to -title: Zone defaults +title: Configure DNS zone defaults sidebar: order: 3 + label: Zone defaults --- -# Configure DNS zone defaults - While there are default values for DNS settings that Cloudflare applies to all new zones, Enterprise accounts have the option to configure their own DNS zone defaults according to their preference. :::caution @@ -16,7 +15,7 @@ DNS zone defaults are only applied at the moment a new zone is created and will ## Steps 1. Log in to the [Cloudflare dashboard](https://dash.cloudflare.com/login) and select your account. -2. Go to **Manage Account** > **Configurations** > **DNS Settings**. +2. Go to **Manage Account** > **Configurations** > **DNS Settings**. If these options are not displayed on your Cloudflare dashboard, you may need to reach out to your account team to have them added. 3. For **DNS zone defaults**, select **Configure defaults**. The values you select for the listed settings will be automatically applied to new zones as you add them to your Cloudflare account. @@ -35,4 +34,4 @@ For secondary zones: - [Secondary DNS override](/dns/zone-setups/zone-transfers/cloudflare-as-secondary/proxy-traffic/): Enable the options to use Cloudflare [proxy](/dns/manage-dns-records/reference/proxied-dns-records/) and add `CNAME` records at your zone apex. - Multi-provider DNS does not apply as a setting for secondary zones, as this is already a required behavior for this setup. `SOA` record and the `NS` record TTL are defined on your external DNS provider and only transferred into Cloudflare. \ No newline at end of file + Multi-provider DNS does not apply as a setting for secondary zones, as this is already a required behavior for this setup. `SOA` record and the `NS` record TTL are defined on your external DNS provider and only transferred into Cloudflare. diff --git a/src/content/docs/durable-objects/api/namespace.mdx b/src/content/docs/durable-objects/api/namespace.mdx index 62462968882252..bafef513d287c3 100644 --- a/src/content/docs/durable-objects/api/namespace.mdx +++ b/src/content/docs/durable-objects/api/namespace.mdx @@ -11,7 +11,7 @@ import { Render, Tabs, TabItem, GlossaryTooltip } from "~/components"; A Durable Object namespace is a set of Durable Objects that are backed by the same Durable Object class. There is only one Durable Object namespace per class. A Durable Object namespace can contain any number of Durable Objects. -The `DurableObjectNamespace` interface is used to obtain a reference to new or existing Durable Objects. The interface is accessible from the fetch handler on a Cloudflare Worker via the `env` parameter, which is the standard interface when referencing bindings declared in `wrangler.toml`. +The `DurableObjectNamespace` interface is used to obtain a reference to new or existing Durable Objects. The interface is accessible from the fetch handler on a Cloudflare Worker via the `env` parameter, which is the standard interface when referencing bindings declared in the `wrangler.toml / wrangler.json` file. This interface defines several [methods](/durable-objects/api/namespace/#methods) that can be used to create an ID for a Durable Object. Note that creating an ID for a Durable Object does not create the Durable Object. The Durable Object is created lazily after calling [`DurableObjectNamespace::get`](/durable-objects/api/namespace/#get) to create a [`DurableObjectStub`](/durable-objects/api/stub) from a `DurableObjectId`. This ensures that objects are not constructed until they are actually accessed. diff --git a/src/content/docs/durable-objects/api/webgpu.mdx b/src/content/docs/durable-objects/api/webgpu.mdx index eea471fb178acb..505513cddb5d39 100644 --- a/src/content/docs/durable-objects/api/webgpu.mdx +++ b/src/content/docs/durable-objects/api/webgpu.mdx @@ -15,7 +15,7 @@ The [WebGPU API](https://developer.mozilla.org/en-US/docs/Web/API/WebGPU_API) al The WebGPU API is only accessible from within [Durable Objects](/durable-objects/). You cannot use the WebGPU API from within Workers. -To use the WebGPU API in local development, enable the `experimental` and `webgpu` [compatibility flags](/workers/configuration/compatibility-flags/) in the [`wrangler.toml` configuration file](/workers/wrangler/configuration/) of your Durable Object. +To use the WebGPU API in local development, enable the `experimental` and `webgpu` [compatibility flags](/workers/configuration/compatibility-flags/) in the [`wrangler.toml / wrangler.json` file](/workers/wrangler/configuration/) of your Durable Object. ``` compatibility_flags = ["experimental", "webgpu"] diff --git a/src/content/docs/durable-objects/best-practices/access-durable-objects-storage.mdx b/src/content/docs/durable-objects/best-practices/access-durable-objects-storage.mdx index b93175cbb23eff..e291ac0d8e2dda 100644 --- a/src/content/docs/durable-objects/best-practices/access-durable-objects-storage.mdx +++ b/src/content/docs/durable-objects/best-practices/access-durable-objects-storage.mdx @@ -6,7 +6,7 @@ sidebar: --- -import { Render, GlossaryTooltip } from "~/components"; +import { Render, GlossaryTooltip, WranglerConfig } from "~/components"; Durable Objects are a powerful compute API that provides a compute with storage building block. Each Durable Object has its own private, transactional and strongly consistent storage. Durable Objects Storage API provides access to a Durable Object's attached storage. @@ -56,9 +56,7 @@ The new beta version of Durable Objects is available where each Durable Object h ::: -To allow a new Durable Object class to use SQLite storage backend, use `new_sqlite_classes` on the migration in your Worker's `wrangler.toml` file: - -import { WranglerConfig } from "~/components"; +To allow a new Durable Object class to use SQLite storage backend, use `new_sqlite_classes` on the migration in your Worker's Wrangler file: diff --git a/src/content/docs/durable-objects/best-practices/websockets.mdx b/src/content/docs/durable-objects/best-practices/websockets.mdx index 23c4f900bd6b00..7d84e282125789 100644 --- a/src/content/docs/durable-objects/best-practices/websockets.mdx +++ b/src/content/docs/durable-objects/best-practices/websockets.mdx @@ -217,7 +217,7 @@ export class WebSocketServer extends DurableObject {
-To execute this code, configure your `wrangler.toml` file to include a Durable Object [binding](/durable-objects/get-started/walkthrough/#5-configure-durable-object-bindings) and [migration](/durable-objects/reference/durable-objects-migrations/) based on the namespace and class name chosen previously. +To execute this code, configure your Wrangler file to include a Durable Object [binding](/durable-objects/get-started/tutorial/#5-configure-durable-object-bindings) and [migration](/durable-objects/reference/durable-objects-migrations/) based on the namespace and class name chosen previously. ```toml title="wrangler.toml" name = "websocket-server" @@ -355,7 +355,7 @@ export class WebSocketHibernationServer extends DurableObject { -Similar to the WebSocket Standard API example, to execute this code, configure your `wrangler.toml` file to include a Durable Object [binding](/durable-objects/get-started/walkthrough/#5-configure-durable-object-bindings) and [migration](/durable-objects/reference/durable-objects-migrations/) based on the namespace and class name chosen previously. +Similar to the WebSocket Standard API example, to execute this code, configure your Wrangler file to include a Durable Object [binding](/durable-objects/get-started/tutorial/#5-configure-durable-object-bindings) and [migration](/durable-objects/reference/durable-objects-migrations/) based on the namespace and class name chosen previously. ```toml title="wrangler.toml" name = "websocket-hibernation-server" diff --git a/src/content/docs/durable-objects/examples/agents.mdx b/src/content/docs/durable-objects/examples/agents.mdx new file mode 100644 index 00000000000000..2ba4fdef824cfc --- /dev/null +++ b/src/content/docs/durable-objects/examples/agents.mdx @@ -0,0 +1,9 @@ +--- +pcx_content_type: navigation +title: Agents +external_link: /agents/ +sidebar: + order: 10 +head: [] +description: Build AI-powered Agents on Cloudflare +--- \ No newline at end of file diff --git a/src/content/docs/durable-objects/examples/alarms-api.mdx b/src/content/docs/durable-objects/examples/alarms-api.mdx index 55d86de038fa92..d813dfe402eb92 100644 --- a/src/content/docs/durable-objects/examples/alarms-api.mdx +++ b/src/content/docs/durable-objects/examples/alarms-api.mdx @@ -13,7 +13,7 @@ description: Use the Durable Objects Alarms API to batch requests to a Durable O --- -import { GlossaryTooltip } from "~/components"; +import { GlossaryTooltip, WranglerConfig } from "~/components"; This example implements an `alarm()` handler that wakes the Durable Object once every 10 seconds to batch requests to a single Durable Object. The `alarm()` handler will delay processing until there is enough work in the queue. @@ -74,9 +74,7 @@ export class Batcher extends DurableObject { The `alarm()` handler will be called once every 10 seconds. If an unexpected error terminates the Durable Object, the `alarm()` handler will be re-instantiated on another machine. Following a short delay, the `alarm()` handler will run from the beginning on the other machine. -Finally, configure your `wrangler.toml` file to include a Durable Object [binding](/durable-objects/get-started/walkthrough/#5-configure-durable-object-bindings) and [migration](/durable-objects/reference/durable-objects-migrations/) based on the namespace and class name chosen previously. - -import { WranglerConfig } from "~/components"; +Finally, configure your Wrangler file to include a Durable Object [binding](/durable-objects/get-started/tutorial/#5-configure-durable-object-bindings) and [migration](/durable-objects/reference/durable-objects-migrations/) based on the namespace and class name chosen previously. diff --git a/src/content/docs/durable-objects/examples/build-a-counter.mdx b/src/content/docs/durable-objects/examples/build-a-counter.mdx index 220c43fd73e082..f8be0b9c308651 100644 --- a/src/content/docs/durable-objects/examples/build-a-counter.mdx +++ b/src/content/docs/durable-objects/examples/build-a-counter.mdx @@ -11,7 +11,7 @@ description: Build a counter using Durable Objects and Workers with RPC methods. --- -import { TabItem, Tabs } from "~/components" +import { TabItem, Tabs, WranglerConfig } from "~/components" This example shows how to build a counter using Durable Objects and Workers with [RPC methods](/workers/runtime-apis/rpc) that can print, increment, and decrement a `name` provided by the URL query string parameter, for example, `?name=A`. @@ -170,9 +170,7 @@ export class Counter extends DurableObject { -Finally, configure your `wrangler.toml` file to include a Durable Object [binding](/durable-objects/get-started/walkthrough/#5-configure-durable-object-bindings) and [migration](/durable-objects/reference/durable-objects-migrations/) based on the namespace and class name chosen previously. - -import { WranglerConfig } from "~/components"; +Finally, configure your Wrangler file to include a Durable Object [binding](/durable-objects/get-started/tutorial/#5-configure-durable-object-bindings) and [migration](/durable-objects/reference/durable-objects-migrations/) based on the namespace and class name chosen previously. diff --git a/src/content/docs/durable-objects/examples/build-a-rate-limiter.mdx b/src/content/docs/durable-objects/examples/build-a-rate-limiter.mdx index c18155010e889c..3cd21b778894ec 100644 --- a/src/content/docs/durable-objects/examples/build-a-rate-limiter.mdx +++ b/src/content/docs/durable-objects/examples/build-a-rate-limiter.mdx @@ -11,7 +11,7 @@ description: Build a rate limiter using Durable Objects and Workers. --- -import { TabItem, Tabs, GlossaryTooltip } from "~/components" +import { TabItem, Tabs, GlossaryTooltip, WranglerConfig } from "~/components" This example shows how to build a rate limiter using Durable Objects and Workers that can be used to protect upstream resources, including third-party APIs that your application relies on and/or services that may be costly for you to invoke. @@ -264,9 +264,7 @@ export class RateLimiter extends DurableObject { -Finally, configure your `wrangler.toml` file to include a Durable Object [binding](/durable-objects/get-started/walkthrough/#5-configure-durable-object-bindings) and [migration](/durable-objects/reference/durable-objects-migrations/) based on the namespace and class name chosen previously. - -import { WranglerConfig } from "~/components"; +Finally, configure your Wrangler file to include a Durable Object [binding](/durable-objects/get-started/tutorial/#5-configure-durable-object-bindings) and [migration](/durable-objects/reference/durable-objects-migrations/) based on the namespace and class name chosen previously. diff --git a/src/content/docs/durable-objects/examples/durable-object-in-memory-state.mdx b/src/content/docs/durable-objects/examples/durable-object-in-memory-state.mdx index ec4c4f0e202cb1..0f6230e6bec26a 100644 --- a/src/content/docs/durable-objects/examples/durable-object-in-memory-state.mdx +++ b/src/content/docs/durable-objects/examples/durable-object-in-memory-state.mdx @@ -13,6 +13,8 @@ description: Create a Durable Object that stores the last location it was --- +import { WranglerConfig } from "~/components"; + This example shows you how Durable Objects are stateful, meaning in-memory state can be retained between requests. After a brief period of inactivity, the Durable Object will be evicted, and all in-memory state will be lost. The next request will reconstruct the object, but instead of showing the city of the previous request, it will display a message indicating that the object has been reinitialized. If you need your applications state to survive eviction, write the state to storage by using the [Storage API](/durable-objects/api/storage-api/), or by storing your data elsewhere. ```js @@ -68,9 +70,7 @@ New Location: ${request.cf.city}`); } ``` -Finally, configure your `wrangler.toml` file to include a Durable Object [binding](/durable-objects/get-started/walkthrough/#5-configure-durable-object-bindings) and [migration](/durable-objects/reference/durable-objects-migrations/) based on the namespace and class name chosen previously. - -import { WranglerConfig } from "~/components"; +Finally, configure your Wrangler file to include a Durable Object [binding](/durable-objects/get-started/tutorial/#5-configure-durable-object-bindings) and [migration](/durable-objects/reference/durable-objects-migrations/) based on the namespace and class name chosen previously. diff --git a/src/content/docs/durable-objects/examples/durable-object-ttl.mdx b/src/content/docs/durable-objects/examples/durable-object-ttl.mdx index e01f04819fc885..8495b826fc1a92 100644 --- a/src/content/docs/durable-objects/examples/durable-object-ttl.mdx +++ b/src/content/docs/durable-objects/examples/durable-object-ttl.mdx @@ -12,7 +12,7 @@ sidebar: description: Use the Durable Objects Alarms API to implement a Time To Live (TTL) for Durable Object instances. --- -import { TabItem, Tabs, GlossaryTooltip } from "~/components"; +import { TabItem, Tabs, GlossaryTooltip, WranglerConfig } from "~/components"; A common feature request for Durable Objects is a Time To Live (TTL) for Durable Object instances. Durable Objects give developers the tools to implement a custom TTL in only a few lines of code. This example demonstrates how to implement a TTL making use of `alarms`. While this TTL will be extended upon every new request to the Durable Object, this can be customized based on a particular use case. @@ -100,9 +100,7 @@ export default { -To test and deploy this example, configure your `wrangler.toml` file to include a Durable Object [binding](/durable-objects/get-started/walkthrough/#5-configure-durable-object-bindings) and [migration](/durable-objects/reference/durable-objects-migrations/) based on the namespace and class name chosen previously. - -import { WranglerConfig } from "~/components"; +To test and deploy this example, configure your Wrangler file to include a Durable Object [binding](/durable-objects/get-started/tutorial/#5-configure-durable-object-bindings) and [migration](/durable-objects/reference/durable-objects-migrations/) based on the namespace and class name chosen previously. diff --git a/src/content/docs/durable-objects/examples/use-kv-from-durable-objects.mdx b/src/content/docs/durable-objects/examples/use-kv-from-durable-objects.mdx index 742b8e024122f8..4ed2f79340b3ea 100644 --- a/src/content/docs/durable-objects/examples/use-kv-from-durable-objects.mdx +++ b/src/content/docs/durable-objects/examples/use-kv-from-durable-objects.mdx @@ -11,19 +11,17 @@ description: Read and write to/from KV within a Durable Object --- -import { GlossaryTooltip } from "~/components"; +import { GlossaryTooltip, WranglerConfig } from "~/components"; The following Worker script shows you how to configure a Durable Object to read from and/or write to a [Workers KV namespace](/kv/concepts/how-kv-works/). This is useful when using a Durable Object to coordinate between multiple clients, and allows you to serialize writes to KV and/or broadcast a single read from KV to hundreds or thousands of clients connected to a single Durable Object [using WebSockets](/durable-objects/best-practices/websockets/). Prerequisites: * A [KV namespace](/kv/api/) created via the Cloudflare dashboard or the [wrangler CLI](/workers/wrangler/install-and-update/). -* A [configured binding](/kv/concepts/kv-bindings/) for the `kv_namespace` in the Cloudflare dashboard or `wrangler.toml` file. +* A [configured binding](/kv/concepts/kv-bindings/) for the `kv_namespace` in the Cloudflare dashboard or Wrangler file. * A [Durable Object namespace binding](/workers/wrangler/configuration/#durable-objects). -Configure your `wrangler.toml` file as follows: - -import { WranglerConfig } from "~/components"; +Configure your Wrangler file as follows: diff --git a/src/content/docs/durable-objects/examples/websocket-hibernation-server.mdx b/src/content/docs/durable-objects/examples/websocket-hibernation-server.mdx index 40699a52402af0..927ce9c5d46c62 100644 --- a/src/content/docs/durable-objects/examples/websocket-hibernation-server.mdx +++ b/src/content/docs/durable-objects/examples/websocket-hibernation-server.mdx @@ -13,7 +13,7 @@ description: Build a WebSocket server using WebSocket Hibernation on Durable --- -import { TabItem, Tabs } from "~/components" +import { TabItem, Tabs, WranglerConfig } from "~/components" This example is similar to the [Build a WebSocket server](/durable-objects/examples/websocket-server/) example, but uses the WebSocket Hibernation API. The WebSocket Hibernation API should be preferred for WebSocket server applications built on Durable Objects, since it significantly decreases duration charge, and provides additional features that pair well with WebSocket applications. For more information, refer to [Use Durable Objects with WebSockets](/durable-objects/best-practices/websockets/). @@ -177,9 +177,7 @@ export class WebSocketHibernationServer extends DurableObject { -Finally, configure your `wrangler.toml` file to include a Durable Object [binding](/durable-objects/get-started/walkthrough/#5-configure-durable-object-bindings) and [migration](/durable-objects/reference/durable-objects-migrations/) based on the namespace and class name chosen previously. - -import { WranglerConfig } from "~/components"; +Finally, configure your Wrangler file to include a Durable Object [binding](/durable-objects/get-started/tutorial/#5-configure-durable-object-bindings) and [migration](/durable-objects/reference/durable-objects-migrations/) based on the namespace and class name chosen previously. diff --git a/src/content/docs/durable-objects/examples/websocket-server.mdx b/src/content/docs/durable-objects/examples/websocket-server.mdx index ded0ede2bdb865..80047bbe15e170 100644 --- a/src/content/docs/durable-objects/examples/websocket-server.mdx +++ b/src/content/docs/durable-objects/examples/websocket-server.mdx @@ -11,7 +11,7 @@ description: Build a WebSocket server using Durable Objects and Workers. --- -import { TabItem, Tabs, GlossaryTooltip } from "~/components" +import { TabItem, Tabs, GlossaryTooltip, WranglerConfig } from "~/components" This example shows how to build a WebSocket server using Durable Objects and Workers. The example exposes an endpoint to create a new WebSocket connection. This WebSocket connection echos any message while including the total number of WebSocket connections currently established. For more information, refer to [Use Durable Objects with WebSockets](/durable-objects/best-practices/websockets/). @@ -187,9 +187,7 @@ export class WebSocketServer extends DurableObject { -Finally, configure your `wrangler.toml` file to include a Durable Object [binding](/durable-objects/get-started/walkthrough/#5-configure-durable-object-bindings) and [migration](/durable-objects/reference/durable-objects-migrations/) based on the namespace and class name chosen previously. - -import { WranglerConfig } from "~/components"; +Finally, configure your Wrangler file to include a Durable Object [binding](/durable-objects/get-started/tutorial/#5-configure-durable-object-bindings) and [migration](/durable-objects/reference/durable-objects-migrations/) based on the namespace and class name chosen previously. diff --git a/src/content/docs/durable-objects/get-started/tutorial-with-sql-api.mdx b/src/content/docs/durable-objects/get-started/tutorial-with-sql-api.mdx index 03c2985921c92c..1527e77108a4ee 100644 --- a/src/content/docs/durable-objects/get-started/tutorial-with-sql-api.mdx +++ b/src/content/docs/durable-objects/get-started/tutorial-with-sql-api.mdx @@ -5,7 +5,7 @@ sidebar: order: 2 --- -import { Render, TabItem, Tabs, PackageManagers } from "~/components"; +import { Render, TabItem, Tabs, PackageManagers, WranglerConfig } from "~/components"; This guide will instruct you through: @@ -56,7 +56,7 @@ Running `create cloudflare@latest` will install [Wrangler](/workers/wrangler/ins }} /> -This will create a new directory, which will include either a `src/index.js` or `src/index.ts` file to write your code and a [`wrangler.toml`](/workers/wrangler/configuration/) configuration file. +This will create a new directory, which will include either a `src/index.js` or `src/index.ts` file to write your code and a [`wrangler.json`](/workers/wrangler/configuration/) configuration file. Move into your new directory: @@ -201,9 +201,7 @@ Refer to [Access a Durable Object from a Worker](/durable-objects/best-practices ## 5. Configure Durable Object bindings -[Bindings](/workers/runtime-apis/bindings/) allow your Workers to interact with resources on the Cloudflare developer platform. The Durable Object bindings in your Worker project's `wrangler.toml` will include a binding name (for this guide, use `MY_DURABLE_OBJECT`) and the class name (`MyDurableObject`). - -import { WranglerConfig } from "~/components"; +[Bindings](/workers/runtime-apis/bindings/) allow your Workers to interact with resources on the Cloudflare developer platform. The Durable Object bindings in your Worker project's `wrangler.toml / wrangler.json` file will include a binding name (for this guide, use `MY_DURABLE_OBJECT`) and the class name (`MyDurableObject`). @@ -225,9 +223,9 @@ The `[[durable_objects.bindings]]` section contains the following fields: A migration is a mapping process from a class name to a runtime state. You perform a migration when creating a new Durable Object class, or when renaming, deleting or transferring an existing Durable Object class. -Migrations are performed through the `[[migrations]]` configurations key in your `wrangler.toml` file. +Migrations are performed through the `[[migrations]]` configurations key in your Wrangler file. -The Durable Object migration to create a new Durable Object class with SQLite storage backend will look like the following in your Worker's `wrangler.toml` file: +The Durable Object migration to create a new Durable Object class with SQLite storage backend will look like the following in your Worker's Wrangler file: diff --git a/src/content/docs/durable-objects/get-started/walkthrough.mdx b/src/content/docs/durable-objects/get-started/tutorial.mdx similarity index 93% rename from src/content/docs/durable-objects/get-started/walkthrough.mdx rename to src/content/docs/durable-objects/get-started/tutorial.mdx index 25eb0723df1ac2..a8221ba79ffd3f 100644 --- a/src/content/docs/durable-objects/get-started/walkthrough.mdx +++ b/src/content/docs/durable-objects/get-started/tutorial.mdx @@ -1,11 +1,11 @@ --- -title: Walkthrough +title: Tutorial pcx_content_type: get-started sidebar: order: 1 --- -import { Render, TabItem, Tabs, PackageManagers } from "~/components"; +import { Render, TabItem, Tabs, PackageManagers, WranglerConfig } from "~/components"; This guide will instruct you through: @@ -49,7 +49,7 @@ Running `create cloudflare@latest` will install [Wrangler](/workers/wrangler/ins }} /> -This will create a new directory, which will include either a `src/index.js` or `src/index.ts` file to write your code and a [`wrangler.toml`](/workers/wrangler/configuration/) configuration file. +This will create a new directory, which will include either a `src/index.js` or `src/index.ts` file to write your code and a [`wrangler.json`](/workers/wrangler/configuration/) configuration file. Move into your new directory: @@ -174,9 +174,7 @@ export default { ## 5. Configure Durable Object bindings -To allow a Worker to invoke methods on a Durable Object, the Worker must have a [Durable Object binding](/workers/runtime-apis/bindings/) in the project's [`wrangler.toml`](/workers/wrangler/configuration/#durable-objects) file. The binding is configured to use a particular Durable Object class. - -import { WranglerConfig } from "~/components"; +To allow a Worker to invoke methods on a Durable Object, the Worker must have a [Durable Object binding](/workers/runtime-apis/bindings/) in the project's [`wrangler.toml / wrangler.json` file](/workers/wrangler/configuration/#durable-objects). The binding is configured to use a particular Durable Object class. @@ -201,9 +199,9 @@ Refer to [Wrangler Configuration](/workers/wrangler/configuration/#durable-objec A migration is a mapping process from a class name to a runtime state. You perform a migration when creating a new Durable Object class, or when renaming, deleting or transferring an existing Durable Object class. -Migrations are performed through the `[[migrations]]` configurations key in your `wrangler.toml` file. +Migrations are performed through the `[[migrations]]` configurations key in your Wrangler file. -The Durable Object migration to create a new Durable Object class will look like the following in your Worker's `wrangler.toml` file: +The Durable Object migration to create a new Durable Object class will look like the following in your Worker's Wrangler file: @@ -227,7 +225,7 @@ New beta version of Durable Objects is available where each Durable Object has a A Durable Object class can only have a single storage type, which cannot be changed after the Durable Object class is created. -To configure SQL storage and API, replace `new_classes` with `new_sqlite_classes` in your Worker's `wrangler.toml` file: +To configure SQL storage and API, replace `new_classes` with `new_sqlite_classes` in your Worker's Wrangler file: diff --git a/src/content/docs/durable-objects/index.mdx b/src/content/docs/durable-objects/index.mdx index 6dc38a695bd902..31e68050326598 100644 --- a/src/content/docs/durable-objects/index.mdx +++ b/src/content/docs/durable-objects/index.mdx @@ -32,7 +32,7 @@ A Durable Object is a special kind of [Worker](/workers/). Like a Worker, it is Thus, Durable Objects enable **stateful** serverless applications. -Get started +Get started :::note[SQLite in Durable Objects Beta] diff --git a/src/content/docs/durable-objects/observability/troubleshooting.mdx b/src/content/docs/durable-objects/observability/troubleshooting.mdx index 78a126ce25b8d7..d10e6f180dd7d5 100644 --- a/src/content/docs/durable-objects/observability/troubleshooting.mdx +++ b/src/content/docs/durable-objects/observability/troubleshooting.mdx @@ -17,11 +17,11 @@ The `wrangler dev` command opens a tunnel from your local development environmen ### No event handlers were registered. This script does nothing. -In your `wrangler.toml` file, make sure the `dir` and `main` entries point to the correct file containing your Worker code, and that the file extension is `.mjs` instead of `.js` if using ES modules syntax. +In your Wrangler file, make sure the `dir` and `main` entries point to the correct file containing your Worker code, and that the file extension is `.mjs` instead of `.js` if using ES modules syntax. ### Cannot apply `--delete-class` migration to class. -When deleting a migration using `npx wrangler deploy --delete-class `, you may encounter this error: `"Cannot apply --delete-class migration to class without also removing the binding that references it"`. You should remove the corresponding binding under `[durable_objects]` in `wrangler.toml` before attempting to apply `--delete-class` again. +When deleting a migration using `npx wrangler deploy --delete-class `, you may encounter this error: `"Cannot apply --delete-class migration to class without also removing the binding that references it"`. You should remove the corresponding binding under `[durable_objects]` in the `wrangler.toml / wrangler.json` file before attempting to apply `--delete-class` again. ### Durable Object is overloaded. diff --git a/src/content/docs/durable-objects/reference/durable-objects-migrations.mdx b/src/content/docs/durable-objects/reference/durable-objects-migrations.mdx index 50909cb778c961..e11c4e28abb269 100644 --- a/src/content/docs/durable-objects/reference/durable-objects-migrations.mdx +++ b/src/content/docs/durable-objects/reference/durable-objects-migrations.mdx @@ -6,7 +6,7 @@ sidebar: --- -import { GlossaryTooltip } from "~/components"; +import { GlossaryTooltip, WranglerConfig } from "~/components"; A migration is a mapping process from a class name to a runtime state. @@ -41,7 +41,7 @@ The destination class (the class that stored Durable Objects are being transferr After a rename or transfer migration, requests to the destination Durable Object class will have access to the source Durable Object's stored data. -After a migration, any existing bindings to the original Durable Object class (for example, from other Workers) will automatically forward to the updated destination class. However, any Workers bound to the updated Durable Object class must update their Durable Object binding configuration in the `wrangler.toml` file for their next deployment. +After a migration, any existing bindings to the original Durable Object class (for example, from other Workers) will automatically forward to the updated destination class. However, any Workers bound to the updated Durable Object class must update their Durable Object binding configuration in the Wrangler file for their next deployment. ::: @@ -56,22 +56,20 @@ Running a delete migration will delete all Durable Objects associated with the d ::: -### Durable Object migrations in `wrangler.toml` +### Durable Object migrations in the Wrangler configuration file -Migrations are performed through the `[[migrations]]` configurations key in your `wrangler.toml` file. +Migrations are performed through the `[[migrations]]` configurations key in your Wrangler file. Migrations require a migration tag, which is defined by the `tag` property in each migration entry. Migration tags are treated like unique names and are used to determine which migrations have already been applied. Once a given Worker code has a migration tag set on it, all future Worker code deployments must include a migration tag. -The migration list is an ordered array of tables, specified as a top-level key in your `wrangler.toml` file. The migration list is inherited by all environments and cannot be overridden by a specific environment. +The migration list is an ordered array of tables, specified as a top-level key in your Wrangler file. The migration list is inherited by all environments and cannot be overridden by a specific environment. All migrations are applied at deployment. Each migration can only be applied once per [environment](/durable-objects/reference/environments/). To illustrate an example migrations workflow, the `DurableObjectExample` class can be initially defined with: -import { WranglerConfig } from "~/components"; - ```toml @@ -117,7 +115,7 @@ The new beta version of Durable Objects is available where each Durable Object h ::: -To allow a new Durable Object class to use a SQLite storage backend, use `new_sqlite_classes` on the migration in your Worker's `wrangler.toml` file: +To allow a new Durable Object class to use a SQLite storage backend, use `new_sqlite_classes` on the migration in your Worker's Wrangler file: diff --git a/src/content/docs/durable-objects/reference/environments.mdx b/src/content/docs/durable-objects/reference/environments.mdx index efbbefee13f4b6..95e05c25c346a3 100644 --- a/src/content/docs/durable-objects/reference/environments.mdx +++ b/src/content/docs/durable-objects/reference/environments.mdx @@ -6,14 +6,14 @@ sidebar: --- +import { WranglerConfig } from "~/components"; + [Wrangler](/workers/wrangler/install-and-update/) allows you to deploy the same Worker application with different configuration for each [environment](/workers/wrangler/environments/). If you are using Wrangler environments, you must specify any [Durable Object bindings](/workers/runtime-apis/bindings/) you wish to use on a per-environment basis. Durable Object bindings are not inherited. For example, you can define an environment named `staging` as below: -import { WranglerConfig } from "~/components"; - ```toml diff --git a/src/content/docs/durable-objects/tutorials/build-a-seat-booking-app/index.mdx b/src/content/docs/durable-objects/tutorials/build-a-seat-booking-app/index.mdx index 6e8cccb0c72d8c..bded7ea0797ab0 100644 --- a/src/content/docs/durable-objects/tutorials/build-a-seat-booking-app/index.mdx +++ b/src/content/docs/durable-objects/tutorials/build-a-seat-booking-app/index.mdx @@ -11,7 +11,7 @@ languages: - SQL --- -import { Render, PackageManagers, Details } from "~/components"; +import { Render, PackageManagers, Details, WranglerConfig } from "~/components"; In this tutorial, you will learn how to build a seat reservation app using Durable Objects. This app will allow users to book a seat for a flight. The app will be written in TypeScript and will use the new [SQLite storage backend in Durable Object](/durable-objects/best-practices/access-durable-objects-storage/#sqlite-storage-backend) to store the data. @@ -256,13 +256,11 @@ The frontend of the application is a simple HTML page that allows users to selec - It also uses a WebSocket connection to receive updates about the available seats. - When a user clicks on a seat, the `bookSeat()` function is called that prompts the user to enter their name and then makes a `POST` request to the `/book-seat` endpoint. -4. Update the bindings in `wrangler.toml` to configure `assets` to serve the `public` directory. - -import { WranglerConfig } from "~/components"; +4. Update the bindings in the `wrangler.toml / wrangler.json` file to configure `assets` to serve the `public` directory. -```toml title="wrangler.toml" +```toml [assets] directory = "public" ``` @@ -283,15 +281,13 @@ npm run dev ## 3. Create table for each flight -The application already has the binding for the Durable Objects class configured in `wrangler.toml`. If you update the name of the Durable Objects class in `src/index.ts`, make sure to also update the binding in `wrangler.toml`. - -1. Update the binding to use the SQLite storage in Durable Objects. In `wrangler.toml`, replace `new_classes=["Flight"]` with `new_sqlite_classes=["Flight"]`, `name = "FLIGHT"` with `name = "FLIGHT"`, and `class_name = "MyDurableObject"` with `class_name = "Flight"`. Your `wrangler.toml` should look like this: - +The application already has the binding for the Durable Objects class configured in the `wrangler.toml / wrangler.json` file. If you update the name of the Durable Objects class in `src/index.ts`, make sure to also update the binding in the `wrangler.toml / wrangler.json` file. +1. Update the binding to use the SQLite storage in Durable Objects. In the `wrangler.toml / wrangler.json` file, replace `new_classes=["Flight"]` with `new_sqlite_classes=["Flight"]`, `name = "FLIGHT"` with `name = "FLIGHT"`, and `class_name = "MyDurableObject"` with `class_name = "Flight"`. your `wrangler.toml / wrangler.json` file should look like this: -```toml {9} title="wrangler.toml" +```toml {9} [[durable_objects.bindings]] name = "FLIGHT" class_name = "Flight" diff --git a/src/content/docs/email-routing/email-workers/send-email-workers.mdx b/src/content/docs/email-routing/email-workers/send-email-workers.mdx index df307bbf3ae848..76791896858b53 100644 --- a/src/content/docs/email-routing/email-workers/send-email-workers.mdx +++ b/src/content/docs/email-routing/email-workers/send-email-workers.mdx @@ -6,12 +6,10 @@ sidebar: --- -import { Render } from "~/components" +import { Render, WranglerConfig } from "~/components" -import { WranglerConfig } from "~/components"; - ```toml diff --git a/src/content/docs/email-security/reporting/search/available-parameters.mdx b/src/content/docs/email-security/reporting/search/available-parameters.mdx index e498706cf3bfa2..ca6f6b939009f6 100644 --- a/src/content/docs/email-security/reporting/search/available-parameters.mdx +++ b/src/content/docs/email-security/reporting/search/available-parameters.mdx @@ -49,3 +49,9 @@ For disposition-specific s For Email Security Horizon Enterprise customers, detections search would index for a period of 12 months and rotate over to a rolling 12-month period. For Email Security Horizon Advantage customers, detections search would index for three months and rotate over to a rolling 3-month period. + +## Scope of data retained + +For messages that are not detected, the body of the message itself is not retained. Only the metadata such as sender, recipient, subject, message_id, and delivery log will be retained. It is also possible to view the messages as the preview image. + +For detections, full messages are retained, including attachments, in addition to the metadata described above. The raw message including attachments can be downloaded as an `.eml` file. diff --git a/src/content/docs/fundamentals/api/how-to/create-via-api.mdx b/src/content/docs/fundamentals/api/how-to/create-via-api.mdx index 06c1fda17b2428..b3ea27fb775a72 100644 --- a/src/content/docs/fundamentals/api/how-to/create-via-api.mdx +++ b/src/content/docs/fundamentals/api/how-to/create-via-api.mdx @@ -6,7 +6,7 @@ sidebar: --- -import { Render } from "~/components" +import { Render, Tabs, TabItem } from "~/components" Generate new API tokens on the fly via the API. Before you can do this, you must create an API token in the Cloudflare dashboard that can create subsequent tokens. @@ -24,7 +24,7 @@ Cloudflare also recommends limiting the use of the token via client IP address f ## Creating API tokens with the API -Once you create an API token that can create other tokens, you can now use it in the API. Refer to the [API schema docs](/api/resources/user/subresources/tokens/methods/create/) for more information. +You can create a user owned token or account owned token to use with the API. Refer to the [user owned token](/api/resources/user/subresources/tokens/methods/create/) or the [account owned token](/api/resources/accounts/subresources/tokens/methods/create/) API schema docs for more information. To create a token: @@ -130,6 +130,93 @@ Each parameter in the `in` and `not_in` objects must be in CIDR notation. For ex Combine the previous information to create a token as in the following example: + + +```bash +curl "https://api.cloudflare.com/client/v4/accounts/{account_id}/tokens" \ +--header "Authorization: Bearer " \ +--header "Content-Type: application/json" \ +--data '{ + "name": "readonly token", + "policies": [ + { + "effect": "allow", + "resources": { + "com.cloudflare.api.account.zone.eb78d65290b24279ba6f44721b3ea3c4": "*", + "com.cloudflare.api.account.zone.22b1de5f1c0e4b3ea97bb1e963b06a43": "*" + }, + "permission_groups": [ + { + "id": "c8fed203ed3043cba015a93ad1616f1f", + "name": "Zone Read" + }, + { + "id": "82e64a83756745bbbb1c9c2701bf816b", + "name": "DNS Read" + } + ] + } + ], + "not_before": "2020-04-01T05:20:00Z", + "expires_on": "2020-04-10T00:00:00Z", + "condition": { + "request.ip": { + "in": [ + "199.27.128.0/21", + "2400:cb00::/32" + ], + "not_in": [ + "199.27.128.1/32" + ] + } + } +}' +``` + + +```bash +curl "https://api.cloudflare.com/client/v4/user/tokens" \ +--header "Authorization: Bearer " \ +--header "Content-Type: application/json" \ +--data '{ + "name": "readonly token", + "policies": [ + { + "effect": "allow", + "resources": { + "com.cloudflare.api.account.zone.eb78d65290b24279ba6f44721b3ea3c4": "*", + "com.cloudflare.api.account.zone.22b1de5f1c0e4b3ea97bb1e963b06a43": "*" + }, + "permission_groups": [ + { + "id": "c8fed203ed3043cba015a93ad1616f1f", + "name": "Zone Read" + }, + { + "id": "82e64a83756745bbbb1c9c2701bf816b", + "name": "DNS Read" + } + ] + } + ], + "not_before": "2020-04-01T05:20:00Z", + "expires_on": "2020-04-10T00:00:00Z", + "condition": { + "request.ip": { + "in": [ + "199.27.128.0/21", + "2400:cb00::/32" + ], + "not_in": [ + "199.27.128.1/32" + ] + } + } +}' +``` + + + ```bash curl "https://api.cloudflare.com/client/v4/user/tokens" \ --header "Authorization: Bearer " \ diff --git a/src/content/docs/fundamentals/api/how-to/make-api-calls.mdx b/src/content/docs/fundamentals/api/how-to/make-api-calls.mdx index 846c34713bcbb4..3ecbcf57c07778 100644 --- a/src/content/docs/fundamentals/api/how-to/make-api-calls.mdx +++ b/src/content/docs/fundamentals/api/how-to/make-api-calls.mdx @@ -5,27 +5,31 @@ sidebar: order: 2 --- +import { TabItem, Tabs } from "~/components"; + Once you [create your API token](/fundamentals/api/get-started/create-token/), all API requests are authorized in the same way. Cloudflare uses the [RFC standard](https://tools.ietf.org/html/rfc6750#section-2.1) `Authorization: Bearer ` interface. An example request is shown below. {/* */} ```bash -curl "https://api.cloudflare.com/client/v4/zones/{zone_id}" \ +curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID" \ --header "Authorization: Bearer YQSn-xWAQiiEh9qM58wZNnyQS7FUdoqGIUAbrh7T" ``` Never send or store your API token secret in plaintext. Also be sure not to check it into code repositories, especially public ones. +Consider defining [environment variables](#environment-variables) for the zone or account ID, as well as for authentication credentials (for example, the API token). + To format JSON output for readability in the command line, you can use a tool like `jq`, a command-line JSON processor. For more information on obtaining and installing `jq`, refer to [Download jq](https://stedolan.github.io/jq/download/). The following example will format the curl JSON output using `jq`: ```bash -curl "https://api.cloudflare.com/client/v4/zones/{zone_id}" \ ---header "Authorization: Bearer " | jq . +curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID" \ +--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" | jq . ``` -## Using Cloudflare’s APIs +## Using Cloudflare's APIs Every Cloudflare API element is fixed to a version number. The latest version is Version 4. The stable base URL for all Version 4 HTTPS endpoints is: `https://api.cloudflare.com/client/v4/` @@ -39,14 +43,15 @@ For specific guidance on making API calls, refer to the following resources: Several Cloudflare endpoints have optional query parameters to filter incoming results, such as [List Zones](/api/resources/zones/methods/list/). -When adding those query parameters, make sure you enclose the URL in quotes `'` (just like the header values), or the API call might error. +When adding those query parameters, make sure you enclose the URL in double quotes `""` (just like the header values), or the API call might error. -```bash "'" - curl 'https://api.cloudflare.com/client/v4/zones?account.id=' \ - --header 'Authorization: Bearer ' \ - --header 'Content-Type: application/json' +```bash '"' +curl "https://api.cloudflare.com/client/v4/zones?account.id=$ACCOUNT_ID" \ +--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" ``` +You can enclose strings using either single quotes (`''`) or double quotes (`""`). However, using single quotes prevents variable substitution in shells like `bash`. In the previous example, this would mean that the `$ACCOUNT_ID` and `$CLOUDFLARE_API_TOKEN` [environment variables](#environment-variables) would not be replaced with their values. + ### Pagination Sometimes there will be too many results to display via the default page size, for example you might receive the following: @@ -63,7 +68,7 @@ There are two query parameter options, which can be combined to paginate across - `page=x` enables you to select a specific page. - `per_page=xx` enables you to adjust the number of results displayed on a page. If you select too many, you may get a timeout. -An example might be `https://api.cloudflare.com/client/v4/zones/zone-identifier/dns_records?per_page=100&page=2`. +An example might be `https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records?per_page=100&page=2`. Other options are: @@ -78,7 +83,7 @@ Recent versions of Windows 10 and 11 [already include the curl tool](https://cur ### Using a Command Prompt window -To use the Cloudflare API with curl on a Command Prompt window, you must use double quotes (`"`) as string delimiters instead of single quotes (`'`). +To use the Cloudflare API with curl on a Command Prompt window, you must use double quotes (`"`) as string delimiters. A typical `PATCH` request will be similar to the following: @@ -110,10 +115,10 @@ PowerShell has specific cmdlets (`Invoke-RestMethod` and `ConvertFrom-Json`) for The following example uses the `Invoke-RestMethod` cmdlet: ```powershell -Invoke-RestMethod -URI 'https://api.cloudflare.com/client/v4/zones/{zone_id}/ssl/certificate_packs?ssl_status=all' -Method 'GET' -ContentType 'application/json' -Headers @{'X-Auth-Email'='';'X-Auth-Key'=''} +Invoke-RestMethod -URI "https://api.cloudflare.com/client/v4/zones/$Env:ZONE_ID/ssl/certificate_packs?ssl_status=all" -Method 'GET' -Headers @{'X-Auth-Email'=$Env:CLOUDFLARE_EMAIL;'X-Auth-Key'=$Env:CLOUDFLARE_API_KEY} ``` -```txt title="Example output" +```txt output result : {@{id=78411cfa-5727-4dc1-8d4a-773d01f17c7c; type=universal; hosts=System.Object[]; primary_certificate=c173c8a1-9724-4e96-a748-2c4494186098; status=active; certificates=System.Object[]; created_on=2022-12-09T23:11:06.010263Z; validity_days=90; validation_method=txt; @@ -124,13 +129,15 @@ errors : {} messages : {} ``` +The command assumes that the environment variables `ZONE_ID`, `CLOUDFLARE_EMAIL`, and `CLOUDFLARE_API_KEY` have been previously defined. For more information, refer to [Environment variables](#environment-variables). + By default, the output will only contain the first level of the JSON object hierarchy (in the above example, the content of objects such as `hosts` and `certificates` is not shown). To show additional levels and format the output like the `jq` tool, you can use the `ConvertFrom-Json` cmdlet specifying the desired maximum depth (by default, `2`): ```powershell -Invoke-RestMethod -URI 'https://api.cloudflare.com/client/v4/zones/{zone_id}/ssl/certificate_packs?ssl_status=all' -Method 'GET' -ContentType 'application/json' -Headers @{'X-Auth-Email'='';'X-Auth-Key'=''} | ConvertTo-Json -Depth 5 +Invoke-RestMethod -URI "https://api.cloudflare.com/client/v4/zones/$Env:ZONE_ID/ssl/certificate_packs?ssl_status=all" -Method 'GET' -Headers @{'X-Auth-Email'=$Env:CLOUDFLARE_EMAIL;'X-Auth-Key'=$Env:CLOUDFLARE_API_KEY} | ConvertTo-Json -Depth 5 ``` -```json title="Example output" +```json output { "result": [ { @@ -174,7 +181,7 @@ You can also use the curl tool in PowerShell. However, in PowerShell `curl` is a A typical `PATCH` request with curl will be similar to the following: ```powershell -curl.exe --request PATCH "https://api.cloudflare.com/client/v4/user/invites/{id}" --header "Authorization: Bearer " --data '{\"status\": \"accepted\"}' +curl.exe --request PATCH "https://api.cloudflare.com/client/v4/user/invites/{id}" --header "Authorization: Bearer $Env:CLOUDFLARE_API_TOKEN" --data '{\"status\": \"accepted\"}' ``` To escape a double quote (`"`) character in a request body (specified with `-d` or `--data`), prepend it with another double quote (`"`) or a backslash (`\`). You must escape double quotes even when using single quotes (`'`) as string delimiters. @@ -184,7 +191,98 @@ To break a single command in two or more lines, use a backtick (`` ` ``) charact ```powershell curl.exe --request PATCH ` "https://api.cloudflare.com/client/v4/user/invites/{id}" ` ---header "X-Auth-Email: " ` ---header "X-Auth-Key: " ` +--header "X-Auth-Email: $Env:CLOUDFLARE_EMAIL" ` +--header "X-Auth-Key: $Env:CLOUDFLARE_API_KEY" ` --data '{\"status\": \"accepted\"}' ``` + +## Environment variables + +You can define environment variables for values that repeat between commands, such as the zone or account ID. The lifetime of an environment variable can be the current shell session, all future sessions of the current user, or even all future sessions of all users on the machine you are defining them. + +You can also use environment variables for keeping authentication credentials (API token, API key, and email) and reusing them in different commands. However, make sure you define these values in the smallest possible scope (either the current shell session only or all new sessions for the current user). + +The procedure for setting and referencing environment variables depends on your platform and shell. + +### Define an environment variable + + + +To define a `ZONE_ID` environment variable for the current shell session, run the following command: + +```sh +export ZONE_ID='f2ea6707005a4da1af1b431202e96ac5' +``` + +To define the variable for all new shell sessions for the current user, add the command above at the end of your shell configuration file (for example, `~/.bashrc` for the `bash` shell and `~/.zshrc` for the `zsh` shell). + + + +To define a `ZONE_ID` environment variable for the current PowerShell session, run the following command: + +```powershell +$Env:ZONE_ID='f2ea6707005a4da1af1b431202e96ac5' +``` + +To define the environment variable for all new PowerShell sessions of the current user, set the variable in your PowerShell profile. You can get the path to your PowerShell profile by running `echo $PROFILE`. + +Alternatively, set the variable for all new PowerShell sessions of the current user using the `SetEnvironmentVariable()` method of the `System.Environment` class. For example: + +```powershell +[Environment]::SetEnvironmentVariable("ZONE_ID", "f2ea6707005a4da1af1b431202e96ac5", "User") +``` + +Running this command will not affect the current session. You will need to close and start a new PowerShell session. + + + +To define a `ZONE_ID` environment variable for the current Command Prompt session, run the following command: + +```txt frame="terminal" +set ZONE_ID=f2ea6707005a4da1af1b431202e96ac5 +``` + +To define an environment variable for all future Command Prompt sessions of the current user, run the following command: + +```txt frame="terminal" +setx ZONE_ID f2ea6707005a4da1af1b431202e96ac5 +``` + +Running this command will not affect the current window. You will need to either run the `set` command or close and start a new Command Prompt window. + + + +### Reference an environment variable + + + +When referencing an environment variable in a command, add a `$` prefix to the variable name (for example, `$ZONE_ID`). Make sure that the full string referencing the variable is either unquoted (if it does not contain spaces) or enclosed in double quotes (`""`). + +For example: + +```sh +curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID" \ +--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" +``` + + + +When referencing an environment variable in a command, add an `$Env:` prefix to the variable name (for example, `$Env:ZONE_ID`). Make sure that the full string referencing the variable is either unquoted or enclosed in double quotes (`""`). + +For example: + +```powershell +Invoke-RestMethod -URI "https://api.cloudflare.com/client/v4/zones/$Env:ZONE_ID" -Method 'GET' -Headers @{'Authorization'="Bearer $Env:CLOUDFLARE_API_TOKEN"} +``` + + + +When referencing an environment variable in a command, enclose the variable name in `%` characters (for example, `%ZONE_ID%`). + +For example: + +```txt frame="terminal" +curl "https://api.cloudflare.com/client/v4/zones/%ZONE_ID%" --header "Authorization: Bearer %CLOUDFLARE_API_TOKEN%" +``` + + diff --git a/src/content/docs/fundamentals/reference/cloudflare-ray-id.mdx b/src/content/docs/fundamentals/reference/cloudflare-ray-id.mdx index 875274deed3eef..c513f61574d7f1 100644 --- a/src/content/docs/fundamentals/reference/cloudflare-ray-id.mdx +++ b/src/content/docs/fundamentals/reference/cloudflare-ray-id.mdx @@ -1,7 +1,6 @@ --- pcx_content_type: reference title: Cloudflare Ray ID - --- A **Cloudflare Ray ID** is an identifier given to every request that goes through Cloudflare. @@ -10,7 +9,7 @@ Ray IDs are particularly useful when evaluating Security Events for patterns or :::caution -Ray IDs are not guaranteed to be unique for every request. In some situations, different requests may have the same Ray ID. +Ray IDs are not guaranteed to be unique for every request. In some situations, different requests may have the same Ray ID. ::: ## Look up Ray IDs @@ -33,4 +32,4 @@ Enterprise customers can enable Ray ID as a field in their [Cloudflare Logs](/lo ### Server logs -For more details about sending Ray IDs to your server logs, refer to the [CF-Ray](/fundamentals/reference/http-request-headers/#cf-ray) header. +For more details about sending Ray IDs to your server logs, refer to the [Cf-Ray](/fundamentals/reference/http-headers/#cf-ray) header. diff --git a/src/content/docs/fundamentals/reference/http-request-headers.mdx b/src/content/docs/fundamentals/reference/http-headers.mdx similarity index 80% rename from src/content/docs/fundamentals/reference/http-request-headers.mdx rename to src/content/docs/fundamentals/reference/http-headers.mdx index c820ec5847abed..522a5b22e044b4 100644 --- a/src/content/docs/fundamentals/reference/http-request-headers.mdx +++ b/src/content/docs/fundamentals/reference/http-headers.mdx @@ -1,33 +1,34 @@ --- pcx_content_type: reference -title: Cloudflare HTTP request headers +title: Cloudflare HTTP headers --- import { Render } from "~/components"; +## Request headers + Cloudflare passes all HTTP request headers to your origin web server and adds additional headers as specified below. :::note - Cloudflare may remove HTTP request headers with names considered invalid [according to NGINX](https://nginx.org/en/docs/http/ngx_http_core_module.html#ignore_invalid_headers) — for example, header names containing a `.` (dot) character. ::: -## Accept-Encoding +### Accept-Encoding For incoming requests, the value of this header will always be set to `accept-encoding: br, gzip`. If the client set a different value, such as `accept-encoding: deflate`, it will be overwritten and the original value will be available in `request.cf.clientAcceptEncoding`. -## CF-Connecting-IP +### CF-Connecting-IP `CF-Connecting-IP` provides the client IP address connecting to Cloudflare to the origin web server. This header will only be sent on the traffic from Cloudflare's edge to your origin web server. -For guidance on logging your visitor’s original IP address, refer to [Restoring original visitor IPs](/support/troubleshooting/restoring-visitor-ips/restoring-original-visitor-ips/). +For guidance on logging your visitor's original IP address, refer to [Restoring original visitor IPs](/support/troubleshooting/restoring-visitor-ips/restoring-original-visitor-ips/). Alternatively, if you do not wish to receive the `CF-Connecting-IP` header or any HTTP header that may contain the visitor's IP address, [enable the **Remove visitor IP headers** Managed Transform](/rules/transform/managed-transforms/configure/). -### CF-Connecting-IP in Worker subrequests +#### CF-Connecting-IP in Worker subrequests -In same-zone Worker subrequests, the value of `CF-Connecting-IP` reflects the value of `x-real-ip` (the client’s IP). `x-real-ip` can be altered by the user in their Worker script. +In same-zone Worker subrequests, the value of `CF-Connecting-IP` reflects the value of `x-real-ip` (the client's IP). `x-real-ip` can be altered by the user in their Worker script. In cross-zone subrequests from one Cloudflare zone to another Cloudflare zone, the `CF-Connecting-IP` value will be set to the Worker client IP address `'2a06:98c0:3600::103'` for security reasons. @@ -35,21 +36,21 @@ For Worker subrequests destined for a non-Cloudflare customer zone, the `CF-Conn When no Worker subrequest is triggered, `cf-connecting-ip` reflects the client's IP address and the `x-real-ip` header is stripped. -## CF-Connecting-IPv6 +### CF-Connecting-IPv6 Cloudflare provides [free IPv6 support](/network/ipv6-compatibility/) to all domains without requiring additional configuration or hardware. To support migrating to IPv6, Cloudflare's [Pseudo IPv4](/network/pseudo-ipv4/) provides an IPv6 to IPv4 translation service for all Cloudflare domains.
-## CF-EW-Via +### CF-EW-Via This header is used for loop detection, similar to the `CDN-Loop` [header](https://blog.cloudflare.com/preventing-request-loops-using-cdn-loop/). -## CF-Pseudo-IPv4 +### CF-Pseudo-IPv4 If [Pseudo IPv4](/network/pseudo-ipv4/) is set to `Add Header` - Cloudflare automatically adds the `CF-Pseudo-IPv4` header with a Class E IPv4 address hashed from the original IPv6 address. -## True-Client-IP (Enterprise plan only) +### True-Client-IP (Enterprise plan only) `True-Client-IP` provides the original client IP address to the origin web server. `True-Client-IP` is only available on an Enterprise plan. In the example below, `203.0.113.1` is the original visitor IP address. For example: `True-Client-IP: 203.0.113.1` @@ -60,12 +61,10 @@ To add a `True-Client-IP` HTTP header to requests, [enable the **Add "True-Clien Alternatively, if you do not wish to receive the `True-Client-IP` header or any HTTP header that may contain the visitor's IP address, [enable the **Remove visitor IP headers** Managed Transform](/rules/transform/managed-transforms/configure/). :::caution - If you are using Cloudflare in a stacked CDN and authenticating HTTP requests based on the IP address value in the `True-Client-IP` header, you must add a `True-Client-IP` header to your requests. If you do not add this header, its value can be spoofed to any value. - ::: -## X-Forwarded-For +### X-Forwarded-For `X-Forwarded-For` maintains proxy server and original visitor IP addresses. If there was no existing `X-Forwarded-For`header in the request sent to Cloudflare, `X-Forwarded-For` has an identical value to the `CF-Connecting-IP` header. @@ -76,28 +75,26 @@ If, on the other hand, an `X-Forwarded-For` header was already present in the re If you do not wish to receive the visitor's IP address in the `X-Forwarded-For` header, or any HTTP header that may contain the visitor's IP address, [enable the **Remove visitor IP headers** Managed Transform](/rules/transform/managed-transforms/configure/). :::note - To restore the original visitor IP address at your origin web server, Cloudflare recommends that your logs or applications look at `CF-Connecting-IP` or `True-Client-IP` instead of `X-Forwarded-For`. `CF-Connecting-IP` and `True-Client-IP` both have a consistent format containing only one IP address. - ::: -## X-Forwarded-Proto +### X-Forwarded-Proto `X-Forwarded-Proto` is used to identify the protocol (HTTP or HTTPS) that Cloudflare uses to connect to origin web server. By default, it is `http`. Certain [encryption mode](/ssl/origin-configuration/ssl-modes/) may change this header to `https` if the connection is encrypted. For incoming requests, the value of this header will be set to the protocol the client used (`http` or `https`). If the client set a different value, it will be overwritten. -## CF-RAY +### Cf-Ray -The `CF-ray` header (otherwise known as a [Ray ID](/fundamentals/reference/cloudflare-ray-id/)) is a hashed value that encodes information about the data center and the visitor’s request. For example: `CF-RAY: 230b030023ae2822-SJC`. +The `Cf-Ray` header (otherwise known as a [Ray ID](/fundamentals/reference/cloudflare-ray-id/)) is a hashed value that encodes information about the data center and the visitor's request. For example: `Cf-Ray: 230b030023ae2822-SJC`. -Add the [`CF-Ray` header to your origin web server logs](/support/troubleshooting/general-troubleshooting/gathering-information-for-troubleshooting-sites/#add-the-cf-ray-header-to-your-logs) to match requests proxied to Cloudflare to requests in your server logs. +Add the [`Cf-Ray` header to your origin web server logs](/support/troubleshooting/general-troubleshooting/gathering-information-for-troubleshooting-sites/#add-the-cf-ray-header-to-your-logs) to match requests proxied to Cloudflare to requests in your server logs. Enterprise customers can also see all requests via [Cloudflare Logs](/logs/). -## CF-IPCountry +### CF-IPCountry -The `CF-IPCountry` header contains a two-character country code of the originating visitor’s country. +The `CF-IPCountry` header contains a two-character country code of the originating visitor's country. Besides the [ISO-3166-1 alpha-2 codes](https://www.iso.org/iso-3166-country-codes.html), Cloudflare uses the following special country codes: @@ -107,44 +104,67 @@ Besides the [ISO-3166-1 alpha-2 codes](https://www.iso.org/iso-3166-country-code To add this header to requests, along with other HTTP headers with location information for the visitor's IP address, [enable the **Add visitor location headers** Managed Transform](/rules/transform/managed-transforms/configure/). :::note - The `CF-IPCountry` header is removed from requests made from a Worker to an origin that is not proxied behind Cloudflare. - ::: -## CF-Visitor +### CF-Visitor -Currently, this header is a JSON object, containing only one key called “scheme”. The header will be either HTTP or HTTPS, and it is only relevant if you need to enable Flexible SSL in your Cloudflare settings. For example: `CF-Visitor: { \"scheme\":\"https\"}`. +Currently, this header is a JSON object, containing only one key called `scheme`. The header will be either HTTP or HTTPS, and it is only relevant if you need to enable Flexible SSL in your Cloudflare settings. For example: `CF-Visitor: { \"scheme\":\"https\"}`. -## CDN-Loop +### CDN-Loop -`CDN-Loop` allows Cloudflare to specify how many times a request can enter Cloudflare's network before it is blocked as a looping request. For example: `CDN-Loop: cloudflare` +`CDN-Loop` allows Cloudflare to specify how many times a request can enter Cloudflare's network before it is blocked as a looping request. For example: `CDN-Loop: cloudflare`. -## CF-Worker +### CF-Worker -The `CF-Worker` request header is added to an edge Worker subrequest that identifies the host that spawned the subrequest. This is useful when you want to protect yourself against cross-zone worker subrequests. For example: `CF-Worker: example.com`. +The `CF-Worker` request header is added to an edge Worker subrequest that identifies the host that spawned the subrequest. This is useful when you want to protect yourself against cross-zone Worker subrequests. For example: `CF-Worker: example.com`. You can add `CF-Worker` header on server logs similar to the way you add the [`CF-RAY`](/support/troubleshooting/general-troubleshooting/gathering-information-for-troubleshooting-sites/#add-the-cf-ray-header-to-your-logs) header. To do that, add `$http_cf_worker` in the log format file: `log_format cf_custom "CF-Worker:$http_cf_worker"'` `CF-Worker` is added to all Worker subrequests sent via `fetch()`. It is set to the name of the zone which owns the Worker making the subrequest. For example, a Worker script on route for `foo.example.com/*` from `example.com` will have all subrequests with the header: -`CF-Worker`: `example.com` +```txt +CF-Worker: example.com +``` The intended purpose of this header is to provide a means for recipients (for example, origins, load balancers, other Workers) to recognize, filter, and route traffic generated by Workers on specific zones. :::note - -When configuring WAF custom rules, do not match on this header. These rules are applied before Cloudflare adds the `CF-Worker` header. Instead, use the [`cf.worker.upstream_zone`](/ruleset-engine/rules-language/fields/reference/cf.worker.upstream_zone/) dynamic field, which contains the same value and exists for the same purpose. - +When configuring WAF custom rules, do not match on this header. These rules are applied before Cloudflare adds the `CF-Worker` header. Instead, use the [`cf.worker.upstream_zone`](/ruleset-engine/rules-language/fields/reference/cf.worker.upstream_zone/) field, which contains the same value and exists for the same purpose. ::: -## Connection +### Connection For incoming requests, the value of this header will always be set to `Keep-Alive`. If the client set a different value, such as `close`, it will be overwritten. Note that is also the case when the client uses HTTP/2 or HTTP/3 to connect. -## Considerations for Spectrum +### Considerations for Spectrum When using Spectrum with a TCP application, these headers are not visible at the origin as they are HTTP headers. If you wish to utilize these in your application, there are two options: - Use an HTTP or HTTPS Spectrum app instead of TCP - Use the [Proxy Protocol feature](/spectrum/how-to/enable-proxy-protocol/) + +## Response headers + +Cloudflare will remove some HTTP headers from the response sent back to the visitor and add some Cloudflare-specific HTTP headers. + +### Removed response headers + +Cloudflare passes all HTTP headers in the response from the origin server back to the visitor with the exception of the following headers: + +- `X-Accel-Buffering` +- `X-Accel-Charset` +- `X-Accel-Limit-Rate` +- `X-Accel-Redirect` + +### Added response headers + +Cloudflare adds the HTTP headers specified below to the response sent to the visitor. + +#### Cf-Ray + +The `Cf-Ray` value returned to the visitor will be the same `Cf-Ray` value that was sent to the origin server. + +#### Cf-Cache-Status + +A list of all possible `Cf-Cache-Status` values is contained in [Cloudflare cache responses](/cache/concepts/cache-responses/). diff --git a/src/content/docs/fundamentals/setup/manage-members/roles.mdx b/src/content/docs/fundamentals/setup/manage-members/roles.mdx index f4d2eb54cdff95..e36f7984058d52 100644 --- a/src/content/docs/fundamentals/setup/manage-members/roles.mdx +++ b/src/content/docs/fundamentals/setup/manage-members/roles.mdx @@ -39,11 +39,11 @@ Account-scoped roles apply across an entire Cloudflare account, and through all | Cloudflare Zero Trust Read Only | Can access [Cloudflare for Zero Trust](/cloudflare-one/) read only mode. | | Cloudflare Zero Trust Reporting | Can access [Cloudflare for Zero Trust](/cloudflare-one/) reporting data. | | DNS | Can edit [DNS records](/dns/manage-dns-records/). | -| Email Configuration Admin | Grants write access to all of CES, [CASB](/cloudflare-one/applications/casb/), [DLP](/cloudflare-one/policies/data-loss-prevention/), [Gateway](/cloudflare-one/policies/gateway/), and [Tunnels](/cloudflare-one/connections/connect-networks/), except Mail Preview, Raw Email, on-demand reports, actions on emails, and Submissions, Submission Transparency (Requires Cloudflare Zero Trust PII). | -| Email Integration Admin | Grants write access to CES account integration only, [CASB](/cloudflare-one/applications/casb/), [DLP](/cloudflare-one/policies/data-loss-prevention/), [Gateway](/cloudflare-one/policies/gateway/), and [Tunnels](/cloudflare-one/connections/connect-networks/). | -| Email Security Analyst | Grants write access to all of CES, except Settings which is read only (Requires Cloudflare Zero Trust PII). | -| Email Security Read Only | Grants read access to all of CES, but cannot see Raw Email, take action on emails, or make Submissions (Requires Cloudflare Zero Trust PII). | -| Email Security Reporting | Grants read access to CES Home, PhishGuard, and Submission Transparency. | +| Email Configuration Admin | Grants write access to all of Email Security, [CASB](/cloudflare-one/applications/casb/), [DLP](/cloudflare-one/policies/data-loss-prevention/), [Gateway](/cloudflare-one/policies/gateway/), and [Tunnels](/cloudflare-one/connections/connect-networks/), except Mail Preview, Raw Email, on-demand reports, actions on emails, and Submissions, Submission Transparency (Requires Cloudflare Zero Trust PII). | +| Email Integration Admin | Grants write access to Email Security account integration only, [CASB](/cloudflare-one/applications/casb/), [DLP](/cloudflare-one/policies/data-loss-prevention/), [Gateway](/cloudflare-one/policies/gateway/), and [Tunnels](/cloudflare-one/connections/connect-networks/). | +| Email Security Analyst | Grants write access to all of Email Security, except Settings which is read only (Requires Cloudflare Zero Trust PII). | +| Email Security Read Only | Grants read access to all of Email Security, but cannot see Raw Email, take action on emails, or make Submissions (Requires Cloudflare Zero Trust PII). | +| Email Security Reporting | Grants read access to Email Security Home, PhishGuard, and Submission Transparency. | | Firewall | Can edit [WAF](/waf/), [IP Access rules](/waf/tools/ip-access-rules/), [Zone Lockdown](/waf/tools/zone-lockdown/) settings, and [Cache Rules](/cache/how-to/cache-rules/). | | Load Balancer | Can edit [Load Balancers](/load-balancing/), Pools, Origins, and Health Checks. | | Log Share | Can edit [Log Share](/logs/) configuration. | @@ -51,8 +51,8 @@ Account-scoped roles apply across an entire Cloudflare account, and through all | Magic Network Monitoring | Can view and edit [MNM configuration](/magic-network-monitoring/). | | Magic Network Monitoring Admin | Can view, edit, create, and delete [MNM configuration](/magic-network-monitoring/). | | Magic Network Monitoring Read-Only | Can view [MNM configuration](/magic-network-monitoring/). | -| Network Services Write (Magic) | Grants write access to network configurations for Magic services. | -| Network Services Read (Magic) | Grants read access to network configurations for Magic services. | +| Network Services Write (Magic) | Grants write access to network configurations for Magic services. Magic Tunnel health checks require the Analytics role for non-admin users. | +| Network Services Read (Magic) | Grants read access to network configurations for Magic services. Magic Tunnel health checks require the Analytics role for non-admin users. | | Minimal Account Access | Can view account, and nothing else. | | Page Shield | Grants write access to [Page Shield](/page-shield/) across the whole account. | | Page Shield Read | Grants read access to [Page Shield](/page-shield/) across the whole account. | diff --git a/src/content/docs/hyperdrive/configuration/connect-to-postgres.mdx b/src/content/docs/hyperdrive/configuration/connect-to-postgres.mdx index ec3c878aac486f..33d68e9adee0dc 100644 --- a/src/content/docs/hyperdrive/configuration/connect-to-postgres.mdx +++ b/src/content/docs/hyperdrive/configuration/connect-to-postgres.mdx @@ -5,7 +5,7 @@ sidebar: order: 3 --- -import { TabItem, Tabs, Render } from "~/components"; +import { TabItem, Tabs, Render, WranglerConfig } from "~/components"; Hyperdrive supports PostgreSQL and PostgreSQL-compatible databases, [popular drivers](#supported-drivers) and Object Relational Mapper (ORM) libraries that use those drivers. @@ -26,9 +26,7 @@ When using wrangler, replace the placeholder value provided to `--connection-str npx wrangler hyperdrive create my-first-hyperdrive --connection-string="postgres://user:password@database.host.example.com:5432/databasenamehere" ``` -The command above will output the ID of your Hyperdrive, which you will need to set in the `wrangler.toml` configuration file for your Workers project: - -import { WranglerConfig } from "~/components"; +The command above will output the ID of your Hyperdrive, which you will need to set in the `wrangler.toml / wrangler.json` file for your Workers project: @@ -52,18 +50,24 @@ Refer to the [Examples documentation](/hyperdrive/examples/) for step-by-step gu Hyperdrive uses Workers [TCP socket support](/workers/runtime-apis/tcp-sockets/#connect) to support TCP connections to databases. The following table lists the supported database drivers and the minimum version that works with Hyperdrive: -| Driver | Documentation | Minimum Version Required | Notes | -| ----------------------------- | ---------------------------------------------------------------------------- | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| Postgres.js (**recommended**) | [Postgres.js documentation](https://github.com/porsager/postgres) | `postgres@3.4.4` | Supported in both Workers & Pages. | -| node-postgres - `pg` | [node-postgres - `pg` documentation](https://node-postgres.com/) | `pg@8.13.0` | `8.11.4` introduced a bug with URL parsing and will not work. `8.11.5` fixes this. Requires `compatibility_flags = ["nodejs_compat"]` and `compatibility_date = "2024-09-23"` - refer to [Node.js compatibility](/workers/runtime-apis/nodejs). Requires wrangler `3.78.7` or later. | -| Drizzle | [Drizzle documentation](https://orm.drizzle.team/) | `0.26.2`^ | | -| Kysely | [Kysely documentation](https://kysely.dev/) | `0.26.3`^ | | -| [rust-postgres](https://github.com/sfackler/rust-postgres) | [rust-postgres documentation](https://docs.rs/postgres/latest/postgres/) | `v0.19.8` | Use the [`query_typed`](https://docs.rs/postgres/latest/postgres/struct.Client.html#method.query_typed) method for best performance. | +| Driver | Documentation | Minimum Version Required | Notes | +| ---------------------------------------------------------- | ------------------------------------------------------------------------ | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Postgres.js (**recommended**) | [Postgres.js documentation](https://github.com/porsager/postgres) | `postgres@3.4.4` | Supported in both Workers & Pages. | +| node-postgres - `pg` | [node-postgres - `pg` documentation](https://node-postgres.com/) | `pg@8.13.0` | `8.11.4` introduced a bug with URL parsing and will not work. `8.11.5` fixes this. Requires `compatibility_flags = ["nodejs_compat"]` and `compatibility_date = "2024-09-23"` - refer to [Node.js compatibility](/workers/runtime-apis/nodejs). Requires wrangler `3.78.7` or later. | +| Drizzle | [Drizzle documentation](https://orm.drizzle.team/) | `0.26.2`^ | | +| Kysely | [Kysely documentation](https://kysely.dev/) | `0.26.3`^ | | +| [rust-postgres](https://github.com/sfackler/rust-postgres) | [rust-postgres documentation](https://docs.rs/postgres/latest/postgres/) | `v0.19.8` | Use the [`query_typed`](https://docs.rs/postgres/latest/postgres/struct.Client.html#method.query_typed) method for best performance. | ^ _The marked libraries use `node-postgres` as a dependency._ Other drivers and ORMs not listed may also be supported: this list is not exhaustive. +### Database drivers and Node.js compatibility + +[Node.js compatibility](/workers/runtime-apis/nodejs/) is required for database drivers, including Postgres.js, and needs to be configured for your Workers project. + + + ## Supported TLS (SSL) modes Hyperdrive supports the following [PostgreSQL TLS (SSL)](https://www.postgresql.org/docs/current/libpq-ssl.html) connection modes when connecting to your origin database: @@ -104,7 +108,7 @@ Install the `node-postgres` driver: npm install pg ``` -**Ensure you have `compatibility_flags` and `compatibility_date` set in your `wrangler.toml` configuration file** as shown below: +**Ensure you have `compatibility_flags` and `compatibility_date` set in your `wrangler.toml / wrangler.json` file** as shown below: @@ -114,7 +118,7 @@ Create a new `Client` instance and pass the Hyperdrive parameters: import { Client } from "pg"; export interface Env { - // If you set another name in wrangler.toml as the value for 'binding', + // If you set another name in the `wrangler.toml / wrangler.json` file as the value for 'binding', // replace "HYPERDRIVE" with the variable name you defined. HYPERDRIVE: Hyperdrive; } diff --git a/src/content/docs/hyperdrive/configuration/connect-to-private-database.mdx b/src/content/docs/hyperdrive/configuration/connect-to-private-database.mdx index fc34cd4eec2e6a..a442d96979dc5c 100644 --- a/src/content/docs/hyperdrive/configuration/connect-to-private-database.mdx +++ b/src/content/docs/hyperdrive/configuration/connect-to-private-database.mdx @@ -18,6 +18,12 @@ When your database is isolated within a private network (such as a [virtual priv - [Cloudflare Tunnel](/cloudflare-one/connections/connect-networks/) is used to establish the secure tunnel connection. - [Cloudflare Access](/cloudflare-one/policies/access/) is used to restrict access to your tunnel such that only specific Hyperdrive configurations can access it. +A request from the Cloudflare Worker to the origin database goes through Hyperdrive, Cloudflare Access, and the Cloudflare Tunnel established by `cloudflared`. `cloudflared` must be running in the private network in which your database is accessible. + +The Cloudflare Tunnel will establish an outbound bidirectional connection from your private network to Cloudflare. Cloudflare Access will secure your Cloudflare Tunnel to be only accessible by your Hyperdrive configuration. + +![A request from the Cloudflare Worker to the origin database goes through Hyperdrive, Cloudflare Access and the Cloudflare Tunnel established by `cloudflared`.](~/assets/images/hyperdrive/configuration/hyperdrive-private-database-architecture.png) + :::caution[Warning] @@ -44,7 +50,7 @@ Your tunnel must be configured to use a public hostname so that Hyperdrive can r 1. In the **Public Hostnames** tab, choose a **Domain** and specify any subdomain or path information. This will be used in your Hyperdrive configuration to route to this tunnel. -2. In the **Service** section, specify **Type** `TCP` and the URL and configured port of your database, such as `localhost:5432`. This address will be used by the tunnel to route requests to your database. +2. In the **Service** section, specify **Type** `TCP` and the URL and configured port of your database, such as `localhost:5432` or `my-database-host.database-provider.com:5432`. This address will be used by the tunnel to route requests to your database. 3. Select **Save tunnel**. @@ -52,7 +58,29 @@ Your tunnel must be configured to use a public hostname so that Hyperdrive can r If you are setting up the tunnel through the CLI instead ([locally-managed tunnel](/cloudflare-one/connections/connect-networks/configure-tunnels/local-management/)), you will have to complete these steps manually. Follow the Cloudflare Zero Trust documentation to [add a public hostname to your tunnel](/cloudflare-one/connections/connect-networks/routing-to-tunnel/dns/) and [configure the public hostname to route to the address of your database](/cloudflare-one/connections/connect-networks/configure-tunnels/local-management/configuration-file/). ::: -## 2. Create a service token +## 2. Create and configure Hyperdrive to connect to the Cloudflare Tunnel + +To restrict access to the Cloudflare Tunnel to Hyperdrive, a [Cloudflare Access application](/cloudflare-one/applications/) must be configured with a [Policy](/cloudflare-one/policies/) that requires requests to contain a valid [Service Auth token](/cloudflare-one/policies/access/#service-auth). + +The Cloudflare dashboard can automatically create and configure the underlying [Cloudflare Access application](/cloudflare-one/applications/), [Service Auth token](/cloudflare-one/policies/access/#service-auth), and [Policy](/cloudflare-one/policies/) on your behalf. Alternatively, you can manually create the Access application and configure the Policies. + + + +### 2.1 Create a Hyperdrive configuration in the Cloudflare dashboard + +Create a Hyperdrive configuration in the Cloudflare dashboard to automatically configure Hyperdrive to connect to your Cloudflare Tunnel. + +1. In the [Cloudflare dashboard](https://dash.cloudflare.com/?to=/:account/workers/hyperdrive), navigate to **Storage & Databases > Hyperdrive** and click **Create configuration**. +2. Select **Private database**. +3. In the **Networking details** section, select the tunnel you are connecting to. +4. In the **Networking details** section, select the hostname associated to the tunnel. If there is no hostname for your database, return to step [1.2. Connect your database using a public hostname](/hyperdrive/configuration/connect-to-private-database/#12-connect-your-database-using-a-public-hostname). +5. In the **Access Service Authentication Token** section, select **Create new (automatic)**. +6. In the **Access Application** section, select **Create new (automatic)**. +7. In the **Database connection details** section, enter the database **name**, **user**, and **password**. + + + +### 2.1 Create a service token The service token will be used to restrict requests to the tunnel, and is needed for the next step. @@ -72,7 +100,7 @@ The service token will be used to restrict requests to the tunnel, and is needed This is the only time Cloudflare Access will display the Client Secret. If you lose the Client Secret, you must regenerate the service token. ::: -## 3. Create an Access application to secure the tunnel +### 2.2 Create an Access application to secure the tunnel [Cloudflare Access](/cloudflare-one/policies/access/) will be used to verify that requests to the tunnel originate from Hyperdrive using the service token created above. @@ -110,7 +138,7 @@ The service token will be used to restrict requests to the tunnel, and is needed 17. Save the application. -## 4. Create a Hyperdrive configuration +### 2.3 Create a Hyperdrive configuration To create a Hyperdrive configuration for your private database, you'll need to specify the Access application and Cloudflare Tunnel information upon creation. @@ -152,7 +180,9 @@ In addition, it will also set the Access Client ID and the Access Client Secret When creating the Hyperdrive configuration for the private database, you must enter the `access-client-id` and the `access-client-id`, and omit the `port`. Hyperdrive will route database messages to the public hostname of the tunnel, and the tunnel will rely on its service configuration (as configured in [1.2. Connect your database using a public hostname](#12-connect-your-database-using-a-public-hostname)) to route requests to the database within your private network. ::: -## 5. Query your Hyperdrive configuration from a Worker (optional) + + +## 3. Query your Hyperdrive configuration from a Worker (optional) To test your Hyperdrive configuration to the database using Cloudflare Tunnel and Access, use the Hyperdrive configuration ID in your Worker and deploy it. @@ -177,4 +207,5 @@ If you successfully receive the list of `pg_tables` from your database when you ## Troubleshooting If you encounter issues when setting up your Hyperdrive configuration with tunnels to a private database, consider these common solutions, in addition to [general troubleshooting steps](/hyperdrive/observability/troubleshooting/) for Hyperdrive: -* Ensure your database is configured to use TLS (SSL). Hyperdrive requires TLS (SSL) to connect. + +- Ensure your database is configured to use TLS (SSL). Hyperdrive requires TLS (SSL) to connect. diff --git a/src/content/docs/hyperdrive/configuration/local-development.mdx b/src/content/docs/hyperdrive/configuration/local-development.mdx index ad50bd38e7e49b..7f566e156f8bcc 100644 --- a/src/content/docs/hyperdrive/configuration/local-development.mdx +++ b/src/content/docs/hyperdrive/configuration/local-development.mdx @@ -5,6 +5,8 @@ sidebar: order: 6 --- +import { WranglerConfig } from "~/components"; + Hyperdrive can be used when developing and testing your Workers locally by connecting to any local database instance running on your machine directly. Local development uses [Wrangler](/workers/wrangler/install-and-update/), the command-line interface for Workers, to manage local development sessions and state. ## Configure local development @@ -19,10 +21,10 @@ If you are new to Hyperdrive and/or Cloudflare Workers, refer to [Hyperdrive tut To specify a database to connect to when developing locally, you can: -- **Recommended** Create a `WRANGLER_HYPERDRIVE_LOCAL_CONNECTION_STRING_` environmental variable with the connection string of your database. `` is the name of the binding assigned to your Hyperdrive in your `wrangler.toml` or Pages configuration. This allows you to avoid committing potentially sensitive credentials to source control in your `wrangler.toml`, if your test/development database is not ephemeral. If you have configured multiple Hyperdrive bindings, replace `` with the unique binding name for each. -- Set `localConnectionString` in `wrangler.toml`. +- **Recommended** Create a `WRANGLER_HYPERDRIVE_LOCAL_CONNECTION_STRING_` environmental variable with the connection string of your database. `` is the name of the binding assigned to your Hyperdrive in your `wrangler.toml / wrangler.json` file or Pages configuration. This allows you to avoid committing potentially sensitive credentials to source control in your `wrangler.toml / wrangler.json` file, if your test/development database is not ephemeral. If you have configured multiple Hyperdrive bindings, replace `` with the unique binding name for each. +- Set `localConnectionString` in the `wrangler.toml / wrangler.json` file. -If both the `WRANGLER_HYPERDRIVE_LOCAL_CONNECTION_STRING_` environmental variable and `localConnectionString` in `wrangler.toml` are set, `wrangler dev` will use the environmental variable instead. Use `unset WRANGLER_HYPERDRIVE_LOCAL_CONNECTION_STRING_` to unset any existing environmental variables. +If both the `WRANGLER_HYPERDRIVE_LOCAL_CONNECTION_STRING_` environmental variable and `localConnectionString` in the `wrangler.toml / wrangler.json` file are set, `wrangler dev` will use the environmental variable instead. Use `unset WRANGLER_HYPERDRIVE_LOCAL_CONNECTION_STRING_` to unset any existing environmental variables. For example, to use the environmental variable, export the environmental variable before running `wrangler dev`: @@ -33,9 +35,7 @@ export WRANGLER_HYPERDRIVE_LOCAL_CONNECTION_STRING_TEST_DB="postgres://user:pass npx wrangler dev ``` -To configure a `localConnectionString` in `wrangler.toml`, ensure your Hyperdrive bindings have a `localConnectionString` property set: - -import { WranglerConfig } from "~/components"; +To configure a `localConnectionString` in the `wrangler.toml / wrangler.json` file, ensure your Hyperdrive bindings have a `localConnectionString` property set: diff --git a/src/content/docs/hyperdrive/configuration/rotate-credentials.mdx b/src/content/docs/hyperdrive/configuration/rotate-credentials.mdx index 971ff24d1b5d52..0975fa258d06b5 100644 --- a/src/content/docs/hyperdrive/configuration/rotate-credentials.mdx +++ b/src/content/docs/hyperdrive/configuration/rotate-credentials.mdx @@ -5,7 +5,7 @@ sidebar: order: 8 --- -import { TabItem, Tabs, Render } from "~/components"; +import { TabItem, Tabs, Render, WranglerConfig } from "~/components"; You can change the connection information and credentials of your Hyperdrive configuration in one of two ways: @@ -23,9 +23,7 @@ To create a Hyperdrive configuration that connects to an existing PostgreSQL dat npx wrangler hyperdrive create my-updated-hyperdrive --connection-string="" ``` -The command above will output the ID of your Hyperdrive. Set this ID in the `wrangler.toml` configuration file for your Workers project: - -import { WranglerConfig } from "~/components"; +The command above will output the ID of your Hyperdrive. Set this ID in the `wrangler.toml / wrangler.json` file for your Workers project: diff --git a/src/content/docs/hyperdrive/get-started.mdx b/src/content/docs/hyperdrive/get-started.mdx index c172656857ce97..1a2287e1e9ee72 100644 --- a/src/content/docs/hyperdrive/get-started.mdx +++ b/src/content/docs/hyperdrive/get-started.mdx @@ -72,25 +72,13 @@ Create a new project named `hyperdrive-tutorial` by running: This will create a new `hyperdrive-tutorial` directory. Your new `hyperdrive-tutorial` directory will include: - A `"Hello World"` [Worker](/workers/get-started/guide/#3-write-code) at `src/index.ts`. -- A [`wrangler.toml`](/workers/wrangler/configuration/) configuration file. `wrangler.toml` is how your `hyperdrive-tutorial` Worker will connect to Hyperdrive. +- A [`wrangler.json`](/workers/wrangler/configuration/) configuration file. `wrangler.json` is how your `hyperdrive-tutorial` Worker will connect to Hyperdrive. -:::note - -Note that the `wrangler.toml` file contains the following option: - -import { WranglerConfig } from "~/components"; - - +### Enable Node.js compatibility -```toml title="wrangler.toml" -compatibility_flags = [ "nodejs_compat" ] -``` - - +[Node.js compatibility](/workers/runtime-apis/nodejs/) is required for database drivers, including Postgres.js, and needs to be configured for your Workers project. -This enables the Node.js compatibility mode which is required for database drivers, including Postgres.js. - -::: + ## 3. Connect Hyperdrive to a database @@ -112,7 +100,7 @@ cd hyperdrive-tutorial :::note -Support for the new `hyperdrive` commands in the wrangler CLI requires a wrangler version of `3.10.0` or later. You can use `npx wrangler@latest` to always ensure you are using the latest version of wrangler. +Support for the new `hyperdrive` commands in the wrangler CLI requires a wrangler version of `3.10.0` or later. You can use `npx wrangler@latest` to always ensure you are using the latest version of Wrangler. ::: @@ -194,7 +182,7 @@ Populate your `index.ts` file with the following code: import postgres from "postgres"; export interface Env { - // If you set another name in wrangler.toml as the value for 'binding', + // If you set another name in the Wrangler config file as the value for 'binding', // replace "HYPERDRIVE" with the variable name you defined. HYPERDRIVE: Hyperdrive; } diff --git a/src/content/docs/hyperdrive/observability/troubleshooting.mdx b/src/content/docs/hyperdrive/observability/troubleshooting.mdx index 8254816b8ce6d8..fb12ad92baa7aa 100644 --- a/src/content/docs/hyperdrive/observability/troubleshooting.mdx +++ b/src/content/docs/hyperdrive/observability/troubleshooting.mdx @@ -3,7 +3,6 @@ pcx_content_type: concept title: Troubleshoot and debug sidebar: order: 10 - --- Troubleshoot and debug errors commonly associated with connecting to a database with Hyperdrive. @@ -43,6 +42,12 @@ Hyperdrive may also encounter `ErrorResponse` wire protocol messages sent by you | `Failed to acquire a connection from the pool.` | Hyperdrive timed out while waiting for a connection to your database, or cannot connect at all. | If you are seeing this error intermittently, your Hyperdrive pool is being exhausted because too many connections are being held open for too long by your worker. This can be caused by a myriad of different issues, but long-running queries/transactions are a common offender. | | `Server connection attempt failed: connection_refused` | Hyperdrive is unable to create new connections to your origin database. | A network firewall or access control list (ACL) is likely rejecting requests from Hyperdrive. Ensure you have allowed connections from the public Internet. Sometimes, this can be caused by your database host provider refusing incoming connections when you go over your connection limit. | +### Node errors + +| Error Message | Details | Recommended fixes | +| ------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | +| `Uncaught Error: No such module "node:"` | Your Cloudflare Workers project or a library that it imports is trying to access a Node module that is not available. | Enable [Node.js compatibility](/workers/runtime-apis/nodejs/) for your Cloudflare Workers project to maximize compatibility. | + ### Improve performance Having query traffic written as transactions can limit performance. This is because in the case of a transaction, the connection must be held for the duration of the transaction, which limits connection multiplexing. If there are multiple queries per transaction, this can be particularly impactful on connection multiplexing. Where possible, we recommend not wrapping queries in transactions to allow the connections to be shared more aggressively. diff --git a/src/content/docs/hyperdrive/platform/limits.mdx b/src/content/docs/hyperdrive/platform/limits.mdx index eda9a473a24db6..07a3cfa0439ee2 100644 --- a/src/content/docs/hyperdrive/platform/limits.mdx +++ b/src/content/docs/hyperdrive/platform/limits.mdx @@ -17,21 +17,18 @@ The following limits apply to Hyperdrive configuration, connections, and queries | Maximum query (statement) duration | 60 seconds | | Maximum username length | 63 characters (bytes) [^1] | | Maximum database name length | 63 characters (bytes) [^1] | -| Maximum origin database connections per region | 10-20 | -| Maximum potential origin database connections | 10 \* number of regions serving traffic (approx. \~80 - 100 connections) [^2] | +| Maximum potential origin database connections | approx. \~100 connections [^2] | :::note - Hyperdrive does not have a hard limit on the number of concurrent *client* connections made from your Workers. As many hosted databases have limits on the number of unique connections they can manage, Hyperdrive attempts to keep number of concurrent pooled connections to your origin database lower. - ::: [^1]: This is a limit enforced by PostgreSQL. Some database providers may enforce smaller limits. -[^2]: Hyperdrive maintains semi-regional connection pools to balance between latency, reliability and overall load on your origin database. +[^2]: Hyperdrive is a distributed system, so it is possible for a client to be unable to reach an existing pool. In this scenario, a new pool will be established, with its own allocation of connections. This favors availability over strictly enforcing limits, but does mean that it is possible in edge cases to overshoot the normal connection limit. :::note You can request adjustments to limits that conflict with your project goals by contacting Cloudflare. Not all limits can be increased. To request an increase, submit a [Limit Increase Request](https://forms.gle/ukpeZVLWLnKeixDu7) and we will contact you with next steps. -::: +::: \ No newline at end of file diff --git a/src/content/docs/hyperdrive/tutorials/serverless-timeseries-api-with-timescale/index.mdx b/src/content/docs/hyperdrive/tutorials/serverless-timeseries-api-with-timescale/index.mdx index 523cb957f4a3ac..bd3d0c12ffc8ee 100644 --- a/src/content/docs/hyperdrive/tutorials/serverless-timeseries-api-with-timescale/index.mdx +++ b/src/content/docs/hyperdrive/tutorials/serverless-timeseries-api-with-timescale/index.mdx @@ -13,7 +13,7 @@ languages: - SQL --- -import { Render, PackageManagers } from "~/components"; +import { Render, PackageManagers, WranglerConfig } from "~/components"; In this tutorial, you will learn to build an API on Workers which will ingest and query time-series data stored in [Timescale](https://www.timescale.com/) (they make PostgreSQL faster in the cloud). @@ -140,9 +140,7 @@ Hyperdrive will attempt to connect to your database with the provided credential ::: -This command outputs your Hyperdrive ID. You can now bind your Hyperdrive configuration to your Worker in your `wrangler.toml` configuration by replacing the content with the following: - -import { WranglerConfig } from "~/components"; +This command outputs your Hyperdrive ID. You can now bind your Hyperdrive configuration to your Worker in your Wrangler configuration by replacing the content with the following: diff --git a/src/content/docs/images/index.mdx b/src/content/docs/images/index.mdx index e73544be71eabd..a199fafffe78d8 100644 --- a/src/content/docs/images/index.mdx +++ b/src/content/docs/images/index.mdx @@ -1,6 +1,7 @@ --- title: Overview pcx_content_type: overview +description: Streamline your image infrastructure with Cloudflare Images. Store, transform, and deliver images efficiently using Cloudflare's global network. sidebar: order: 1 head: diff --git a/src/content/docs/images/pricing.mdx b/src/content/docs/images/pricing.mdx index 997e060f1470ae..a1323da7e132c1 100644 --- a/src/content/docs/images/pricing.mdx +++ b/src/content/docs/images/pricing.mdx @@ -24,7 +24,7 @@ On the Free plan, you can request up to 5,000 unique transformations each month Once you exceed 5,000 unique transformations: - Existing transformations in cache will continue to be served as expected. -- New transformations will return a `9423` error. If your source image is from the same domain where the transformation is served, then you can use the [`onerror` parameter](/images/transform-images/transform-via-url/#onerror) to redirect to the original image. +- New transformations will return a `9422` error. If your source image is from the same domain where the transformation is served, then you can use the [`onerror` parameter](/images/transform-images/transform-via-url/#onerror) to redirect to the original image. - You will not be charged for exceeding the limits in the Free plan. To request more than 5,000 unique transformations each month, you can purchase an Images Paid plan. diff --git a/src/content/docs/images/reference/troubleshooting.mdx b/src/content/docs/images/reference/troubleshooting.mdx index e9e8bda31cdbe3..5891255cadf231 100644 --- a/src/content/docs/images/reference/troubleshooting.mdx +++ b/src/content/docs/images/reference/troubleshooting.mdx @@ -40,7 +40,7 @@ When resizing fails, the response body contains an error message explaining the * 9504, 9505, & 9510 — The origin server could not be contacted because the origin server may be down or overloaded. Try again later. * 9523 — The `/cdn-cgi/image/` resizing service could not perform resizing. This may happen when an image has invalid format. Use correctly formatted image and try again. * 9524 — The `/cdn-cgi/image/` resizing service could not perform resizing. This may happen when an image URL is intercepted by a Worker. As an alternative you can [resize within the Worker](/images/transform-images/transform-via-workers/). This can also happen when using a `pages.dev` URL of a [Cloudflare Pages](/pages/) project. In that case, you can use a [Custom Domain](/pages/configuration/custom-domains/) instead. -* 9511 — The image format is not supported. Refer to [Supported formats and limitations](/images/transform-images/) to learn about supported input and output formats. +* 9520 — The image format is not supported. Refer to [Supported formats and limitations](/images/transform-images/) to learn about supported input and output formats. * 9522 — The image exceeded the processing limit. This may happen briefly after purging an entire zone or when files with very large dimensions are requested. If the problem persists, contact support. * 9422, 9424, 9516, 9517, 9518, 9522 & 9523 — Internal errors. Please contact support if you encounter these errors. diff --git a/src/content/docs/kv/concepts/kv-bindings.mdx b/src/content/docs/kv/concepts/kv-bindings.mdx index 8ef9fac5ee0949..f0998ba208a3ea 100644 --- a/src/content/docs/kv/concepts/kv-bindings.mdx +++ b/src/content/docs/kv/concepts/kv-bindings.mdx @@ -5,6 +5,8 @@ sidebar: order: 7 --- +import { WranglerConfig } from "~/components"; + KV [bindings](/workers/runtime-apis/bindings/) allow for communication between a Worker and a KV namespace. Configure KV bindings in the [wrangler.toml file](/workers/wrangler/configuration/). @@ -21,9 +23,7 @@ A KV namespace will have a name you choose (for example, `My tasks`), and an ass To execute your Worker, define the binding. -In the following example, the binding is called `TODO`. In the `kv_namespaces` portion of your `wrangler.toml` file, add: - -import { WranglerConfig } from "~/components"; +In the following example, the binding is called `TODO`. In the `kv_namespaces` portion of your Wrangler file, add: @@ -58,7 +58,7 @@ export default { When you use Wrangler to develop locally with the `wrangler dev` command, Wrangler will default to using a local version of KV to avoid interfering with any of your live production data in KV. This means that reading keys that you have not written locally will return `null`. -To have `wrangler dev` connect to your Workers KV namespace running on Cloudflare's global network, call `wrangler dev --remote` instead. This will use the `preview_id` of the KV binding configuration in the `wrangler.toml` file. This is how a `wrangler.toml` file looks with the `preview_id` specified. +To have `wrangler dev` connect to your Workers KV namespace running on Cloudflare's global network, call `wrangler dev --remote` instead. This will use the `preview_id` of the KV binding configuration in the Wrangler file. This is how a Wrangler file looks with the `preview_id` specified. @@ -78,7 +78,7 @@ kv_namespaces = [ ## Access KV from Durable Objects and Workers using ES modules format -[Durable Objects](/durable-objects/) use ES modules format. Instead of a global variable, bindings are available as properties of the `env` parameter [passed to the constructor](/durable-objects/get-started/walkthrough/#3-write-a-durable-object-class). +[Durable Objects](/durable-objects/) use ES modules format. Instead of a global variable, bindings are available as properties of the `env` parameter [passed to the constructor](/durable-objects/get-started/tutorial/#3-write-a-durable-object-class). An example might look like: diff --git a/src/content/docs/kv/concepts/kv-namespaces.mdx b/src/content/docs/kv/concepts/kv-namespaces.mdx index 57d4a6c4fea6ba..42939b6ba116e4 100644 --- a/src/content/docs/kv/concepts/kv-namespaces.mdx +++ b/src/content/docs/kv/concepts/kv-namespaces.mdx @@ -5,7 +5,7 @@ sidebar: order: 7 --- -import { Type, MetaInfo } from "~/components"; +import { Type, MetaInfo, WranglerConfig } from "~/components"; A KV namespace is a key-value database replicated to Cloudflare’s global network. @@ -35,8 +35,6 @@ To bind KV namespaces to your Worker, assign an array of the below object to the Example: -import { WranglerConfig } from "~/components"; - ```toml title="wrangler.toml" diff --git a/src/content/docs/kv/examples/workers-kv-to-serve-assets.mdx b/src/content/docs/kv/examples/workers-kv-to-serve-assets.mdx index 7fa1702a33f362..ba78758a47484f 100644 --- a/src/content/docs/kv/examples/workers-kv-to-serve-assets.mdx +++ b/src/content/docs/kv/examples/workers-kv-to-serve-assets.mdx @@ -80,7 +80,7 @@ To create a KV store via Wrangler: id = "" ``` -2. In your `wrangler.toml` file, add the following with the values generated in the terminal: +2. In your Wrangler file, add the following with the values generated in the terminal: ```bash {3} title="wrangler.toml" [[kv_namespaces]] @@ -90,7 +90,7 @@ To create a KV store via Wrangler: The [KV binding](/kv/concepts/kv-bindings/) `assets` is how your Worker will interact with the [KV namespace](/kv/concepts/kv-namespaces/). This binding will be provided as a runtime variable within your Workers code by the Workers runtime. - We'll also create a preview KV namespace. It is recommended to create a separate KV namespace when developing locally to avoid making changes to the production namespace. When developing locally against remote resources, the Wrangler CLI will only use the namespace specified by `preview_id` in the KV namespace configuration of the `wrangler.toml` file. + We'll also create a preview KV namespace. It is recommended to create a separate KV namespace when developing locally to avoid making changes to the production namespace. When developing locally against remote resources, the Wrangler CLI will only use the namespace specified by `preview_id` in the KV namespace configuration of the Wrangler file. 3. In your terminal, run the following command: @@ -113,7 +113,7 @@ To create a KV store via Wrangler: preview_id = "" ``` -4. In your `wrangler.toml` file, add the additional preview_id below kv_namespaces with the values generated in the terminal: +4. In your Wrangler file, add the additional preview_id below kv_namespaces with the values generated in the terminal: ```bash {4} title="wrangler.toml" [[kv_namespaces]] @@ -141,7 +141,7 @@ npx wrangler kv key put index.html --path index.html --binding assets --preview npx wrangler kv key put index.html --path index.html --binding assets --preview ``` -This will create a KV pair with the filename as key and the file content as value, within the our production and preview namespaces specified by your binding in your `wrangler.toml` file. +This will create a KV pair with the filename as key and the file content as value, within the our production and preview namespaces specified by your binding in your Wrangler file. ## 4. Serve static assets from KV from your Worker application @@ -377,7 +377,7 @@ Run `wrangler deploy` to deploy your Workers project to Cloudflare with the bind npx wrangler deploy ``` -Wrangler will automatically set your KV binding to use the production KV namespace set in our `wrangler.toml` file with the KV namespace id. Throughout this example, we uploaded our assets to both the preview and the production KV namespaces. +Wrangler will automatically set your KV binding to use the production KV namespace set in our Wrangler file with the KV namespace id. Throughout this example, we uploaded our assets to both the preview and the production KV namespaces. We can now verify that our project is properly working by accessing our Workers default hostname and accessing `..dev/index.html` or `..dev/hello-world` to see our deployed Worker in action, generating responses from the values in our KV store. diff --git a/src/content/docs/kv/get-started.mdx b/src/content/docs/kv/get-started.mdx index 07864f5ec22060..e3e22e1a1852fd 100644 --- a/src/content/docs/kv/get-started.mdx +++ b/src/content/docs/kv/get-started.mdx @@ -61,13 +61,13 @@ Create a new Worker to read and write to your KV namespace. - testconfig.json - vitest.config.mts - worker-configuration.d.ts - - **wrangler.toml** + - **wrangler.json** Your new `kv-tutorial` directory includes: - A `"Hello World"` [Worker](/workers/get-started/guide/#3-write-code) in `index.ts`. - - A [`wrangler.toml`](/workers/wrangler/configuration/) configuration file. `wrangler.toml` is how your `kv-tutorial` Worker accesses your kv database. + - A [`wrangler.json`](/workers/wrangler/configuration/) configuration file. `wrangler.json` is how your `kv-tutorial` Worker accesses your kv database. 2. Change into the directory you just created for your Worker project: @@ -119,7 +119,7 @@ To create a KV namespace via Wrangler: npx wrangler kv namespace create ``` - The `npx wrangler kv namespace create ` subcommand takes a new binding name as its argument. A KV namespace is created using a concatenation of your Worker’s name (from your `wrangler.toml` file) and the binding name you provide. A `BINDING_ID` is randomly generated for you. + The `npx wrangler kv namespace create ` subcommand takes a new binding name as its argument. A KV namespace is created using a concatenation of your Worker’s name (from your Wrangler file) and the binding name you provide. A `BINDING_ID` is randomly generated for you. For this tutorial, use the binding name `BINDING_NAME`. @@ -161,7 +161,7 @@ To bind your KV namespace to your Worker: -1. In your `wrangler.toml` file, add the following with the values generated in your terminal from [step 2](/kv/get-started/#2-create-a-kv-namespace): +1. In your Wrangler file, add the following with the values generated in your terminal from [step 2](/kv/get-started/#2-create-a-kv-namespace): @@ -182,7 +182,7 @@ To bind your KV namespace to your Worker: :::note[Bindings] -A binding is how your Worker interacts with external resources such as [KV namespaces](/kv/concepts/kv-namespaces/). A binding is a runtime variable that the Workers runtime provides to your code. You can declare a variable name in your `wrangler.toml` file that binds to these resources at runtime, and interact with them through this variable. Every binding's variable name and behavior is determined by you when deploying the Worker. +A binding is how your Worker interacts with external resources such as [KV namespaces](/kv/concepts/kv-namespaces/). A binding is a runtime variable that the Workers runtime provides to your code. You can declare a variable name in your Wrangler file that binds to these resources at runtime, and interact with them through this variable. Every binding's variable name and behavior is determined by you when deploying the Worker. Refer to [Environment](/kv/reference/environments/) for more information. @@ -315,7 +315,7 @@ You can view key-value pairs directly from the dashboard. When using [`wrangler dev`](/workers/wrangler/commands/#dev) to develop locally, Wrangler defaults to using a local version of KV to avoid interfering with any of your live production data in KV. This means that reading keys that you have not written locally returns null. -To have `wrangler dev` connect to your Workers KV namespace running on Cloudflare's global network, call `wrangler dev --remote` instead. This uses the `preview_id` of the KV binding configuration in the `wrangler.toml` file. Refer to the [KV binding docs](/kv/concepts/kv-bindings/#use-kv-bindings-when-developing-locally) for more information. +To have `wrangler dev` connect to your Workers KV namespace running on Cloudflare's global network, call `wrangler dev --remote` instead. This uses the `preview_id` of the KV binding configuration in the Wrangler file. Refer to the [KV binding docs](/kv/concepts/kv-bindings/#use-kv-bindings-when-developing-locally) for more information. ::: diff --git a/src/content/docs/kv/platform/limits.mdx b/src/content/docs/kv/platform/limits.mdx index d2f3d3e2a072d6..085a4c2e5f302d 100644 --- a/src/content/docs/kv/platform/limits.mdx +++ b/src/content/docs/kv/platform/limits.mdx @@ -16,7 +16,7 @@ import { Render } from "~/components" | Writes to different keys | 1,000 writes per day | Unlimited | | Writes to same key | 1 per second | 1 per second | | Operations/worker invocation | 1000 | 1000 | -| Namespaces | 200 | 200 | +| Namespaces | 1000 | 1000 | | Storage/account | 1 GB | Unlimited | | Storage/namespace | 1 GB | Unlimited | | Keys/namespace | Unlimited | Unlimited | diff --git a/src/content/docs/kv/reference/environments.mdx b/src/content/docs/kv/reference/environments.mdx index 4b4f6d58e9e626..8eef01fdb0e69c 100644 --- a/src/content/docs/kv/reference/environments.mdx +++ b/src/content/docs/kv/reference/environments.mdx @@ -5,11 +5,11 @@ sidebar: order: 3 --- -KV namespaces can be used with [environments](/workers/wrangler/environments/). This is useful when you have code in your Worker that refers to a KV binding like `MY_KV`, and you want to have these bindings point to different KV namespaces (for example, one for staging and one for production). +import { WranglerConfig } from "~/components"; -The following code in the `wrangler.toml` file shows you how to have two environments that have two different KV namespaces but the same binding name: +KV namespaces can be used with [environments](/workers/wrangler/environments/). This is useful when you have code in your Worker that refers to a KV binding like `MY_KV`, and you want to have these bindings point to different KV namespaces (for example, one for staging and one for production). -import { WranglerConfig } from "~/components"; +The following code in the Wrangler file shows you how to have two environments that have two different KV namespaces but the same binding name: @@ -52,7 +52,7 @@ Most `kv` subcommands also allow you to specify an environment with the optional Specifying an environment with the optional `--env` flag allows you to publish Workers running the same code but with different KV namespaces. -For example, you could use separate staging and production KV namespaces for KV data in your `wrangler.toml` file: +For example, you could use separate staging and production KV namespaces for KV data in your Wrangler file: @@ -78,9 +78,9 @@ kv_namespaces = [ -With the `wrangler.toml` file above, you can specify `--env production` when you want to perform a KV action on the KV namespace `MY_KV` under `env.production`. +With the Wrangler file above, you can specify `--env production` when you want to perform a KV action on the KV namespace `MY_KV` under `env.production`. -For example, with the `wrangler.toml` file above, you can get a value out of a production KV instance with: +For example, with the Wrangler file above, you can get a value out of a production KV instance with: ```sh wrangler kv key get --binding "MY_KV" --env=production "" diff --git a/src/content/docs/learning-paths/secure-internet-traffic/build-http-policies/tls-inspection.mdx b/src/content/docs/learning-paths/secure-internet-traffic/build-http-policies/tls-inspection.mdx index 54a28595a39586..b793700bb0ec3e 100644 --- a/src/content/docs/learning-paths/secure-internet-traffic/build-http-policies/tls-inspection.mdx +++ b/src/content/docs/learning-paths/secure-internet-traffic/build-http-policies/tls-inspection.mdx @@ -38,7 +38,7 @@ To turn on TLS inspection for your Zero Trust organization: ### 3. Determine the certificate used for inspection -TLS inspection requires a trusted private root certificate to be able to inspect and filter encrypted traffic. A [Cloudflare root certificate](/cloudflare-one/connections/connect-devices/user-side-certificates/automated-deployment/) is a simple and common solution that is usually appropriate for testing or proof-of-concept conditions when deployed to your devices. +TLS inspection requires a trusted private root certificate to be able to inspect and filter encrypted traffic. A [Cloudflare root certificate](/cloudflare-one/connections/connect-devices/user-side-certificates/automated-deployment/) is a simple and common solution that is usually appropriate for testing or proof-of-concept conditions when deployed to your devices. You can [generate a Cloudflare certificate](/cloudflare-one/connections/connect-devices/user-side-certificates/#generate-a-cloudflare-root-certificate) in Zero Trust. Alternatively, if you already have a root CA that you use for other inspection or trust applications, we recommend [using your own certificate](/cloudflare-one/connections/connect-devices/user-side-certificates/custom-certificate/). A few reasons for this include: @@ -46,6 +46,8 @@ Alternatively, if you already have a root CA that you use for other inspection o - If external services like Git workflows or CLI tools rely on an existing certificate store, presenting the same certificate in inspection is far less likely to interrupt their traffic flow, although these are things that you may wish to exempt from inspection. - If you are using [WARP Connector](/cloudflare-one/connections/connect-networks/private-net/warp-connector/) or a [Magic WAN](/magic-wan/) IPsec/GRE tunnel to on-ramp traffic to Cloudflare, devices behind those tunnels will not be able to use HTTP policies that require TLS inspection unless they have a certificate that matches your organization's certificate of choice. Your network infrastructure most likely already has your own device certificates deployed, so using your own existing public key infrastructure for inspection will simplify protection. +Once you generate a Cloudflare certificate or upload a custom certificate, you will need to set it as **Available** to deploy it across the Cloudflare network and as **In-Use** to use it for inspection. For more information, refer to [Activate a root certificate](/cloudflare-one/connections/connect-devices/user-side-certificates/#activate-a-root-certificate). + ### 4. Build a baseline Do Not Inspect policy Do you want to inspect all traffic by default, or do you only want to inspect explicit destinations? We recommend that you build a Gateway list of applications and endpoints to exclude from inspection and add the list as an OR operator in addition to our existing Do Not Inspect application group. For example: diff --git a/src/content/docs/learning-paths/workers/get-started/c3-and-wrangler.mdx b/src/content/docs/learning-paths/workers/get-started/c3-and-wrangler.mdx index 64125e6c313051..49ab962c55310a 100644 --- a/src/content/docs/learning-paths/workers/get-started/c3-and-wrangler.mdx +++ b/src/content/docs/learning-paths/workers/get-started/c3-and-wrangler.mdx @@ -35,9 +35,9 @@ When you run C3 to create your project, C3 will install the latest version of Wr ## Source of truth -If you are building your Worker on the Cloudflare dashboard, you will set up your project configuration (such as environment variables, bindings, and routes) through the dashboard. If you are building your project programmatically using C3 and Wrangler, you will rely on a [`wrangler.toml`](/workers/wrangler/configuration/) file to configure your Worker. +If you are building your Worker on the Cloudflare dashboard, you will set up your project configuration (such as environment variables, bindings, and routes) through the dashboard. If you are building your project programmatically using C3 and Wrangler, you will rely on a [`wrangler.toml / wrangler.json` file](/workers/wrangler/configuration/) to configure your Worker. -Cloudflare recommends choosing and using one [source of truth](/workers/wrangler/configuration/#source-of-truth), the dashboard or `wrangler.toml`, to avoid errors in your project. +Cloudflare recommends choosing and using one [source of truth](/workers/wrangler/configuration/#source-of-truth), the dashboard or the `wrangler.toml / wrangler.json` file (for example, `wrangler.json` or `wrangler.toml`), to avoid errors in your project. ## Summary diff --git a/src/content/docs/learning-paths/workers/get-started/first-worker.mdx b/src/content/docs/learning-paths/workers/get-started/first-worker.mdx index b179eb3177fcbc..f43daf62364bfe 100644 --- a/src/content/docs/learning-paths/workers/get-started/first-worker.mdx +++ b/src/content/docs/learning-paths/workers/get-started/first-worker.mdx @@ -53,7 +53,7 @@ Refer to [How to run Wrangler commands](/workers/wrangler/commands/#how-to-run-w In your Worker project directory, C3 has generated the following: -1. `wrangler.toml`: Your [Wrangler](/workers/wrangler/configuration/#sample-wrangler-configuration) configuration file. +1. `wrangler.json`: Your [Wrangler](/workers/wrangler/configuration/#sample-wrangler-configuration) configuration file. 2. `index.js` (in `/src`): A minimal `'Hello World!'` Worker written in [ES module](/workers/reference/migrate-to-module-workers/) syntax. 3. `package.json`: A minimal Node dependencies configuration file. 4. `package-lock.json`: Refer to [`npm` documentation on `package-lock.json`](https://docs.npmjs.com/cli/v9/configuring-npm/package-lock-json). diff --git a/src/content/docs/load-balancing/load-balancers/dns-records.mdx b/src/content/docs/load-balancing/load-balancers/dns-records.mdx index fc5e7c8ed57828..2acb51acde41fc 100644 --- a/src/content/docs/load-balancing/load-balancers/dns-records.mdx +++ b/src/content/docs/load-balancing/load-balancers/dns-records.mdx @@ -60,7 +60,7 @@ If you already have an existing `A`, `AAAA`, or `CNAME` record, be aware that th ## SSL/TLS coverage -Due to internal limitations, Cloudflare [Universal SSL certificates](/ssl/edge-certificates/universal-ssl/) do not cover load balancing hostnames by default. This behavior will be corrected in the future. +Due to internal limitations, on [Partial (CNAME) setup](/dns/zone-setups/partial-setup/) the Cloudflare [Universal SSL certificates](/ssl/edge-certificates/universal-ssl/) do not cover load balancing hostnames by default. This behavior will be corrected in the future. As a current workaround for a domain or first-level subdomain (`lb.example.com`), create a [proxied `CNAME`/`A`/`AAAA` record](/dns/manage-dns-records/how-to/create-dns-records/) for that hostname. diff --git a/src/content/docs/load-balancing/monitors/index.mdx b/src/content/docs/load-balancing/monitors/index.mdx index 7c45ffddeff40e..1a5f5ed0449289 100644 --- a/src/content/docs/load-balancing/monitors/index.mdx +++ b/src/content/docs/load-balancing/monitors/index.mdx @@ -78,7 +78,7 @@ The Cloudflare API supports the following commands for monitors. Examples are gi The following table summarizes the different types of monitors available in Cloudflare Load Balancing, their monitoring types, and how each health check process evaluates the success criteria to determine endpoint health: -| Monitor type | Monitoring type | Description | Health check process | Sucess critera | +| Monitor type | Monitoring type | Description | Health check process | Success criteria | | ------------ | -------------- | ----------- | -------------------- | -------------- | | HTTP/HTTPS | Public and private | Used for HTTP and HTTPS endpoints with specific protocol attributes. | The probe is configured with settings and success criteria such as Method, Simulate Zone, Follow Redirects, Request Headers, and Response Body. The probe then evaluates the configured success criteria using the HTTP protocol. Throughout the configured timeout period, the TCP connection is kept active using [keep-alives](/fundamentals/reference/tcp-connections/#tcp-connections-and-keep-alives), even if no response is received. | Success is based on meeting the configured HTTP success criteria. No response within the configured timeout and retries is considered unhealthy. | | TCP | Public and private | Checks TCP connectivity by attempting to open a connection to the endpoint. | The monitor sends a TCP SYN message to the specified port. A successful health check requires receiving a SYN/ACK message to establish the connection. The connection is closed by sending a FIN or RST packet, or by receiving a FIN packet from the endpoint. | Failure to establish a TCP connection within the configured timeout and retries is considered unhealthy. | diff --git a/src/content/docs/logs/faq/common-calculations.mdx b/src/content/docs/logs/faq/common-calculations.mdx index b8c2e54601f16b..f199813807313c 100644 --- a/src/content/docs/logs/faq/common-calculations.mdx +++ b/src/content/docs/logs/faq/common-calculations.mdx @@ -1,6 +1,6 @@ --- pcx_content_type: faq -title: Common calculations +title: Common calculations FAQ structured_data: true sidebar: order: 4 diff --git a/src/content/docs/logs/faq/instant-logs.mdx b/src/content/docs/logs/faq/instant-logs.mdx index 13d7e77beaa519..f8d25230cbde4e 100644 --- a/src/content/docs/logs/faq/instant-logs.mdx +++ b/src/content/docs/logs/faq/instant-logs.mdx @@ -1,6 +1,6 @@ --- pcx_content_type: faq -title: Instant Logs +title: Instant Logs FAQ structured_data: true sidebar: order: 5 diff --git a/src/content/docs/logs/faq/logpull-api.mdx b/src/content/docs/logs/faq/logpull-api.mdx index 37c7790653bc62..19df58b94e0286 100644 --- a/src/content/docs/logs/faq/logpull-api.mdx +++ b/src/content/docs/logs/faq/logpull-api.mdx @@ -1,6 +1,6 @@ --- pcx_content_type: faq -title: Logpull API +title: Logpull API FAQ structured_data: true sidebar: order: 3 diff --git a/src/content/docs/logs/faq/logpush.mdx b/src/content/docs/logs/faq/logpush.mdx index 14629cc22a462d..150714a318d265 100644 --- a/src/content/docs/logs/faq/logpush.mdx +++ b/src/content/docs/logs/faq/logpush.mdx @@ -1,6 +1,6 @@ --- pcx_content_type: faq -title: Logpush +title: Logpush FAQ structured_data: true sidebar: order: 2 diff --git a/src/content/docs/logs/get-started/permissions.mdx b/src/content/docs/logs/get-started/permissions.mdx index 763139878782c5..b3a010a033b17b 100644 --- a/src/content/docs/logs/get-started/permissions.mdx +++ b/src/content/docs/logs/get-started/permissions.mdx @@ -10,9 +10,9 @@ Below is a description of the available permissions for tokens and roles as they ## Tokens -* **Logs: Read** - Grants read access to logs using Logpull or Instant Logs. +- **Logs: Read** - Grants read access to logs using Logpull or Instant Logs. -* **Logs: Write** - Grants read and write access to Logpull and Logpush, and read access to Instant Logs. +- **Logs: Write** - Grants read and write access to Logpull and Logpush, and read access to Instant Logs. Note that all Logpush API operations require **Logs: Write** permission because Logpush jobs contain sensitive information. :::note[Note] diff --git a/src/content/docs/magic-transit/index.mdx b/src/content/docs/magic-transit/index.mdx index 06cdfc1a892f83..7ed8a46a187851 100644 --- a/src/content/docs/magic-transit/index.mdx +++ b/src/content/docs/magic-transit/index.mdx @@ -37,6 +37,10 @@ Magic Transit steers traffic along tunnel routes based on priorities you define Use Cloudflare-owned IP addresses if you want to protect a smaller network and do not meet Magic Transit's `/24` prefix length requirements. + +Use BGP peering between your networks and Cloudflare to automate the process of adding or removing networks and subnets, and take advantage of failure detection and session recovery features. + + --- ## Related products diff --git a/src/content/docs/magic-transit/reference/tunnel-health-checks.mdx b/src/content/docs/magic-transit/reference/tunnel-health-checks.mdx index f54c61af202e8b..4ac972925b9cb0 100644 --- a/src/content/docs/magic-transit/reference/tunnel-health-checks.mdx +++ b/src/content/docs/magic-transit/reference/tunnel-health-checks.mdx @@ -11,11 +11,11 @@ import { Render } from "~/components"; diff --git a/src/content/docs/magic-wan/configuration/manually/third-party/azure/azure-virtual-wan.mdx b/src/content/docs/magic-wan/configuration/manually/third-party/azure/azure-virtual-wan.mdx new file mode 100644 index 00000000000000..4000a904d96f94 --- /dev/null +++ b/src/content/docs/magic-wan/configuration/manually/third-party/azure/azure-virtual-wan.mdx @@ -0,0 +1,144 @@ +--- +pcx_content_type: integration-guide +title: Microsoft Azure Virtual WAN +--- + +This tutorial provides information on how to connect Magic WAN to a Microsoft Azure Virtual WAN hub. + +## Prerequisites + +You will need to have an existing Resource group, Virtual Network, and Virtual Machine created in your Azure account. Refer to [Microsoft's documentation](https://learn.microsoft.com/en-us/azure/virtual-network/) to learn more on how to create these. + +## Start Azure configuration + +### 1. Create a Virtual WAN + +To connect one or more VNets to Magic WAN via a Virtual WAN hub, you first need to create a Virtual WAN (vWAN) resource representing your Azure network. If you already have a vWAN that you wish to connect to Magic WAN, continue to the next step. Refer to [Microsoft's documentation](https://learn.microsoft.com/en-us/azure/virtual-wan/virtual-wan-site-to-site-portal#openvwan) to learn more. + +1. In the Azure portal, go to your **Virtual WANs** page. +2. Select the option to create a **Virtual WAN**. +3. Create a Virtual WAN with the **Type** set to **Standard**. + +### 2. Create a Virtual WAN Hub + +Using traditional hub and spoke terminology, a Virtual WAN Hub deployed within a vWAN is the hub to which your VNet(s) and Magic WAN attach as spokes. The vWAN hub deployed in this step will contain a VPN Gateway for connecting to Magic WAN. + +1. Create a **Virtual WAN Hub**. +2. In **Basics**: + 1. Select your resource group as well as your desired region, capacity, and hub routing preference. Microsoft recommends using the default hub routing preference of **ExpressRoute** unless you have a specific need to change this setting. Refer to [Microsoft's documentation](https://learn.microsoft.com/en-us/azure/virtual-wan/about-virtual-hub-routing-preference) to learn more about Azure hub routing preferences. + 2. Configure the **Hub Private Address Space**. Choose an [address space with a subnet mask of `/24` or greater](https://learn.microsoft.com/en-us/azure/virtual-wan/virtual-wan-site-to-site-portal#hub) that does not overlap with the address spaces of any VNets you wish to attach to the vWAN Hub, nor with any of your Magic WAN sites. +3. In **Site to Site**: + 1. In **Do you want to create a Site to site (VPN gateway)?** select **Yes**. + 2. Select your desired **Gateway scale units** and **Routing Preference**. Refer to [Microsoft's documentation](https://learn.microsoft.com/en-us/azure/virtual-network/ip-services/routing-preference-overview#routing-via-microsoft-global-network) to learn more about Azure routing preferences. +4. Select **Create**. Note that the deployment time for the vWAN Hub and VPN Gateway may take 30 minutes or more. +5. After the VPN Gateway has finished provisioning, go to **Virtual WAN** > **Hubs** > **Your vHub** > **Connectivity** > **VPN (Site to site)**. +6. In the **Essentials** dropdown select the VPN Gateway listed. +7. Select the JSON View for the VPN Gateway and take note of the JSON attributes at the paths `properties.ipConfigurations[0].publicIpAddress` and `properties.ipConfigurations[1].publicIpAddress`. These will be the customer endpoints needed when configuring IPsec tunnels for Magic WAN. + +### 3. Create a VPN site + +A VPN site represents the remote site your Azure vWAN can reach through a VPN connection. This is typically an on-premises location. In this case, the VPN site represents Magic WAN. + +1. Go to **Virtual WAN** > **VPN sites** > **Create site**. +2. In **Basics**: + 1. Configure your desired region and name. + 2. Configure the **Device vendor** as Cloudflare. + 3. In **Private address space**, specify the address range(s) you wish to access from your vWAN through Magic WAN. This could include other private networks connected to your Magic WAN, or a default route (`0.0.0.0/0`) if you want Internet egress traffic to traverse Magic WAN (that is, to be scanned by Cloudflare Gateway). The address space can be modified after VPN site creation. +3. In **Links**: + 1. Configure a single link. Provide a name, speed (in Mbps), and provider name (here, enter `Cloudflare`) for your link. For the **Link IP address**, enter your Cloudflare anycast address. The **BGP address** and **ASN** fields should be left empty. BGP is not supported at the time of writing this tutorial. +4. Select **Create**. + +### 4. Configure VPN site for Magic IPsec tunnel health checks + +Magic WAN uses [Tunnel Health Checks](/magic-wan/reference/tunnel-health-checks/) to monitor whether a tunnel is available. + +Tunnel health checks make use of ICMP probes sent from the Cloudflare side of the Magic IPsec tunnel to the remote endpoint (Azure). Probes are sent from the tunnel's interface address, which you specify in two places: + +- **Cloudflare Dashboard:** In your Magic IPsec tunnel configuration as the address of the virtual tunnel interface (VTI) (so that Cloudflare knows what address to send probes from). Cloudflare requires this address in CIDR notation with a `/31` netmask. +- **Azure Portal:** In your VPN site's address space (so that Azure routes probe responses back over the tunnel). Azure requires this address in CIDR notation with a `/32` netmask. + +Cloudflare recommends that you select a unique `/31` subnet ([RFC 1918 — Address Allocation for Private Internets](https://datatracker.ietf.org/doc/html/rfc1918)) for each IPsec tunnel which is treated as a Point-to-Point Link and provides the ideal addressing scheme to satisfy both requirements. + +Example: + +- Select `169.254.251.137/31` as your unique Point-to-Point Link subnet. +- In the Cloudflare dashboard, set `169.254.251.137/31` as your tunnel's **IPv4 Interface address**. (Refer to [Configure Magic WAN](#configure-magic-wan) below.) +- In the Azure portal, add `169.254.251.137/32` to your VPN site's **Private address space**. + +:::note +It is important to ensure the subnet selected for the Interface Address does not overlap with any other subnet. + +You should also refer to RFC 3021 for more information on using 31-bit prefixes on [IPv4 Point-to-Point Links](https://datatracker.ietf.org/doc/html/rfc3021). +::: + +To configure the Address Space for the Local Network Gateway to support Tunnel Health Checks: + +1. Go to **Virtual WAN** > **VPN sites** > **Your VPN Site** > **Edit site** to edit the VPN site configured in the previous section. +2. Update the **Private address space** to include two `/32` subnets in CIDR notation as described above. When using Azure VPN Gateways with vWAN Hubs, a single VPN Gateway Connection maps to two Magic WAN IPsec Tunnels. For this reason, we need to select two unique `/31` subnets, one for each Cloudflare IPsec Tunnel. The upper address of each `/31` is then added to the VPN Site's Private address space as a `/32`subnet. +3. Select **Confirm**. + +### 5. Create a Virtual Network Connection + +To connect your existing VNet to your newly created vHub: + +1. Go to **Virtual WAN** > **Virtual network connections** and select **Add connection**. +2. Configure the connection to connect the desired VNet to the vHub created above. +3. Ensure that within the connection's **Routing configuration**: + 1. **Propagate to none** is set to **No.** + 2. **Bypass Next Hop IP for workloads within this VNet** is set to **No** + 3. And **Propagate static route** is set to **Yes**. +4. Select **Create**. + +## Configure Magic WAN + +When connecting your Azure vHub VPN Gateway to Magic WAN, two Cloudflare tunnels are required to map to the single Azure VPN Gateway Connection created above. This is because Azure VPN Gateways are deployed with two public IP addresses. + +1. Create an [IPsec tunnel](/magic-wan/configuration/manually/how-to/configure-tunnels/#add-tunnels) in the Cloudflare dashboard. +2. Make sure you have the following settings: + 1. **Interface address**: Add the upper IP address within the first `/31` subnet selected in step 4 of the Start Azure Configuration section. Refer to [Tunnel endpoints](/magic-wan/configuration/manually/how-to/configure-tunnels/) for more details. + 2. **Customer endpoint**: The first public IP associated with your Azure VPN Gateway. For example, `40.xxx.xxx.xxx`. + 3. **Cloudflare endpoint**: Use the Cloudflare anycast address you have received from your account team. This will also be the IP address corresponding to the VPN Site in Azure. For example, `162.xxx.xxx.xxx`. + 4. **Health check rate**: Medium (default). + 5. **Health check type**: Reply (default). + 6. **Health check direction**: Bidirectional (default). + 7. **Health check target**: Custom; enter the customer endpoint. + 8. **Add pre-shared key later**: Select this option to create a PSK that will be used later in Azure. + 9. **Replay protection**: **Enable**. +3. Edit the tunnel. Generate a new pre-shared key and copy the key to a safe location. +4. Create static routes for your Azure Virtual Network subnets, specifying the newly created tunnel as the next hop. +5. Create the second IPsec tunnel in the Cloudflare dashboard. Copy the configuration of the first tunnel with the following exceptions: + 1. **Interface address**: Add the upper IP address within the **second** `/31` subnet selected in step 4 of the Start Azure Configuration section. + 2. **Customer endpoint**: The **second** Public IP associated with your Azure VPN Gateway. + 3. **Health check target**: Enter the new customer endpoint as a custom target. + 4. **Use my own pre-shared key**: Select this option and enter the key generated for the first tunnel. +6. Create static routes for your Azure Virtual Network subnets, specifying the newly created tunnel as the next hop. To use one tunnel as primary and the other as backup, give the primary tunnel's route a lower priority. To ECMP load balance across both tunnels, assign both routes the same priority. + +## Finish Azure Configuration + +### 1. Create an IPsec VPN Gateway Connection + +To create a **VPN Gateway Connection**: + +1. Go to **Virtual WAN** > **Hubs** > **Your vHub** > **Connectivity** > **VPN (Site to site)** and remove the default filter **Hub association: Connected** to display the **VPN Site** created above. +2. Check the box next to your VPN Site and select **Connect VPN sites**. + +Choose the following settings when creating your VPN Connection: + +1. **PSK**: Provide the PSK generated by Cloudflare for your Magic WAN Tunnels. +2. **Protocol**: *IKEv2* +3. **IPsec**: *Custom* + 1. **IPsec SA lifetime in seconds**: 28800 + 2. **IKE Phase 1** + 1. **Encryption**: *AES256* + 2. **Integrity/PRF**: *SHA256* + 3. **DH Group**: *ECP384* + 3. **IKE Phase 2(IPsec)** + 1. **IPsec Encryption**: *AES256* + 2. **IPsec Integrity**: *SHA256* + 3. **PFS Group**: *ECP384* + 4. **Propagate Default Route:** **Disable** + 5. **Use policy based traffic selector**: **Disable** + 6. **Connection mode**: **Initiator Only** + 7. **Configure traffic selector?**: **Disabled** + +4. Select **Connect**. \ No newline at end of file diff --git a/src/content/docs/magic-wan/configuration/manually/third-party/azure.mdx b/src/content/docs/magic-wan/configuration/manually/third-party/azure/azure-vpn-gateway.mdx similarity index 99% rename from src/content/docs/magic-wan/configuration/manually/third-party/azure.mdx rename to src/content/docs/magic-wan/configuration/manually/third-party/azure/azure-vpn-gateway.mdx index bf72ed89c695fc..1cc173cee69f62 100644 --- a/src/content/docs/magic-wan/configuration/manually/third-party/azure.mdx +++ b/src/content/docs/magic-wan/configuration/manually/third-party/azure/azure-vpn-gateway.mdx @@ -1,6 +1,6 @@ --- pcx_content_type: integration-guide -title: Microsoft Azure +title: Microsoft Azure VPN Gateway --- This tutorial provides information on how to connect Cloudflare Magic WAN to your Azure Virtual Network, using the Azure Virtual Network Gateway. diff --git a/src/content/docs/magic-wan/configuration/manually/third-party/azure/index.mdx b/src/content/docs/magic-wan/configuration/manually/third-party/azure/index.mdx new file mode 100644 index 00000000000000..9edcfc5ab59e91 --- /dev/null +++ b/src/content/docs/magic-wan/configuration/manually/third-party/azure/index.mdx @@ -0,0 +1,13 @@ +--- +pcx_content_type: integration-guide +title: Microsoft Azure +sidebar: + group: + hideIndex: true +--- + +import { DirectoryListing } from "~/components" + +Microsoft Azure integration guides currently available: + + \ No newline at end of file diff --git a/src/content/docs/magic-wan/index.mdx b/src/content/docs/magic-wan/index.mdx index ba703fdc82c6ae..9eab27fa2ead77 100644 --- a/src/content/docs/magic-wan/index.mdx +++ b/src/content/docs/magic-wan/index.mdx @@ -74,6 +74,10 @@ Learn how to [get started](/magic-wan/get-started/). Learn how you can use Magic WAN with other Cloudflare Zero Trust products. + +Use BGP peering between your networks and Cloudflare to automate the process of adding or removing networks and subnets, and take advantage of failure detection and session recovery features. + + --- ## Related products diff --git a/src/content/docs/magic-wan/reference/tunnel-health-checks.mdx b/src/content/docs/magic-wan/reference/tunnel-health-checks.mdx index 9166ee5811bd5a..ab59f0fba6890d 100644 --- a/src/content/docs/magic-wan/reference/tunnel-health-checks.mdx +++ b/src/content/docs/magic-wan/reference/tunnel-health-checks.mdx @@ -12,14 +12,11 @@ import { Render } from "~/components"; file="tunnel-health/tunnel-health-checks" product="magic-transit" params={{ - healthCheckFrequencyURL: - "/magic-wan/configuration/common-settings/tunnel-health-checks/", + addTunnels: "/magic-wan/configuration/manually/how-to/configure-tunnels/#add-tunnels", + changeHealthCheckRate: "/magic-wan/configuration/common-settings/tunnel-health-checks/", + probeHealth: "#health-state-and-prioritization", productName: "Magic WAN", - onboardingURL: - "/magic-wan/configuration/manually/how-to/configure-static-routes/", - configureTunnelEndpointsURL: - "/magic-wan/configuration/manually/how-to/configure-tunnels/", - urlChangeHealthCheckType: - "/magic-wan/configuration/manually/how-to/configure-tunnels/#add-tunnels", + staticRoutes: "/magic-wan/configuration/manually/how-to/configure-static-routes/", + tunnelEndpoints: "/magic-wan/configuration/manually/how-to/configure-tunnels/" }} /> diff --git a/src/content/docs/network/ip-geolocation.mdx b/src/content/docs/network/ip-geolocation.mdx index 3fa8a683d947c7..3a2dd8a5222f3d 100644 --- a/src/content/docs/network/ip-geolocation.mdx +++ b/src/content/docs/network/ip-geolocation.mdx @@ -6,7 +6,7 @@ title: IP geolocation import { FeatureTable, TabItem, Tabs } from "~/components"; -IP geolocation adds the [`CF-IPCountry` header](/fundamentals/reference/http-request-headers/#cf-ipcountry) to all requests to your origin server. +IP geolocation adds the [`CF-IPCountry` header](/fundamentals/reference/http-headers/#cf-ipcountry) to all requests to your origin server. Cloudflare automatically updates its IP geolocation database using MaxMind and other data sources, typically twice a week. @@ -36,7 +36,7 @@ To enable **IP Geolocation** with the API, send a [`PATCH`](/api/resources/zones :::note -In order to use this data, you will need to then retrieve it from the [`CF-IPCountry` header](/fundamentals/reference/http-request-headers/#cf-ipcountry). +In order to use this data, you will need to then retrieve it from the [`CF-IPCountry` header](/fundamentals/reference/http-headers/#cf-ipcountry). ::: diff --git a/src/content/docs/network/true-client-ip-header.mdx b/src/content/docs/network/true-client-ip-header.mdx index 329ce81f983e34..ed0297246c9ae8 100644 --- a/src/content/docs/network/true-client-ip-header.mdx +++ b/src/content/docs/network/true-client-ip-header.mdx @@ -2,12 +2,11 @@ pcx_content_type: troubleshooting source: https://support.cloudflare.com/hc/en-us/articles/206776727-Understanding-the-True-Client-IP-Header title: Understanding the True-Client-IP Header - --- -import { FeatureTable } from "~/components" +import { FeatureTable } from "~/components"; -Enabling the True-Client-IP Header adds the [`True-Client-IP` header](/fundamentals/reference/http-request-headers/#true-client-ip-enterprise-plan-only) to all requests to your origin server, which includes the end user’s IP address. +Enabling the True-Client-IP Header adds the [`True-Client-IP` header](/fundamentals/reference/http-headers/#true-client-ip-enterprise-plan-only) to all requests to your origin server, which includes the end user's IP address. ## Availability @@ -18,17 +17,13 @@ Enabling the True-Client-IP Header adds the [`True-Client-IP` header](/fundament The recommended procedure to access client IP information is to [enable the **Add "True-Client-IP" header** Managed Transform](/rules/transform/managed-transforms/reference/#add-true-client-ip-header). :::note - - -In order to use this data, you will need to then retrieve it from the [`True-Client-IP` header](/fundamentals/reference/http-request-headers/#cf-ipcountry). - - +To use this data, you will need to then retrieve it from the [`True-Client-IP` header](/fundamentals/reference/http-headers/#cf-ipcountry). ::: ## Additional resources For additional guidance on using True-Client-IP Header with Cloudflare, refer to the following resources: -* [Available Managed Transforms](/rules/transform/managed-transforms/reference/#add-true-client-ip-header) -* [HTTP request headers](/fundamentals/reference/http-request-headers/#true-client-ip-enterprise-plan-only) -* [Restoring original visitor IPs](/support/troubleshooting/restoring-visitor-ips/restoring-original-visitor-ips/) +- [Available Managed Transforms](/rules/transform/managed-transforms/reference/#add-true-client-ip-header) +- [Cloudflare HTTP headers](/fundamentals/reference/http-headers/#true-client-ip-enterprise-plan-only) +- [Restoring original visitor IPs](/support/troubleshooting/restoring-visitor-ips/restoring-original-visitor-ips/) diff --git a/src/content/docs/page-shield/how-it-works/index.mdx b/src/content/docs/page-shield/how-it-works/index.mdx index c170aad8bc79b4..db472942975511 100644 --- a/src/content/docs/page-shield/how-it-works/index.mdx +++ b/src/content/docs/page-shield/how-it-works/index.mdx @@ -12,7 +12,7 @@ description: Page Shield tracks resources (such as scripts) loaded by your import { GlossaryTooltip } from "~/components"; -Page Shield helps manage resources loaded by your website visitors, including scripts, their connections, and cookies. It can trigger alert notifications when resources change or are considered malicious. +Page Shield helps manage resources loaded by your website visitors, including scripts, their connections, and [cookies](https://www.cloudflare.com/learning/privacy/what-are-cookies/). It can trigger alert notifications when resources change or are considered malicious. Enabling Page Shield adds a Content Security Policy (CSP) deployed with a [report-only directive](/page-shield/reference/csp-header/) to collect information from the browser. This allows Cloudflare to provide you with a list of all scripts running on your application and the connections they make to third-party endpoints. Page Shield also monitors ingress and egress traffic for cookies, either set by origin servers or by the visitor's browser. diff --git a/src/content/docs/pages/configuration/build-caching.mdx b/src/content/docs/pages/configuration/build-caching.mdx index 669755637cbc83..f2a15dac4433e9 100644 --- a/src/content/docs/pages/configuration/build-caching.mdx +++ b/src/content/docs/pages/configuration/build-caching.mdx @@ -3,36 +3,17 @@ pcx_content_type: concept title: Build caching --- -Improve Pages build times by turning on build caching to restore dependencies and build output between builds. The first build to occur after enabling build caching on your Pages project will save to cache. Every subsequent build will restore from cache unless configured otherwise. +Improve Pages build times by caching dependencies and build output between builds with a project-wide shared cache. -## Requirements +The first build to occur after enabling build caching on your Pages project will save to cache. Every subsequent build will restore from cache unless configured otherwise. -Build caching requires the [V2 build system](/pages/configuration/build-image/#v2-build-system) or later. To update from V1, refer to the [V2 build system migration instructions](/pages/configuration/build-image/#v1-to-v2-migration). - -## Configuration - -### Enable build caching - -To enable build caching in the Cloudflare dashboard: - -1. Log in to the [Cloudflare dashboard](https://dash.cloudflare.com) and select your account. -2. In Account Home, select **Workers & Pages**. -3. In **Overview**, select your Pages project. -4. Go to **Settings** > **Build** > **Build cache** and select **Enable**. +## About build cache -### Clear cache - -The build cache can be cleared for a project if needed, such as when debugging build issues. To clear the build cache: - -1. Log in to the [Cloudflare dashboard](https://dash.cloudflare.com) and select your account. -2. In Account Home, select **Workers & Pages**. -3. In **Overview**, select your Pages project. -4. Go to **Settings** > **Build** > **Build cache**. -5. Select **Clear Cache** to clear the build cache. +When enabled, the build cache will automatically detect and cache data from each build. Refer to [Frameworks](/pages/configuration/build-caching/#frameworks) to review what directories are automatically saved and restored from the build cache. -## How build caching works +### Requirements -When enabled, the build cache will automatically detect and cache data from each build. Refer to [Frameworks](/pages/configuration/build-caching/#frameworks) to review what directories are automatically saved and restored from the build cache. +Build caching requires the [V2 build system](/pages/configuration/build-image/#v2-build-system) or later. To update from V1, refer to the [V2 build system migration instructions](/pages/configuration/build-image/#v1-to-v2-migration). ### Package managers @@ -47,7 +28,9 @@ Pages will cache the global cache directories of the following package managers: ### Frameworks -Caching the build output from frameworks can speed up subsequent build times. The build cache supports the following frameworks: +Some frameworks provide a cache directory that is typically populated by the framework with intermediate build outputs or dependencies during build time. Pages will automatically detect the framework you are using and cache this directory for reuse in subsequent builds. + +The following frameworks support build output caching: | Framework | Directories cached | | ---------- | --------------------------------------------- | @@ -58,9 +41,27 @@ Caching the build output from frameworks can speed up subsequent build times. Th | Next.js | `.next/cache` | | Nuxt | `node_modules/.cache/nuxt` | -## Limits +### Limits The following limits are imposed for build caching: - **Retention**: Cache is purged seven days after its last read date. Unread cache artifacts are purged seven days after creation. - **Storage**: Every project is allocated 10 GB. If the project cache exceeds this limit, the project will automatically start deleting artifacts that were read least recently. + +## Enable build cache + +To enable build caching : + +1. Navigate to [Workers & Pages Overview](https://dash.cloudflare.com) on the Dashboard. +2. Find your Pages project. +3. Go to **Settings** > **Build** > **Build cache**. +4. Select **Enable** to turn on build caching. + +## Clear build cache + +The build cache can be cleared for a project if needed, such as when debugging build issues. To clear the build cache: + +1. Navigate to [Workers & Pages Overview](https://dash.cloudflare.com) on the Dashboard. +2. Find your Pages project. +3. Go to **Settings** > **Build** > **Build cache**. +4. Select **Clear Cache** to clear the build cache. diff --git a/src/content/docs/pages/configuration/git-integration.mdx b/src/content/docs/pages/configuration/git-integration.mdx deleted file mode 100644 index 132cc91f444f48..00000000000000 --- a/src/content/docs/pages/configuration/git-integration.mdx +++ /dev/null @@ -1,128 +0,0 @@ ---- -pcx_content_type: concept -title: Git integration ---- - -Cloudflare supports connecting Cloudflare Pages to your GitHub and GitLab repositories to look for new changes to your project. Pages does not currently support self-hosted instances of GitHub or GitLab. - -## Custom branches - -Suppose you have a custom Git workflow that uses specific branches to represent your project's production build. In that case, you can specify a custom branch when creating (or managing an existing) project in the Pages dashboard by going to **Settings** > **Builds & deployments** > **Configure Production deployments**. To change the production branch, click the **production branch** dropdown menu and choose any other branch. - -You can also use [preview deployments](/pages/configuration/preview-deployments/) to preview how the new version of your project looks before merging into `production`. In addition, Pages allows you to configure which of your preview branches are built and deployed by using [branch build controls](/pages/configuration/branch-build-controls/). - -To configure this in your Pages project go to **Settings** > **Builds & deployments** > **Configure preview deployment** and select **Custom branches**. Here you can specify branches you wish to include and exclude from automatic deployments in the provided configuration fields. To learn more refer to the [branch build controls](/pages/configuration/branch-build-controls/) documentation. - -## Skipping a specific build via a commit message - -Without any configuration required, you can choose to skip a deployment on an adhoc basis. By adding the `[CI Skip]`, `[CI-Skip]`, `[Skip CI]`, `[Skip-CI]`, or `[CF-Pages-Skip]` flag as a prefix in your commit message, and Pages will omit that deployment. The prefixes are not case sensitive. - -## Organizational access - -You can deploy projects to Cloudflare Pages from your open-source team, company, or side project on both GitHub and GitLab. - -### GitHub - -When authorizing Cloudflare Pages to access a GitHub account, you can specify access to your individual account or an organization that you belong to on GitHub. In order to be able to add the Cloudflare Pages installation to that organization, your user account must be an owner or have the appropriate role within the organization (that is, the GitHub Apps Manager role). More information on these roles can be seen on [GitHub's documentation](https://docs.github.com/en/organizations/managing-peoples-access-to-your-organization-with-roles/roles-in-an-organization#github-app-managers). - -:::caution[GitHub security consideration] - -A GitHub account should only point to one Cloudflare account, however, this is not enforced. If you are setting up Cloudflare with GitHub for your organization, Cloudflare recommends that you limit the scope of the application to only the repositories you intend to build with Pages at the time that you set up your project. You can modify these permissions as you build more applications. - -::: - -### GitLab - -By authorizing Cloudflare Pages to access your GitLab account, you will automatically allow access to organizations, groups, and namespaces your GitLab account can access for use by Cloudflare Pages. Managing access to these organizations and groups is handled by GitLab. - -## Removing access - -### GitHub - -You can remove Cloudflare Pages' access to your GitHub account by viewing the [**Applications** page](https://github.com/settings/installations) on GitHub. The GitHub App is named Cloudflare Workers and Pages, and it is shared between Workers and Pages projects. - -Note that removing access to GitHub will disable new builds for Workers and Pages, though the last build of your site will continue to be hosted via Cloudflare Pages. - -### GitLab - -You can remove Cloudflare Pages' access to your GitLab account by navigating to **User Settings** > **Applications** > **Authorized Applications**. Find the applications called Cloudflare Pages and select the **Revoke** button to revoke access. - -Note that the GitLab application Cloudflare Pages is shared between Workers and Pages projects, and removing access to GitLab will disable new builds for Workers and Pages, though the last build of your site will continue to be hosted via Cloudflare Pages. - -## Reinstall a Git installation - -When encountering Git integration related issues, one potential troubleshooting step is attempting to uninstall and reinstall the GitHub or GitLab application associated with the Cloudflare Pages installation. The process for each Git provider is provided below. - -### GitHub - -1. Go to the installation settings page on GitHub: - 1. `https://github.com/settings/installations` for individual accounts. - 2. `https://github.com/organizations//settings/installations` for organizational accounts. -2. If the Cloudflare Workers and Pages installation is there, click **Configure**, and click **Uninstall "Cloudflare Workers and Pages"**. If there is no "Cloudflare Workers and Pages" installation there, then you don't need to do anything. -3. Go back to the **Workers & Pages** overview page at `https://dash.cloudflare.com/[YOUR_ACCOUNT_ID]/workers-and-pages`. Click **Create application** > **Pages** > **Connect to Git** -4. Click the **+ Add account** button, click the GitHub account you want to add, and then click **Install & Authorize**. -5. You should be redirected to the create project page with your GitHub account or organization in the account list. -6. Attempt to make a new deployment with your project which was previously broken. - -### GitLab - -1. Go to your application settings page on GitLab located here: [https://gitlab.com/-/profile/applications](https://gitlab.com/-/profile/applications) -2. Click the "Revoke" button on your Cloudflare Pages installation if it exists. -3. Go back to the **Workers & Pages** overview page at `https://dash.cloudflare.com/[YOUR_ACCOUNT_ID]/workers-and-pages`. Click **Create application** > **Pages** > **Connect to Git** -4. Select the **GitLab** tab at the top, click the **+ Add account** button, click the GitLab account you want to add, and then click **Authorize** on the modal titled "Authorize Cloudflare Pages to use your account?". -5. You will be redirected to the create project page with your GitLab account or organization in the account list. -6. Attempt to make a new deployment with your project which was previously broken. - -## Troubleshooting - -### Project Creation - -#### `This repository is being used for a Cloudflare Pages project on a different Cloudflare account.` - -Using the same Github/Gitlab repository across separate Cloudflare accounts is disallowed. To use the repository for a Pages project in that Cloudflare account, you should delete any Pages projects using the repository in other Cloudflare accounts. - -### Deployments - -If you run into any issues related to deployments or failing, check your project dashboard to see if there are any SCM installation warnings listed as shown in the screenshot below. - -![Pausing a deployment in the Settings of your Pages project](~/assets/images/pages/platform/git.dashboard-error.png) - -To resolve any errors displayed in the Cloudflare Pages dashboard, follow the steps listed below. - -#### `This project is disconnected from your Git account, this may cause deployments to fail.` - -To resolve this issue, follow the steps provided above in the [Reinstalling a Git installation section](/pages/configuration/git-integration/#reinstall-a-git-installation) for the applicable SCM provider. If the issue persists even after uninstalling and reinstalling, contact support. - -#### `Cloudflare Pages is not properly installed on your Git account, this may cause deployments to fail.` - -To resolve this issue, follow the steps provided above in the [Reinstalling a Git installation section](/pages/configuration/git-integration/#reinstall-a-git-installation) for the applicable SCM provider. If the issue persists even after uninstalling and reinstalling, contact support. - -#### `The Cloudflare Pages installation has been suspended, this may cause deployments to fail.` - -Go to your GitHub installation settings: - -- `https://github.com/settings/installations` for individual accounts -- `https://github.com/organizations//settings/installations` for organizational accounts - -Click **Configure** on the Cloudflare Pages application. Scroll down to the bottom of the page and click **Unsuspend** to allow Cloudflare Pages to make future deployments. - -#### `The project is linked to a repository that no longer exists, this may cause deployments to fail.` - -You may have deleted or transferred the repository associated with this Cloudflare Pages project. For a deleted repository, you will need to create a new Cloudflare Pages project with a repository that has not been deleted. For a transferred repository, you can either transfer the repository back to the original Git account or you will need to create a new Cloudflare Pages project with the transferred repository. - -#### `The repository cannot be accessed, this may cause deployments to fail.` - -You may have excluded this repository from your installation's repository access settings. Go to your GitHub installation settings: - -- `https://github.com/settings/installations` for individual accounts -- `https://github.com/organizations//settings/installations` for organizational accounts - -Click **Configure** on the Cloudflare Pages application. Under **Repository access**, ensure that the repository associated with your Cloudflare Pages project is included in the list. - -#### `There is an internal issue with your Cloudflare Pages Git installation.` - -This is an internal error in the Cloudflare Pages SCM system. You can attempt to [reinstall your Git installation](/pages/configuration/git-integration/#reinstall-a-git-installation), but if the issue persists, [contact support](/support/contacting-cloudflare-support/). - -## Related resources - -- [Branch build controls](/pages/configuration/branch-build-controls/#production-branch-control) - Control which environments and branches you would like to automatically deploy to. diff --git a/src/content/docs/pages/configuration/git-integration/github-integration.mdx b/src/content/docs/pages/configuration/git-integration/github-integration.mdx new file mode 100644 index 00000000000000..c21b2d1ae0505d --- /dev/null +++ b/src/content/docs/pages/configuration/git-integration/github-integration.mdx @@ -0,0 +1,91 @@ +--- +pcx_content_type: concept +title: GitHub integration +--- + +You can connect each Cloudflare Pages project to a GitHub repository, and Cloudflare will automatically deploy your code every time you push a change to a branch. + +## Features + +Beyond automatic deployments, the Cloudflare GitHub integration lets you monitor, manage, and preview deployments directly in GitHub, keeping you informed without leaving your workflow. + +### Custom branches + +Pages will default to setting your [production environment](/pages/configuration/branch-build-controls/#production-branch-control) to the branch you first push. If a branch other than the default branch (e.g. `main`) represents your project's production branch, then go to **Settings** > **Builds** > **Branch control**, change the production branch by clicking the **Production branch** dropdown menu and choose any other branch. + +You can also use [preview deployments](/pages/configuration/preview-deployments/) to preview versions of your project before merging your production branch, and deploying to production. Pages allows you to configure which of your preview branches are automatically deployed using [branch build controls](/pages/configuration/branch-build-controls/). To configure, go to **Settings** > **Builds** > **Branch control** and select an option under **Preview branch**. Use [**Custom branches**](/pages/configuration/branch-build-controls/) to specify branches you wish to include or exclude from automatic preview deployments. + +### Preview URLs + +Every time you open a new pull request on your GitHub repository, Cloudflare Pages will create a unique preview URL, which will stay updated as you continue to push new commits to the branch. Note that preview URLs will not be created for pull requests created from forks of your repository. Learn more in [Preview Deployments](/pages/configuration/preview-deployments/). + +![GitHub Preview URLs](~/assets/images/pages/configuration/ghpreviewurls.png) + +### Skipping a build via a commit message + +Without any configuration required, you can choose to skip a deployment on an ad hoc basis. By adding the `[CI Skip]`, `[CI-Skip]`, `[Skip CI]`, `[Skip-CI]`, or `[CF-Pages-Skip]` flag as a prefix in your commit message, and Pages will omit that deployment. The prefixes are not case sensitive. + +### Check runs + +If you have one or multiple projects connected to a repository (i.e. a [monorepo](/pages/configuration/monorepos/)), you can check on the status of each build within GitHub via [GitHub check runs](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/collaborating-on-repositories-with-code-quality-features/about-status-checks#checks). + +You can see the checks by selecting the status icon next to a commit within your GitHub repository. In the example below, you can select the green check mark to see the results of the check run. + +![GitHub status](~/assets/images/workers/platform/ci-cd/gh-status-check-runs.png) + +Check runs will appear like the following in your repository. + +![GitHub check runs](~/assets/images/pages/configuration/ghcheckrun.png) + +If a build skips for any reason (i.e. CI Skip, build watch paths, or branch deployment controls), the check run/commit status will not appear. + +## Manage access + +You can deploy projects to Cloudflare Workers from your company or side project on GitHub using the [Cloudflare Workers & Pages GitHub App](https://github.com/apps/cloudflare-workers-and-pages). + +### Organizational access + +You can deploy projects to Cloudflare Pages from your company or side project on both GitHub and GitLab. + +When authorizing Cloudflare Pages to access a GitHub account, you can specify access to your individual account or an organization that you belong to on GitHub. In order to be able to add the Cloudflare Pages installation to that organization, your user account must be an owner or have the appropriate role within the organization (that is, the GitHub Apps Manager role). More information on these roles can be seen on [GitHub's documentation](https://docs.github.com/en/organizations/managing-peoples-access-to-your-organization-with-roles/roles-in-an-organization#github-app-managers). + +:::caution[GitHub security consideration] + +A GitHub account should only point to one Cloudflare account. If you are setting up Cloudflare with GitHub for your organization, Cloudflare recommends that you limit the scope of the application to only the repositories you intend to build with Pages. To modify these permissions, go to the [Applications page](https://github.com/settings/installations) on GitHub and select **Switch settings context** to access your GitHub organization settings. Then, select **Cloudflare Workers & Pages** > For **Repository access**, select **Only select repositories** > select your repositories. + +::: + +### Remove access + +You can remove Cloudflare Pages' access to your GitHub repository or account by going to the [Applications page](https://github.com/settings/installations) on GitHub (if you are in an organization, select Switch settings context to access your GitHub organization settings). The GitHub App is named Cloudflare Workers and Pages, and it is shared between Workers and Pages projects. + +#### Remove Cloudflare access to a GitHub repository + +To remove access to an individual GitHub repository, you can navigate to **Repository access**. Select the **Only select repositories** option, and configure which repositories you would like Cloudflare to have access to. + +![GitHub Repository Access](~/assets/images/workers/platform/ci-cd/github-repository-access.png) + +#### Remove Cloudflare access to the entire GitHub account + +To remove Cloudflare Workers and Pages access to your entire Git account, you can navigate to **Uninstall "Cloudflare Workers and Pages"**, then select **Uninstall**. Removing access to the Cloudflare Workers and Pages app will revoke Cloudflare's access to _all repositories_ from that GitHub account. If you want to only disable automatic builds and deployments, follow the [Disable Build](/workers/ci-cd/builds/#disabling-builds) instructions. + +Note that removing access to GitHub will disable new builds for Workers and Pages project that were connected to those repositories, though your previous deployments will continue to be hosted by Cloudflare Workers. + +### Reinstall the Cloudflare GitHub app + +If you see errors where Cloudflare Pages cannot access your git repository, you should attempt to uninstall and reinstall the GitHub application associated with the Cloudflare Pages installation. + +1. Go to the installation settings page on GitHub: + - Navigate to **Settings > Builds** for the Pages project and select **Manage** under Git Repository. + - Alternatively, visit these links to find the Cloudflare Workers and Pages installation and select **Configure**: + +| | | +| ---------------- | ---------------------------------------------------------------------------------- | +| **Individual** | `https://github.com/settings/installations` | +| **Organization** | `https://github.com/organizations//settings/installations` | + +2. In the Cloudflare Workers and Pages GitHub App settings page, navigate to **Uninstall "Cloudflare Workers and Pages"** and select **Uninstall**. +3. Go back to the [**Workers & Pages** overview](https://dash.cloudflare.com) page. Select **Create application** > **Pages** > **Connect to Git**. +4. Select the **+ Add account** button, select the GitHub account you want to add, and then select **Install & Authorize**. +5. You should be redirected to the create project page with your GitHub account or organization in the account list. +6. Attempt to make a new deployment with your project which was previously broken. diff --git a/src/content/docs/pages/configuration/git-integration/gitlab-integration.mdx b/src/content/docs/pages/configuration/git-integration/gitlab-integration.mdx new file mode 100644 index 00000000000000..8a829d389418d2 --- /dev/null +++ b/src/content/docs/pages/configuration/git-integration/gitlab-integration.mdx @@ -0,0 +1,61 @@ +--- +pcx_content_type: concept +title: GitLab integration +--- + +You can connect each Cloudflare Pages project to a GitLab repository, and Cloudflare will automatically deploy your code every time you push a change to a branch. + +## Features + +Beyond automatic deployments, the Cloudflare GitLab integration lets you monitor, manage, and preview deployments directly in GitLab, keeping you informed without leaving your workflow. + +### Custom branches + +Pages will default to setting your [production environment](/pages/configuration/branch-build-controls/#production-branch-control) to the branch you first push. If a branch other than the default branch (e.g. `main`) represents your project's production branch, then go to **Settings** > **Builds** > **Branch control**, change the production branch by clicking the **Production branch** dropdown menu and choose any other branch. + +You can also use [preview deployments](/pages/configuration/preview-deployments/) to preview versions of your project before merging your production branch, and deploying to production. Pages allows you to configure which of your preview branches are automatically deployed using [branch build controls](/pages/configuration/branch-build-controls/). To configure, go to **Settings** > **Builds** > **Branch control** and select an option under **Preview branch**. Use [**Custom branches**](/pages/configuration/branch-build-controls/) to specify branches you wish to include or exclude from automatic preview deployments. + +### Skipping a specific build via a commit message + +Without any configuration required, you can choose to skip a deployment on an ad hoc basis. By adding the `[CI Skip]`, `[CI-Skip]`, `[Skip CI]`, `[Skip-CI]`, or `[CF-Pages-Skip]` flag as a prefix in your commit message, Pages will omit that deployment. The prefixes are not case sensitive. + +### Check runs and preview URLs + +If you have one or multiple projects connected to a repository (i.e. a [monorepo](/workers/ci-cd/builds/advanced-setups/#monorepos)), you can check on the status of each build within GitLab via [GitLab commit status](https://docs.gitlab.com/ee/user/project/merge_requests/status_checks.html). + +You can see the statuses by selecting the status icon next to a commit or by going to **Build** > **Pipelines** within your GitLab repository. In the example below, you can select the green check mark to see the results of the check run. + +![GitLab Status](~/assets/images/workers/platform/ci-cd/gl-status-checks.png) + +Check runs will appear like the following in your repository. You can select one of the statuses to view the [preview URL](/pages/configuration/preview-deployments/) for that deployment. + +![GitLab Commit Status](~/assets/images/pages/configuration/glcommitstatus.png) + +If a build skips for any reason (i.e. CI Skip, build watch paths, or branch deployment controls), the check run/commit status will not appear. + +## Manage access + +You can deploy projects to Cloudflare Workers from your company or side project on GitLab using the Cloudflare Pages app. + +### Organizational access + +You can deploy projects to Cloudflare Pages from your company or side project on both GitHub and GitLab. + +When you authorize Cloudflare Pages to access your GitLab account, you automatically give Cloudflare Pages access to organizations, groups, and namespaces accessed by your GitLab account. Managing access to these organizations and groups is handled by GitLab. + +### Remove access + +You can remove Cloudflare Workers' access to your GitLab account by navigating to [Authorized Applications page](https://gitlab.com/-/profile/applications) on GitLab. Find the applications called Cloudflare Workers and select the **Revoke** button to revoke access. + +Note that the GitLab application Cloudflare Workers is shared between Workers and Pages projects, and removing access to GitLab will disable new builds for Workers and Pages, though your previous deployments will continue to be hosted by Cloudflare Pages. + +### Reinstall the Cloudflare GitLab app + +When encountering Git integration related issues, one potential troubleshooting step is attempting to uninstall and reinstall the GitHub or GitLab application associated with the Cloudflare Pages installation. + +1. Go to your application settings page on GitLab located here: [https://gitlab.com/-/profile/applications](https://gitlab.com/-/profile/applications) +2. Select the **Revoke** button on your Cloudflare Pages installation if it exists. +3. Go back to the **Workers & Pages** overview page at `https://dash.cloudflare.com/[YOUR_ACCOUNT_ID]/workers-and-pages`. Select **Create application** > **Pages** > **Connect to Git**. +4. Select the **GitLab** tab at the top, select the **+ Add account** button, select the GitLab account you want to add, and then select **Authorize** on the modal titled "Authorize Cloudflare Pages to use your account?". +5. You will be redirected to the create project page with your GitLab account or organization in the account list. +6. Attempt to make a new deployment with your project which was previously broken. diff --git a/src/content/docs/pages/configuration/git-integration/index.mdx b/src/content/docs/pages/configuration/git-integration/index.mdx new file mode 100644 index 00000000000000..24ede8576e9dc4 --- /dev/null +++ b/src/content/docs/pages/configuration/git-integration/index.mdx @@ -0,0 +1,57 @@ +--- +pcx_content_type: concept +title: Git integration +--- + +You can connect each Cloudflare Pages project to a [GitHub](/pages/configuration/git-integration/github-integration) or [GitLab](/pages/configuration/git-integration/gitlab-integration) repository, and Cloudflare will automatically deploy your code every time you push a change to a branch. + +:::note +Cloudflare Workers now also supports Git integrations to automatically build and deploy Workers from your connected Git repository. Learn more in [Workers Builds](/workers/ci-cd/builds/). +::: + +When you connect a git repository to your Cloudflare Pages project, Cloudflare will also: + +- **Preview deployments for custom branches**, generating preview URLs for a commit to any branch in the repository without affecting your production deployment. +- **Preview URLs in pull requests** (PRs) to the repository. +- **Build and deployment status checks** within the Git repository. +- **Skipping builds using a commit message**. + +These features allow you to manage your deployments directly within GitHub or GitLab without leaving your team's regular development workflow. + +:::caution[You cannot switch to Direct Upload later] +If you deploy using the Git integration, you cannot switch to [Direct Upload](/pages/get-started/direct-upload/) later. However, if you already use a Git-integrated project and do not want to trigger deployments every time you push a commit, you can [disable automatic deployments](/pages/configuration/git-integration/#disable-automatic-deployments) on all branches. Then, you can use Wrangler to deploy directly to your Pages projects and make changes to your Git repository without automatically triggering a build. + +::: + +## Supported Git providers + +Cloudflare supports connecting Cloudflare Pages to your GitHub and GitLab repositories. Pages does not currently support connecting self-hosted instances of GitHub or GitLab. + +If you using a different Git provider (e.g. Bitbucket) or a self-hosted instance, you can start with a Direct Upload project and deploy using a CI/CD provider (e.g. GitHub Actions) with [Wrangler CLI](/pages/how-to/use-direct-upload-with-continuous-integration/). + +## Add a Git integration + +If you do not have a Git account linked to your Cloudflare account, you will be prompted to set up an installation to GitHub or GitLab when [connecting to Git](/pages/get-started/git-integration/) for the first time, or when adding a new Git account. Follow the prompts and authorize the Cloudflare Git integration. + +You can check the following pages to see if your Git integration has been installed: + +- [GitHub Applications page](https://github.com/settings/installations) (if you're in an organization, select **Switch settings context** to access your GitHub organization settings) +- [GitLab Authorized Applications page](https://gitlab.com/-/profile/applications) + +For details on providing access to organization accounts, see the [GitHub](/pages/configuration/git-integration/github-integration/#organizational-access) and [GitLab](/pages/configuration/git-integration/gitlab-integration/#organizational-access) guides. + +## Manage a Git integration + +You can manage the Git installation associated with your repository connection by navigating to the Pages project, then going to **Settings** > **Builds** and selecting **Manage** under **Git Repository**. + +This can be useful for managing repository access or troubleshooting installation issues by reinstalling. For more details, see the [GitHub](/pages/configuration/git-integration/github-integration/#managing-access) and [GitLab](/pages/configuration/git-integration/gitlab-integration/#managing-access) guides. + +## Disable automatic deployments + +If you are using a Git-integrated project and do not want to trigger deployments every time you push a commit, you can use [branch control](/pages/configuration/branch-build-controls/) to disable/pause builds: + +1. Go to the **Settings** of your **Pages project** in the [Cloudflare dashboard](https://dash.cloudflare.com). +2. Navigate to **Build** > edit **Branch control** > turn off **Enable automatic production branch deployments**. +3. You can also change your Preview branch to **None (Disable automatic branch deployments)** to pause automatic preview deployments. + +Then, you can use Wrangler to deploy directly to your Pages project and make changes to your Git repository without automatically triggering a build. diff --git a/src/content/docs/pages/configuration/git-integration/troubleshooting.mdx b/src/content/docs/pages/configuration/git-integration/troubleshooting.mdx new file mode 100644 index 00000000000000..5da836dddb7e2e --- /dev/null +++ b/src/content/docs/pages/configuration/git-integration/troubleshooting.mdx @@ -0,0 +1,58 @@ +--- +pcx_content_type: concept +title: Troubleshooting builds +--- + +If your git integration is experiencing issues, you may find the following banners in the Deployment page of your Pages project. + +## Project creation + +#### `This repository is being used for a Cloudflare Pages project on a different Cloudflare account.` + +Using the same GitHub/GitLab repository across separate Cloudflare accounts is disallowed. To use the repository for a Pages project in that Cloudflare account, you should delete any Pages projects using the repository in other Cloudflare accounts. + +## Deployments + +If you run into any issues related to deployments or failing, check your project dashboard to see if there are any SCM installation warnings listed as shown in the screenshot below. + +![Pausing a deployment in the Settings of your Pages project](~/assets/images/pages/platform/git.dashboard-error.png) + +To resolve any errors displayed in the Cloudflare Pages dashboard, follow the steps listed below. + +#### `This project is disconnected from your Git account, this may cause deployments to fail.` + +To resolve this issue, follow the steps provided above in the [Reinstalling a Git installation section](/pages/configuration/git-integration/#reinstall-a-git-installation) for the applicable SCM provider. If the issue persists even after uninstalling and reinstalling, contact support. + +#### `Cloudflare Pages is not properly installed on your Git account, this may cause deployments to fail.` + +To resolve this issue, follow the steps provided above in the [Reinstalling a Git installation section](/pages/configuration/git-integration/#reinstall-a-git-installation) for the applicable SCM provider. If the issue persists even after uninstalling and reinstalling, contact support. + +#### `The Cloudflare Pages installation has been suspended, this may cause deployments to fail.` + +Go to your GitHub installation settings: + +- `https://github.com/settings/installations` for individual accounts +- `https://github.com/organizations//settings/installations` for organizational accounts + +Click **Configure** on the Cloudflare Pages application. Scroll down to the bottom of the page and click **Unsuspend** to allow Cloudflare Pages to make future deployments. + +#### `The project is linked to a repository that no longer exists, this may cause deployments to fail.` + +You may have deleted or transferred the repository associated with this Cloudflare Pages project. For a deleted repository, you will need to create a new Cloudflare Pages project with a repository that has not been deleted. For a transferred repository, you can either transfer the repository back to the original Git account or you will need to create a new Cloudflare Pages project with the transferred repository. + +#### `The repository cannot be accessed, this may cause deployments to fail.` + +You may have excluded this repository from your installation's repository access settings. Go to your GitHub installation settings: + +- `https://github.com/settings/installations` for individual accounts +- `https://github.com/organizations//settings/installations` for organizational accounts + +Click **Configure** on the Cloudflare Pages application. Under **Repository access**, ensure that the repository associated with your Cloudflare Pages project is included in the list. + +#### `There is an internal issue with your Cloudflare Pages Git installation.` + +This is an internal error in the Cloudflare Pages SCM system. You can attempt to [reinstall your Git installation](/pages/configuration/git-integration/#reinstall-a-git-installation), but if the issue persists, [contact support](/support/contacting-cloudflare-support/). + +#### `GitHub/GitLab is having an incident and push events to Cloudflare are operating in a degraded state. Check their status page for more details.` + +This indicates that GitHub or GitLab may be experiencing an incident affecting push events to Cloudflare. It is recommended to monitor their status page ([GitHub](https://www.githubstatus.com/), [GitLab](https://status.gitlab.com/)) for updates and try deploying again later. diff --git a/src/content/docs/pages/configuration/preview-deployments.mdx b/src/content/docs/pages/configuration/preview-deployments.mdx index 808e740d76fb62..e989051a614792 100644 --- a/src/content/docs/pages/configuration/preview-deployments.mdx +++ b/src/content/docs/pages/configuration/preview-deployments.mdx @@ -11,6 +11,8 @@ Preview deployments allow you to preview new versions of your project without de Every time you open a new pull request on your GitHub repository, Cloudflare Pages will create a unique preview URL, which will stay updated as you continue to push new commits to the branch. This is only true when pull requests originate from the repository itself. +![GitHub Preview URLs](~/assets/images/pages/configuration/ghpreviewurls.png) + For example, if you have a repository called `user-example` connected to Pages, this will give you a `user-example.pages.dev` subdomain. If `main` is your default branch, then any commits to the `main` branch will update your `user-example.pages.dev` content, as well as any [custom domains](/pages/configuration/custom-domains/) attached to the project. ![User-example repository's deployment status and preview](~/assets/images/pages/platform/preview-deployment-mergedone.png) diff --git a/src/content/docs/pages/framework-guides/deploy-a-nuxt-site.mdx b/src/content/docs/pages/framework-guides/deploy-a-nuxt-site.mdx index f26026ac689fef..49d97532ca141a 100644 --- a/src/content/docs/pages/framework-guides/deploy-a-nuxt-site.mdx +++ b/src/content/docs/pages/framework-guides/deploy-a-nuxt-site.mdx @@ -107,7 +107,7 @@ export default defineNuxtConfig({ }); ``` -This module is powered by the [`getPlatformProxy` helper function](/workers/wrangler/api#getplatformproxy). `getPlatformProxy` will automatically detect any bindings defined in your project's `wrangler.toml` file and emulate those bindings in local development. Review [Wrangler configuration information on bindings](/workers/wrangler/configuration/#bindings) for more information on how to configure bindings in `wrangler.toml`. +This module is powered by the [`getPlatformProxy` helper function](/workers/wrangler/api#getplatformproxy). `getPlatformProxy` will automatically detect any bindings defined in your project's Wrangler file and emulate those bindings in local development. Review [Wrangler configuration information on bindings](/workers/wrangler/configuration/#bindings) for more information on how to configure bindings in the `wrangler.toml / wrangler.json` file. :::note diff --git a/src/content/docs/pages/framework-guides/deploy-a-remix-site.mdx b/src/content/docs/pages/framework-guides/deploy-a-remix-site.mdx index c140334ae10cd2..0cdf9866f6a49c 100644 --- a/src/content/docs/pages/framework-guides/deploy-a-remix-site.mdx +++ b/src/content/docs/pages/framework-guides/deploy-a-remix-site.mdx @@ -3,7 +3,7 @@ pcx_content_type: how-to title: Remix --- -import { PagesBuildPreset, Render, PackageManagers } from "~/components"; +import { PagesBuildPreset, Render, PackageManagers, WranglerConfig } from "~/components"; [Remix](https://remix.run/) is a framework that is focused on fully utilizing the power of the web. Like Cloudflare Workers, it uses modern JavaScript APIs, and it places emphasis on web fundamentals such as meaningful HTTP status codes, caching and optimizing for both usability and performance. @@ -82,9 +82,9 @@ A [binding](/pages/functions/bindings/) allows your application to interact with Remix uses Wrangler's [`getPlatformProxy`](/workers/wrangler/api/#getplatformproxy) to simulate the Cloudflare environment locally. You configure `getPlatformProxy` in your project's `vite.config.ts` file via [`cloudflareDevProxyVitePlugin`](https://remix.run/docs/en/main/future/vite#cloudflare-proxy). -To bind resources in local development, you need to configure the bindings in the `wrangler.toml` file. Refer to [Bindings](/workers/wrangler/configuration/#bindings) to learn more. +To bind resources in local development, you need to configure the bindings in the Wrangler file. Refer to [Bindings](/workers/wrangler/configuration/#bindings) to learn more. -Once you have configured the bindings in the `wrangler.toml` file, the proxies are then available within `context.cloudflare` in your `loader` or `action` functions: +Once you have configured the bindings in the Wrangler file, the proxies are then available within `context.cloudflare` in your `loader` or `action` functions: ```typescript export const loader = ({ context }: LoaderFunctionArgs) => { @@ -96,7 +96,7 @@ export const loader = ({ context }: LoaderFunctionArgs) => { :::note[Correcting the env type] -You may have noticed that `context.cloudflare.env` is not typed correctly when you add additional bindings in `wrangler.toml`. +You may have noticed that `context.cloudflare.env` is not typed correctly when you add additional bindings in the `wrangler.toml / wrangler.json` file. To fix this, run `npm run typegen` to generate the missing types. This will update the `Env` interface defined in `worker-configuration.d.ts`. After running the command, you can access the bindings in your `loader` or `action` using `context.cloudflare.env` as shown above. @@ -113,9 +113,7 @@ Once you have configured the bindings in the Cloudflare dashboard, the proxies a As an example, you will bind and query a D1 database in a Remix application. 1. Create a D1 database. Refer to the [D1 documentation](/d1/) to learn more. -2. Configure bindings for your D1 database in the `wrangler.toml` file: - -import { WranglerConfig } from "~/components"; +2. Configure bindings for your D1 database in the Wrangler file: diff --git a/src/content/docs/pages/framework-guides/deploy-an-analog-site.mdx b/src/content/docs/pages/framework-guides/deploy-an-analog-site.mdx index bf19694e41f427..a87a9547ba4373 100644 --- a/src/content/docs/pages/framework-guides/deploy-an-analog-site.mdx +++ b/src/content/docs/pages/framework-guides/deploy-an-analog-site.mdx @@ -102,15 +102,15 @@ export default defineNitroPlugin((nitroApp: NitroApp) => { }); ``` -In the code above, the `getPlatformProxy` helper function will automatically detect any bindings defined in your project's `wrangler.toml` file and emulate those bindings in local development. Review [Wrangler configuration information on bindings](/workers/wrangler/configuration/#bindings) for more information on how to configure bindings in `wrangler.toml`. +In the code above, the `getPlatformProxy` helper function will automatically detect any bindings defined in your project's Wrangler file and emulate those bindings in local development. You may wish to refer to [Wrangler configuration information on bindings](/workers/wrangler/configuration/#bindings). -A new type definition for the `Env` type (used by `context.cloudflare.env`) can be generated from `wrangler.toml` with the following command: +A new type definition for the `Env` type (used by `context.cloudflare.env`) can be generated from the `wrangler.toml / wrangler.json` file with the following command: ```sh npm run cf-typegen ``` -This should be done any time you add new bindings to `wrangler.toml`. +This should be done any time you add new bindings to your Wrangler configuration. ### Setup bindings in deployed applications diff --git a/src/content/docs/pages/framework-guides/nextjs/ssr/advanced.mdx b/src/content/docs/pages/framework-guides/nextjs/ssr/advanced.mdx index 7de369abf105bc..c43dced68f8795 100644 --- a/src/content/docs/pages/framework-guides/nextjs/ssr/advanced.mdx +++ b/src/content/docs/pages/framework-guides/nextjs/ssr/advanced.mdx @@ -32,7 +32,7 @@ export default { } as ExportedHandler<{ ASSETS: Fetcher }>; ``` -This looks like a Worker — but it does not need its own `wrangler.toml` file. You can think of it purely as code that `@cloudflare/next-on-pages` will then use to wrap the output of the build that is deployed to your Cloudflare Pages project. +This looks like a Worker — but it does not need its own Wrangler file. You can think of it purely as code that `@cloudflare/next-on-pages` will then use to wrap the output of the build that is deployed to your Cloudflare Pages project. 2. Pass the entrypoint argument to the next-on-pages CLI with the path to your handler. diff --git a/src/content/docs/pages/framework-guides/nextjs/ssr/bindings.mdx b/src/content/docs/pages/framework-guides/nextjs/ssr/bindings.mdx index 3d5e9372f782a5..79ecc4ac1f77c7 100644 --- a/src/content/docs/pages/framework-guides/nextjs/ssr/bindings.mdx +++ b/src/content/docs/pages/framework-guides/nextjs/ssr/bindings.mdx @@ -26,7 +26,7 @@ export async function GET(request) { } ``` -Add bindings to your Pages project by [adding them to your `wrangler.toml` configuration file](/pages/functions/wrangler-configuration/). +Add bindings to your Pages project by [adding them to your `wrangler.toml / wrangler.json` file](/pages/functions/wrangler-configuration/). ## TypeScript type declarations for bindings diff --git a/src/content/docs/pages/framework-guides/nextjs/ssr/get-started.mdx b/src/content/docs/pages/framework-guides/nextjs/ssr/get-started.mdx index f1c76217a886f4..87d20e861dce35 100644 --- a/src/content/docs/pages/framework-guides/nextjs/ssr/get-started.mdx +++ b/src/content/docs/pages/framework-guides/nextjs/ssr/get-started.mdx @@ -9,7 +9,7 @@ head: description: Deploy a full-stack Next.js app to Cloudflare Pages --- -import { PackageManagers } from "~/components"; +import { PackageManagers, WranglerConfig } from "~/components"; Learn how to deploy full-stack (SSR) Next.js apps to Cloudflare Pages. @@ -43,11 +43,9 @@ First, install [@cloudflare/next-on-pages](https://github.com/cloudflare/next-on npm install --save-dev @cloudflare/next-on-pages ``` -### 2. Add `wrangler.toml` file +### 2. Add Wrangler file -Then, add a [`wrangler.toml`](/pages/functions/wrangler-configuration/) file to the root directory of your Next.js app: - -import { WranglerConfig } from "~/components"; +Then, add a [`wrangler.toml / wrangler.json` file](/pages/functions/wrangler-configuration/) to the root directory of your Next.js app: diff --git a/src/content/docs/pages/functions/bindings.mdx b/src/content/docs/pages/functions/bindings.mdx index df5f95d32f7420..976cc4dcc29fe5 100644 --- a/src/content/docs/pages/functions/bindings.mdx +++ b/src/content/docs/pages/functions/bindings.mdx @@ -5,7 +5,7 @@ sidebar: order: 7 --- -import { Render, TabItem, Tabs } from "~/components"; +import { Render, TabItem, Tabs, WranglerConfig } from "~/components"; A [binding](/workers/runtime-apis/bindings/) enables your Pages Functions to interact with resources on the Cloudflare developer platform. Use bindings to integrate your Pages Functions with Cloudflare resources like [KV](/kv/concepts/how-kv-works/), [Durable Objects](/durable-objects/), [R2](/r2/), and [D1](/d1/). You can set bindings for both production and preview environments. @@ -21,7 +21,7 @@ Pages Functions only support a subset of all [bindings](/workers/runtime-apis/bi [Workers KV](/kv/concepts/kv-namespaces/) is Cloudflare's key-value storage solution. -To bind your KV namespace to your Pages Function, you can configure a KV namespace binding in [`wrangler.toml`](/pages/functions/wrangler-configuration/#kv-namespaces) or the Cloudflare dashboard. +To bind your KV namespace to your Pages Function, you can configure a KV namespace binding in the [`wrangler.toml / wrangler.json` file](/pages/functions/wrangler-configuration/#kv-namespaces) or the Cloudflare dashboard. To configure a KV namespace binding via the Cloudflare dashboard: @@ -63,7 +63,7 @@ export const onRequest: PagesFunction = async (context) => { You can interact with your KV namespace bindings locally in one of two ways: -- Configure your Pages project's `wrangler.toml` file and run [`npx wrangler pages dev`](/workers/wrangler/commands/#dev-1). +- Configure your Pages project's Wrangler file and run [`npx wrangler pages dev`](/workers/wrangler/commands/#dev-1). - Pass arguments to `wrangler pages dev` directly. To interact with your KV namespace binding locally by passing arguments to the Wrangler CLI, add `-k ` or `--kv=` to the `wrangler pages dev` command. For example, if your KV namespace is bound your Function via the `TODO_LIST` binding, access the KV namespace in local development by running: @@ -80,7 +80,7 @@ npx wrangler pages dev --kv=TODO_LIST -To bind your Durable Object to your Pages Function, you can configure a Durable Object binding in [`wrangler.toml`](/pages/functions/wrangler-configuration/#kv-namespaces) or the Cloudflare dashboard. +To bind your Durable Object to your Pages Function, you can configure a Durable Object binding in the [`wrangler.toml / wrangler.json` file](/pages/functions/wrangler-configuration/#kv-namespaces) or the Cloudflare dashboard. To configure a Durable Object binding via the Cloudflare dashboard: @@ -128,7 +128,7 @@ export const onRequestGet: PagesFunction = async (context) => { You can interact with your Durable Object bindings locally in one of two ways: -- Configure your Pages project's `wrangler.toml` file and run [`npx wrangler pages dev`](/workers/wrangler/commands/#dev-1). +- Configure your Pages project's Wrangler file and run [`npx wrangler pages dev`](/workers/wrangler/commands/#dev-1). - Pass arguments to `wrangler pages dev` directly. While developing locally, to interact with a Durable Object namespace, run `wrangler dev` in the directory of the Worker exporting the Durable Object. In another terminal, run `wrangler pages dev` in the directory of your Pages project. @@ -143,7 +143,7 @@ For example, if your Worker is called `do-worker` and it declares a Durable Obje [R2](/r2/) is Cloudflare's blob storage solution that allows developers to store large amounts of unstructured data without the egress fees. -To bind your R2 bucket to your Pages Function, you can configure a R2 bucket binding in [`wrangler.toml`](/pages/functions/wrangler-configuration/#r2-buckets) or the Cloudflare dashboard. +To bind your R2 bucket to your Pages Function, you can configure a R2 bucket binding in the [`wrangler.toml / wrangler.json` file](/pages/functions/wrangler-configuration/#r2-buckets) or the Cloudflare dashboard. To configure a R2 bucket binding via the Cloudflare dashboard: @@ -191,7 +191,7 @@ export const onRequest: PagesFunction = async (context) => { You can interact with your R2 bucket bindings locally in one of two ways: -- Configure your Pages project's `wrangler.toml` file and run [`npx wrangler pages dev`](/workers/wrangler/commands/#dev-1). +- Configure your Pages project's Wrangler file and run [`npx wrangler pages dev`](/workers/wrangler/commands/#dev-1). - Pass arguments to `wrangler pages dev` directly. :::note @@ -214,7 +214,7 @@ Interact with this binding by using `context.env` (for example, `context.env.BUC [D1](/d1/) is Cloudflare’s native serverless database. -To bind your D1 database to your Pages Function, you can configure a D1 database binding in [`wrangler.toml`](/pages/functions/wrangler-configuration/#d1-databases) or the Cloudflare dashboard. +To bind your D1 database to your Pages Function, you can configure a D1 database binding in the [`wrangler.toml / wrangler.json` file](/pages/functions/wrangler-configuration/#d1-databases) or the Cloudflare dashboard. To configure a D1 database binding via the Cloudflare dashboard: @@ -262,12 +262,12 @@ export const onRequest: PagesFunction = async (context) => { You can interact with your D1 database bindings locally in one of two ways: -- Configure your Pages project's `wrangler.toml` file and run [`npx wrangler pages dev`](/workers/wrangler/commands/#dev-1). +- Configure your Pages project's Wrangler file and run [`npx wrangler pages dev`](/workers/wrangler/commands/#dev-1). - Pass arguments to `wrangler pages dev` directly. To interact with a D1 database via the Wrangler CLI while [developing locally](/d1/best-practices/local-development/#develop-locally-with-pages), add `--d1 =` to the `wrangler pages dev` command. -If your D1 database is bound to your Pages Function via the `NORTHWIND_DB` binding and the `database_id` in your `wrangler.toml` file is `xxxx-xxxx-xxxx-xxxx-xxxx`, access this database in local development by running: +If your D1 database is bound to your Pages Function via the `NORTHWIND_DB` binding and the `database_id` in your Wrangler file is `xxxx-xxxx-xxxx-xxxx-xxxx`, access this database in local development by running: ```sh npx wrangler pages dev --d1 NORTHWIND_DB=xxxx-xxxx-xxxx-xxxx-xxxx @@ -289,7 +289,7 @@ Refer to the [D1 Workers Binding API documentation](/d1/worker-api/) for the API [Vectorize](/vectorize/) is Cloudflare’s native vector database. -To bind your Vectorize index to your Pages Function, you can configure a Vectorize index binding in [`wrangler.toml`](/pages/functions/wrangler-configuration/#vectorize-indexes) or the Cloudflare dashboard. +To bind your Vectorize index to your Pages Function, you can configure a Vectorize index binding in the [`wrangler.toml / wrangler.json` file](/pages/functions/wrangler-configuration/#vectorize-indexes) or the Cloudflare dashboard. To configure a Vectorize index binding via the Cloudflare dashboard: @@ -426,7 +426,7 @@ export const onRequest: PagesFunction = async (context) => { [Workers AI](/workers-ai/) allows you to run machine learning models, powered by serverless GPUs, on Cloudflare’s global network. -To bind Workers AI to your Pages Function, you can configure a Workers AI binding in [`wrangler.toml`](/pages/functions/wrangler-configuration/#workers-ai) or the Cloudflare dashboard. +To bind Workers AI to your Pages Function, you can configure a Workers AI binding in the [`wrangler.toml / wrangler.json` file](/pages/functions/wrangler-configuration/#workers-ai) or the Cloudflare dashboard. When developing locally using Wrangler, you can define an AI binding using the `--ai` flag. Start Wrangler in development mode by running [`wrangler pages dev --ai AI`](/workers/wrangler/commands/#dev) to expose the `context.env.AI` binding. @@ -485,7 +485,7 @@ export const onRequest: PagesFunction = async (context) => { You can interact with your Workers AI bindings locally in one of two ways: -- Configure your Pages project's `wrangler.toml` file and run [`npx wrangler pages dev`](/workers/wrangler/commands/#dev-1). +- Configure your Pages project's Wrangler file and run [`npx wrangler pages dev`](/workers/wrangler/commands/#dev-1). - Pass arguments to `wrangler pages dev` directly. To interact with a Workers AI binding via the Wrangler CLI while developing locally, run: @@ -500,7 +500,7 @@ npx wrangler pages dev --ai= [Service bindings](/workers/runtime-apis/bindings/service-bindings/) enable you to call a Worker from within your Pages Function. -To bind your Pages Function to a Worker, configure a Service binding in your Pages Function using [`wrangler.toml`](/pages/functions/wrangler-configuration/#service-bindings) or the Cloudflare dashboard. +To bind your Pages Function to a Worker, configure a Service binding in your Pages Function using the [`wrangler.toml / wrangler.json` file](/pages/functions/wrangler-configuration/#service-bindings) or the Cloudflare dashboard. To configure a Service binding via the Cloudflare dashboard: @@ -540,7 +540,7 @@ export const onRequest: PagesFunction = async (context) => { You can interact with your Service bindings locally in one of two ways: -- Configure your Pages project's `wrangler.toml` file and run [`npx wrangler pages dev`](/workers/wrangler/commands/#dev-1). +- Configure your Pages project's Wrangler file and run [`npx wrangler pages dev`](/workers/wrangler/commands/#dev-1). - Pass arguments to `wrangler pages dev` directly. To interact with a [Service binding](/workers/runtime-apis/bindings/service-bindings/) while developing locally, run the Worker you want to bind to via `wrangler dev` and in parallel, run `wrangler pages dev` with `--service =` where `SCRIPT_NAME` indicates the name of the Worker. For example, if your Worker is called `my-worker`, connect with this Worker by running it via `npx wrangler dev` (in the Worker's directory) alongside `npx wrangler pages dev --service MY_SERVICE=my-worker` (in the Pages' directory). Interact with this binding by using `context.env` (for example, `context.env.MY_SERVICE`). @@ -555,7 +555,7 @@ For example, to develop locally, if your Worker is called `my-worker`, run `npx [Queue Producers](/queues/configuration/javascript-apis/#producer) enable you to send messages into a queue within your Pages Function. -To bind a queue to your Pages Function, configure a queue producer binding in your Pages Function using [`wrangler.toml`](/pages/functions/wrangler-configuration/#queues-producers) or the Cloudflare dashboard: +To bind a queue to your Pages Function, configure a queue producer binding in your Pages Function using the [`wrangler.toml / wrangler.json` file](/pages/functions/wrangler-configuration/#queues-producers) or the Cloudflare dashboard: To configure a queue producer binding via the Cloudflare dashboard: @@ -613,8 +613,6 @@ If using a queue producer binding with a Pages Function, you will be able to sen PostgreSQL drivers like [`Postgres.js`](https://github.com/porsager/postgres) depend on Node.js APIs. Pages Functions with Hyperdrive bindings must be [deployed with Node.js compatibility](/workers/runtime-apis/nodejs). -import { WranglerConfig } from "~/components"; - ```toml title="wrangler.toml" @@ -628,7 +626,7 @@ compatibility_date = "2024-09-23" [Hyperdrive](/hyperdrive/) is a service for connecting to your existing databases from Cloudflare Workers and Pages Functions. -To bind your Hyperdrive config to your Pages Function, you can configure a Hyperdrive binding in [`wrangler.toml`](/pages/functions/wrangler-configuration/#hyperdrive) or the Cloudflare dashboard. +To bind your Hyperdrive config to your Pages Function, you can configure a Hyperdrive binding in the [`wrangler.toml / wrangler.json` file](/pages/functions/wrangler-configuration/#hyperdrive) or the Cloudflare dashboard. To configure a Hyperdrive binding via the Cloudflare dashboard: 1. Log in to the [Cloudflare dashboard](https://dash.cloudflare.com) and select your account. @@ -693,13 +691,13 @@ export const onRequest: PagesFunction = async (context) => { ### Interact with your Hyperdrive binding locally -To interact with your Hyperdrive binding locally, you must provide a local connection string to your database that your Pages project will connect to directly. You can set an environment variable `WRANGLER_HYPERDRIVE_LOCAL_CONNECTION_STRING_` with the connection string of the database, or use the `wrangler.toml` file to configure your Hyperdrive binding with a `localConnectionString` as specified in [Hyperdrive documentation for local development](/hyperdrive/configuration/local-development/). Then, run [`npx wrangler pages dev `](/workers/wrangler/commands/#dev-1). +To interact with your Hyperdrive binding locally, you must provide a local connection string to your database that your Pages project will connect to directly. You can set an environment variable `WRANGLER_HYPERDRIVE_LOCAL_CONNECTION_STRING_` with the connection string of the database, or use the Wrangler file to configure your Hyperdrive binding with a `localConnectionString` as specified in [Hyperdrive documentation for local development](/hyperdrive/configuration/local-development/). Then, run [`npx wrangler pages dev `](/workers/wrangler/commands/#dev-1). ## Analytics Engine The [Analytics Engine](/analytics/analytics-engine/) binding enables you to write analytics within your Pages Function. -To bind an Analytics Engine dataset to your Pages Function, you must configure an Analytics Engine binding using [`wrangler.toml`](/pages/functions/wrangler-configuration/#analytics-engine-datasets) or the Cloudflare dashboard: +To bind an Analytics Engine dataset to your Pages Function, you must configure an Analytics Engine binding using the [`wrangler.toml / wrangler.json` file](/pages/functions/wrangler-configuration/#analytics-engine-datasets) or the Cloudflare dashboard: To configure an Analytics Engine binding via the Cloudflare dashboard: @@ -759,7 +757,7 @@ You cannot use an Analytics Engine binding locally. An [environment variable](/workers/configuration/environment-variables/) is an injected value that can be accessed by your Functions. Environment variables are a type of binding that allow you to attach text strings or JSON values to your Pages Function. It is stored as plain text. Set your environment variables directly within the Cloudflare dashboard for both your production and preview environments at runtime and build-time. -To add environment variables to your Pages project, you can use [`wrangler.toml`](/pages/functions/wrangler-configuration/#environment-variables) or the Cloudflare dashboard. +To add environment variables to your Pages project, you can use the [`wrangler.toml / wrangler.json` file](/pages/functions/wrangler-configuration/#environment-variables) or the Cloudflare dashboard. To configure an environment variable via the Cloudflare dashboard: @@ -805,7 +803,7 @@ export const onRequest: PagesFunction = async (context) => { You can interact with your environment variables locally in one of two ways: -- Configure your Pages project's `wrangler.toml` file and running `npx wrangler pages dev`. +- Configure your Pages project's Wrangler file and running `npx wrangler pages dev`. - Pass arguments to [`wrangler pages dev`](/workers/wrangler/commands/#dev-1) directly. To interact with your environment variables locally via the Wrangler CLI, add `--binding==` to the `wrangler pages dev` command: diff --git a/src/content/docs/pages/functions/local-development.mdx b/src/content/docs/pages/functions/local-development.mdx index 87b149c7a25aaf..8c430386201310 100644 --- a/src/content/docs/pages/functions/local-development.mdx +++ b/src/content/docs/pages/functions/local-development.mdx @@ -25,13 +25,13 @@ This will then start serving your Pages project. You can press `b` to open the b :::note -If you have a [`wrangler.toml`](/pages/functions/wrangler-configuration/) file configured for your Pages project, you can run [`wrangler pages dev`](/workers/wrangler/commands/#dev-1) without specifying a directory. +If you have a [`wrangler.toml / wrangler.json` file](/pages/functions/wrangler-configuration/) file configured for your Pages project, you can run [`wrangler pages dev`](/workers/wrangler/commands/#dev-1) without specifying a directory. ::: ### HTTPS support -To serve your local development server over HTTPS with a self-signed certificate, you can [set `local_protocol` via `wrangler.toml`](/pages/functions/wrangler-configuration/#local-development-settings) or you can pass the `--local-protocol=https` argument to [`wrangler pages dev`](/workers/wrangler/commands/#dev-1): +To serve your local development server over HTTPS with a self-signed certificate, you can [set `local_protocol` via the `wrangler.toml / wrangler.json` file](/pages/functions/wrangler-configuration/#local-development-settings) or you can pass the `--local-protocol=https` argument to [`wrangler pages dev`](/workers/wrangler/commands/#dev-1): ```sh npx wrangler pages dev --local-protocol=https @@ -41,6 +41,6 @@ npx wrangler pages dev --local-protocol=https To attach a binding to local development, refer to [Bindings](/pages/functions/bindings/) and find the Cloudflare Developer Platform resource you would like to work with. -## Additional configuration via `wrangler.toml` +## Additional Wrangler configuration -If you are using a `wrangler.toml` configuration file in your project, you can set up dev server values like: `port`, `local protocol`, `ip`, and `port`. For more information, read about [configuring local development settings](/pages/functions/wrangler-configuration/#local-development-settings). +If you are using a Wrangler configuration file in your project, you can set up dev server values like: `port`, `local protocol`, `ip`, and `port`. For more information, read about [configuring local development settings](/pages/functions/wrangler-configuration/#local-development-settings). diff --git a/src/content/docs/pages/functions/source-maps.mdx b/src/content/docs/pages/functions/source-maps.mdx index e88463b8466777..1878e223f979ab 100644 --- a/src/content/docs/pages/functions/source-maps.mdx +++ b/src/content/docs/pages/functions/source-maps.mdx @@ -9,7 +9,7 @@ sidebar: --- -import { Render } from "~/components" +import { Render, WranglerConfig } from "~/components" @@ -23,9 +23,7 @@ Support for uploading source maps for Pages is available now in open beta. Minim ## Source Maps -To enable source maps, provide the `--upload-source-maps` flag to [`wrangler pages deploy`](/workers/wrangler/commands/#deploy-1) or add the following to your Pages application's [`wrangler.toml`](/pages/functions/wrangler-configuration/) file if you are using the Pages build environment: - -import { WranglerConfig } from "~/components"; +To enable source maps, provide the `--upload-source-maps` flag to [`wrangler pages deploy`](/workers/wrangler/commands/#deploy-1) or add the following to your Pages application's [`wrangler.toml / wrangler.json` file](/pages/functions/wrangler-configuration/) if you are using the Pages build environment: diff --git a/src/content/docs/pages/functions/wrangler-configuration.mdx b/src/content/docs/pages/functions/wrangler-configuration.mdx index ed66149b387e69..460b0cd99dcc03 100644 --- a/src/content/docs/pages/functions/wrangler-configuration.mdx +++ b/src/content/docs/pages/functions/wrangler-configuration.mdx @@ -5,36 +5,34 @@ sidebar: order: 6 --- -import { Render, TabItem, Tabs, Type, MetaInfo } from "~/components"; +import { Render, TabItem, Tabs, Type, MetaInfo, WranglerConfig } from "~/components"; :::caution -If your project contains an existing `wrangler.toml` file that you [previously used for local development](/pages/functions/local-development/), make sure you verify that it matches your project settings in the Cloudflare dashboard before opting-in to deploy your Pages project with `wrangler.toml`. Instead of writing your `wrangler.toml` file by hand, Cloudflare recommends using `npx wrangler pages download config` to download your current project settings into a `wrangler.toml` file. +If your project contains an existing Wrangler file that you [previously used for local development](/pages/functions/local-development/), make sure you verify that it matches your project settings in the Cloudflare dashboard before opting-in to deploy your Pages project with the `wrangler.toml / wrangler.json` file. Instead of writing your Wrangler file by hand, Cloudflare recommends using `npx wrangler pages download config` to download your current project settings into a Wrangler file. ::: -Pages Functions can be configured two ways, either via the [Cloudflare dashboard](https://dash.cloudflare.com) or `wrangler.toml`, a configuration file used to customize the development and deployment setup for [Workers](/workers/) and Pages Functions. +Pages Functions can be configured two ways, either via the [Cloudflare dashboard](https://dash.cloudflare.com) or the `wrangler.toml / wrangler.json` file, a file used to customize the development and deployment setup for [Workers](/workers/) and Pages Functions. -This page serves as a reference on how to configure your Pages project via `wrangler.toml`. +This page serves as a reference on how to configure your Pages project via the `wrangler.toml / wrangler.json` file. -If using `wrangler.toml`, you must treat your `wrangler.toml` as the [source of truth](/pages/functions/wrangler-configuration/#source-of-truth) for your Pages project configuration. +If using a `wrangler.toml / wrangler.json` file, you must treat your file as the [source of truth](/pages/functions/wrangler-configuration/#source-of-truth) for your Pages project configuration. -:::note[Configuration via `wrangler.toml` is in open beta.] +:::note[Configuration via the `wrangler.toml / wrangler.json` file is in open beta.] Cloudflare welcomes your feedback. Join the #functions channel in the [Cloudflare Developers Discord](https://discord.com/invite/cloudflaredev) to report bugs and request features. ::: -Using `wrangler.toml` to configure your Pages project allows you to: +Using the `wrangler.toml / wrangler.json` file to configure your Pages project allows you to: - **Store your configuration file in source control:** Keep your configuration in your repository alongside the rest of your code. - **Edit your configuration via your code editor:** Remove the need to switch back and forth between interfaces. - **Write configuration that is shared across environments:** Define configuration like [bindings](/pages/functions/bindings/) for local development, preview and production in one file. - **Ensure better access control:** By using a configuration file in your project repository, you can control who has access to make changes without giving access to your Cloudflare dashboard. -## Example `wrangler.toml` file - -import { WranglerConfig } from "~/components"; +## Example Wrangler file @@ -61,23 +59,21 @@ API_KEY = "1234567asdf" ### V2 build system -Pages Functions configuration via `wrangler.toml` requires the [V2 build system](/pages/configuration/build-image/#v2-build-system) or later. To update from V1, refer to the [V2 build system migration instructions](/pages/configuration/build-image/#v1-to-v2-migration). +Pages Functions configuration via the `wrangler.toml / wrangler.json` file requires the [V2 build system](/pages/configuration/build-image/#v2-build-system) or later. To update from V1, refer to the [V2 build system migration instructions](/pages/configuration/build-image/#v1-to-v2-migration). ### Wrangler -You must have Wrangler version 3.45.0 or higher to use `wrangler.toml` for your Pages project's configuration. To check your Wrangler version, update Wrangler or install Wrangler, refer to [Install/Update Wrangler](/workers/wrangler/install-and-update/). +You must have Wrangler version 3.45.0 or higher to use a `wrangler.toml / wrangler.json` file for your Pages project's configuration. To check your Wrangler version, update Wrangler or install Wrangler, refer to [Install/Update Wrangler](/workers/wrangler/install-and-update/). ## Migrate from dashboard configuration -The migration instructions for Pages projects that do not have a `wrangler.toml` file currently are different than those for Pages projects with an existing `wrangler.toml` file. Read the instructions based on your situation carefully to avoid errors in production. - -### Projects with existing `wrangler.toml` file - -Before you could use `wrangler.toml` to define your preview and production configuration, it was possible to use `wrangler.toml` to define which [bindings](/pages/functions/bindings/) should be available to your Pages project in local development. +The migration instructions for Pages projects that do not have a Wrangler file currently are different than those for Pages projects with an existing Wrangler file. Read the instructions based on your situation carefully to avoid errors in production. -If you have been using `wrangler.toml` for local development, you may already have a file in your Pages project that looks like this: +### Projects with existing Wrangler file +Before you could use the `wrangler.toml / wrangler.json` file to define your preview and production configuration, it was possible to use the file to define which [bindings](/pages/functions/bindings/) should be available to your Pages project in local development. +If you have been using a `wrangler.toml / wrangler.json` file for local development, you may already have a file in your Pages project that looks like this: @@ -89,24 +85,24 @@ id = "" -If you would like to use your existing `wrangler.toml` file for your Pages project configuration, you must: +If you would like to use your existing Wrangler file for your Pages project configuration, you must: 1. Add the `pages_build_output_dir` key with the appropriate value of your [build output directory](/pages/configuration/build-configuration/#build-commands-and-directories) (for example, `pages_build_output_dir = "./dist"`.) -2. Review your existing `wrangler.toml` configuration carefully to make sure it aligns with your desired project configuration before deploying. +2. Review your existing Wrangler configuration carefully to make sure it aligns with your desired project configuration before deploying. -If you add the `pages_build_output_dir` key to `wrangler.toml` and deploy your Pages project, Pages will use whatever configuration was defined for local use, which is very likely to be non-production. Do not deploy until you are confident that your `wrangler.toml` is ready for production use. +If you add the `pages_build_output_dir` key to your `wrangler.toml / wrangler.json` file and deploy your Pages project, Pages will use whatever configuration was defined for local use, which is very likely to be non-production. Do not deploy until you are confident that your `wrangler.toml / wrangler.json` file is ready for production use. :::caution[Overwriting configuration] -Running [`wrangler pages download config`](/pages/functions/wrangler-configuration/#projects-without-existing-wranglertoml-file) will overwrite your existing `wrangler.toml` file with a generated `wrangler.toml` file based on your Cloudflare dashboard configuration. Run this command only if you want to discard your previous `wrangler.toml` file that you used for local development and start over with configuration pulled from the Cloudflare dashboard. +Running [`wrangler pages download config`](/pages/functions/wrangler-configuration/#projects-without-existing-wranglertoml-file) will overwrite your existing Wrangler file with a generated Wrangler file based on your Cloudflare dashboard configuration. Run this command only if you want to discard your previous Wrangler file that you used for local development and start over with configuration pulled from the Cloudflare dashboard. ::: -You can continue to use your `wrangler.toml` file for local development without migrating it for production use by not adding a `pages_build_output_dir` key. If you do not add a `pages_build_output_dir` key and run `wrangler pages deploy`, you will see a warning message telling you that fields are missing and that the file will continue to be used for local development only. +You can continue to use your Wrangler file for local development without migrating it for production use by not adding a `pages_build_output_dir` key. If you do not add a `pages_build_output_dir` key and run `wrangler pages deploy`, you will see a warning message telling you that fields are missing and that the file will continue to be used for local development only. -### Projects without existing `wrangler.toml` file +### Projects without existing Wrangler file -If you have an existing Pages project with configuration set up via the Cloudflare dashboard and do not have an existing `wrangler.toml` file in your Project, run the `wrangler pages download config` command in your Pages project directory. The `wrangler pages download config` command will download your existing Cloudflare dashboard configuration and generate a valid `wrangler.toml` file in your Pages project directory. +If you have an existing Pages project with configuration set up via the Cloudflare dashboard and do not have an existing Wrangler file in your Project, run the `wrangler pages download config` command in your Pages project directory. The `wrangler pages download config` command will download your existing Cloudflare dashboard configuration and generate a valid Wrangler file in your Pages project directory. @@ -128,32 +124,32 @@ pnpm wrangler pages download config -Review your generated `wrangler.toml` file. To start using `wrangler.toml` for your Pages project's configuration, create a new deployment, via [Git integration](/pages/get-started/git-integration/) or [Direct Upload](/pages/get-started/direct-upload/). +Review your generated Wrangler file. To start using the `wrangler.toml / wrangler.json` file for your Pages project's configuration, create a new deployment, via [Git integration](/pages/get-started/git-integration/) or [Direct Upload](/pages/get-started/direct-upload/). ### Handling compatibility dates set to "Latest" In the Cloudflare dashboard, you can set compatibility dates for preview deployments to "Latest". This will ensure your project is always using the latest compatibility date without the need to explicitly set it yourself. -If you download a `wrangler.toml` from a project configured with "Latest" using the `wrangler pages download` command, your `wrangler.toml` will have the latest compatibility date available at the time you downloaded the configuration file. Wrangler does not support the "Latest" functionality like the dashboard. Compatibility dates must be explicitly set when using `wrangler.toml`. +If you download a `wrangler.toml / wrangler.json` file from a project configured with "Latest" using the `wrangler pages download` command, your `wrangler.toml / wrangler.json` file will have the latest compatibility date available at the time you downloaded the configuration file. Wrangler does not support the "Latest" functionality like the dashboard. Compatibility dates must be explicitly set when using a `wrangler.toml / wrangler.json` file. Refer to [this guide](/workers/configuration/compatibility-dates/) for more information on what compatibility dates are and how they work. -## Differences using `wrangler.toml` for Pages Functions and Workers +## Differences using a Wrangler configuration file for Pages Functions and Workers -If you have used [Workers](/workers), you may already be familiar with [`wrangler.toml`](/workers/wrangler/configuration/). There are a few key differences to be aware of when using `wrangler.toml` with your Pages Functions project: +If you have used [Workers](/workers), you may already be familiar with the [`wrangler.toml / wrangler.json` file](/workers/wrangler/configuration/). There are a few key differences to be aware of when using this file with your Pages Functions project: -- The configuration fields **do not match exactly** between Pages Functions `wrangler.toml` file and the Workers equivalent. For example, configuration keys like `main`, which are Workers specific, do not apply to a Pages Function's `wrangler.toml`. Some functionality supported by Workers, such as [module aliasing](/workers/wrangler/configuration/#module-aliasing) cannot yet be used by Cloudflare Pages projects. -- The Pages `wrangler.toml` introduces a new key, `pages_build_output_dir`, which is only used for Pages projects. +- The configuration fields **do not match exactly** between Pages Functions Wrangler file and the Workers equivalent. For example, configuration keys like `main`, which are Workers specific, do not apply to a Pages Function's `wrangler.toml / wrangler.json` file. Some functionality supported by Workers, such as [module aliasing](/workers/wrangler/configuration/#module-aliasing) cannot yet be used by Cloudflare Pages projects. +- The Pages' `wrangler.toml / wrangler.json` file introduces a new key, `pages_build_output_dir`, which is only used for Pages projects. - The concept of [environments](/pages/functions/wrangler-configuration/#configure-environments) and configuration inheritance in this file **is not** the same as Workers. - This file becomes the [source of truth](/pages/functions/wrangler-configuration/#source-of-truth) when used, meaning that you **can not edit the same fields in the dashboard** once you are using this file. ## Configure environments -With `wrangler.toml` you can quickly set configuration across your local environment, preview deployments, and production. +With a `wrangler.toml / wrangler.json` file, you can quickly set configuration across your local environment, preview deployments, and production. ### Local development -`wrangler.toml` works locally when using `wrangler pages dev`. This means that you can test out configuration changes quickly without a need to login to the Cloudflare dashboard. Refer to the following config file for an example: +`wrangler.toml / wrangler.json` file works locally when using `wrangler pages dev`. This means that you can test out configuration changes quickly without a need to login to the Cloudflare dashboard. Refer to the following config file for an example: @@ -172,7 +168,7 @@ id = "" -This `wrangler.toml` configuration file adds the `nodejs_compat` compatibility flag and a KV namespace binding to your Pages project. Running `wrangler pages dev` in a Pages project directory with this `wrangler.toml` configuration file will apply the `nodejs_compat` compatibility flag locally, and expose the `KV` binding in your Pages Function code at `context.env.KV`. +This `wrangler.toml / wrangler.json` file adds the `nodejs_compat` compatibility flag and a KV namespace binding to your Pages project. Running `wrangler pages dev` in a Pages project directory with this `wrangler.toml / wrangler.json` file will apply the `nodejs_compat` compatibility flag locally, and expose the `KV` binding in your Pages Function code at `context.env.KV`. :::note @@ -182,7 +178,7 @@ For a full list of configuration keys, refer to [inheritable keys](#inheritable- ### Production and preview deployments -Once you are ready to deploy your project, you can set the configuration for production and preview deployments by creating a new deployment containing a `wrangler.toml` file. +Once you are ready to deploy your project, you can set the configuration for production and preview deployments by creating a new deployment containing a Wrangler file. :::note @@ -220,7 +216,7 @@ Unlike [Workers Environments](/workers/wrangler/configuration/#environments), `p ::: -Refer to the following `wrangler.toml` configuration file for an example of how to override preview deployment configuration: +Refer to the following `wrangler.toml / wrangler.json` file for an example of how to override preview deployment configuration: @@ -439,20 +435,18 @@ When using Wrangler in the default local development mode, files will be written ::: -- Configure D1 database bindings via your [`wrangler.toml` file](/workers/wrangler/configuration/#d1-databases) the same way they are configured with Cloudflare Workers. +- Configure D1 database bindings via your [Wrangler file](/workers/wrangler/configuration/#d1-databases) the same way they are configured with Cloudflare Workers. - Interact with your [D1 Database binding](/pages/functions/bindings/#d1-databases). ### Durable Objects [Durable Objects](/durable-objects/) provide low-latency coordination and consistent storage for the Workers platform. -- Configure Durable Object namespace bindings via your [`wrangler.toml` file](/workers/wrangler/configuration/#durable-objects) the same way they are configured with Cloudflare Workers. +- Configure Durable Object namespace bindings via your [Wrangler file](/workers/wrangler/configuration/#durable-objects) the same way they are configured with Cloudflare Workers. :::caution - Durable Object bindings configured in -a Pages project's `wrangler.toml` require the `script_name` key. For Workers, -the `script_name` key is optional. + Durable Object bindings configured in a Pages project's `wrangler.toml / wrangler.json` file require the `script_name` key. For Workers, the `script_name` key is optional. ::: @@ -462,14 +456,14 @@ the `script_name` key is optional. [Environment variables](/workers/configuration/environment-variables/) are a type of binding that allow you to attach text strings or JSON values to your Pages Function. -- Configure environment variables via your [`wrangler.toml` file](/workers/wrangler/configuration/#environment-variables) the same way they are configured with Cloudflare Workers. +- Configure environment variables via your [Wrangler file](/workers/wrangler/configuration/#environment-variables) the same way they are configured with Cloudflare Workers. - Interact with your [environment variables](/pages/functions/bindings/#environment-variables). ### Hyperdrive [Hyperdrive](/hyperdrive/) bindings allow you to interact with and query any Postgres database from within a Pages Function. -- Configure Hyperdrive bindings via your [`wrangler.toml` file](/workers/wrangler/configuration/#hyperdrive) the same way they are configured with Cloudflare Workers. +- Configure Hyperdrive bindings via your [Wrangler file](/workers/wrangler/configuration/#hyperdrive) the same way they are configured with Cloudflare Workers. ### KV namespaces @@ -481,7 +475,7 @@ When using Wrangler in the default local development mode, files will be written ::: -- Configure KV namespace bindings via your [`wrangler.toml` file](/workers/wrangler/configuration/#kv-namespaces) the same way they are configured with Cloudflare Workers. +- Configure KV namespace bindings via your [Wrangler file](/workers/wrangler/configuration/#kv-namespaces) the same way they are configured with Cloudflare Workers. - Interact with your [KV namespace binding](/pages/functions/bindings/#kv-namespaces). ### Queues Producers @@ -494,7 +488,7 @@ You cannot currently configure a [queues consumer](/queues/reference/how-queues- ::: -- Configure Queues Producer bindings via your [`wrangler.toml` file](/workers/wrangler/configuration/#queues) the same way they are configured with Cloudflare Workers. +- Configure Queues Producer bindings via your [Wrangler file](/workers/wrangler/configuration/#queues) the same way they are configured with Cloudflare Workers. - Interact with your [Queues Producer binding](/pages/functions/bindings/#queue-producers). ### R2 buckets @@ -507,27 +501,27 @@ When using Wrangler in the default local development mode, files will be written ::: -- Configure R2 bucket bindings via your [`wrangler.toml` file](/workers/wrangler/configuration/#r2-buckets) the same way they are configured with Cloudflare Workers. +- Configure R2 bucket bindings via your [Wrangler file](/workers/wrangler/configuration/#r2-buckets) the same way they are configured with Cloudflare Workers. - Interact with your [R2 bucket bindings](/pages/functions/bindings/#r2-buckets). ### Vectorize indexes A [Vectorize index](/vectorize/) allows you to insert and query vector embeddings for semantic search, classification and other vector search use-cases. -- Configure Vectorize bindings via your [`wrangler.toml` file](/workers/wrangler/configuration/#vectorize-indexes) the same way they are configured with Cloudflare Workers. +- Configure Vectorize bindings via your [Wrangler file](/workers/wrangler/configuration/#vectorize-indexes) the same way they are configured with Cloudflare Workers. ### Service bindings A service binding allows you to call a Worker from within your Pages Function. Binding a Pages Function to a Worker allows you to send HTTP requests to the Worker without those requests going over the Internet. The request immediately invokes the downstream Worker, reducing latency as compared to a request to a third-party service. Refer to [About Service bindings](/workers/runtime-apis/bindings/service-bindings/). -- Configure service bindings via your [`wrangler.toml` file](/workers/wrangler/configuration/#service-bindings) the same way they are configured with Cloudflare Workers. +- Configure service bindings via your [Wrangler file](/workers/wrangler/configuration/#service-bindings) the same way they are configured with Cloudflare Workers. - Interact with your [service bindings](/pages/functions/bindings/#service-bindings). ### Analytics Engine Datasets [Workers Analytics Engine](/analytics/analytics-engine/) provides analytics, observability and data logging from Pages Functions. Write data points within your Pages Function binding then query the data using the [SQL API](/analytics/analytics-engine/sql-api/). -- Configure Analytics Engine Dataset bindings via your [`wrangler.toml` file](/workers/wrangler/configuration/#analytics-engine-datasets) the same way they are configured with Cloudflare Workers. +- Configure Analytics Engine Dataset bindings via your [Wrangler file](/workers/wrangler/configuration/#analytics-engine-datasets) the same way they are configured with Cloudflare Workers. - Interact with your [Analytics Engine Dataset](/pages/functions/bindings/#analytics-engine). ### Workers AI @@ -538,7 +532,7 @@ A service binding allows you to call a Worker from within your Pages Function. B Unlike other bindings, this binding is limited to one AI binding per Pages Function project. -- Configure Workers AI bindings via your [`wrangler.toml` file](/workers/wrangler/configuration/#workers-ai) the same way they are configured with Cloudflare Workers. +- Configure Workers AI bindings via your [Wrangler file](/workers/wrangler/configuration/#workers-ai) the same way they are configured with Cloudflare Workers. - Interact with your [Workers AI binding](/pages/functions/bindings/#workers-ai). ## Local development settings @@ -547,6 +541,6 @@ The local development settings that you can configure are the same for Pages Fun ## Source of truth -When used in your Pages Functions projects, your `wrangler.toml` file is the source of truth. You will be able to see, but not edit, the same fields when you log into the Cloudflare dashboard. +When used in your Pages Functions projects, your Wrangler file is the source of truth. You will be able to see, but not edit, the same fields when you log into the Cloudflare dashboard. -If you decide that you don't want to use `wrangler.toml` for configuration, you can safely delete it and create a new deployment. Configuration values from your last deployment will still apply and you will be able to edit them from the dashboard. +If you decide that you do not want to use a `wrangler.toml / wrangler.json` file for configuration, you can safely delete it and create a new deployment. Configuration values from your last deployment will still apply and you will be able to edit them from the dashboard. diff --git a/src/content/docs/pages/get-started/c3.mdx b/src/content/docs/pages/get-started/c3.mdx index 15d1cb90f1ca2a..d77d3c148b1063 100644 --- a/src/content/docs/pages/get-started/c3.mdx +++ b/src/content/docs/pages/get-started/c3.mdx @@ -10,7 +10,14 @@ description: Use C3 (`create-cloudflare` CLI) to set up and deploy new deployment. --- -import { Render, TabItem, Tabs, Type, MetaInfo, PackageManagers } from "~/components"; +import { + Render, + TabItem, + Tabs, + Type, + MetaInfo, + PackageManagers, +} from "~/components"; Cloudflare provides a CLI command for creating new Workers and Pages projects — `npm create cloudflare`, powered by the [`create-cloudflare` package](https://www.npmjs.com/package/create-cloudflare). @@ -73,7 +80,7 @@ npm create cloudflare@latest [--] [] [OPTIONS] [-- ] ```sh -yarn create cloudflare@latest [--] [] [OPTIONS] [-- ] +yarn create cloudflare [--] [] [OPTIONS] [-- ] ``` @@ -163,8 +170,8 @@ bun create cloudflare@latest [--] [] [OPTIONS] [-- ] At a minimum, templates must contain the following: - `package.json` - - `wrangler.toml` - - `src/` containing a worker script referenced from `wrangler.toml` + - `wrangler.json` + - `src/` containing a worker script referenced from `wrangler.json` See the [templates folder](https://github.com/cloudflare/workers-sdk/tree/main/packages/create-cloudflare/templates) of this repo for more examples. @@ -229,7 +236,7 @@ Cloudflare collects anonymous usage data to improve `create-cloudflare` over tim You can opt-out if you do not wish to share any information. @@ -243,15 +250,15 @@ export CREATE_CLOUDFLARE_TELEMETRY_DISABLED=1 You can check the status of telemetry collection at any time. You can always re-enable telemetry collection. diff --git a/src/content/docs/pages/get-started/direct-upload.mdx b/src/content/docs/pages/get-started/direct-upload.mdx index 73fc8e4ce6cf4f..2634e821ff69b0 100644 --- a/src/content/docs/pages/get-started/direct-upload.mdx +++ b/src/content/docs/pages/get-started/direct-upload.mdx @@ -10,7 +10,13 @@ description: Upload your prebuilt assets to Pages and deploy them via the import { Render } from "~/components"; -Direct Upload enables you to upload your prebuilt assets to Pages and deploy them to the Cloudflare global network. This guide will instruct you how to upload your assets using Wrangler or the drag and drop method. +Direct Upload enables you to upload your prebuilt assets to Pages and deploy them to the Cloudflare global network. You should choose Direct Upload over Git integration if you want to [integrate your own build platform](/pages/how-to/use-direct-upload-with-continuous-integration/) or upload from your local computer. + +This guide will instruct you how to upload your assets using Wrangler or the drag and drop method. + +:::caution[You cannot switch to Git integration later] +If you choose Direct Upload, you cannot switch to [Git integration](/pages/get-started/git-integration/) later. You will have to create a new project with Git integration to use automatic deployments. +::: ## Prerequisites @@ -141,4 +147,4 @@ If using the drag and drop method, a red warning symbol will appear next to an a Drag and drop deployments made from the Cloudflare dashboard do not currently support compiling a `functions` folder of [Pages Functions](/pages/functions/). To deploy a `functions` folder, you must use Wrangler. When deploying a project using Wrangler, if a `functions` folder exists where the command is run, that `functions` folder will be uploaded with the project. -However, note that a `_worker.js` file is supported by both Wrangler and drag and drop deployments made from the dashboard. \ No newline at end of file +However, note that a `_worker.js` file is supported by both Wrangler and drag and drop deployments made from the dashboard. diff --git a/src/content/docs/pages/get-started/git-integration.mdx b/src/content/docs/pages/get-started/git-integration.mdx index 85e7ba1ee544d2..c8e53242c2cc4c 100644 --- a/src/content/docs/pages/get-started/git-integration.mdx +++ b/src/content/docs/pages/get-started/git-integration.mdx @@ -5,12 +5,16 @@ head: - tag: title content: Git integration guide description: Connect your Git provider to Pages. - --- -import { Details, Render } from "~/components" +import { Details, Render } from "~/components"; + +In this guide, you will get started with Cloudflare Pages and deploy your first website to the Pages platform through Git integration. The Git integration enables automatic builds and deployments every time you push a change to your connected [GitHub](/pages/configuration/git-integration/github-integration/) or [GitLab](/pages/configuration/git-integration/gitlab-integration/) repository. + +:::caution[You cannot switch to Direct Upload later] +If you deploy using the Git integration, you cannot switch to [Direct Upload](/pages/get-started/direct-upload/) later. However, if you already use a Git-integrated project and do not want to trigger deployments every time you push a commit, you can [disable automatic deployments](/pages/configuration/git-integration/#disable-automatic-deployments) on all branches. Then, you can use Wrangler to deploy directly to your Pages projects and make changes to your Git repository without automatically triggering a build. -In this guide, you will get started with Cloudflare Pages, and deploy your first website to the Pages platform through Git integration. +::: ## Connect your Git provider to Pages diff --git a/src/content/docs/pages/how-to/add-custom-http-headers.mdx b/src/content/docs/pages/how-to/add-custom-http-headers.mdx index d696423ccb2f04..a5e50cfe196fce 100644 --- a/src/content/docs/pages/how-to/add-custom-http-headers.mdx +++ b/src/content/docs/pages/how-to/add-custom-http-headers.mdx @@ -3,6 +3,8 @@ pcx_content_type: how-to title: Add custom HTTP headers --- +import { WranglerConfig } from "~/components"; + :::note Cloudflare provides HTTP header customization for Pages projects by adding a `_headers` file to your project. Refer to the [documentation](/pages/configuration/headers/) for more information. @@ -64,9 +66,7 @@ cd custom-headers-example npm install ``` -To operate your Workers function alongside your Pages application, deploy it to the same custom domain as your Pages application. To do this, update the `wrangler.toml` file in your project with your account and zone details: - -import { WranglerConfig } from "~/components"; +To operate your Workers function alongside your Pages application, deploy it to the same custom domain as your Pages application. To do this, update the Wrangler file in your project with your account and zone details: @@ -83,7 +83,7 @@ zone_id = "FILL-IN-YOUR-ZONE-ID" If you do not know how to find your Account ID and Zone ID, refer to [our guide](/fundamentals/setup/find-account-and-zone-ids/). -Once you have configured your `wrangler.toml`, run `npx wrangler deploy` in your terminal to deploy your Worker: +Once you have configured your `wrangler.toml / wrangler.json` file, run `npx wrangler deploy` in your terminal to deploy your Worker: ```sh npx wrangler deploy diff --git a/src/content/docs/pages/migrations/migrating-from-workers/index.mdx b/src/content/docs/pages/migrations/migrating-from-workers/index.mdx index 64cded1f056b5a..ef891f3d21e1fc 100644 --- a/src/content/docs/pages/migrations/migrating-from-workers/index.mdx +++ b/src/content/docs/pages/migrations/migrating-from-workers/index.mdx @@ -17,7 +17,7 @@ You may already have a reasonably complex Worker and/or it would be tedious to s :::note -When using a `_worker.js` file, the entire `/functions` directory is ignored – this includes its routing and middleware characteristics. Instead, the `_worker.js` file is deployed as is and must be written using the [Module Worker syntax](/workers/reference/migrate-to-module-workers/). +When using a `_worker.js` file, the entire `/functions` directory is ignored - this includes its routing and middleware characteristics. Instead, the `_worker.js` file is deployed as is and must be written using the [Module Worker syntax](/workers/reference/migrate-to-module-workers/). ::: @@ -29,10 +29,10 @@ By migrating to Cloudflare Pages, you will be able to access features like [prev Workers Sites projects consist of the following pieces: 1. An application built with a [static site tool](/pages/how-to/) or a static collection of HTML, CSS and JavaScript files. -2. If using a static site tool, a build directory (called `bucket` in `wrangler.toml`) where the static project builds your HTML, CSS, and JavaScript files. +2. If using a static site tool, a build directory (called `bucket` in the `wrangler.toml / wrangler.json` file) where the static project builds your HTML, CSS, and JavaScript files. 3. A Worker application for serving that build directory. For most projects, this is likely to be the `workers-site` directory. -When moving to Cloudflare Pages, remove the Workers application and any associated `wrangler.toml` configuration files or build output. Instead, note and record your `build` command (if you have one), and the `bucket` field, or build directory, from the `wrangler.toml` file in your project's directory. +When moving to Cloudflare Pages, remove the Workers application and any associated `wrangler.toml / wrangler.json` files or build output. Instead, note and record your `build` command (if you have one), and the `bucket` field, or build directory, from the Wrangler file in your project's directory. ## Migrate headers and redirects diff --git a/src/content/docs/pages/platform/known-issues.mdx b/src/content/docs/pages/platform/known-issues.mdx index e15b0e556bfaf7..97aa558d274f9b 100644 --- a/src/content/docs/pages/platform/known-issues.mdx +++ b/src/content/docs/pages/platform/known-issues.mdx @@ -19,7 +19,7 @@ Here are some known bugs and issues with Cloudflare Pages: ## Git configuration -- After you have selected a GitHub/GitLab repository for your Pages application, it cannot be changed. Delete your Pages project and create a new one pointing at a different repository if you need to update it. +- If you deploy using the Git integration, you cannot switch to Direct Upload later. However, if you already use a Git-integrated project and do not want to trigger deployments every time you push a commit, you can [disable/pause automatic deployments](/pages/configuration/git-integration/#disable-automatic-deployments). Alternatively, you can delete your Pages project and create a new one pointing at a different repository if you need to update it. ## Build configuration diff --git a/src/content/docs/pages/tutorials/localize-a-website/index.mdx b/src/content/docs/pages/tutorials/localize-a-website/index.mdx index 2a7aad8fffcf35..ea94ce012754cf 100644 --- a/src/content/docs/pages/tutorials/localize-a-website/index.mdx +++ b/src/content/docs/pages/tutorials/localize-a-website/index.mdx @@ -10,7 +10,7 @@ tags: - HTMLRewriter --- -import { Render, PackageManagers } from "~/components"; +import { Render, PackageManagers, WranglerConfig } from "~/components"; In this tutorial, you will build an example internationalization and localization engine (commonly referred to as **i18n** and **l10n**) for your application, serve the content of your site, and automatically translate the content based on your visitors’ location in the world. @@ -258,9 +258,7 @@ export async function onRequest(context) { Your i18n tool built on Cloudflare Pages is complete and it is time to deploy it to your domain. -To deploy your application to a `*.pages.dev` subdomain, you need to specify a directory of static assets to serve, configure the `pages_build_output_dir` in your project’s `wrangler.toml` file and set the value to `./public`: - -import { WranglerConfig } from "~/components"; +To deploy your application to a `*.pages.dev` subdomain, you need to specify a directory of static assets to serve, configure the `pages_build_output_dir` in your project’s Wrangler file and set the value to `./public`: diff --git a/src/content/docs/pages/tutorials/use-r2-as-static-asset-storage-for-pages/index.mdx b/src/content/docs/pages/tutorials/use-r2-as-static-asset-storage-for-pages/index.mdx index 83353424c94221..f016a6357a08c0 100644 --- a/src/content/docs/pages/tutorials/use-r2-as-static-asset-storage-for-pages/index.mdx +++ b/src/content/docs/pages/tutorials/use-r2-as-static-asset-storage-for-pages/index.mdx @@ -12,6 +12,8 @@ languages: - JavaScript --- +import { WranglerConfig } from "~/components"; + This tutorial will teach you how to use [R2](/r2/) as a static asset storage bucket for your [Pages](/pages/) app. This is especially helpful if you're hitting the [file limit](/pages/platform/limits/#files) or the [max file size limit](/pages/platform/limits/#file-size) on Pages. To illustrate how this is done, we will use R2 as a static asset storage for a fictional cat blog. @@ -65,11 +67,9 @@ npx wrangler r2 object put / -f ## Bind R2 to Pages -To bind the R2 bucket we have created to the cat blog, we need to update `wrangler.toml`. +To bind the R2 bucket we have created to the cat blog, we need to update the Wrangler configuration. -Open `wrangler.toml`, and add the following binding to the file. `bucket_name` should be the exact name of the bucket created earlier, while `binding` can be any custom name referring to the R2 resource: - -import { WranglerConfig } from "~/components"; +Open the `wrangler.toml / wrangler.json` file, and add the following binding to the file. `bucket_name` should be the exact name of the bucket created earlier, while `binding` can be any custom name referring to the R2 resource: @@ -86,7 +86,7 @@ bucket_name = "cat-media" Note: The keyword `ASSETS` is reserved and cannot be used as a resource binding. ::: -Save `wrangler.toml` and we are ready to move on to the last step. +Save the `wrangler.toml / wrangler.json` file, and we are ready to move on to the last step. Alternatively, you can add a binding to your Pages project on the dashboard by navigating to the project’s _Settings_ tab > _Functions_ > _R2 bucket bindings_. diff --git a/src/content/docs/pub-sub/learning/integrate-workers.mdx b/src/content/docs/pub-sub/learning/integrate-workers.mdx index bd2399073fcc58..3ba068f47cbcb0 100644 --- a/src/content/docs/pub-sub/learning/integrate-workers.mdx +++ b/src/content/docs/pub-sub/learning/integrate-workers.mdx @@ -5,6 +5,8 @@ sidebar: order: 2 --- +import { WranglerConfig } from "~/components"; + Once of the most powerful features of Pub/Sub is the ability to connect [Cloudflare Workers](/workers/) — powerful serverless functions that run on the edge — and filter, aggregate and mutate every message published to that broker. Workers can also mirror those messages to other sources, including writing to [Cloudflare R2 storage](/r2/), external databases, or other cloud services beyond Cloudflare, making it easy to persist or analyze incoming message payloads and data at scale. There are three ways to integrate a Worker with Pub/Sub: @@ -80,7 +82,7 @@ You should receive a success response that resembles the example below, with the ] ``` -Copy the array of public keys into your `wrangler.toml` as an environmental variable: +Copy the array of public keys into your `wrangler.toml / wrangler.json` file as an environmental variable: :::note @@ -88,8 +90,6 @@ Your public keys will be unique to your own Pub/Sub Broker: you should ensure yo ::: -import { WranglerConfig } from "~/components"; - ```toml diff --git a/src/content/docs/queues/configuration/batching-retries.mdx b/src/content/docs/queues/configuration/batching-retries.mdx index 361cd9afcdce53..b09220c49f5300 100644 --- a/src/content/docs/queues/configuration/batching-retries.mdx +++ b/src/content/docs/queues/configuration/batching-retries.mdx @@ -5,6 +5,8 @@ sidebar: order: 2 --- +import { WranglerConfig } from "~/components"; + ## Batching When configuring a [consumer Worker](/queues/reference/how-queues-works#consumers) for a queue, you can also define how messages are batched as they are delivered. @@ -194,9 +196,7 @@ npx wrangler@latest queues consumer worker add $QUEUE-NAME $WORKER_SCRIPT_NAME - npx wrangler@latest queues consumer http add $QUEUE-NAME --retry-delay-secs=60 ``` -Delays can also be configured in [`wrangler.toml`](/workers/wrangler/configuration/#queues) with the `delivery_delay` setting for producers (when sending) and/or the `retry_delay` (when retrying) per-consumer: - -import { WranglerConfig } from "~/components"; +Delays can also be configured in the [`wrangler.toml / wrangler.json` file](/workers/wrangler/configuration/#queues) with the `delivery_delay` setting for producers (when sending) and/or the `retry_delay` (when retrying) per-consumer: @@ -213,7 +213,7 @@ import { WranglerConfig } from "~/components"; -If you use both the `wrangler` CLI and `wrangler.toml` to change the settings associated with a queue or a queue consumer, the most recent configuration change will take effect. +If you use both the `wrangler` CLI and the `wrangler.toml / wrangler.json` file to change the settings associated with a queue or a queue consumer, the most recent configuration change will take effect. Refer to the [Queues REST API documentation](/api/resources/queues/subresources/consumers/methods/get/) to learn how to configure message delays and retry delays programmatically. diff --git a/src/content/docs/queues/configuration/configure-queues.mdx b/src/content/docs/queues/configuration/configure-queues.mdx index 6030d3d0654cfa..d34bc6c1227253 100644 --- a/src/content/docs/queues/configuration/configure-queues.mdx +++ b/src/content/docs/queues/configuration/configure-queues.mdx @@ -9,16 +9,18 @@ head: --- +import { WranglerConfig } from "~/components"; + Cloudflare Queues can be configured using [Wrangler](/workers/wrangler/install-and-update/), the command-line interface for Cloudflare's Developer Platform, which includes [Workers](/workers/), [R2](/r2/), and other developer products. -Each Worker has a `wrangler.toml` configuration file that specifies environment variables, triggers, and resources, such as a Queue. To enable Worker-to-resource communication, you must set up a [binding](/workers/runtime-apis/bindings/) in your Worker project's `wrangler.toml` file. +Each Worker has a `wrangler.toml / wrangler.json` file that specifies environment variables, triggers, and resources, such as a Queue. To enable Worker-to-resource communication, you must set up a [binding](/workers/runtime-apis/bindings/) in your Worker project's Wrangler file. Use the options below to configure your queue. :::note -Below are options for Queues, refer to the Wrangler documentation for a full reference of [`wrangler.toml`](/workers/wrangler/configuration/). +Below are options for Queues, refer to the Wrangler documentation for a full reference of the [`wrangler.toml / wrangler.json` file](/workers/wrangler/configuration/). ::: @@ -27,9 +29,7 @@ Below are options for Queues, refer to the Wrangler documentation for a full ref A producer is a [Cloudflare Worker](/workers/) that writes to one or more queues. A producer can accept messages over HTTP, asynchronously write messages when handling requests, and/or write to a queue from within a [Durable Object](/durable-objects/). Any Worker can write to a queue. -To produce to a queue, set up a binding in your `wrangler.toml` file. These options should be used when a Worker wants to send messages to a queue. - -import { WranglerConfig } from "~/components"; +To produce to a queue, set up a binding in your Wrangler file. These options should be used when a Worker wants to send messages to a queue. @@ -57,7 +57,7 @@ import { WranglerConfig } from "~/components"; ## Workers -To consume messages from one or more queues, set up a binding in your `wrangler.toml` file. These options should be used when a Worker wants to receive messages from a queue. +To consume messages from one or more queues, set up a binding in your Wrangler file. These options should be used when a Worker wants to receive messages from a queue. diff --git a/src/content/docs/queues/configuration/consumer-concurrency.mdx b/src/content/docs/queues/configuration/consumer-concurrency.mdx index e23d881d8ddfce..add633b7286c56 100644 --- a/src/content/docs/queues/configuration/consumer-concurrency.mdx +++ b/src/content/docs/queues/configuration/consumer-concurrency.mdx @@ -5,6 +5,8 @@ sidebar: order: 5 --- +import { WranglerConfig } from "~/components"; + Consumer concurrency allows a [consumer Worker](/queues/reference/how-queues-works/#consumers) processing messages from a queue to automatically scale out horizontally to keep up with the rate that messages are being written to a queue. In many systems, the rate at which you write messages to a queue can easily exceed the rate at which a single consumer can read and process those same messages. This is often because your consumer might be parsing message contents, writing to storage or a database, or making third-party (upstream) API calls. @@ -58,7 +60,7 @@ If you have a workflow that is limited by an upstream API and/or system, you may You can configure the concurrency of your consumer Worker in two ways: 1. Set concurrency settings in the Cloudflare dashboard -2. Set concurrency settings via `wrangler.toml` +2. Set concurrency settings via the `wrangler.toml / wrangler.json` file ### Set concurrency settings in the Cloudflare dashboard @@ -74,7 +76,7 @@ To remove a fixed maximum value, select **auto (recommended)**. Note that if you are writing messages to a queue faster than you can process them, messages may eventually reach the [maximum retention period](/queues/platform/limits/) set for that queue. Individual messages that reach that limit will expire from the queue and be deleted. -### Set concurrency settings via `wrangler.toml` +### Set concurrency settings in the `wrangler.toml / wrangler.json` file :::note @@ -82,9 +84,7 @@ Ensure you are using the latest version of [wrangler](/workers/wrangler/install- ::: -To set a fixed maximum number of concurrent consumer invocations for a given queue, configure a `max_concurrency` in your `wrangler.toml` file: - -import { WranglerConfig } from "~/components"; +To set a fixed maximum number of concurrent consumer invocations for a given queue, configure a `max_concurrency` in your Wrangler file: diff --git a/src/content/docs/queues/configuration/dead-letter-queues.mdx b/src/content/docs/queues/configuration/dead-letter-queues.mdx index cdfe6d16253c84..847a079ed92c4f 100644 --- a/src/content/docs/queues/configuration/dead-letter-queues.mdx +++ b/src/content/docs/queues/configuration/dead-letter-queues.mdx @@ -5,14 +5,14 @@ sidebar: order: 3 --- +import { WranglerConfig } from "~/components"; + A Dead Letter Queue (DLQ) is a common concept in a messaging system, and represents where messages are sent when a delivery failure occurs with a consumer after `max_retries` is reached. A Dead Letter Queue is like any other queue, and can be produced to and consumed from independently. With Cloudflare Queues, a Dead Letter Queue is defined within your [consumer configuration](/queues/configuration/configure-queues/). Messages are delivered to the DLQ when they reach the configured retry limit for the consumer. Without a DLQ configured, messages that reach the retry limit are deleted permanently. For example, the following consumer configuration would send messages to our DLQ named `"my-other-queue"` after retrying delivery (by default, 3 times): -import { WranglerConfig } from "~/components"; - ```toml diff --git a/src/content/docs/queues/configuration/pull-consumers.mdx b/src/content/docs/queues/configuration/pull-consumers.mdx index 6fce655387eed7..ca58cd2572b3e1 100644 --- a/src/content/docs/queues/configuration/pull-consumers.mdx +++ b/src/content/docs/queues/configuration/pull-consumers.mdx @@ -8,6 +8,8 @@ head: content: Cloudflare Queues - Pull consumers --- +import { WranglerConfig } from "~/components"; + A pull-based consumer allows you to pull from a queue over HTTP from any environment and/or programming language outside of Cloudflare Workers. A pull-based consumer can be useful when your message consumption rate is limited by upstream infrastructure or long-running tasks. ## How to choose between push or pull consumer @@ -34,13 +36,11 @@ To configure a pull-based consumer and receive messages from a queue, you need t ## 1. Enable HTTP pull -You can enable HTTP pull or change a queue from push-based to pull-based via `wrangler.toml`, the `wrangler` CLI, or via the [Cloudflare dashboard](https://dash.cloudflare.com/). +You can enable HTTP pull or change a queue from push-based to pull-based via the `wrangler.toml / wrangler.json` file, the `wrangler` CLI, or via the [Cloudflare dashboard](https://dash.cloudflare.com/). -### wrangler.toml +### Wrangler configuration file -A HTTP consumer can be configured in `wrangler.toml` by setting `type = "http_pull"` in the consumer configuration: - -import { WranglerConfig } from "~/components"; +A HTTP consumer can be configured in the `wrangler.toml / wrangler.json` file by setting `type = "http_pull"` in the consumer configuration: @@ -75,7 +75,7 @@ wrangler queues consumer worker remove $QUEUE-NAME $SCRIPT_NAME :::note -If you remove the Worker consumer with `wrangler` but do not delete the `[[queues.consumer]]` configuration from `wrangler.toml`, subsequent deployments of your Worker will fail when they attempt to add a conflicting consumer configuration. +If you remove the Worker consumer with `wrangler` but do not delete the `[[queues.consumer]]` configuration from `wrangler.toml / wrangler.json` file, subsequent deployments of your Worker will fail when they attempt to add a conflicting consumer configuration. Ensure you remove the consumer configuration first. diff --git a/src/content/docs/queues/examples/publish-to-a-queue-over-http.mdx b/src/content/docs/queues/examples/publish-to-a-queue-over-http.mdx index 7753c6f9c7225c..e56b154f54ee1c 100644 --- a/src/content/docs/queues/examples/publish-to-a-queue-over-http.mdx +++ b/src/content/docs/queues/examples/publish-to-a-queue-over-http.mdx @@ -10,6 +10,8 @@ head: description: Publish to a Queue directly via HTTP and Workers. --- +import { WranglerConfig } from "~/components"; + The following example shows you how to publish messages to a queue from any HTTP client, using a shared secret to securely authenticate the client. This allows you to write to a Queue from any service or programming language that support HTTP, including Go, Rust, Python or even a Bash script. @@ -17,11 +19,9 @@ This allows you to write to a Queue from any service or programming language tha ### Prerequisites - A [queue created](/queues/get-started/#3-create-a-queue) via the [Cloudflare dashboard](https://dash.cloudflare.com) or the [wrangler CLI](/workers/wrangler/install-and-update/). -- A [configured **producer** binding](/queues/configuration/configure-queues/#producer) in the Cloudflare dashboard or `wrangler.toml` file. +- A [configured **producer** binding](/queues/configuration/configure-queues/#producer) in the Cloudflare dashboard or Wrangler file. -Configure your `wrangler.toml` file as follows: - -import { WranglerConfig } from "~/components"; +Configure your Wrangler file as follows: diff --git a/src/content/docs/queues/examples/send-errors-to-r2.mdx b/src/content/docs/queues/examples/send-errors-to-r2.mdx index c8f3aa93d71cab..c74a0f060358b7 100644 --- a/src/content/docs/queues/examples/send-errors-to-r2.mdx +++ b/src/content/docs/queues/examples/send-errors-to-r2.mdx @@ -11,10 +11,10 @@ description: Example of how to use Queues to batch data and store it in an R2 bu --- -The following Worker will catch JavaScript errors and send them to a queue. The same Worker will receive those errors in batches and store them to a log file in an R2 bucket. - import { WranglerConfig } from "~/components"; +The following Worker will catch JavaScript errors and send them to a queue. The same Worker will receive those errors in batches and store them to a log file in an R2 bucket. + ```toml diff --git a/src/content/docs/queues/examples/use-queues-with-durable-objects.mdx b/src/content/docs/queues/examples/use-queues-with-durable-objects.mdx index 79ccb57415ebfc..b40279302a55b7 100644 --- a/src/content/docs/queues/examples/use-queues-with-durable-objects.mdx +++ b/src/content/docs/queues/examples/use-queues-with-durable-objects.mdx @@ -10,17 +10,17 @@ head: description: Publish to a queue from within a Durable Object. --- +import { WranglerConfig } from "~/components"; + The following example shows you how to write a Worker script to publish to [Cloudflare Queues](/queues/) from within a [Durable Object](/durable-objects/). Prerequisites: - A [queue created](/queues/get-started/#3-create-a-queue) via the Cloudflare dashboard or the [wrangler CLI](/workers/wrangler/install-and-update/). -- A [configured **producer** binding](/queues/configuration/configure-queues/#producer) in the Cloudflare dashboard or `wrangler.toml` file. +- A [configured **producer** binding](/queues/configuration/configure-queues/#producer) in the Cloudflare dashboard or Wrangler file. - A [Durable Object namespace binding](/workers/wrangler/configuration/#durable-objects). -Configure your `wrangler.toml` file as follows: - -import { WranglerConfig } from "~/components"; +Configure your Wrangler file as follows: diff --git a/src/content/docs/queues/get-started.mdx b/src/content/docs/queues/get-started.mdx index d04392af57517c..f1bd0fd93e310e 100644 --- a/src/content/docs/queues/get-started.mdx +++ b/src/content/docs/queues/get-started.mdx @@ -8,7 +8,7 @@ head: content: Get started --- -import { Render, PackageManagers } from "~/components"; +import { Render, PackageManagers, WranglerConfig } from "~/components"; Cloudflare Queues is a flexible messaging queue that allows you to queue messages for asynchronous processing. By following this guide, you will create your first queue, a Worker to publish messages to that queue, and a consumer Worker to consume messages from that queue. @@ -40,7 +40,7 @@ To create a producer Worker, run: }} /> -This will create a new directory, which will include both a `src/index.ts` Worker script, and a [`wrangler.toml`](/workers/wrangler/configuration/) configuration file. After you create your Worker, you will create a Queue to access. +This will create a new directory, which will include both a `src/index.ts` Worker script, and a [`wrangler.json`](/workers/wrangler/configuration/) configuration file. After you create your Worker, you will create a Queue to access. Move into the newly created directory: @@ -68,9 +68,7 @@ You cannot change your queue name after you have set it. After you create your q To expose your queue to the code inside your Worker, you need to connect your queue to your Worker by creating a binding. [Bindings](/workers/runtime-apis/bindings/) allow your Worker to access resources, such as Queues, on the Cloudflare developer platform. -To create a binding, open your newly generated `wrangler.toml` configuration file and add the following: - -import { WranglerConfig } from "~/components"; +To create a binding, open your newly generated `wrangler.toml / wrangler.json` file and add the following: @@ -108,7 +106,7 @@ export default { } satisfies ExportedHandler; ``` -Replace `MY_QUEUE` with the name you have set for your binding from your `wrangler.toml`. +Replace `MY_QUEUE` with the name you have set for your binding from your `wrangler.toml / wrangler.json` file. Also add the queue to `Env` interface in `index.ts`. @@ -124,7 +122,7 @@ In a production application, you would likely use a [`try...catch`](https://deve ### Publish your producer Worker -With your `wrangler.toml` file and `index.ts` file configured, you are ready to publish your producer Worker. To publish your producer Worker, run: +With your Wrangler file and `index.ts` file configured, you are ready to publish your producer Worker. To publish your producer Worker, run: ```sh npx wrangler deploy @@ -174,7 +172,7 @@ export default { } satisfies ExportedHandler; ``` -Replace `MY_QUEUE` with the name you have set for your binding from your `wrangler.toml`. +Replace `MY_QUEUE` with the name you have set for your binding from your `wrangler.toml / wrangler.json` file. Every time messages are published to the queue, your consumer Worker's `queue` handler (`async queue`) is called and it is passed one or more messages. @@ -188,7 +186,7 @@ After you have configured your consumer Worker, you are ready to connect it to y Each queue can only have one consumer Worker connected to it. If you try to connect multiple consumers to the same queue, you will encounter an error when attempting to publish that Worker. -To connect your queue to your consumer Worker, open your `wrangler.toml` file and add this to the bottom: +To connect your queue to your consumer Worker, open your Wrangler file and add this to the bottom: @@ -215,7 +213,7 @@ In your consumer Worker, you are using queues to auto batch messages using the ` ### Publish your consumer Worker -With your `wrangler.toml` file and `index.ts` file configured, publish your consumer Worker by running: +With your Wrangler file and `index.ts` file configured, publish your consumer Worker by running: ```sh npx wrangler deploy @@ -241,7 +239,7 @@ With `wrangler tail` running, your consumer Worker will start logging the reques If you refresh less than 10 times, it may take a few seconds for the messages to appear because batch timeout is configured for 10 seconds. After 10 seconds, messages should arrive in your terminal. -If you get errors when you refresh, check that the queue name you created in [step 2](/queues/get-started/#2-create-a-queue) and the queue you referenced in your `wrangler.toml` file is the same. You should ensure that your producer Worker is returning `Success` and is not returning an error. +If you get errors when you refresh, check that the queue name you created in [step 2](/queues/get-started/#2-create-a-queue) and the queue you referenced in your Wrangler file is the same. You should ensure that your producer Worker is returning `Success` and is not returning an error. By completing this guide, you have now created a queue, a producer Worker that publishes messages to that queue, and a consumer Worker that consumes those messages from it. diff --git a/src/content/docs/queues/observability/metrics.mdx b/src/content/docs/queues/observability/metrics.mdx index 1da117cb3f9223..7ac5708c569624 100644 --- a/src/content/docs/queues/observability/metrics.mdx +++ b/src/content/docs/queues/observability/metrics.mdx @@ -6,7 +6,7 @@ sidebar: --- -You can view the metrics for a Queue on your account via the [Cloudflare dashboard](https://dash.cloudflare.com). Navigate to **Workers** > **Queues** > **your Queue** and under the **Metrics** tab you'll be able to view line charts describing the number of messages processed by final outcome, the number of messages in the backlog, and other important indicators. +You can view the metrics for a Queue on your account via the [Cloudflare dashboard](https://dash.cloudflare.com). Navigate to **Storage & Databases** > **Queues** > **your Queue** and under the **Metrics** tab you'll be able to view line charts describing the number of messages processed by final outcome, the number of messages in the backlog, and other important indicators. The metrics displayed in the Cloudflare dashboard charts are all pulled from Cloudflare's GraphQL Analytics API. You can access the metrics programmatically. diff --git a/src/content/docs/queues/reference/how-queues-works.mdx b/src/content/docs/queues/reference/how-queues-works.mdx index e2b01267e6ee4f..f9ffc010101814 100644 --- a/src/content/docs/queues/reference/how-queues-works.mdx +++ b/src/content/docs/queues/reference/how-queues-works.mdx @@ -6,6 +6,8 @@ sidebar: --- +import { WranglerConfig } from "~/components"; + Cloudflare Queues is a flexible messaging queue that allows you to queue messages for asynchronous processing. Message queues are great at decoupling components of applications, like the checkout and order fulfillment services for an e-commerce site. Decoupled services are easier to reason about, deploy, and implement, allowing you to ship features that delight your customers without worrying about synchronizing complex deployments. Queues also allow you to batch and buffer calls to downstream services and APIs. There are four major concepts to understand with Queues: @@ -135,9 +137,7 @@ export default { }; ``` -You then connect that consumer to a queue with `wrangler queues consumer ` or by defining a `[[queues.consumers]]` configuration in your `wrangler.toml` manually: - -import { WranglerConfig } from "~/components"; +You then connect that consumer to a queue with `wrangler queues consumer ` or by defining a `[[queues.consumers]]` configuration in your `wrangler.toml / wrangler.json` file manually: @@ -190,7 +190,7 @@ export default { ### Remove a consumer -To remove a queue from your project, run `wrangler queues consumer remove ` and then remove the desired queue below the `[[queues.consumers]]` in `wrangler.toml` file. +To remove a queue from your project, run `wrangler queues consumer remove ` and then remove the desired queue below the `[[queues.consumers]]` in Wrangler file. ### Pull consumers diff --git a/src/content/docs/queues/tutorials/handle-rate-limits/index.mdx b/src/content/docs/queues/tutorials/handle-rate-limits/index.mdx index ab05871bfbe181..897469ac2462f2 100644 --- a/src/content/docs/queues/tutorials/handle-rate-limits/index.mdx +++ b/src/content/docs/queues/tutorials/handle-rate-limits/index.mdx @@ -18,7 +18,7 @@ head: description: Example of how to use Queues to handle rate limits of external APIs. --- -import { Render, PackageManagers } from "~/components"; +import { Render, PackageManagers, WranglerConfig } from "~/components"; This tutorial explains how to use Queues to handle rate limits of external APIs by building an application that sends email notifications using [Resend](https://www.resend.com/). However, you can use this pattern to handle rate limits of any external API. @@ -73,11 +73,9 @@ Creating queue rate-limit-queue. Created queue rate-limit-queue. ``` -### Add Queue bindings to `wrangler.toml` +### Add Queue bindings to your `wrangler.toml / wrangler.json` file -In your `wrangler.toml` file, add the following: - -import { WranglerConfig } from "~/components"; +In your Wrangler file, add the following: @@ -97,7 +95,7 @@ max_retries = 3 It is important to include the `max_batch_size` of two to the consumer queue is important because the Resend API has a default rate limit of two requests per second. This batch size allows the queue to process the message in the batch size of two. If the batch size is less than two, the queue will wait for 10 seconds to collect the next message. If no more messages are available, the queue will process the message in the batch. For more information, refer to the [Batching, Retries and Delays documentation](/queues/configuration/batching-retries) -Your final `wrangler.toml` file should look similar to the example below. +Your final Wrangler file should look similar to the example below. diff --git a/src/content/docs/queues/tutorials/web-crawler-with-browser-rendering/index.mdx b/src/content/docs/queues/tutorials/web-crawler-with-browser-rendering/index.mdx index e364e5a2bbaaee..ba1ba58ec58332 100644 --- a/src/content/docs/queues/tutorials/web-crawler-with-browser-rendering/index.mdx +++ b/src/content/docs/queues/tutorials/web-crawler-with-browser-rendering/index.mdx @@ -19,7 +19,7 @@ head: description: Example of how to use Queues and Browser Rendering to power a web crawler. --- -import { Render, PackageManagers } from "~/components"; +import { Render, PackageManagers, WranglerConfig } from "~/components"; This tutorial explains how to build and deploy a web crawler with Queues, [Browser Rendering](/browser-rendering/), and [Puppeteer](/browser-rendering/platform/puppeteer/). @@ -82,11 +82,9 @@ binding = "crawler_screenshots" id = "" ``` -### Add KV bindings to wrangler.toml +### Add KV bindings to the `wrangler.toml / wrangler.json` file -Then, in your `wrangler.toml` file, add the following with the values generated in the terminal: - -import { WranglerConfig } from "~/components"; +Then, in your Wrangler file, add the following with the values generated in the terminal: @@ -137,7 +135,7 @@ Created queue queues-web-crawler. ### Add Queue bindings to wrangler.toml -Then, in your `wrangler.toml` file, add the following: +Then, in your Wrangler file, add the following: @@ -157,7 +155,7 @@ binding = "CRAWLER_QUEUE" Adding the `max_batch_timeout` of 60 seconds to the consumer queue is important because Browser Rendering has a limit of two new browsers per minute per account. This timeout waits up to a minute before collecting queue messages into a batch. The Worker will then remain under this browser invocation limit. -Your final `wrangler.toml` file should look similar to the one below. +Your final Wrangler file should look similar to the one below. diff --git a/src/content/docs/r2/api/s3/presigned-urls.mdx b/src/content/docs/r2/api/s3/presigned-urls.mdx index 99fd02874e46a2..d089be4156fa9b 100644 --- a/src/content/docs/r2/api/s3/presigned-urls.mdx +++ b/src/content/docs/r2/api/s3/presigned-urls.mdx @@ -68,9 +68,9 @@ A valid alternative design to presigned URLs is to use a Worker with a [binding] :::note[Bindings] -A binding is how your Worker interacts with external resources such as [KV Namespaces](/kv/concepts/kv-namespaces/), [Durable Objects](/durable-objects/), or [R2 Buckets](/r2/buckets/). A binding is a runtime variable that the Workers runtime provides to your code. You can declare a variable name in your `wrangler.toml` file that will be bound to these resources at runtime, and interact with them through this variable. Every binding's variable name and behavior is determined by you when deploying the Worker. Refer to [Environment Variables](/workers/configuration/environment-variables/) for more information. +A binding is how your Worker interacts with external resources such as [KV Namespaces](/kv/concepts/kv-namespaces/), [Durable Objects](/durable-objects/), or [R2 Buckets](/r2/buckets/). A binding is a runtime variable that the Workers runtime provides to your code. You can declare a variable name in your Wrangler file that will be bound to these resources at runtime, and interact with them through this variable. Every binding's variable name and behavior is determined by you when deploying the Worker. Refer to [Environment Variables](/workers/configuration/environment-variables/) for more information. -A binding is defined in the `wrangler.toml` file of your Worker project's directory. +A binding is defined in the Wrangler file of your Worker project's directory. ::: @@ -131,7 +131,7 @@ export default { } satisfies ExportedHandler; ``` -Notice the total absence of any configuration or token secrets present in the Worker code. Instead, you would create a `wrangler.toml` [binding](/r2/api/workers/workers-api-usage/#4-bind-your-bucket-to-a-worker) to whatever bucket represents the bucket you will upload to. Additionally, authorization is handled in-line with the upload which can reduce latency. +Notice the total absence of any configuration or token secrets present in the Worker code. Instead, you would create a `wrangler.toml / wrangler.json` file [binding](/r2/api/workers/workers-api-usage/#4-bind-your-bucket-to-a-worker) to whatever bucket represents the bucket you will upload to. Additionally, authorization is handled in-line with the upload which can reduce latency. In some cases, Workers lets you implement certain functionality more easily. For example, if you wanted to offer a write-once guarantee so that users can only upload to a path once, with pre-signed URLs, you would need to sign specific headers and require the sender to send them. You can modify the previous Worker to sign additional headers: diff --git a/src/content/docs/r2/api/workers/workers-api-reference.mdx b/src/content/docs/r2/api/workers/workers-api-reference.mdx index ce0539010e6bd5..ac28aeb841de53 100644 --- a/src/content/docs/r2/api/workers/workers-api-reference.mdx +++ b/src/content/docs/r2/api/workers/workers-api-reference.mdx @@ -3,7 +3,7 @@ pcx_content_type: reference title: Workers API reference --- -import { Type, MetaInfo } from "~/components"; +import { Type, MetaInfo, WranglerConfig } from "~/components"; The in-Worker R2 API is accessed by binding an R2 bucket to a [Worker](/workers). The Worker you write can expose external access to buckets via a route or manipulate R2 objects internally. @@ -17,15 +17,13 @@ R2 organizes the data you store, called objects, into containers, called buckets :::note[Bindings] -A binding is how your Worker interacts with external resources such as [KV Namespaces](/kv/concepts/kv-namespaces/), [Durable Objects](/durable-objects/), or [R2 Buckets](/r2/buckets/). A binding is a runtime variable that the Workers runtime provides to your code. You can declare a variable name in your `wrangler.toml` file that will be bound to these resources at runtime, and interact with them through this variable. Every binding's variable name and behavior is determined by you when deploying the Worker. Refer to [Environment Variables](/workers/configuration/environment-variables/) for more information. +A binding is how your Worker interacts with external resources such as [KV Namespaces](/kv/concepts/kv-namespaces/), [Durable Objects](/durable-objects/), or [R2 Buckets](/r2/buckets/). A binding is a runtime variable that the Workers runtime provides to your code. You can declare a variable name in your Wrangler file that will be bound to these resources at runtime, and interact with them through this variable. Every binding's variable name and behavior is determined by you when deploying the Worker. Refer to [Environment Variables](/workers/configuration/environment-variables/) for more information. -A binding is defined in the `wrangler.toml` file of your Worker project's directory. +A binding is defined in the Wrangler file of your Worker project's directory. ::: -To bind your R2 bucket to your Worker, add the following to your `wrangler.toml` file. Update the `binding` property to a valid JavaScript variable identifier and `bucket_name` to the name of your R2 bucket: - -import { WranglerConfig } from "~/components"; +To bind your R2 bucket to your Worker, add the following to your Wrangler file. Update the `binding` property to a valid JavaScript variable identifier and `bucket_name` to the name of your R2 bucket: @@ -361,7 +359,7 @@ Only a single hashing algorithm can be specified at once. - Note that there is a limit on the total amount of data that a single `list` operation can return. If you request data, you may receive fewer than `limit` results in your response to accommodate metadata. - - The [compatibility date](/workers/configuration/compatibility-dates/) must be set to `2022-08-04` or later in your `wrangler.toml` file. If not, then the `r2_list_honor_include` compatibility flag must be set. Otherwise it is treated as `include: ['httpMetadata', 'customMetadata']` regardless of what the `include` option provided actually is. + - The [compatibility date](/workers/configuration/compatibility-dates/) must be set to `2022-08-04` or later in your Wrangler file. If not, then the `r2_list_honor_include` compatibility flag must be set. Otherwise it is treated as `include: ['httpMetadata', 'customMetadata']` regardless of what the `include` option provided actually is. This means applications must be careful to avoid comparing the amount of returned objects against your `limit`. Instead, use the `truncated` property to determine if the `list` request has more data to be returned. diff --git a/src/content/docs/r2/api/workers/workers-api-usage.mdx b/src/content/docs/r2/api/workers/workers-api-usage.mdx index 7ca5d9c8d1102c..2c40d0b32a88f7 100644 --- a/src/content/docs/r2/api/workers/workers-api-usage.mdx +++ b/src/content/docs/r2/api/workers/workers-api-usage.mdx @@ -8,7 +8,7 @@ head: content: Use R2 from Workers --- -import { Render, PackageManagers } from "~/components"; +import { Render, PackageManagers, WranglerConfig } from "~/components"; ## 1. Create a new application with C3 @@ -56,15 +56,13 @@ You will need to bind your bucket to a Worker. :::note[Bindings] -A binding is how your Worker interacts with external resources such as [KV Namespaces](/kv/concepts/kv-namespaces/), [Durable Objects](/durable-objects/), or [R2 Buckets](/r2/buckets/). A binding is a runtime variable that the Workers runtime provides to your code. You can declare a variable name in your `wrangler.toml` file that will be bound to these resources at runtime, and interact with them through this variable. Every binding's variable name and behavior is determined by you when deploying the Worker. Refer to the [Environment Variables](/workers/configuration/environment-variables/) documentation for more information. +A binding is how your Worker interacts with external resources such as [KV Namespaces](/kv/concepts/kv-namespaces/), [Durable Objects](/durable-objects/), or [R2 Buckets](/r2/buckets/). A binding is a runtime variable that the Workers runtime provides to your code. You can declare a variable name in your Wrangler file that will be bound to these resources at runtime, and interact with them through this variable. Every binding's variable name and behavior is determined by you when deploying the Worker. Refer to the [Environment Variables](/workers/configuration/environment-variables/) documentation for more information. -A binding is defined in the `wrangler.toml` file of your Worker project's directory. +A binding is defined in the Wrangler file of your Worker project's directory. ::: -To bind your R2 bucket to your Worker, add the following to your `wrangler.toml` file. Update the `binding` property to a valid JavaScript variable identifier and `bucket_name` to the `` you used to create your bucket in [step 2](#2-create-your-bucket): - -import { WranglerConfig } from "~/components"; +To bind your R2 bucket to your Worker, add the following to your Wrangler file. Update the `binding` property to a valid JavaScript variable identifier and `bucket_name` to the `` you used to create your bucket in [step 2](#2-create-your-bucket): diff --git a/src/content/docs/r2/buckets/create-buckets.mdx b/src/content/docs/r2/buckets/create-buckets.mdx index b89386f86a6759..c747815d03c8d5 100644 --- a/src/content/docs/r2/buckets/create-buckets.mdx +++ b/src/content/docs/r2/buckets/create-buckets.mdx @@ -25,7 +25,8 @@ wrangler r2 bucket create your-bucket-name :::note -Bucket names can only contain lowercase letters (a-z), numbers (0-9), and hyphens (-). +- Bucket names can only contain lowercase letters (a-z), numbers (0-9), and hyphens (-). +- Bucket names cannot begin or end with a hyphen. The placeholder text is only for the example. diff --git a/src/content/docs/r2/examples/terraform-aws.mdx b/src/content/docs/r2/examples/terraform-aws.mdx index 30a53f1a9c262d..1d6be7b07b313d 100644 --- a/src/content/docs/r2/examples/terraform-aws.mdx +++ b/src/content/docs/r2/examples/terraform-aws.mdx @@ -18,7 +18,12 @@ For using only the Cloudflare provider, see [Terraform](/r2/examples/terraform/) ::: -With [`terraform`](https://developer.hashicorp.com/terraform/downloads) installed, create `main.tf` and copy the content below replacing with your Account ID and R2 credentials. +With [`terraform`](https://developer.hashicorp.com/terraform/downloads) installed: + +1. Create `main.tf` file, or edit your existing Terraform configuration +2. Populate the endpoint URL at `endpoints.s3` with your [Cloudflare account ID](/fundamentals/setup/find-account-and-zone-ids/) +3. Populate `access_key` and `secret_key` with the corresponding [R2 API credentials](/r2/api/s3/tokens/). +4. Ensure that `skip_region_validation = true`, `skip_requesting_account_id = true`, and `skip_credentials_validation = true` are set in the provider configuration. ```hcl terraform { @@ -36,6 +41,8 @@ provider "aws" { access_key = secret_key = + # Required for R2. + # These options disable S3-specific validation on the client (Terraform) side. skip_credentials_validation = true skip_region_validation = true skip_requesting_account_id = true diff --git a/src/content/docs/r2/index.mdx b/src/content/docs/r2/index.mdx index fbbd70e7d36c26..bb561e69c93f8f 100644 --- a/src/content/docs/r2/index.mdx +++ b/src/content/docs/r2/index.mdx @@ -4,6 +4,7 @@ type: overview pcx_content_type: overview sidebar: order: 1 +description: Cloudflare R2 is a cost-effective, scalable object storage solution for cloud-native apps, web content, and data lakes without egress fees. head: - tag: title content: Cloudflare R2 diff --git a/src/content/docs/r2/reference/data-location.mdx b/src/content/docs/r2/reference/data-location.mdx index 950f7a9fc4c9a5..4342a004ad4a1f 100644 --- a/src/content/docs/r2/reference/data-location.mdx +++ b/src/content/docs/r2/reference/data-location.mdx @@ -5,6 +5,8 @@ sidebar: order: 7 --- +import { WranglerConfig } from "~/components"; + Learn how the location of data stored in R2 is determined and about the different available inputs that control the physical location where objects in your buckets are stored. ## Automatic (recommended) @@ -77,9 +79,7 @@ Use Jurisdictional Restrictions when you need to ensure data is stored and proce ### Using jurisdictions from Workers -To access R2 buckets that belong to a jurisdiction from [Workers](/workers/), you will need to specify the jurisdiction as well as the bucket name as part of your [bindings](/r2/api/workers/workers-api-usage/#3-bind-your-bucket-to-a-worker) in your `wrangler.toml`: - -import { WranglerConfig } from "~/components"; +To access R2 buckets that belong to a jurisdiction from [Workers](/workers/), you will need to specify the jurisdiction as well as the bucket name as part of your [bindings](/r2/api/workers/workers-api-usage/#3-bind-your-bucket-to-a-worker) in your `wrangler.toml / wrangler.json` file: diff --git a/src/content/docs/r2/reference/partners/index.mdx b/src/content/docs/r2/reference/partners/index.mdx new file mode 100644 index 00000000000000..5b80dfa05c1246 --- /dev/null +++ b/src/content/docs/r2/reference/partners/index.mdx @@ -0,0 +1,5 @@ +--- +title: Partners +sidebar: + hidden: true +--- diff --git a/src/content/docs/r2/reference/partners/snowflake-regions.mdx b/src/content/docs/r2/reference/partners/snowflake-regions.mdx new file mode 100644 index 00000000000000..ba76a5d1d51a5d --- /dev/null +++ b/src/content/docs/r2/reference/partners/snowflake-regions.mdx @@ -0,0 +1,81 @@ +--- +title: Snowflake +sidebar: + hidden: true +--- + +import { Render } from "~/components"; + +This page details which R2 location or jurisdiction is recommended based on your Snowflake region. + +You have the following inputs to control the physical location where objects in your R2 buckets are stored (for more information refer to [data location](/r2/reference/data-location/)): + +- [**Location hints**](/r2/reference/data-location/#location-hints): Specify a geophrical area (for example, Asia-Pacific or Western Europe). R2 makes a best effort to place your bucket in or near that location to optimize performance. You can confirm bucket placement after creation by navigating to the **Settings** tab of your bucket and referring to the **Bucket details** section. +- [**Jurisdictions**](/r2/reference/data-location/#jurisdictional-restrictions): Enforce that data is both stored and processed within a specific jurisdiction (for example, the EU or FedRAMP environment). Use jurisdictions when you need to ensure data is stored and processed within a jurisdiction to meet data residency requirements, including local regulations such as the [GDPR](https://gdpr-info.eu/) or [FedRAMP](https://blog.cloudflare.com/cloudflare-achieves-fedramp-authorization/). + +## North and South America (Commercial) + +| Snowflake region name | Cloud | Region ID | Recommended R2 location | +| ------------------------- | ----- | ---------------- | ----------------------- | +| Canada (Central) | AWS | `ca-central-1` | Location hint: `enam` | +| South America (Sao Paulo) | AWS | `sa-east-1` | Location hint: `enam` | +| US West (Oregon) | AWS | `us-west-2` | Location hint: `wnam` | +| US East (Ohio) | AWS | `us-east-2` | Location hint: `enam` | +| US East (N. Virginia) | AWS | `us-east-1` | Location hint: `enam` | +| US Central1 (Iowa) | GCP | `us-central1` | Location hint: `enam` | +| US East4 (N. Virginia) | GCP | `us-east4` | Location hint: `enam` | +| Canada Central (Toronto) | Azure | `canadacentral` | Location hint: `enam` | +| Central US (Iowa) | Azure | `centralus` | Location hint: `enam` | +| East US 2 (Virginia) | Azure | `eastus2` | Location hint: `enam` | +| South Central US (Texas) | Azure | `southcentralus` | Location hint: `enam` | +| West US 2 (Washington) | Azure | `westus2` | Location hint: `wnam` | + +## U.S. Government + +| Snowflake region name | Cloud | Region ID | Recommended R2 location | +| --------------------- | ----- | --------------- | ----------------------- | +| US Gov East 1 | AWS | `us-gov-east-1` | Jurisdiction: `fedramp` | +| US Gov West 1 | AWS | `us-gov-west-1` | Jurisdiction: `fedramp` | +| US Gov Virginia | Azure | `usgovvirginia` | Jurisdiction: `fedramp` | + +:::note + +Cloudflare Enterprise customers may contact their account team or [Cloudflare Support](/support/contacting-cloudflare-support/) to get access to the FedRAMP jurisdiction. +::: + +## Europe and Middle East + +| Snowflake region name | Cloud | Region ID | Recommended R2 location | +| ----------------------------- | ----- | ------------------ | ----------------------------------------- | +| EU (Frankfurt) | AWS | `eu-central-1` | Jurisdiction: `eu` or hint: `weur`/`eeur` | +| EU (Zurich) | AWS | `eu-central-2` | Jurisdiction: `eu` or hint: `weur`/`eeur` | +| EU (Stockholm) | AWS | `eu-north-1` | Jurisdiction: `eu` or hint: `weur`/`eeur` | +| EU (Ireland) | AWS | `eu-west-1` | Jurisdiction: `eu` or hint: `weur`/`eeur` | +| Europe (London) | AWS | `eu-west-2` | Jurisdiction: `eu` or hint: `weur`/`eeur` | +| EU (Paris) | AWS | `eu-west-3` | Jurisdiction: `eu` or hint: `weur`/`eeur` | +| Middle East Central2 (Dammam) | GCP | `me-central2` | Location hint: `weur`/`eeur` | +| Europe West2 (London) | GCP | `europe-west-2` | Jurisdiction: `eu` or hint: `weur`/`eeur` | +| Europe West3 (Frankfurt) | GCP | `europe-west-3` | Jurisdiction: `eu` or hint: `weur`/`eeur` | +| Europe West4 (Netherlands) | GCP | `europe-west-4` | Jurisdiction: `eu` or hint: `weur`/`eeur` | +| North Europe (Ireland) | Azure | `northeurope` | Jurisdiction: `eu` or hint: `weur`/`eeur` | +| Switzerland North (Zurich) | Azure | `switzerlandnorth` | Jurisdiction: `eu` or hint: `weur`/`eeur` | +| West Europe (Netherlands) | Azure | `westeurope` | Jurisdiction: `eu` or hint: `weur`/`eeur` | +| UAE North (Dubai) | Azure | `uaenorth` | Location hint: `weur`/`eeur` | +| UK South (London) | Azure | `uksouth` | Jurisdiction: `eu` or hint: `weur`/`eeur` | + +## Asia Pacific and China + +| Snowflake region name | Cloud | Region ID | Recommended R2 location | +| -------------------------------- | ----- | ---------------- | ----------------------- | +| Asia Pacific (Tokyo) | AWS | `ap-northeast-1` | Location hint: `apac` | +| Asia Pacific (Seoul) | AWS | `ap-northeast-2` | Location hint: `apac` | +| Asia Pacific (Osaka) | AWS | `ap-northeast-3` | Location hint: `apac` | +| Asia Pacific (Mumbai) | AWS | `ap-south-1` | Location hint: `apac` | +| Asia Pacific (Singapore) | AWS | `ap-southeast-1` | Location hint: `apac` | +| Asia Pacific (Sydney) | AWS | `ap-southeast-2` | Location hint: `oc` | +| Asia Pacific (Jakarta) | AWS | `ap-southeast-3` | Location hint: `apac` | +| China (Ningxia) | AWS | `cn-northwest-1` | Location hint: `apac` | +| Australia East (New South Wales) | Azure | `australiaeast` | Location hint: `oc` | +| Central India (Pune) | Azure | `centralindia` | Location hint: `apac` | +| Japan East (Tokyo) | Azure | `japaneast` | Location hint: `apac` | +| Southeast Asia (Singapore) | Azure | `southeastasia` | Location hint: `apac` | diff --git a/src/content/docs/r2/tutorials/summarize-pdf.mdx b/src/content/docs/r2/tutorials/summarize-pdf.mdx index 61dfdd9edc7be7..79aed17692a561 100644 --- a/src/content/docs/r2/tutorials/summarize-pdf.mdx +++ b/src/content/docs/r2/tutorials/summarize-pdf.mdx @@ -12,7 +12,7 @@ languages: - TypeScript --- -import { Render, PackageManagers, Details } from "~/components"; +import { Render, PackageManagers, Details, WranglerConfig } from "~/components"; In this tutorial, you will learn how to use [event notifications](/r2/buckets/event-notifications/) to process a PDF file when it is uploaded to an R2 bucket. You will use [Workers AI](/workers-ai/) to summarize the PDF and store the summary as a text file in the same bucket. @@ -61,9 +61,7 @@ cd pdf-summarizer ## 2. Create the front-end -Using Static Assets, you can serve the front-end of your application from your Worker. To use Static Assets, you need to add the required bindings to your `wrangler.toml` file. - -import { WranglerConfig } from "~/components"; +Using Static Assets, you can serve the front-end of your application from your Worker. To use Static Assets, you need to add the required bindings to your Wrangler file. @@ -237,7 +235,7 @@ When you open the URL in your browser, you will see that there is a file upload ## 3. Handle file upload -To handle the file upload, you will first need to add the R2 binding. In the `wrangler.toml` file, add the following code: +To handle the file upload, you will first need to add the R2 binding. In the Wrangler file, add the following code: @@ -305,7 +303,7 @@ Event notifications capture changes to data in your R2 bucket. You will need to npx wrangler queues create pdf-summarizer ``` -Add the binding to the `wrangler.toml` file: +Add the binding to the Wrangler file: @@ -387,7 +385,7 @@ The above code does the following: ## 7. Use Workers AI to summarize the content -To use Workers AI, you will need to add the Workers AI binding to the `wrangler.toml` file. The `wrangler.toml` file should contain the following code: +To use Workers AI, you will need to add the Workers AI binding to the Wrangler file. The Wrangler file should contain the following code: diff --git a/src/content/docs/r2/tutorials/upload-logs-event-notifications.mdx b/src/content/docs/r2/tutorials/upload-logs-event-notifications.mdx index b537755019a9c0..85d6763ecd902a 100644 --- a/src/content/docs/r2/tutorials/upload-logs-event-notifications.mdx +++ b/src/content/docs/r2/tutorials/upload-logs-event-notifications.mdx @@ -11,7 +11,7 @@ languages: - TypeScript --- -import { Render, PackageManagers } from "~/components"; +import { Render, PackageManagers, WranglerConfig } from "~/components"; This example provides a step-by-step guide on using [event notifications](/r2/buckets/event-notifications/) to capture and store R2 upload logs in a separate bucket. @@ -85,9 +85,7 @@ cd consumer-worker ## 5. Configure your Worker -In your Worker project's [`wrangler.toml`](/workers/wrangler/configuration/) file, add a [queue consumer](/workers/wrangler/configuration/#queues) and [R2 bucket binding](/workers/wrangler/configuration/#r2-buckets). The queues consumer bindings will register your Worker as a consumer of your future event notifications and the R2 bucket bindings will allow your Worker to access your R2 bucket. - -import { WranglerConfig } from "~/components"; +In your Worker project's [`wrangler.toml / wrangler.json` file](/workers/wrangler/configuration/), add a [queue consumer](/workers/wrangler/configuration/#queues) and [R2 bucket binding](/workers/wrangler/configuration/#r2-buckets). The queues consumer bindings will register your Worker as a consumer of your future event notifications and the R2 bucket bindings will allow your Worker to access your R2 bucket. diff --git a/src/content/docs/radar/investigate/bgp-anomalies.mdx b/src/content/docs/radar/investigate/bgp-anomalies.mdx index c5d1f629fbd641..3f537a2ab7eb95 100644 --- a/src/content/docs/radar/investigate/bgp-anomalies.mdx +++ b/src/content/docs/radar/investigate/bgp-anomalies.mdx @@ -7,7 +7,7 @@ sidebar: text: Beta --- -import { Render, PackageManagers } from "~/components"; +import { Render, PackageManagers, WranglerConfig } from "~/components"; To access Cloudflare Radar BGP Anomaly Detection results, you will first need to create an API token that includes a `Account:Radar` permission. All the following examples should work with a free-tier Cloudflare account. @@ -198,11 +198,9 @@ To start developing your Worker, `cd` into your new project directory: cd hijack-alerts ``` -In your `wrangler.toml` file, change the default checking frequency (once per hour) to what you like. Here is an example +In your Wrangler file, change the default checking frequency (once per hour) to what you like. Here is an example of configuring the workers to run the script five minutes. -import { WranglerConfig } from "~/components"; - ```toml @@ -372,7 +370,7 @@ The last step is to deploy the application with command `npx wrangler deploy` an If you have [Email Routing][email-routing] enabled for your domain, you can also send email alerts directly from Workers. Refer to [Send emails from Workers][email-workers-tutorial] to learn more. -For this alert to work, you will need to configure the proper email bindings in the [`wrangler.toml`][wrangler-send-email] file. +For this alert to work, you will need to configure the proper email bindings in the [`wrangler.toml / wrangler.json` file][wrangler-send-email]. diff --git a/src/content/docs/reference-architecture/diagrams/ai/ai-asset-creation.mdx b/src/content/docs/reference-architecture/diagrams/ai/ai-asset-creation.mdx index 1223203503a6fc..198999947776b9 100644 --- a/src/content/docs/reference-architecture/diagrams/ai/ai-asset-creation.mdx +++ b/src/content/docs/reference-architecture/diagrams/ai/ai-asset-creation.mdx @@ -34,13 +34,13 @@ Example uses of such compositions of AI models can be employed to generation vis ![Figure 1:Content-based asset generation](~/assets/images/reference-architecture/ai-asset-generation-diagrams/ai-asset-generation.svg "Figure 1: Content-based asset generation") 1. **Client upload**: Send POST request with content to API endpoint. -2. **Prompt generation**: Generate prompt for later-stage text-to-image model by calling [Workers AI](/workers-ai/) [text generation models](/workers-ai/models/#text-generation) with content as input. +2. **Prompt generation**: Generate prompt for later-stage text-to-image model by calling [Workers AI](/workers-ai/) [text generation models](/workers-ai/models/) with content as input. 3. **Safety check**: Check for compliance with safety guidelines by calling [Workers AI](/workers-ai/) [text classification models](/workers-ai/models/#text-classification) with the previously generated prompt as input. 4. **Image generation**: Generate image by calling [Workers AI](/workers-ai/) [text-to-image models](/workers-ai/models/#text-to-image) previously generated prompt. ## Related resources - [Community project: content-based asset creation demo](https://auto-asset.pages.dev/) -- [Workers AI: Text generation models](/workers-ai/models/#text-generation) +- [Workers AI: Text generation models](/workers-ai/models/) - [Workers AI: Text-to-image models](/workers-ai/models/#text-to-image) - [Workers AI: llamaguard-7b-awq](/workers-ai/models/llamaguard-7b-awq/) diff --git a/src/content/docs/rules/reference/page-rules-migration.mdx b/src/content/docs/rules/reference/page-rules-migration.mdx index f67d13639cef85..2c4254dde1b964 100644 --- a/src/content/docs/rules/reference/page-rules-migration.mdx +++ b/src/content/docs/rules/reference/page-rules-migration.mdx @@ -145,7 +145,7 @@ You configured a Page Rule to perform an automatic redirect from HTTP to HTTPS f 3. If your tests succeed, delete the existing Page Rule. - + | Page Rules configuration | Migrate to a single redirect | | ---------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -188,7 +188,7 @@ You configured a Page Rule turning on Automatic HTTPS Rewrites for all subdomain 3. If your tests succeed, delete the existing Page Rule. - + | Page Rules configuration | Migrate to a configuration rule | | -------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -234,7 +234,7 @@ You configured a Page Rule adjusting browser cache TTL to one day for all subdom 3. If your tests succeed, delete the existing Page Rule. - + | Page Rules configuration | Migrate to a cache rule | | ------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | @@ -277,7 +277,7 @@ You configured a Page Rule turning on Browser Integrity Check for all subdomains 3. If your tests succeed, delete the existing Page Rule. - + | Page Rules configuration | Migrate to a configuration rule | | ------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -321,7 +321,7 @@ You configured a Page Rule turning on Bypass Cache on Cookie for all subdomains 3. If your tests succeed, delete the existing Page Rule. - + | Page Rules configuration | Migrate to a cache rule | | ---------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -367,7 +367,7 @@ You configured a Page Rule turning on Cache By Device Type for all subdomains of 3. If your tests succeed, delete the existing Page Rule. - + | Page Rules configuration | Migrate to a cache rule | | ------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | @@ -412,7 +412,7 @@ You configured a Page Rule turning on Cache Deception Armor for all subdomains o 3. If your tests succeed, delete the existing Page Rule. - + | Page Rules configuration | Migrate to a cache rule | | -------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -456,7 +456,7 @@ You configured a Page Rule turning on caching of all assets for all subdomains o 3. If your tests succeed, delete the existing Page Rule. - + | Page Rules configuration | Migrate to a cache rule | | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -500,7 +500,7 @@ You configured a Page Rule turning on caching for responses that contained cooki 3. If your tests succeed, delete the existing Page Rule. - + | Page Rules configuration | Migrate to a cache rule | | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -552,7 +552,7 @@ You configured a Page Rule turning on caching of every response with status code 3. If your tests succeed, delete the existing Page Rule. - + | Page Rules configuration | Migrate to a cache rule | | ------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -598,7 +598,7 @@ You configured a Page Rule setting a custom cache key for all query string param 3. If your tests succeed, delete the existing Page Rule. - + | Page Rules configuration | Migrate to a cache rule | | -------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -639,7 +639,7 @@ You configured a Page Rule turning off Cloudflare Apps (deprecated) for all subd 3. If your tests succeed, delete the existing Page Rule. - + | Page Rules configuration | Migrate to a configuration rule | | -------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -688,7 +688,7 @@ You configured a Page Rule with **Disable Performance** (deprecated) for all sub 3. If your tests succeed, delete the existing Page Rule. - + | Page Rules configuration | Migrate to a configuration rule | | ---------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -767,7 +767,7 @@ You configured a Page Rule turning off [Zaraz](/zaraz/) for all subdomains of `e 3. If your tests succeed, delete the existing Page Rule. - + | Page Rules configuration | Migrate to a configuration rule | | ---------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | @@ -814,7 +814,7 @@ You configured a Page Rule adjusting Edge Cache TTL for all subdomains of `examp 3. If your tests succeed, delete the existing Page Rule. - + | Page Rules configuration | Migrate to a cache rule | | ---------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | @@ -857,7 +857,7 @@ You configured a Page Rule turning off [Email Obfuscation](/waf/tools/scrape-shi 3. If your tests succeed, delete the existing Page Rule. - + | Page Rules configuration | Migrate to a configuration rule | | ------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -910,7 +910,7 @@ You configured a Page Rule permanently redirecting `www.example.com` to `example }} /> - + | Page Rules configuration | Migrate to a single redirect | | --------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -961,7 +961,7 @@ You configured a Page Rule permanently redirecting `example.com/old-path` to `ex }} /> - + | Page Rules configuration | Migrate to a single redirect | | ----------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -1004,7 +1004,7 @@ You configured a Page Rule changing the `Host` HTTP header to `example.saas-prov 3. If your tests succeed, delete the existing Page Rule. - + | Page Rules configuration | Migrate to an origin rule | | ------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -1030,7 +1030,7 @@ You configured a Page Rule adding a `CF-IPCountry` HTTP header, for all requests 2. Turn off your existing Page Rule and validate the behavior of the Managed Transform. 3. If your tests succeed, delete the existing Page Rule. - + | Page Rules configuration | Migrate to a Managed Transform | | -------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -1073,7 +1073,7 @@ You configured a Page Rule turning off Mirage for all subdomains of `example.com 3. If your tests succeed, delete the existing Page Rule. - + | Page Rules configuration | Migrate to a configuration rule | | -------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -1116,7 +1116,7 @@ You configured a Page Rule turning off Opportunistic Encryption for all subdomai 3. If your tests succeed, delete the existing Page Rule. - + | Page Rules configuration | Migrate to a configuration rule | | -------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -1162,7 +1162,7 @@ You configured a Page Rule turning off Origin Cache Control for all subdomains o 3. If your tests succeed, delete the existing Page Rule. - + | Page Rules configuration | Migrate to a cache rule | | ------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | @@ -1208,7 +1208,7 @@ You configured a Page Rule turning on Origin Error Page Pass-thru for all subdom 3. If your tests succeed, delete the existing Page Rule. - + | Page Rules configuration | Migrate to a cache rule | | -------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -1251,7 +1251,7 @@ You configured a Page Rule turning off [Polish](/images/polish/) for all subdoma 3. If your tests succeed, delete the existing Page Rule. - + | Page Rules configuration | Migrate to a configuration rule | | -------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -1297,7 +1297,7 @@ You configured a Page Rule turning on Query String Sort for all subdomains of `e 3. If your tests succeed, delete the existing Page Rule. - + | Page Rules configuration | Migrate to a cache rule | | ------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -1339,7 +1339,7 @@ You configured a Page Rule changing the origin to `example.saas-provider.com`, f 3. If your tests succeed, delete the existing Page Rule. - + | Page Rules configuration | Migrate to an origin rule | | ---------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -1385,7 +1385,7 @@ You configured a Page Rule turning on byte-for-byte equivalency checks for all s 3. If your tests succeed, delete the existing Page Rule. - + | Page Rules configuration | Migrate to a cache rule | | ------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -1428,7 +1428,7 @@ You configured a Page Rule turning off Rocket Loader for all subdomains of `exam 3. If your tests succeed, delete the existing Page Rule. - + | Page Rules configuration | Migrate to a configuration rule | | ---------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | @@ -1471,7 +1471,7 @@ You configured a Page Rule setting Security Level to _I'm Under Attack_ for all 3. If your tests succeed, delete the existing Page Rule. - + | Page Rules configuration | Migrate to a configuration rule | | ------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -1497,7 +1497,7 @@ You configured a Page Rule adding a `True-Client-IP` HTTP header for all request 2. Turn off your existing Page Rule and validate the behavior of the Managed Transform. 3. If your tests succeed, delete the existing Page Rule. - + | Page Rules configuration | Migrate to a Managed Transform | | -------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -1540,7 +1540,7 @@ You configured a Page Rule setting SSL to _Strict_ for all subdomains of `exampl 3. If your tests succeed, delete the existing Page Rule. - + | Page Rules configuration | Migrate to a configuration rule | | -------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | diff --git a/src/content/docs/rules/snippets/create-api.mdx b/src/content/docs/rules/snippets/create-api.mdx index ea776b1f1d2134..e0a823242d0140 100644 --- a/src/content/docs/rules/snippets/create-api.mdx +++ b/src/content/docs/rules/snippets/create-api.mdx @@ -58,6 +58,8 @@ curl --request PUT https://api.cloudflare.com/client/v4/zones/{zone_id}/snippets --form metadata='{"main_module":"example.js"}' ``` +The name of a snippet can only contain the characters `a-z`, `0-9`, and `_` (underscore). The name must be unique in the context of the zone. You cannot change the snippet name after creating the snippet. + The required body parameters are: - `files`: The file with your JavaScript code. @@ -78,6 +80,8 @@ To make this example work, save your JavaScript code in a file named `example.js } ``` +To deploy a new snippet you must [create a snippet rule](#createupdatedelete-snippet-rules). The expression of the snippet rule defines when the snippet code will run. + ### Create/update/delete snippet rules :::caution diff --git a/src/content/docs/rules/snippets/create-dashboard.mdx b/src/content/docs/rules/snippets/create-dashboard.mdx index 759f9c5c33736d..3e2d9d007dbe18 100644 --- a/src/content/docs/rules/snippets/create-dashboard.mdx +++ b/src/content/docs/rules/snippets/create-dashboard.mdx @@ -9,30 +9,20 @@ head: content: Create a snippet in the dashboard --- -The snippet creation wizard will guide you through the following steps: - -1. Define snippet code and test your snippet. -2. Create snippet rule. The rule expression defines for which requests the snippet code will run. -3. Review your snippet configuration and deploy the snippet. - -## Procedure - 1. Log in to the [Cloudflare dashboard](https://dash.cloudflare.com/), and select your account and website. 2. Go to **Rules** > **Snippets**, and select **Create a Snippet**. -3. Enter a descriptive name for the snippet. - -4. Enter the snippet's JavaScript code. You can test how your snippet will handle incoming requests using the **HTTP** and **Preview** tabs. +3. In **Snippet name**, enter a descriptive name for the snippet. You cannot change the name after creating the snippet. -5. Select **Continue to add Snippet rule**. +4. Enter the snippet's JavaScript code in the code editor. You can test how your snippet will handle incoming requests using the **HTTP** and **Preview** tabs. -6. Enter a descriptive name for the snippet rule. The snippet rule specifies for which requests the snippet code will run. +5. Select **Snippet rule** to configure when the snippet will run. -7. Under **When incoming requests match**, select if you wish to run the snippet for all incoming requests or only for requests that match a custom filter expression. +6. Under **Run this Snippet if incoming requests match**, select if you wish to run the snippet only for requests that match a custom filter expression or for all incoming requests. -8. (Optional) To define a custom expression, use the Expression Builder (specifying one or more values for **Field**, **Operator**, and **Value**) or manually enter an expression using the Expression Editor. For more information, refer to [Edit expressions in the dashboard](/ruleset-engine/rules-language/expressions/edit-expressions/). +7. (Optional) To define a custom expression, use the Expression Builder (specifying one or more values for **Field**, **Operator**, and **Value**) or manually enter an expression using the Expression Editor. For more information, refer to [Edit expressions in the dashboard](/ruleset-engine/rules-language/expressions/edit-expressions/). -9. Select **Continue to create Snippet**. +8. Select **Done**. -10. Review the snippet code and the snippet rule that defines when the snippet will run. To save your snippet and deploy a rule that enables it, select **Save and deploy Snippet**. If you are not ready to deploy your snippet, select **Save and enable later**. +9. To deploy your snippet, select **Deploy**. If you are not ready to deploy your snippet, open the dropdown next to **Deploy** and select **Save as Draft**. diff --git a/src/content/docs/rules/snippets/create-terraform.mdx b/src/content/docs/rules/snippets/create-terraform.mdx index 5a6a46a680151b..a911725349c34c 100644 --- a/src/content/docs/rules/snippets/create-terraform.mdx +++ b/src/content/docs/rules/snippets/create-terraform.mdx @@ -40,7 +40,7 @@ resource "cloudflare_snippet_rules" "cookie_snippet_rule" { } ``` -The name of a snippet can only contain the characters `a-z`, `0-9`, and `_` (underscore). The name must be unique in the context of the zone. +The name of a snippet can only contain the characters `a-z`, `0-9`, and `_` (underscore). The name must be unique in the context of the zone. You cannot change the snippet name after creating the snippet. All `snippet_name` values in the `cloudflare_snippet_rules` resource must match the names of existing snippets. diff --git a/src/content/docs/rules/snippets/index.mdx b/src/content/docs/rules/snippets/index.mdx index f78465a0d71b4b..6ac0f2b4bf8afe 100644 --- a/src/content/docs/rules/snippets/index.mdx +++ b/src/content/docs/rules/snippets/index.mdx @@ -26,7 +26,7 @@ To create and deploy a Snippet, you need to define the following elements: - **Code snippet**: JavaScript code to be executed during the request-handling process. - **Snippet rule**: A [filter expression](/ruleset-engine/rules-language/expressions/) that determines which requests the Snippet will be applied to. Each Snippet can only be associated with one Snippet Rule. -For more information, refer to the [How it works](/rules/snippets/how-it-works/) and [Create in the dashboard](/rules/snippets/create-dashboard/) sections. +For more information, refer to the [How it works](/rules/snippets/how-it-works/) and [Create a snippet in the dashboard](/rules/snippets/create-dashboard/) sections. ## Templates diff --git a/src/content/docs/ruleset-engine/reference/phases-list.mdx b/src/content/docs/ruleset-engine/reference/phases-list.mdx index 000c5af17b2ec8..8b11f8f9aa3d0d 100644 --- a/src/content/docs/ruleset-engine/reference/phases-list.mdx +++ b/src/content/docs/ruleset-engine/reference/phases-list.mdx @@ -3,18 +3,15 @@ title: Phases list pcx_content_type: reference sidebar: order: 1 - --- -import { Render } from "~/components" +import { Render } from "~/components"; The following tables list the [phases](/ruleset-engine/about/phases/) of Cloudflare products powered by the Ruleset Engine, in the order those phases are executed. Some products such as the Cloudflare Web Application Firewall have more than one associated phase. ## Network layer -Network-layer phases apply to packets received on the Cloudflare global network. - - +[Network-layer](https://www.cloudflare.com/learning/ddos/glossary/open-systems-interconnection-model-osi/) phases apply to packets received on the Cloudflare global network. | Phase name | Used in product/feature | | ---------------- | ------------------------------------------------------------------------------------------------ | @@ -23,43 +20,38 @@ Network-layer phases apply to packets received on the Cloudflare global network. | `mt_managed` | [Magic Firewall managed rulesets](/magic-firewall/how-to/enable-managed-rulesets/) | | `mt_ids_managed` | [Magic Firewall Intrusion Detection System (IDS)](/magic-firewall/about/ids/) | - - ## Application layer -Application-layer phases apply to requests received on the Cloudflare global network. +[Application-layer](https://www.cloudflare.com/learning/ddos/what-is-layer-7/) phases apply to requests received on the Cloudflare global network. ### Request phases The phases execute in the order they appear in the table. - - -| Phase name | Used in product/feature | -| ----------------------------------- | ------------------------------------------------------------------------------------------------------ | -| `http_request_sanitize` | [URL normalization](/rules/normalization/) | -| `http_request_dynamic_redirect` | [Single Redirects](/rules/url-forwarding/single-redirects/) | -| `http_request_transform` | [Rewrite URL Rules](/rules/transform/url-rewrite/) | -| *N/A* (internal phase) | [Waiting Room Rules](/waiting-room/additional-options/waiting-room-rules/) | -| `http_config_settings` | [Configuration Rules](/rules/configuration-rules/) | -| `http_request_origin` | [Origin Rules](/rules/origin-rules/) | -| `ddos_l7`\* | [HTTP DDoS Attack Protection](/ddos-protection/managed-rulesets/http/) | -| `http_request_api_gateway` | [API Gateway](/api-shield/api-gateway/) | -| `http_request_firewall_custom` | [Custom rules (Web Application Firewall)](/waf/custom-rules/) | -| `http_ratelimit` | [Rate limiting rules (WAF)](/waf/rate-limiting-rules/) | -| *N/A* (internal phase) | [API Shield](/api-shield/) | -| `http_request_firewall_managed` | [WAF Managed Rules](/waf/managed-rules/) | -| `http_request_sbfm` | [Super Bot Fight Mode](/bots/get-started/pro/) | -| *N/A* (internal phase) | [Cloudflare Access](/cloudflare-one/policies/access/) | -| `http_request_redirect` | [Bulk Redirects](/rules/url-forwarding/bulk-redirects/) | -| *N/A* (internal phase) | [Managed Transforms](/rules/transform/managed-transforms/) | -| `http_request_late_transform` | [HTTP Request Header Modification Rules](/rules/transform/request-header-modification/) | -| `http_request_cache_settings` | [Cache Rules](/cache/how-to/cache-rules/) | -| `http_request_snippets` | [Snippets](/rules/snippets/) | -| `http_request_cloud_connector` | [Cloud Connector](/rules/cloud-connector/) | - - -\* *This phase is for configuration purposes only — the corresponding rules will not be executed at this stage in the request handling process.* +| Phase name | Used in product/feature | +| ------------------------------- | --------------------------------------------------------------------------------------- | +| `http_request_sanitize` | [URL normalization](/rules/normalization/) | +| `http_request_dynamic_redirect` | [Single Redirects](/rules/url-forwarding/single-redirects/) | +| `http_request_transform` | [Rewrite URL Rules](/rules/transform/url-rewrite/) | +| _N/A_ (internal phase) | [Waiting Room Rules](/waiting-room/additional-options/waiting-room-rules/) | +| `http_config_settings` | [Configuration Rules](/rules/configuration-rules/) | +| `http_request_origin` | [Origin Rules](/rules/origin-rules/) | +| `ddos_l7`\* | [HTTP DDoS Attack Protection](/ddos-protection/managed-rulesets/http/) | +| `http_request_api_gateway` | [API Gateway](/api-shield/api-gateway/) | +| `http_request_firewall_custom` | [Custom rules (Web Application Firewall)](/waf/custom-rules/) | +| `http_ratelimit` | [Rate limiting rules (WAF)](/waf/rate-limiting-rules/) | +| _N/A_ (internal phase) | [API Shield](/api-shield/) | +| `http_request_firewall_managed` | [WAF Managed Rules](/waf/managed-rules/) | +| `http_request_sbfm` | [Super Bot Fight Mode](/bots/get-started/pro/) | +| _N/A_ (internal phase) | [Cloudflare Access](/cloudflare-one/policies/access/) | +| `http_request_redirect` | [Bulk Redirects](/rules/url-forwarding/bulk-redirects/) | +| _N/A_ (internal phase) | [Managed Transforms](/rules/transform/managed-transforms/) | +| `http_request_late_transform` | [HTTP Request Header Modification Rules](/rules/transform/request-header-modification/) | +| `http_request_cache_settings` | [Cache Rules](/cache/how-to/cache-rules/) | +| `http_request_snippets` | [Snippets](/rules/snippets/) | +| `http_request_cloud_connector` | [Cloud Connector](/rules/cloud-connector/) | + +\* _This phase is for configuration purposes only — the corresponding rules will not be executed at this stage in the request handling process._ @@ -67,14 +59,12 @@ The phases execute in the order they appear in the table. The phases execute in the order they appear in the table. - - -| Phase name | Used in product/feature | -| --------------------------------- | ---------------------------------------------------------------------------------------------------- | -| `http_custom_errors` | [Custom Error Responses](/rules/custom-error-responses/) | -| *N/A* (internal phase) | [Managed Transforms](/rules/transform/managed-transforms/) | -| `http_response_headers_transform` | [HTTP Response Header Modification Rules](/rules/transform/response-header-modification/) | -| `http_ratelimit` | [Rate limiting rules](/waf/rate-limiting-rules/) (when they use response information) | -| `http_response_compression` | [Compression Rules](/rules/compression-rules/) | -| `http_response_firewall_managed` | [Cloudflare Sensitive Data Detection](/waf/managed-rules/) (Data Loss Prevention) | -| `http_log_custom_fields` | [Logpush custom fields](/logs/reference/custom-fields/) | \ No newline at end of file +| Phase name | Used in product/feature | +| --------------------------------- | ----------------------------------------------------------------------------------------- | +| `http_custom_errors` | [Custom Error Responses](/rules/custom-error-responses/) | +| _N/A_ (internal phase) | [Managed Transforms](/rules/transform/managed-transforms/) | +| `http_response_headers_transform` | [HTTP Response Header Modification Rules](/rules/transform/response-header-modification/) | +| `http_ratelimit` | [Rate limiting rules](/waf/rate-limiting-rules/) (when they use response information) | +| `http_response_compression` | [Compression Rules](/rules/compression-rules/) | +| `http_response_firewall_managed` | [Cloudflare Sensitive Data Detection](/waf/managed-rules/) (Data Loss Prevention) | +| `http_log_custom_fields` | [Logpush custom fields](/logs/reference/custom-fields/) | diff --git a/src/content/docs/ruleset-engine/rules-language/functions.mdx b/src/content/docs/ruleset-engine/rules-language/functions.mdx index cfa47bd5d8a236..433f9006f3b23e 100644 --- a/src/content/docs/ruleset-engine/rules-language/functions.mdx +++ b/src/content/docs/ruleset-engine/rules-language/functions.mdx @@ -347,6 +347,9 @@ url_decode("%2520", "r") will return " " // Using url_decode() with the any() function: any(url_decode(http.request.body.form.values[*])[*] contains "an xss attack") + +// Using the u option to match a specific alphabet +url_decode(http.request.uri.path) matches "(?u)\p{Hangul}+" ``` ### `uuidv4` diff --git a/src/content/docs/ssl/edge-certificates/changing-dcv-method/methods/delegated-dcv.mdx b/src/content/docs/ssl/edge-certificates/changing-dcv-method/methods/delegated-dcv.mdx index 742626e2f4474d..0128edc487b72d 100644 --- a/src/content/docs/ssl/edge-certificates/changing-dcv-method/methods/delegated-dcv.mdx +++ b/src/content/docs/ssl/edge-certificates/changing-dcv-method/methods/delegated-dcv.mdx @@ -35,7 +35,7 @@ You should use Delegated DCV when all of the following conditions are true: :::note[Delegated DCV and origin certificates] -As explained in the [announcement blog post](https://blog.cloudflare.com/introducing-dcv-delegation/), currently, you can only delegate DCV to one provider at a time. If you also issue publicly trusted certificates for the same hostname for your [origin server](/ssl/concepts/#origin-certificate), this will no longer be possible. You can use [Cloudflare Origin CA certificates](/ssl/origin-configuration/origin-ca/) instead. +As explained in the [announcement blog post](https://blog.cloudflare.com/introducing-dcv-delegation/), currently, you can only delegate DCV to one provider at a time. If you also issue publicly trusted certificates for the same hostname for your [origin server](/ssl/concepts/#origin-certificate), this will no longer be possible. You can use [Cloudflare origin CA certificates](/ssl/origin-configuration/origin-ca/) instead. ::: ## Setup diff --git a/src/content/docs/ssl/origin-configuration/authenticated-origin-pull/set-up/zone-level.mdx b/src/content/docs/ssl/origin-configuration/authenticated-origin-pull/set-up/zone-level.mdx index e5ca768855d785..966af24685ffb2 100644 --- a/src/content/docs/ssl/origin-configuration/authenticated-origin-pull/set-up/zone-level.mdx +++ b/src/content/docs/ssl/origin-configuration/authenticated-origin-pull/set-up/zone-level.mdx @@ -28,7 +28,7 @@ If you need a different AOP certificate to apply to different custom hostnames, First, upload a certificate to your origin. -To use a Cloudflare certificate (which uses a specific CA), [download the .PEM file](/ssl/static/authenticated_origin_pull_ca.pem) and upload it to your origin. This certificate is **not** the same as the Cloudflare Origin CA certificate and will not appear on your Dashboard. +To use a Cloudflare certificate (which uses a specific CA), [download the .PEM file](/ssl/static/authenticated_origin_pull_ca.pem) and upload it to your origin. This certificate is **not** the same as the [Cloudflare origin CA certificate](/ssl/origin-configuration/origin-ca/) and will not appear on your Dashboard. To use a custom certificate, follow the API instructions to [upload a custom certificate to Cloudflare](/ssl/edge-certificates/custom-certificates/uploading/#upload-a-custom-certificate), but use the [`origin_tls_client_auth` endpoint](/api/resources/origin_tls_client_auth/methods/create/). Then, upload the certificate to your origin. diff --git a/src/content/docs/ssl/origin-configuration/origin-ca.mdx b/src/content/docs/ssl/origin-configuration/origin-ca/index.mdx similarity index 85% rename from src/content/docs/ssl/origin-configuration/origin-ca.mdx rename to src/content/docs/ssl/origin-configuration/origin-ca/index.mdx index d64ce987c620d2..f0f6f9171b172f 100644 --- a/src/content/docs/ssl/origin-configuration/origin-ca.mdx +++ b/src/content/docs/ssl/origin-configuration/origin-ca/index.mdx @@ -1,24 +1,23 @@ --- -title: Origin CA certificates +title: Cloudflare origin CA pcx_content_type: how-to sidebar: order: 3 + label: Setup head: [] -description: Origin Certificate Authority (CA) certificates allow you to encrypt - traffic between Cloudflare and your origin web server, and reduce origin - bandwidth consumption. +description: Encrypt traffic between Cloudflare and your origin web server and reduce origin bandwidth consumption. --- -import { FeatureTable } from "~/components" +import { FeatureTable, GlossaryTooltip, Render } from "~/components" -Use Origin Certificate Authority (CA) certificates to encrypt traffic between Cloudflare and your origin web server and reduce origin bandwidth consumption. Once deployed, these certificates are compatible with [Strict SSL mode](/ssl/origin-configuration/ssl-modes/full-strict/). +If your origin only receives traffic from proxied records, use Cloudflare origin CA certificates to encrypt traffic between Cloudflare and your origin web server and reduce bandwidth consumption. Once deployed, these certificates are compatible with [Strict SSL mode](/ssl/origin-configuration/ssl-modes/full-strict/). -For more background information on Origin CA certificates, refer to the [introductory blog post](https://blog.cloudflare.com/cloudflare-ca-encryption-origin/). +For more background information on origin CA certificates, refer to the [introductory blog post](https://blog.cloudflare.com/cloudflare-ca-encryption-origin/). :::note -Using Cloudflare Origin CA certificates do not prevent you from using [delegated DCV](/ssl/edge-certificates/changing-dcv-method/methods/delegated-dcv/). +Using Cloudflare origin CA certificates does not prevent you from using [delegated DCV](/ssl/edge-certificates/changing-dcv-method/methods/delegated-dcv/). ::: ## Availability @@ -89,6 +88,10 @@ If all your origin hosts are protected by Origin CA certificates or publicly tru If you have origin hosts that are not protected by certificates, set the **SSL/TLS encryption** mode for a specific application to **Full (strict)** by using a [Page Rule](/rules/page-rules/). +:::caution + +::: + ## Revoke an Origin CA certificate If you misplace your key material or do not want a certificate to be trusted, you may want to revoke your certificate. You cannot undo this process. @@ -114,7 +117,7 @@ Some origin web servers require upload of the Cloudflare Origin CA root certific ### Hostname and wildcard coverage -Certificates may be generated with up to 200 individual Subject Alternative Names (SANs). A SAN can take the form of a fully-qualified domain name (`www.example.com`) or a wildcard (`*.example.com`). You cannot use IP addresses as SANs on Cloudflare Origin CA certificates. +Certificates may be generated with up to 200 individual Subject Alternative Names (SANs). A SAN can take the form of a fully-qualified domain name (`www.example.com`) or a wildcard (`*.example.com`). You cannot use IP addresses as SANs on Cloudflare origin CA certificates. Wildcards may only cover one level, but can be used multiple times on the same certificate for broader coverage (for example, `*.example.com` and `*.secure.example.com` may co-exist). @@ -131,4 +134,4 @@ To automate processes involving Origin CA certificates, use the following API ca ## Troubleshooting -Site visitors may see untrusted certificate errors if you pause or disable Cloudflare on subdomains that use Origin CA certificates. These certificates only encrypt traffic between Cloudflare and your origin server, not traffic from client browsers to your origin. +If you find `NET::ERR_CERT_AUTHORITY_INVALID` or other issues after setting up Cloudflare origin CA, refer to [troubleshooting](/ssl/origin-configuration/origin-ca/troubleshooting/). diff --git a/src/content/docs/ssl/origin-configuration/origin-ca/troubleshooting.mdx b/src/content/docs/ssl/origin-configuration/origin-ca/troubleshooting.mdx new file mode 100644 index 00000000000000..c0aa6232c89f68 --- /dev/null +++ b/src/content/docs/ssl/origin-configuration/origin-ca/troubleshooting.mdx @@ -0,0 +1,45 @@ +--- +title: Troubleshooting Cloudflare origin CA +pcx_content_type: troubleshooting +description: Troubleshoot issues like NET::ERR_CERT_AUTHORITY_INVALID when using Cloudflare origin CA. +sidebar: + order: 2 + label: Troubleshooting +--- + +import { GlossaryTooltip, Render } from "~/components"; + +Consider the following common issues and troubleshooting steps when using [Cloudflare origin CA](/ssl/origin-configuration/origin-ca/). + +## NET::ERR_CERT_AUTHORITY_INVALID + +### Cause + + +This also means that SSL Labs or similar SSL validators are expected to flag the certificate as invalid. + +### Solutions + +- Make sure the [proxy status](/dns/manage-dns-records/reference/proxied-dns-records/) of your DNS records and any [page rules](/rules/page-rules/) (if existing) are set up correctly. If so, you can try to turn proxying off and then on again and wait a few minutes. +- If you must have direct connections between clients and your origin server, consider installing a publicly trusted certificate at your origin instead. This process is done outside of Cloudflare, where you should issue the certificate directly from a certificate authority (CA) of your choice. You can still use Full (strict) [encryption mode](/ssl/origin-configuration/ssl-modes/), as long as the CA is listed on the [Cloudflare trust store](https://github.com/cloudflare/cfssl_trust). + +## The issuer of this certificate could not be found + +### Cause +Some origin web servers require that you upload the Cloudflare origin CA root certificate or certificate chain. + +### Solution +Use the following links to download either an ECC or an RSA version and upload to your origin web server: + +* [Cloudflare Origin ECC PEM](/ssl/static/origin_ca_ecc_root.pem) (do not use with Apache cPanel) +* [Cloudflare Origin RSA PEM](/ssl/static/origin_ca_rsa_root.pem) + +## The certificate is not trusted in all web browsers + +### Cause +Apache cPanel requires that you upload the Cloudflare origin CA root certificate or certificate chain. + +### Solution +Use the following link to download an RSA version of the root certificate and upload it to your origin web server: + +* [Cloudflare Origin RSA PEM](/ssl/static/origin_ca_rsa_root.pem) \ No newline at end of file diff --git a/src/content/docs/style-guide/components/badges.mdx b/src/content/docs/style-guide/components/badges.mdx index 657dcf0052b31c..c806adadf26866 100644 --- a/src/content/docs/style-guide/components/badges.mdx +++ b/src/content/docs/style-guide/components/badges.mdx @@ -6,21 +6,19 @@ import { Badge } from "~/components"; Badges are a built-in component provided by [Starlight](https://starlight.astro.build/guides/components/#bades). Use them to indicate a product is in beta, for example. -:::note - -For guidance on using badges inline with other text, refer to [Inline badges](/style-guide/components/inline-badge/). - -::: - ## Component +To adopt this styling in a React component, apply the `sl-badge` class to a `span` element. + ```mdx live import { Badge } from "~/components"; - - - - + + + + + + ``` ## Sidebar diff --git a/src/content/docs/style-guide/components/inline-badge.mdx b/src/content/docs/style-guide/components/inline-badge.mdx index 57dc07ef721782..af6375f6a0a168 100644 --- a/src/content/docs/style-guide/components/inline-badge.mdx +++ b/src/content/docs/style-guide/components/inline-badge.mdx @@ -12,7 +12,9 @@ Guidelines: - For instructions related to the feature (such as instructions on turning the feature on or off), you may mention again it's in beta, and also include "(beta)" in the side nav. ::: -## Example +## Component + +To adopt this styling in a React component, apply the `sl-badge` class to a `span` element. ```mdx live import { InlineBadge } from '~/components'; @@ -27,7 +29,7 @@ import { InlineBadge } from '~/components'; ### Legacy -### Custom +### Default ``` ## Inputs diff --git a/src/content/docs/style-guide/documentation-content-strategy/content-types/changelog.mdx b/src/content/docs/style-guide/documentation-content-strategy/content-types/changelog.mdx index 3ec3c91722d564..b57eb9d457f4a7 100644 --- a/src/content/docs/style-guide/documentation-content-strategy/content-types/changelog.mdx +++ b/src/content/docs/style-guide/documentation-content-strategy/content-types/changelog.mdx @@ -117,7 +117,7 @@ entries: description: |- Queue consumers will soon automatically scale up concurrently as a queues' backlog grows in order to keep overall message processing latency down. Concurrency will be enabled on all existing queues by 2023-03-28. - **To opt-out, or to configure a fixed maximum concurrency**, set `max_concurrency = 1` in your `wrangler.toml` file or via [the queues dashboard](https://dash.cloudflare.com/?to=/:account/queues). + **To opt-out, or to configure a fixed maximum concurrency**, set `max_concurrency = 1` in your Wrangler file or via [the queues dashboard](https://dash.cloudflare.com/?to=/:account/queues). **To opt-in, you do not need to take any action**: your consumer will begin to scale out as needed to keep up with your message backlog. It will scale back down as the backlog shrinks, and/or if a consumer starts to generate a higher rate of errors. To learn more about how consumers scale, refer to the [consumer concurrency](/queues/learning/consumer-concurrency/) documentation. - publish_date: "2023-03-02" diff --git a/src/content/docs/style-guide/formatting/code-conventions-and-format.mdx b/src/content/docs/style-guide/formatting/code-conventions-and-format.mdx index 5450485a3fd28c..4a6065f78b675b 100644 --- a/src/content/docs/style-guide/formatting/code-conventions-and-format.mdx +++ b/src/content/docs/style-guide/formatting/code-conventions-and-format.mdx @@ -107,7 +107,7 @@ Text in this font denotes text or characters that you should enter from the keyb | Enum (enumerator) names (depending on language) | `type ContentTypeMapElem` | | Environment variable names | `` | | Element names, including angle brackets (XML and HTML). | `
`, `
`, ``, `` | -| Filenames, filename extensions (if used), and paths | `wrangler.toml` | +| Filenames, filename extensions (if used), and paths | `wrangler.toml`, `wrangler.json` | | Folders and directories | `~/Downloads/Cloudflare_CA.crt` | | HTTP verbs | `POST`, `GET`, `HEAD`, `PUT`,`DELETE` | | HTTP status codes | `400`, `200`, `500`
However, error ranges using `x` placeholders should not be monospaced: 5xx, 1xxxx. | diff --git a/src/content/docs/support/account-management-billing/cannot-locate-dashboard-account.mdx b/src/content/docs/support/account-management-billing/cannot-locate-dashboard-account.mdx index 6f9362178481f4..1cf9ab7faf0cbb 100644 --- a/src/content/docs/support/account-management-billing/cannot-locate-dashboard-account.mdx +++ b/src/content/docs/support/account-management-billing/cannot-locate-dashboard-account.mdx @@ -15,7 +15,7 @@ If you have an account with paid services: 3. For **Is your issue domain related?**, select "No". 4. For **Summary**, enter "Can't access Cloudflare Help Center My Activities." 5. Select **Add more details** or **Open a Case**. -6. For **Description**, enter "Can't access Cloudflare Help Center My Activities" and follow the process mentioned for [Cannot locate dashboard account](/support/account-management-billing/cannot-locate-dashboard-account/)" +6. For **Description**, enter a brief description of the issue using at least 20 words. 7. Select **Submit Case**. This process will allow us to link your account inside our new support system. diff --git a/src/content/docs/support/contacting-cloudflare-support.mdx b/src/content/docs/support/contacting-cloudflare-support.mdx index 81024b79164a51..2d4bba8f6a4533 100644 --- a/src/content/docs/support/contacting-cloudflare-support.mdx +++ b/src/content/docs/support/contacting-cloudflare-support.mdx @@ -2,7 +2,7 @@ pcx_content_type: troubleshooting source: https://support.cloudflare.com/hc/en-us/articles/200172476-Contacting-Cloudflare-Support title: Contacting Cloudflare Support -description: Learn how to contact Cloudflare Support through various methods, including live chat and phone, with guidelines for identity verification and case submission. +description: Learn how to contact Cloudflare Support via community, chat, or phone. Get help with issues, verify identity, and understand SLAs for different plans. sidebar: order: 1 --- diff --git a/src/content/docs/support/third-party-software/others/configure-cloudflare-and-heroku-over-https.mdx b/src/content/docs/support/third-party-software/others/configure-cloudflare-and-heroku-over-https.mdx index b262fffeef035b..94322164cae686 100644 --- a/src/content/docs/support/third-party-software/others/configure-cloudflare-and-heroku-over-https.mdx +++ b/src/content/docs/support/third-party-software/others/configure-cloudflare-and-heroku-over-https.mdx @@ -92,7 +92,7 @@ Once the certificate status changes to **• Active Certificate**, incoming tr ### Step 4b - Force all traffic over HTTPS -To ensure all traffic to your site is encrypted, Cloudflare lets you force an automatic HTTPS redirect.  To configure this, consult: [How do I redirect all visitors to HTTPS/SSL?](https://support.cloudflare.com/hc/articles/200170536) +To ensure all traffic to your site is encrypted, Cloudflare lets you force an automatic HTTPS redirect.  To configure this, consult: [How do I redirect all visitors to HTTPS/SSL?](/ssl/troubleshooting/faq/#how-do-i-redirect-all-visitors-to-httpsssl) You can then use a cURL command to verify that all requests are being forced over HTTPS. @@ -111,6 +111,6 @@ Server: cloudflare CF-RAY: 3e1e77d5c42b8c52-SFO-DOG ``` -If SSL was not working for your domain (e.g. your SSL certificate has not yet been issued), you would see a [525](https://support.cloudflare.com/hc/articles/115003011431#525error) or [526](https://support.cloudflare.com/hc/articles/115003011431#526error) HTTP response after the redirect. +If SSL was not working for your domain (for example, your SSL certificate has not yet been issued), you would see a [525](/support/troubleshooting/cloudflare-errors/troubleshooting-cloudflare-5xx-errors/#error-525-ssl-handshake-failed) or [526](/support/troubleshooting/cloudflare-errors/troubleshooting-cloudflare-5xx-errors/#error-526-invalid-ssl-certificate) HTTP response after the redirect. Please note that the issuing of a Universal SSL certificate typically takes up to 24 hours. Our paid SSL certificates issue within 10-15 minutes. diff --git a/src/content/docs/support/troubleshooting/http-status-codes/2xx-success.mdx b/src/content/docs/support/troubleshooting/http-status-codes/2xx-success.mdx index 7fc488fa7c97b9..4e771311e2866b 100644 --- a/src/content/docs/support/troubleshooting/http-status-codes/2xx-success.mdx +++ b/src/content/docs/support/troubleshooting/http-status-codes/2xx-success.mdx @@ -2,14 +2,13 @@ pcx_content_type: troubleshooting source: https://support.cloudflare.com/hc/en-us/articles/115003014192-2xx-Success title: 2xx Success - --- 2xx status codes indicate success, meaning that the client's request was received, understood, and accepted by the server. ## 200 OK -A 200 response indicates that the request has succeeded. +A 200 response indicates that the request has succeeded. ### Common use cases @@ -49,7 +48,7 @@ Servers use this response to tell a client that the resource was cached by a pro ### Cloudlare-specific information -Cloudflare does not cache 203 responses. For details about how Cloudflare handles 203 responses, refer to [HTTP request headers](/fundamentals/reference/http-request-headers/). +Cloudflare does not cache 203 responses. For details about how Cloudflare handles 203 responses, refer to [Cloudflare HTTP headers](/fundamentals/reference/http-headers/). ## 204 No content @@ -65,7 +64,7 @@ This response is often used by servers to indicate that a document editor's save ## 205 Reset content -A 205 response tells the client to return to its previous state after a request. +A 205 response tells the client to return to its previous state after a request. ### Common use cases @@ -93,5 +92,3 @@ For more details, refer to [RFC 7233 Section 4.1](https://tools.ietf.org/html/rf ### Cloudflare-specific information Cloudflare handles 206 responses for range requests, but caching behavior may vary depending on the file type and origin settings. - - diff --git a/src/content/docs/support/troubleshooting/http-status-codes/4xx-client-error.mdx b/src/content/docs/support/troubleshooting/http-status-codes/4xx-client-error.mdx index 68259727a58e44..2eec8bfb70bd08 100644 --- a/src/content/docs/support/troubleshooting/http-status-codes/4xx-client-error.mdx +++ b/src/content/docs/support/troubleshooting/http-status-codes/4xx-client-error.mdx @@ -7,129 +7,223 @@ title: 4xx Client Error import { FeatureTable, Render } from "~/components" -4xx codes generally are error responses specifying an issue at the client’s end, potentially a network issue.   +`4xx` codes are error responses that indicate an issue on the client's end, potentially due to a network problem. -* 4xx codes can be used as a response to any request method. -* Origin server should include an explanation which should be displayed by User-Agent, with the exception of a `HEAD` request -* [Custom rules](/waf/custom-rules/) can return any response code in the range 400-499 in your HTML page, if the site owner has created a rule with *Block* action and configured a custom response code. Refer to [custom response](/waf/custom-rules/create-dashboard/#configure-a-custom-response-for-blocked-requests) for more details. +- `4xx` codes can be used as a response to any request method. +- The origin server should include an explanation, which should be displayed by the User-Agent, except in the case of a `HEAD` request. +- [Custom rules](/waf/custom-rules/) can return any response code in the range of `400–499` on your HTML page if the site owner has created a rule with the _Block_ action and configured a custom response code. For more details, refer to [custom response](/waf/custom-rules/create-dashboard/#configure-a-custom-response-for-blocked-requests). -The following are common 4xx codes and their definitions: +## 400 Bad Request -## **400 Bad Request ([RFC7231](https://tools.ietf.org/html/rfc7231))** +This error indicates that the client sent a request to the server that could not be understood or processed due to issues with the request itself. -The client did not send a correct request to the server. This is a client error: malformed request syntax, invalid request, message framing, or deceptive request routing. -For example, if the request contains a special character that is not correctly [URL Encoded (or percent-encoded)](https://en.wikipedia.org/wiki/Percent-encoding), this HTTP Error 400 will be returned. +For more information, refer to [RFC7231](https://tools.ietf.org/html/rfc7231). -If you're getting an HTTP Error when using the [Cloudflare API](/api/), please make sure that you are using the correct syntax, the correct parameters and correct body for your API call. +### Common use cases -## **401 Unauthorized ([RFC 7235](https://tools.ietf.org/html/rfc7235))** +A `400 Bad Request` error occurs due to client-side issues, such as malformed request syntax, invalid request content, message framing problems, or deceptive request routing. For example, if the request contains a special character that is not properly [URL Encoded (or percent-encoded)](https://en.wikipedia.org/wiki/Percent-encoding), an `HTTP Error 400` will be returned. -The request was not sent with the proper authentication credentials +### Cloudflare-specific information + +If you encounter an HTTP error while using the [Cloudflare API](/api/), make sure that you are using the correct syntax, parameters, and body for your API call. + +## 401 Unauthorized + +This error indicates that the request was not sent with the proper authentication credentials. The server requires authentication to process the request. + +For more details, refer to [RFC 7235](https://tools.ietf.org/html/rfc7235). + +### Common use cases + +A `401 Unauthorized` error occurs when the client fails to provide valid authentication credentials. The server responds with at least one challenge in the form of a `WWW-Authenticate` header field, as outlined in [section 4.1](https://datatracker.ietf.org/doc/html/rfc7235#section-4.1). + +If the client resends the request with the same credentials and the challenge remains unchanged, the server may return an entity to assist the client in identifying the correct credentials needed. + +### Cloudflare-specific information + +When encountering a `401` error while using the Cloudflare API, ensure that you are providing the correct authentication credentials (for example, [API tokens](/fundamentals/api/get-started/create-token/) or [keys](/fundamentals/api/get-started/ca-keys/)). Double-check that the credentials are active and properly formatted. If the error persists, refer to the `WWW-Authenticate` header in the response for guidance on resolving the issue. + +## 402 Payment Required + +The `402 Payment Required` status code is reserved for future use and is not yet implemented according to the standards outlined in [RFC7231](https://tools.ietf.org/html/rfc7231). + +## 403 Forbidden + +The `403 Forbidden` status code indicates that the clien's request was understood by the server but cannot be fulfilled due to insufficient permissions to access the requested resource. +For more details, refer to [RFC7231](https://tools.ietf.org/html/rfc7231). + +### Common use cases + +If you encounter a `403` error without the Cloudflare branding, this means that the error is being returned directly by the origin web server, not Cloudflare. This is typically related to permission rules set on your server. Common reasons for this error are: + +- Permission rules configured on the origin web server (for example, in an Apache `.htaccess` file). +- Mod_security rules. +- IP deny rules, such as blocking traffic from certain IP ranges. Make sure that [Cloudflare's IP ranges](https://www.cloudflare.com/ips) are not being blocked. + +### Cloudflare-specific information + +Cloudflare may serve `403` responses in the following scenarios: + +- **WAF rules**: The request violated a default WAF managed rule (enabled for all orange-clouded Cloudflare domains) or a custom WAF managed rule specific to your zone. For more information, refer to [WAF Managed Rules](/waf/managed-rules/). + +- **Security features**: A `403` response with Cloudflare branding in the response body may be triggered by: + - [WAF Custom or Managed Rules](/waf/) with the challenge or block action + - [Security Level](/waf/tools/security-level/) settings, which default to Medium. + - [DDoS Protection](/ddos-protection/), which is enabled by default on zones onboarded to Cloudflare, IP applications onboarded to Spectrum, and IP Prefixes onboarded to Magic Transit. + - Most [1xxx Cloudflare error codes](/support/troubleshooting/cloudflare-errors/troubleshooting-cloudflare-1xxx-errors/). + - The [Browser Integrity Check](/waf/tools/browser-integrity-check/). + - [Validation Checks](/waf/analytics/security-events/additional-information/). + +Cloudflare may also serve an unstyled `403` error page in specific cases. These errors are not logged because they occur early in Cloudflare's infrastructure, before domain configuration is loaded. An example is: + +- [SNI](https://www.cloudflare.com/learning/ssl/what-is-sni/): A `403` error is returned when the client sends a host that does not match the SNI (Server Name Indication). + +## 404 Not Found + +The `404 Not Found` status code indicates that the origin server was unable to locate the requested resource. Typically, this means the host server could not find the resource. For a more permanent version of this error, the 410 Gone status code should be used. + +For more details, refer to [RFC7231](https://tools.ietf.org/html/rfc7231). + +### Common use cases + +These errors typically occur when someone mistypes a URL on your site, when there is a broken link from another page, when a page that previously existed is moved or removed, or there is an error when a search engine indexes your site. + +These errors typically account for approximately 3% of total page views for a typical site. However, they often go untracked by traditional analytics platforms, such as Google Analytics. To improve user experience, website owners usually implement a custom 404 page to be displayed when this error is generated. + +### Cloudflare-specific information + +Cloudflare does not generate `404s` for customer websites, we only proxy the request from the origin server. If you encounter a `404` error on a Cloudflare-powered site, the issue lies with the origin server. In such cases, contact your hosting provider for assistance. + +## 405 Method Not Allowed + +The 405 Method Not Allowed status code indicates that the origin server recognizes the requested resource but does not support the HTTP method used in the request. + +For more details, refer to [RFC7231](https://tools.ietf.org/html/rfc7231). + +### Common use cases + +This error typically occurs when the client uses an unsupported HTTP method to interact with a specific resource. The origin server must include an `Allow` header in the response, which lists the HTTP methods supported for that resource. + +For example, attempting a `POST` request on a resource that is unchangeable and only supports `GET` requests will result in a `405` error. + +### Cloudflare-specific information + +Cloudflare does not directly generate `405` errors. These errors are returned by the origin server when it does not allow the HTTP method used in the request. If you encounter a `405` error, review the configuration of your origin server to ensure the correct methods are enabled for the resource in question. + +## 406 Not Acceptable + +The `406 Not Acceptable` status code indicates that the requested resource is not available in a format that adheres to the content negotiation headers specified by the client (for example, `Accept-Charset` or `Accept-Language`). + +For more details, refer to [RFC7231](https://tools.ietf.org/html/rfc7231)1. -* Server must send with at least one challenge in the form of a `WWW-Authenticate` header field according to [section 4.1](https://datatracker.ietf.org/doc/html/rfc7235#section-4.1) -* Client may send a second request with the same credentials and then if the challenge is identical to the one before, an entity will be provided by the server to help the client find what credentials are needed. +### Common use cases -## **402 Payment Required ([RFC7231](https://tools.ietf.org/html/rfc7231))** +For example, if a client requests content in a specific language or character set that the server does not support, this error will be generated. To avoid returning a `406` error, the server can instead serve the less preferred method to the client's User-Agent, rather than rejecting the request. -Not yet implemented by RFC standards but reserved for future use. +### Cloudflare-specific information + +Cloudflare does not generate `406` errors directly but can proxy these responses from the origin server. If content negotiation issues occur, they are typically related to configurations at the origin server, such as language or character set settings. + +## 407 Authentication Required -## **403 Forbidden ([RFC7231](https://tools.ietf.org/html/rfc7231))** +The `407 Proxy Authentication Required` status code indicates that the client did not provide the necessary authentication credentials to access the requested resource through a proxy server. +For more details, refer to [RFC 7235](https://tools.ietf.org/html/rfc7235). -If you're seeing a 403 error without Cloudflare branding, this is always returned directly from the origin web server, not Cloudflare, and is generally related to permission rules on your server. The top reasons for this error are: +### Common use cases -1. Permission rules you have set on the origin web server (in the Apache .htaccess for example) -2. Mod\_security rules -3. IP deny rules. You need to make sure that [Cloudflare's IP ranges](https://www.cloudflare.com/ips) aren't being blocked +This error typically occurs in environments where a proxy server is used as an intermediary between the client and the target server. To resolve this, the client must include the appropriate `Proxy-Authorization` header in the request with valid credentials. ### Cloudflare-specific information -Cloudflare will serve 403 responses if the request violated either a default WAF managed rule enabled for all orange-clouded Cloudflare domains or a WAF managed rule enabled for that particular zone. Read more at [WAF Managed Rules](/waf/managed-rules/). +Cloudflare does not generate `407` errors but proxies them from the origin server or an upstream proxy. If a `407` error occurs on a Cloudflare-powered site, review the origin server's proxy configuration to ensure authentication requirements are properly set, and verify that the client is providing the required credentials. + +## 408 Request Timeout + +The `408 Request Timeout` status code indicates that the origin server did not receive the complete request within a reasonable time frame and does not wish to continue waiting for the connection. This response is not commonly used, as servers often prefer to use the "close" connection option to terminate idle connections + +For more details, refer to [RFC7231](https://tools.ietf.org/html/rfc7231). -If you're seeing a 403 response that contains Cloudflare branding in the response body, this is the HTTP response code returned along with many of our security features: +### Common use cases -* [WAF Custom or Managed Rules](/waf/) with the challenge or block action -* [Security Level](/waf/tools/security-level/), that is set to Medium by default -* [DDoS Protection](/ddos-protection/), that is enabled by default on zones onboarded to Cloudflare, IP applications onboarded to Spectrum, and IP Prefixes onboarded to Magic Transit -* Most [1xxx Cloudflare error codes](/support/troubleshooting/cloudflare-errors/troubleshooting-cloudflare-1xxx-errors/) -* The [Browser Integrity Check](/waf/tools/browser-integrity-check/) -* [Validation Checks](/waf/analytics/security-events/additional-information/) +This error typically occurs when a client fails to send a complete request within the server's timeout period. Common scenarios include slow network connections, server overload or client-side delays to complete the request. -Cloudflare will also serve an unstyled 403 error page in the following case. There errors are not logged, as they occur early in Cloudflare's infrastructure, before the configuration for domains has been loaded. +### Cloudflare-specific information -* [SNI](https://www.cloudflare.com/learning/ssl/what-is-sni/) mismatch: a 403 error is returned if there is a mismatch caused by the client sending a different host to the SNI +Cloudflare does not generate `408` errors but may proxy them from the origin server. If a `408` error occurs on a Cloudflare-powered site, it is essential to review the origin server's timeout settings and ensure that the server is not overloaded. Additionally, verify that the client's Internet connection is stable and that the request is being sent promptly. -## **404 Not Found ([RFC7231](https://tools.ietf.org/html/rfc7231))** +## 409 Conflict -Origin server was unable or unwilling to find the resource requested. This usually means the host server could not find the resource. To serve a more permanent version of this error one should use a 410 error code. +The `409 Conflict` status code indicates that the request could not be completed due to a conflict with the current state of the target resource. -These errors typically occur when someone mistypes a URL on your site when there is a broken link from another page, when a page that previously existed is moved or removed, or there is an error when a search engine indexes your site. For a typical site, these errors account for approximately 3% of the total page views, but they’re often untracked by traditional analytics platforms like Google Analytics. +For more details, refer to [RFC7231](https://tools.ietf.org/html/rfc7231). -Website owners usually implement a custom page to be served when this error is generated. +### Common use cases +This error typically happens with a `PUT` request when multiple clients are attempting to edit the same resource. To solve this issue: -Cloudflare does not generate 404s for customer websites, we only proxy the request from the origin server. When seeing a 404 for your Cloudflare powered site you should contact your hosting provider for help. + - The server should generate a payload that includes enough information for the client to recognize the source of the conflict. + - Clients should retry the request again after resolving the conflict. -## **405 Method Not Allowed ([RFC7231](https://tools.ietf.org/html/rfc7231))** +### Cloudflare-specific information -Origin server is aware of the requested resource, but the request method used is not supported. +Cloudflare will return a 409 response for a [Error 1001: DNS Resolution Error](/support/troubleshooting/cloudflare-errors/troubleshooting-cloudflare-1xxx-errors/#error-1001-dns-resolution-error). -* Origin server must also provide an `Allow` header with a list of supported targets for that resource. +## 410 Gone -An example would be a POST on an unchangeable resource the thus only accepts GET. +When a resource is intentionally and permanently removed, servers use the `410 Gone` status code to inform clients that the resource is no longer available. +In this case: -## **406 Not Acceptable ([RFC7231](https://tools.ietf.org/html/rfc7231))** + - The server suggests that links referencing the resource should be removed. + - The server is not obligated to use this status code instead of a `404` response, nor is it required to maintain this response for any specific period of time. -Resource is not available at the origin that adheres to negotiation headers that were  set prior (e.g. via `Accept-Charset` and `Accept-Language` headers) +For more details, refer to [RFC7231](https://tools.ietf.org/html/rfc7231). -This status code can be replaced by simply serving the less preferred method to the User-Agent in lieu of generating this error. +### Common use cases -## **407 Authentication Required  ([RFC 7235](https://tools.ietf.org/html/rfc7235))** +This status is commonly applied to deprecated content, such as outdated pages or discontinued products. -The client did not send the required authentication with the request. +### Cloudflare-specific information -## **408 Request Timeout  ([RFC7231](https://tools.ietf.org/html/rfc7231))** +Cloudflare does not generate `410` for customer websites, we only proxy the request from the origin server. If you encounter a `410` error on a Cloudflare-powered site, the issue lies with the origin server. In such cases, contact your hosting provider for assistance. -The origin server did not receive the complete request in what it considers a reasonable time. +## 411 Length Required -* Implied the server does not wish to wait and continue the connection. -* Not used much because servers typically choose to use the “close” connection option. +The `411 Length Required` status code indicates that the client did not specify the `Content-Length` of the request body in the headers, and this information is required to obtain the resource. The client may resend the request after adding the required header field. -## **409 Conflict ([RFC7231](https://tools.ietf.org/html/rfc7231))** +For more details, refer to [RFC7231](https://tools.ietf.org/html/rfc7231). -The request did not complete because of a conflict with the current state of the resource. Typically happens on a PUT request where multiple clients are attempting to edit the same resource. +### Common use cases -* The server *should* generate a payload that includes enough information for the client to recognize the source of the conflict. -* Clients can and should retry the request again +This status code can occur in various scenarios, such as when a client sends an API request without the required `Content-Length` header, when uploading a file where the server needs the header to allocate resources, or when proxies or legacy systems enforce strict HTTP compliance. In each case, the server or intermediary requires the `Content-Length` header to process the request properly. -Cloudflare will generate and serve a 409 response for a [Error 1001: DNS Resolution Error](/support/troubleshooting/cloudflare-errors/troubleshooting-cloudflare-1xxx-errors/#error-1001-dns-resolution-error). +### Cloudflare-specific information -## **410 Gone ([RFC7231](https://tools.ietf.org/html/rfc7231))** +Cloudflare does not generate `411` for customer websites, we only proxy the request from the origin server. If you encounter a `411` error on a Cloudflare-powered site, the issue lies with the origin server. In such cases, contact your hosting provider for assistance. -The resource requested is permanently missing at the origin. +## 412 Precondition Failed -* The server is suggesting the links reference the resource should be removed. -* The server is not qualified to use this status code over a 404 response nor required to have this response for any specific period of time. +The `412 Precondition Failed` status code indicates that the server denies the request because the resource does not meet the conditions specified by the client. -## **411 Length Required ([RFC7231](https://tools.ietf.org/html/rfc7231))** +For more details, refer to [RFC 7232](https://tools.ietf.org/html/rfc7232). -Client did not define the `Content-Length` of the request body in the headers and this is required to obtain the resource. +### Common use cases -* Client may resend the request after adding the header field. +One common use case for the `412 Precondition Failed` status code is version control. For example, a client modifying an existing resource may set the `If-Unmodified-Since` header to ensure the resource has not been changed since the client downloaded it for editing. If another client edits the resource after the specified date but before the original client uploads their changes, the server will return a `412` response to prevent overwriting the newer updates. -## **412 Precondition Failed  ([RFC 7232](https://tools.ietf.org/html/rfc7232))** +### Cloudflare-specific information -Server denies the request because the resource failed to meet the conditions specified by the client. +Cloudflare may serve this response: for more information please refer to [ETag Headers](/cache/reference/etag-headers/). -For an example of version control, a client is modifying an existing resource and thus sets the `If-Unmodified-Since` header to match the date that the client downloaded the resource and began edits. If the resource was edited (likely by another client) after this date and before the upload of the edits, this response will be generated since the date of the last edit will come after the date set in `If-Unmodified-Since` by the client. +## 413 Payload Too Large -Cloudflare will serve this response. For more information, refer to: [ETag Headers](/cache/reference/etag-headers/) +The `413 Payload Too Large` status code indicates that the server refuses to process the request because the payload sent by the client exceeds the server's acceptable size limit. The server may optionally close the connection. If this refusal would only happen temporarily, then the server should send a `Retry-After` header to specify when the client should try the request again. -## **413 Payload Too Large  ([RFC7231](https://tools.ietf.org/html/rfc7231))** +For more details, refer to [RFC7231](https://tools.ietf.org/html/rfc7231). -Refusal from the server to process the request because the payload sent from the client is larger than the server wished to accept. Server has the optional to close the connection. +### Common use cases -* If this refusal would only happen temporarily, then the server should send a `Retry-After`  header to specify when the client should try the request again. +The `413 Payload Too Large` status code often occurs when clients attempt to upload large files, such as videos or images, or send oversized request bodies, like JSON or XML payloads, that exceed the server's size limits. This can also happen during file transfers or API requests involving large datasets, prompting the server to reject the request. -### Cloudflare customers +### Cloudflare-specific information The upload limit for the Cloudflare API depends on your plan. If you exceed this limit, your API call will receive a `413 Request Entity Too Large` error. @@ -137,74 +231,122 @@ The upload limit for the Cloudflare API depends on your plan. If you exceed this If you require a larger upload, break up requests into smaller chunks, change your DNS record to [DNS-only](/dns/manage-dns-records/reference/proxied-dns-records/#dns-only-records), or [upgrade your plan](/fundamentals/subscriptions-and-billing/change-plan/). -## **414 URI Too Long ([RFC7231](https://tools.ietf.org/html/rfc7231))** +## 414 URI Too Long + +The `414 URI Too Long` status code indicates that the server refuses to process the request because the URI provided by the client is excessively long. + +For more details, refer to [RFC7231](https://tools.ietf.org/html/rfc7231). + +### Common use cases + +For example, if a client is attempting a `GET` request with an unusually long URI, such as one containing an excessive number of query parameters, after a `POST`, this could be seen as a security risk and a `414` is generated. + +### Cloudflare-specific information + +Cloudflare will generate a `414` response if the URI length exceeds 32KB. + +## 415 Unsupported Media Type + +The `415 Unsupported Media Type` status code indicates that the server refuses to process the request because the format of the payload is not supported. One way to identify and fix this issue would be to look at the `Content-Type` or `Content-Encoding` headers sent in the client's request. + +For more details, refer to [RFC7231](https://tools.ietf.org/html/rfc7231). + +### Common use cases -Refusal from the server that the URI was too long to be processed. For example, if a client is attempting a GET request with an unusually long URI after a POST, this could be seen as a security risk and a 414 gets generated. +This may be triggered by submitting a file type or format that the server is not configured to handle, such as uploading an unsupported image or document format, may also trigger this error. -Cloudflare will generate this response for a URI longer than 32KB +### Cloudflare-specific information + +Cloudflare typically passes this response from the origin server if it encounters an unsupported media type in the client's request payload. + +## 416 Range Not Satisfiable + +The `416 Range Not Satisfiable` status code indicates that the server cannot fulfill the requested range specified in the `Range` header of the client's request. + +For more details, refer to [RFC7233](https://datatracker.ietf.org/doc/html/rfc7233). + +### Common use cases -## **415 Unsupported Media Type ([RFC7231](https://tools.ietf.org/html/rfc7231))** +This error can happen when a client requests a byte range outside the bounds of the resource, such as a range exceeding the file's total size. It can also happen if the server does not support partial content delivery or if there is a conflict between the requested range and the server's understanding of the resource, often caused by an outdated or invalid cache. -Refusal from the server to process the format of the current payload. One way to identify and fix this issue would be to look at the `Content-Type` or `Content-Encoding` headers sent in the client’s request. +### Cloudflare-specific information + +Cloudflare typically serves this response when the origin server rejects a `Range` header request for a resource. This often occurs if the requested range exceeds the size of the file, as indicated in the `Content-Range` header. + +## 417 Expectation Failed -## **416 Range Not Satisfiable ([RFC7233](https://datatracker.ietf.org/doc/html/rfc7233))** +The `417 Expectation Failed` status code indicates that the server could not meet the requirements specified in the `Expect` header of the client's request. -The 416 error response code indicates that a server cannot serve the requested ranges. For example: +For more details, refer to R[RFC7231](https://tools.ietf.org/html/rfc7231). -`HTTP/1.1 416 Range Not Satisfiable` +### Common use cases -`Content-Range: bytes */12777` +Some clients use the `Expect` header, such as `Expect: 100-continue`, to verify if the server is ready to receive a large payload, and if the server cannot fulfill this expectation, it returns a 417 response. Similarly, a server may reject a request with this error if the client includes an `Expect` header with unsupported or invalid values. -The most common reason is that the file doesn't include such ranges. Browsers usually either request the entire file again or abort the operation. +### Cloudflare-specific information + +Cloudflare typically forwards this response from the origin server if it encounters an issue related to unsupported or unfulfilled `Expect` headers in the client's request. -## **417 Expectation Failed ([RFC7231](https://tools.ietf.org/html/rfc7231))** +## 429 Too Many Requests -Failure of server to meet the requirements specified in the `Expect` header of the client’s request. +The `429 Too Many Requests` status code indicates that the client has sent too many requests in a specified amount of time, as determined by the server's rate-limiting rules. The server may include a `Retry-After` header in the response to specify when the client can try again. -## **429 Too Many Requests ([RFC6585](https://tools.ietf.org/html/rfc6585))** +For more details, refer to [RFC6585](https://tools.ietf.org/html/rfc6585). -Client has sent too many requests in the specified amount of time according to the server. Often known as "rate-limiting". Server may respond with information allowing the requester to retry after a specific period of time. +### Common use cases -### Cloudflare customers +Servers use this status code to prevent excessive API requests from overloading the system. For example, a client making repeated API calls within a short time frame may trigger a 429 response. Websites or services may impose rate limits to manage traffic spikes or prevent abuse, temporarily blocking excessive requests from users. + +### Cloudflare-specific information + +- **Cloudflare API limits** -### Website end users +- **Website end users** + +Cloudflare will generate a `429` response when a request is being [rate limited](https://www.cloudflare.com/rate-limiting/). If visitors to your site encounter this error, it will be visible in the [Rate Limiting Analytics](/waf/reference/legacy/old-rate-limiting/#analytics) dashboard. -Cloudflare will generate and send this status code when a request is being [rate limited](https://www.cloudflare.com/rate-limiting/). If visitors to your site are receiving these error codes, you will be able to see this in the [Rate Limiting Analytics](/waf/reference/legacy/old-rate-limiting/#analytics). +## 451 Unavailable For Legal Reason -## **451 Unavailable For Legal Reason ([RFC7725](https://tools.ietf.org/html/rfc7725))** +The `451` status code indicates that the server cannot deliver the requested resource due to legal actions or restrictions. -Server is unable to deliver the resource due to legal actions. +For more details, refer to [RFC7725](https://tools.ietf.org/html/rfc7725). -Typically search engines (e.g. Google) and ISP (e.g. ATT) are the ones affected by this response code and not the origin server. +### Common use cases -* The response should include an explanation is the response body with details of the legal demand. +This occurs when access to a resource is blocked due to court orders, copyright claims, or other legal demands. Typically search engines (for example, Google) and ISP (for example, ATT) are the ones affected by this response code, rather than the origin server itself. The server should include an explanation in the response body, detailing the legal demand or reason for the restriction. -## **499 Client Close Request** +### Cloudflare-specific information -nginx specific response code to indicate when the connection has been closed by the client while the server is still processing its request, making the server unable to send a status code back. +Cloudflare may pass through a `451` response from the origin server if the requested resource is legally restricted. -* This will be shown in [Cloudflare Logs](https://support.cloudflare.com/hc/en-us/articles/216672448-Enterprise-Log-Share-REST-API) and status code analytics for Enterprise customers. +## 499 Client Close Request -:::note +The `HTTP 499` error typically occurs when a client terminates the connection before the server is able to respond. + +### Common use cases -Since Cloudflare was built on nginx, we also have a 499 HTTP code in Cloudflare Logs -and analytics for connections which are terminated before we have finished -processing the request. It is expected behavior to see these in your -logs intermittently as clients close connections. +Examples of `499` errors include situations where a client times out and closes the connection before the server completes processing, such as during large file uploads or long-running requests. They can also occur due to issues in the TCP three-way handshake, where the client terminates the connection prematurely because of its timeout settings. + +### Cloudflare-specific information + +The `499 Client Closed Request` status code is specific to nginx and indicates that the client closed the connection while the server was still processing the request, preventing the server from sending a status code in response. This status code appears in [Cloudflare Logs](/logs/) and status code analytics for Enterprise customers. + +:::note +Since Cloudflare is built on nginx, the 499 HTTP code is also logged in Cloudflare Logs and analytics for connections terminated by clients before Cloudflare has finished processing the request. It is expected to occasionally see these entries in your logs as clients close connections. ::: -To provide more context, a TCP connection must be established between Cloudflare and the website's Origin server before any higher protocol (in this case is HTTP) started the "conversation". In order to establish a connection, TCP uses a three-way handshake : +To provide more context, a TCP connection must be established between Cloudflare and the website's origin server before any higher protocol (such as HTTP) begins communication. TCP uses a three-way handshake to establish connection: -* SYN: Cloudflare sends three SYN packets to the origin server. -* SYN+ACK: In response, the origin server replies with an SYN+ACK. -* ACK: Finally, Cloudflare sends an ACK back to the origin server. +- **SYN**: Cloudflare sends a SYN packet to the origin server. +- **SYN+ACK**: The origin server responds with a SYN+ACK packet. +- **ACK**: Cloudflare sends an ACK packet back to the origin server. -At this point, both Cloudflare and the origin server have received an acknowledgment of the connection, and communication is established. However, if the origin server does not send an SYN+ACK back to Cloudflare **within 15 seconds, Cloudflare will retry one more time (another 15 seconds timeout)**. +At this point, the connection is established, and both Cloudflare and the origin server can communicate. However, if the origin server does not send a SYN+ACK back to Cloudflare within 15 seconds, Cloudflare retries once more, with another 15-second timeout. -So, depending on the timeout value on the client-side, there will be 3 different scenarios along with each own status code generated : +Depending on the client-side timeout settings, the following scenarios can occur: -* If the client has a shorter timeout (less than 30 seconds), they will give up the connection, and thus Cloudflare logs the 499 error. -* If the client has a higher timeout (more than 30 seconds), once the TCP connection has been successfully established, the HTTP transaction will be continued as per normal. In this case, Cloudflare returns a normal status code (HTTP 200). -* If the client has a higher timeout and Cloudflare was unable to establish the TCP handshake with the Origin server, we will return HTTP 522. +- **Shorter client timeout (less than 30 seconds)**: If the client has a shorter timeout, it will abandon the connection before Cloudflare completes processing, and a `499` error will be logged. +- **Successful connection (more than 30 seconds)**: If the client has a longer timeout and the TCP connection is successfully established, the HTTP transaction proceeds normally, and Cloudflare returns a standard status code (`HTTP 200`). +- **Handshake failure**: If the client has a longer timeout but Cloudflare cannot establish the TCP handshake with the origin server, Cloudflare will return an `HTTP 522` status code. \ No newline at end of file diff --git a/src/content/docs/support/troubleshooting/restoring-visitor-ips/restoring-original-visitor-ips.mdx b/src/content/docs/support/troubleshooting/restoring-visitor-ips/restoring-original-visitor-ips.mdx index 7a9c891dc76917..b993e040ad1180 100644 --- a/src/content/docs/support/troubleshooting/restoring-visitor-ips/restoring-original-visitor-ips.mdx +++ b/src/content/docs/support/troubleshooting/restoring-visitor-ips/restoring-original-visitor-ips.mdx @@ -6,9 +6,9 @@ title: Restoring original visitor IPs import { Render } from "~/components"; -When your [website traffic is routed through the Cloudflare network](https://support.cloudflare.com/hc/articles/205177068), we act as a reverse proxy. This allows Cloudflare to speed up page load time by routing packets more efficiently and caching static resources (images, JavaScript, CSS, etc.). As a result, when responding to requests and logging them, your origin server returns a [Cloudflare IP address](https://www.cloudflare.com/ips/). +When your [website traffic is routed through the Cloudflare network](https://support.cloudflare.com/hc/articles/205177068), we act as a reverse proxy. This allows Cloudflare to speed up page load time by routing packets more efficiently and caching static resources (images, JavaScript, CSS, etc.). As a result, when responding to requests and logging them, your origin server returns a [Cloudflare IP address](https://www.cloudflare.com/ips/). -For example, if you install applications that depend on the incoming IP address of the original visitor, a Cloudflare IP address is logged by default. The original visitor IP address appears in an appended HTTP header called [_CF-Connecting-IP_](/fundamentals/reference/http-request-headers/). By following our [web server instructions](#web-server-instructions), you can log the original visitor IP address at your origin server. If this HTTP header is not available when requests reach your origin server, check your [Transform Rules](/rules/transform/) and [Managed Transforms](/rules/transform/managed-transforms/) configuration. +For example, if you install applications that depend on the incoming IP address of the original visitor, a Cloudflare IP address is logged by default. The original visitor IP address appears in an appended HTTP header called [`CF-Connecting-IP`](/fundamentals/reference/http-headers/). By following our [web server instructions](#web-server-instructions), you can log the original visitor IP address at your origin server. If this HTTP header is not available when requests reach your origin server, check your [Transform Rules](/rules/transform/) and [Managed Transforms](/rules/transform/managed-transforms/) configuration. :::note @@ -443,7 +443,7 @@ http-request set-header X-Forwarded-For %[req.hdr(CF-Connecting-IP)] if from_cf ### Envoy Gateway -To extract the original client IP for your Envoy Gateway, set a [Client Traffic Policy](https://gateway.envoyproxy.io/latest/tasks/traffic/client-traffic-policy/#configure-client-ip-detection) to look for the custom [`CF-Connecting-IP` header](/fundamentals/reference/http-request-headers/#cf-connecting-ip). +To extract the original client IP for your Envoy Gateway, set a [Client Traffic Policy](https://gateway.envoyproxy.io/latest/tasks/traffic/client-traffic-policy/#configure-client-ip-detection) to look for the custom [`CF-Connecting-IP` header](/fundamentals/reference/http-headers/#cf-connecting-ip). ```txt title="Truncated Client Traffic Policy example" clientIPDetection: @@ -458,5 +458,5 @@ For more details, refer to [Custom header original IP detection extension](https ## Related Resources -- [HTTP request headers](/fundamentals/reference/http-request-headers/) +- [Cloudflare HTTP headers](/fundamentals/reference/http-headers/) - [Transform Rules](/rules/transform/) diff --git a/src/content/docs/terraform/additional-configurations/ddos-managed-rulesets.mdx b/src/content/docs/terraform/additional-configurations/ddos-managed-rulesets.mdx index c1b7cf3d437c5b..e184dea80244a1 100644 --- a/src/content/docs/terraform/additional-configurations/ddos-managed-rulesets.mdx +++ b/src/content/docs/terraform/additional-configurations/ddos-managed-rulesets.mdx @@ -36,6 +36,8 @@ For more information on DDoS managed rulesets, refer to [Managed rulesets](/ddos This example configures the [HTTP DDoS Attack Protection](/ddos-protection/managed-rulesets/http/) managed ruleset for a zone using Terraform, changing the sensitivity level of rule with ID fdfdac75430c4c47a959592f0aa5e68a to `low`. + + ```tf resource "cloudflare_ruleset" "zone_level_http_ddos_config" { zone_id = "" @@ -77,6 +79,8 @@ This example configures the [Network-layer DDoS Attack Protection](/ddos-protect ::: + + ```tf resource "cloudflare_ruleset" "account_level_network_ddos_config" { account_id = "" @@ -126,6 +130,8 @@ The order of the rules is important: the rule with the highest sensitivity level ::: + + ```tf variable "zone_id" { default = "" diff --git a/src/content/docs/terraform/additional-configurations/rate-limiting-rules.mdx b/src/content/docs/terraform/additional-configurations/rate-limiting-rules.mdx index 8b016058c0e6ce..2fbec939b875fd 100644 --- a/src/content/docs/terraform/additional-configurations/rate-limiting-rules.mdx +++ b/src/content/docs/terraform/additional-configurations/rate-limiting-rules.mdx @@ -35,6 +35,8 @@ For more information on configuring the previous version of rate limiting rules This example creates a rate limiting rule in zone with ID `` blocking traffic that exceeds the configured rate: + + ```tf resource "cloudflare_ruleset" "zone_rl" { zone_id = "" @@ -71,6 +73,8 @@ resource "cloudflare_ruleset" "zone_rl" { This example defines a [custom ruleset](/ruleset-engine/custom-rulesets/) with a single rate limiting rule in account with ID `` that blocks traffic for the `/api/` path exceeding the configured rate. The second `cloudflare_ruleset` resource defines an `execute` rule that deploys the custom ruleset for traffic addressed at `example.com`. + + ```tf resource "cloudflare_ruleset" "account_rl" { account_id = @@ -125,6 +129,8 @@ This example creates a rate limiting rule in zone with ID `` with: - A custom counting expression that includes a response field (`http.response.code`). - A custom JSON response for rate limited requests. + + ```tf resource "cloudflare_ruleset" "zone_rl_custom_response" { zone_id = "" diff --git a/src/content/docs/terraform/additional-configurations/transform-rules.mdx b/src/content/docs/terraform/additional-configurations/transform-rules.mdx index 9f01101b5cd2ce..8b78537b90ac9c 100644 --- a/src/content/docs/terraform/additional-configurations/transform-rules.mdx +++ b/src/content/docs/terraform/additional-configurations/transform-rules.mdx @@ -33,6 +33,8 @@ For more information on Transform Rules, refer to [Transform Rules](/rules/trans The following example creates a Rewrite URL Rule that rewrites requests for `example.com/old-folder` to `example.com/new-folder`: + + ```tf resource "cloudflare_ruleset" "transform_url_rewrite" { zone_id = "" @@ -69,6 +71,8 @@ The following configuration example performs the following adjustments to HTTP r - Adds a `my-header-2` header to the request with a dynamic value defined by an expression. - Deletes the `existing-header` header from the request, if it exists. + + ```tf resource "cloudflare_ruleset" "transform_modify_request_headers" { zone_id = "" @@ -117,6 +121,8 @@ The following configuration example performs the following adjustments to HTTP r - Adds a `my-header-2` header to the response with a dynamic value defined by an expression. - Deletes the `existing-header` header from the response, if it exists. + + ```tf resource "cloudflare_ruleset" "transform_modify_response_headers" { zone_id = "" diff --git a/src/content/docs/terraform/additional-configurations/waf-custom-rules.mdx b/src/content/docs/terraform/additional-configurations/waf-custom-rules.mdx index eb753d4838127c..b1569df2a434ad 100644 --- a/src/content/docs/terraform/additional-configurations/waf-custom-rules.mdx +++ b/src/content/docs/terraform/additional-configurations/waf-custom-rules.mdx @@ -40,6 +40,8 @@ For more information on custom rules, refer to [Custom rules](/waf/custom-rules/ The following example configures a custom rule in the zone entry point ruleset for the `http_request_firewall_custom` phase for zone with ID ``. The rule will block all traffic on non-standard HTTP(S) ports: + + ```tf resource "cloudflare_ruleset" "zone_custom_firewall" { zone_id = "" @@ -67,6 +69,8 @@ For more information on enabling leaked credentials detection using Terraform, r This example adds a custom rule that challenges requests with leaked credentials by using one of the [leaked credentials fields](/waf/detections/leaked-credentials/#leaked-credentials-fields) in the rule expression. + + ```tf resource "cloudflare_ruleset" "zone_custom_firewall_leaked_creds" { zone_id = "" @@ -94,6 +98,8 @@ For more information on enabling malicious uploads detection using Terraform, re This example adds a custom rule that blocks requests with one or more content objects considered malicious by using one of the [content scanning fields](/waf/detections/malicious-uploads/#content-scanning-fields) in the rule expression. + + ```tf resource "cloudflare_ruleset" "zone_custom_firewall_malicious_uploads" { zone_id = "" @@ -125,6 +131,8 @@ You can only create and deploy custom rulesets at the account level. The following configuration creates the custom ruleset with a single rule: + + ```tf resource "cloudflare_ruleset" "account_firewall_custom_ruleset" { account_id = "" @@ -149,6 +157,8 @@ resource "cloudflare_ruleset" "account_firewall_custom_ruleset" { The following configuration deploys the custom ruleset at the account level. It defines a dependency on the `account_firewall_custom_ruleset` resource and uses the ID of the created custom ruleset in `action_parameters`: + + ```tf resource "cloudflare_ruleset" "account_firewall_custom_entrypoint" { account_id = "" @@ -181,6 +191,8 @@ The following configuration creates a custom ruleset with a single rule that [ch You can only add exposed credential checks to rules in a custom ruleset (that is, a ruleset with `kind = "custom"`). + + ```tf resource "cloudflare_ruleset" "account_firewall_custom_ruleset_exposed_creds" { account_id = "" @@ -213,6 +225,8 @@ resource "cloudflare_ruleset" "account_firewall_custom_ruleset_exposed_creds" { The following configuration deploys the custom ruleset. It defines a dependency on the `account_firewall_custom_ruleset_exposed_creds` resource and obtains the ID of the created custom ruleset: + + ```tf resource "cloudflare_ruleset" "account_firewall_custom_entrypoint" { account_id = "" diff --git a/src/content/docs/terraform/additional-configurations/waf-managed-rulesets.mdx b/src/content/docs/terraform/additional-configurations/waf-managed-rulesets.mdx index 338ff132e2aa3c..31e4aeb376e1e6 100644 --- a/src/content/docs/terraform/additional-configurations/waf-managed-rulesets.mdx +++ b/src/content/docs/terraform/additional-configurations/waf-managed-rulesets.mdx @@ -36,6 +36,8 @@ For more information on WAF Managed Rules, refer to [WAF Managed Rules](/waf/man The following example deploys two managed rulesets to the zone with ID `` using Terraform, using a `cloudflare_ruleset` resource with two rules that execute the managed rulesets. + + ```tf # Configure a ruleset at the zone level for the "http_request_firewall_managed" phase resource "cloudflare_ruleset" "zone_level_managed_waf" { @@ -80,6 +82,8 @@ resource "cloudflare_ruleset" "zone_level_managed_waf" { The following example deploys two managed rulesets to the account with ID `` using Terraform, using a `cloudflare_ruleset` resource with two rules that execute the managed rulesets for two hostnames belonging to Enterprise zones. + + ```tf resource "cloudflare_ruleset" "account_level_managed_waf" { account_id = "" @@ -123,6 +127,8 @@ The following example adds two [skip rules](/waf/managed-rules/waf-exceptions/) Add the two skip rules to the `cloudflare_ruleset` resource before the rule that deploys the Cloudflare Managed Ruleset: + + ```tf null {4-13,15-27} resource "cloudflare_ruleset" "zone_level_managed_waf" { # (...) @@ -184,6 +190,8 @@ The following example adds three [overrides](/ruleset-engine/managed-rulesets/ov The following configuration includes the three overrides in the rule that executes the Cloudflare Managed Ruleset: + + ```tf null {9-24} # (...) @@ -223,6 +231,8 @@ This example enables [payload logging](/waf/managed-rules/payload-logging/) for Building upon the rule that deploys the Cloudflare Managed Ruleset, the following rule configuration adds the `matched_data` object with the public key used to encrypt the payload: + + ```tf null {9-11} # (...) @@ -262,6 +272,8 @@ The following example rule of a `cloudflare_ruleset` Terraform resource performs - Sets the score threshold to `60` (_Low_). - Sets the ruleset action to `log`. + + ```tf null {8-25} # (...) diff --git a/src/content/docs/terraform/advanced-topics/import-cloudflare-resources.mdx b/src/content/docs/terraform/advanced-topics/import-cloudflare-resources.mdx index c6dd4a234daf49..f5e8f8c2473f58 100644 --- a/src/content/docs/terraform/advanced-topics/import-cloudflare-resources.mdx +++ b/src/content/docs/terraform/advanced-topics/import-cloudflare-resources.mdx @@ -3,6 +3,8 @@ pcx_content_type: tutorial title: Import Cloudflare resources --- +import { Render } from "~/components"; + An important point to understand about Terraform is that it can only manage configuration it created or was explicitly told about after the fact. The reason for this limitation is that Terraform expects to be authoritative for the resources it manages. It relies on two types of files to understand what resources it controls and what state they are in. Terraform determines when and how to make changes from the following: - A [configuration file](https://developer.hashicorp.com/terraform/language) (ending in `.tf`) that defines the configuration of resources for Terraform to manage. This is what you worked with in the tutorial steps. @@ -54,6 +56,8 @@ To start managing existing Cloudflare resources in Terraform, for example, DNS r If you do not have a Terraform configuration file defined, you need the `provider` block defined as follows: + + ```hcl provider 'cloudflare' { # Cloudflare email saved in $CLOUDFLARE_EMAIL @@ -71,6 +75,8 @@ cf-terraforming generate --email $CLOUDFLARE_EMAIL --token $CLOUDFLARE_API_TOKEN If you had not redirected the output to the `importing-example.tf` file, the result displayed in the standard output (your terminal window) would look like the following: + + ```tf resource "cloudflare_record" "terraform_managed_resource_3c0b456bc2aa443089c5f40f45f51b31" { name = "@" diff --git a/src/content/docs/terraform/advanced-topics/remote-backend.mdx b/src/content/docs/terraform/advanced-topics/remote-backend.mdx index cd5060cbf81376..3c8192b247c972 100644 --- a/src/content/docs/terraform/advanced-topics/remote-backend.mdx +++ b/src/content/docs/terraform/advanced-topics/remote-backend.mdx @@ -38,6 +38,8 @@ After your token has been successfully created, review your **Secret Access Key* Update your [`cloudflare.tf`](/terraform/tutorial/initialize-terraform/) file to include a [backend](https://developer.hashicorp.com/terraform/language/settings/backends/configuration) for the `` bucket you created above. + + ```tf terraform { backend "s3" { diff --git a/src/content/docs/terraform/tutorial/add-page-rules.mdx b/src/content/docs/terraform/tutorial/add-page-rules.mdx index a992f51965573f..d2090f042cdeb6 100644 --- a/src/content/docs/terraform/tutorial/add-page-rules.mdx +++ b/src/content/docs/terraform/tutorial/add-page-rules.mdx @@ -8,10 +8,14 @@ head: content: Add exceptions with Page Rules --- +import { Render } from "~/components"; + In the [Configure HTTPS settings](/terraform/tutorial/configure-https-settings/) tutorial, you configured zone settings that apply to all incoming requests for `example.com`. In this tutorial, you will add an exception to these settings using [Page Rules](/rules/page-rules/). Specifically, you will increase the security level for a URL known to be expensive to render and cannot be cached: `https://www.example.com/expensive-db-call`. Additionally, you will add a redirect from the previous URL used to host this page. + + ## 1. Create a new branch and append the page rule Create a new branch and append the configuration. diff --git a/src/content/docs/terraform/tutorial/configure-https-settings.mdx b/src/content/docs/terraform/tutorial/configure-https-settings.mdx index d141ad3ff90cd1..92449c6c6b077c 100644 --- a/src/content/docs/terraform/tutorial/configure-https-settings.mdx +++ b/src/content/docs/terraform/tutorial/configure-https-settings.mdx @@ -8,10 +8,14 @@ head: content: Configure HTTPS settings --- +import { Render } from "~/components"; + After proxying a basic website through Cloudflare, you can use Terraform to adjust zone settings. In this tutorial, you will configure some optional HTTPS settings and then push the updated configuration to GitHub for posterity. You will use a new Git branch for the changes and then merge it into the `master` branch before applying. On a team, you might consider using this step as an opportunity for others to review your change before merging and deploying it. You can also integrate Terraform into your CI/CD system to perform tests automatically using another Cloudflare domain. + + ## 1. Create a new branch and append the new zone settings In this step, modify the Terraform configuration to enable the following settings: diff --git a/src/content/docs/terraform/tutorial/initialize-terraform.mdx b/src/content/docs/terraform/tutorial/initialize-terraform.mdx index ed9ddcfa7ee781..160eab4f24954b 100644 --- a/src/content/docs/terraform/tutorial/initialize-terraform.mdx +++ b/src/content/docs/terraform/tutorial/initialize-terraform.mdx @@ -8,10 +8,14 @@ head: content: Introduction to Terraform init --- +import { Render } from "~/components"; + This tutorial shows you how to get started with Terraform. The tutorial uses an example scenario where you have a web server for your domain, accessible on `203.0.113.10`, and you just signed up your domain (`example.com`) on Cloudflare to manage everything in Terraform. Before you begin, ensure you have [installed Terraform](/terraform/installing/). You will also need to [create an API Token](/fundamentals/api/get-started/create-token/) with permissions to edit resources for this tutorial. + + ## 1. Define your first Terraform config file Create an initial Terraform config file, filling in your own values for the [API token](/fundamentals/api/get-started/create-token/), [zone ID](/fundamentals/setup/find-account-and-zone-ids/), [account ID](/fundamentals/setup/find-account-and-zone-ids/), and [domain](/fundamentals/setup/manage-domains/add-site/). diff --git a/src/content/docs/terraform/tutorial/revert-configuration.mdx b/src/content/docs/terraform/tutorial/revert-configuration.mdx index 51dbc05d0b8257..ca747a9a46a9d6 100644 --- a/src/content/docs/terraform/tutorial/revert-configuration.mdx +++ b/src/content/docs/terraform/tutorial/revert-configuration.mdx @@ -8,10 +8,14 @@ head: content: Revert configuration --- +import { Render } from "~/components"; + Sometimes, you may have to roll back configuration changes. For example, you might want to run performance tests on a new configuration or maybe you mistyped an IP address and brought your entire site down. To revert your configuration, check out the desired branch and ask Terraform to move your Cloudflare settings back in time. If you accidentally brought your site down, consider establishing a good strategy for peer reviewing pull requests rather than merging directly to `master` as done in the tutorials for brevity. + + ## 1. Review your configuration history Before determining how far back to revert, review the versioned history: diff --git a/src/content/docs/terraform/tutorial/track-history.mdx b/src/content/docs/terraform/tutorial/track-history.mdx index ef257be9f01225..953ffa4bdea50a 100644 --- a/src/content/docs/terraform/tutorial/track-history.mdx +++ b/src/content/docs/terraform/tutorial/track-history.mdx @@ -8,6 +8,8 @@ head: content: Track your history --- +import { Render } from "~/components"; + In the [Initialize Terraform](/terraform/tutorial/initialize-terraform/) tutorial, you created and applied some basic Cloudflare configuration. Terraform applied this configuration to your zone because you provided your API token at the top of the `cloudflare.tf` file that has access to this zone. ```sh @@ -19,6 +21,8 @@ provider "cloudflare" { In this tutorial, you will store your configuration in GitHub where it can be tracked, peer-reviewed, and rolled back to as needed. First, you will remove your credentials from the Terraform config file to prevent committing them to a repository. +: + ## 1. Use environment variables for authentication As a good security practice, remove your Cloudflare credentials from anything that will be committed to a repository. The Cloudflare Terraform provider supports reading the credentials (and other configuration) [from environment variables](https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs#schema), as in the following example: diff --git a/src/content/docs/terraform/tutorial/use-load-balancing.mdx b/src/content/docs/terraform/tutorial/use-load-balancing.mdx index 112531a8d823a2..8dca7c59338054 100644 --- a/src/content/docs/terraform/tutorial/use-load-balancing.mdx +++ b/src/content/docs/terraform/tutorial/use-load-balancing.mdx @@ -8,8 +8,12 @@ head: content: Improve performance and reliability --- +import { Render } from "~/components"; + In this tutorial, you will add a second origin for some basic round robining, and then use the [Cloudflare Load Balancing](/load-balancing/) product to fail traffic over as needed. You will also enhance your load balancing configuration through the use of "geo steering" to serve results from an origin server that is geographically closest to your end users. + + ## 1. Add another DNS record for `www` To get started, add a DNS record for a second web server, located in Asia. The IP address for this server is `198.51.100.15`. diff --git a/src/content/docs/turnstile/concepts/hostname-management.mdx b/src/content/docs/turnstile/concepts/hostname-management.mdx index afa6ac418dab30..c7318589998bb3 100644 --- a/src/content/docs/turnstile/concepts/hostname-management.mdx +++ b/src/content/docs/turnstile/concepts/hostname-management.mdx @@ -6,31 +6,61 @@ sidebar: --- +You can associate hostnames with your widget to control where it can be used using Hostname Management. Managing your hostnames ensures that Turnstile works seamlessly with your setup, whether you add standalone hostnames or leverage zones registered to your Cloudflare account. + +## Hostname limits + By default, all widgets can have up to 10 hostnames associated with a widget. A widget requires at least one hostname to be entered. Only Enterprise Bot Management and Enterprise Turnstile customers can have this limit increased. Contact your account team to increase your hostname limit. -You must specify a list of hostnames when creating a widget. The widget can only be used on these hostnames and will not work on any other hostnames. You can use subdomains to restrict the widgets further. +## Add a custom hostname + +You can add a hostname to your Turnstile widget even if it is not on the Cloudflare network or registered as a zone. There are no prerequisites for using Turnstile. + +To add a custom hostname: + +1. Log in to the [Cloudflare dashboard](https://dash.cloudflare.com/) and select your account. +2. Go to **Turnstile**. +3. On an existing widget, select **Settings**. +4. Select **Add Hostnames** under Hostname Management. +5. Add a custom hostname or choose from an existing hostname. +6. Select **Add**. + +## Add hostnames with a registered zone + +If you already have a zone registered with Cloudflare, you can add hostnames during the Turnstile widget setup. You will see all zones registered to your account, where you can select the relevant hostname from the list, and it will be added to your Turnstile widget seamlessly. + +## Hostname requirements + +When associating hostnames with a widget, follow these requirements: -The hostname should not contain a scheme `http://` or `https://`, a port `443`, or a path `/`. +- Hostnames must be fully qualified domain names (FQDNs), such as `example.com` or `subdomain.example.com`. +- Wildcards are not supported. Specify each hostname you want Turnstile to work on. +- The hostname should not include: + - A scheme (for example, `http://` or `https://`) + - A port (for example, `443`) + - A path (for example, `/path`) -Specifying a subdomain is optional. +### Subdomain specification -For example, using the `www.example.com` value will allow widgets on the following hostnames: +Specifying a subdomain is optional, but it can be used to further restrict the widget. For example, adding `www.example.com` as a hostname will allow widgets to work on: - `www.example.com` - `abc.www.example.com:8080` -but not on the following hostnames: +However, it will not work on the following hostnames: - `example.com` - `dash.example.com` - `cloudflare.com` -When the widget is embedded on a hostname not listed, it will show an error message. +:::note +If the widget is embedded on a hostname not listed, it will display an error message. +::: -## Optional hostname validation +## Optional hostname validation (Enterprise only) -Customers with Enterprise Bot Management or Enterprise Turnstile can have the optional `any hostname` validation entitlement. +Customers with Enterprise Bot Management or Enterprise Turnstile can have the optional any hostname validation entitlement. -By default, a widget requires at least one hostname to be entered. With this entitlement, you can create and use a widget without entering any hostnames for the widget. Contact your account team to enable this entitlement. +By default, a widget requires at least one hostname to be entered. With this entitlement, you can create and use a widget without entering any hostnames for the widget. Contact your account team to enable this entitlement. \ No newline at end of file diff --git a/src/content/docs/turnstile/concepts/pre-clearance-support.mdx b/src/content/docs/turnstile/concepts/pre-clearance-support.mdx index 69508684661b80..a6844003101f2a 100644 --- a/src/content/docs/turnstile/concepts/pre-clearance-support.mdx +++ b/src/content/docs/turnstile/concepts/pre-clearance-support.mdx @@ -6,46 +6,36 @@ sidebar: --- -You can integrate Cloudflare challenges on single-page applications (SPAs) by allowing Turnstile to issue a clearance cookie. The clearance level is set upon widget creation or widget modification using the Turnstile API's `clearance_level`. Possible values for the configuration are `no_clearance`, `jschallenge`, `managed`, or `interactive`. All widgets are set to `no_clearance` by default. +Pre-clearance in Turnstile allows websites to streamline user experiences by using clearance cookies. These cookies enable visitors to bypass WAF challenges downstream, based on the security clearance level set by the customer. This can be particularly useful for trusted visitors, enhancing usability while maintaining security. -For Enterprise customers eligible to toggle off domain checks, Cloudflare recommends issuing clearance cookies on widgets where at least one domain is specified. +You can integrate Cloudflare challenges by allowing Turnstile to issue a pre-clearance cookie. The pre-clearance level is set upon widget creation or widget modification using the Turnstile API's `clearance_level`. Possible values for the configuration are: + +- `no_clearance` +- `jschallenge` +- `managed` +- `interactive` + +All widgets are set to `no_clearance` by default. + +For Enterprise customers eligible to toggle off domain checks, Cloudflare recommends issuing pre-clearance cookies on widgets where at least one domain is specified. :::note Clearance cookies only support zones that are orange-clouded. ::: -Refer to the [blog post](https://blog.cloudflare.com/integrating-turnstile-with-the-cloudflare-waf-to-challenge-fetch-requests) for an example of pre-clearance implementation. +Refer to the [blog post](https://blog.cloudflare.com/integrating-turnstile-with-the-cloudflare-waf-to-challenge-fetch-requests) for more details on how pre-clearance works with WAF. ## Pre-clearance level options -- **Interactive**: Interactive Pre-clearance allows a user with a clearance cookie to not be challenged by Interactive, Managed Challenge, or JavaScript Challenge Firewall Rules -- **Managed**: Managed allows a user with a clearance cookie to not be challenged by Managed Challenge or JavaScript Challenge Firewall Rules -- **Non-interactive**: Non-interactive allows a user with a clearance cookie to not be challenged by JavaScript Challenge Firewall Rules +- **Interactive (High)**: Allows a user with a clearance cookie to not be challenged by Interactive, Managed Challenge, or JavaScript Challenge Firewall Rules +- **Managed (Medium)**: Allows a user with a clearance cookie to not be challenged by Managed Challenge or JavaScript Challenge Firewall Rules +- **Non-interactive (Low)**: Allows a user with a clearance cookie to not be challenged by JavaScript Challenge Firewall Rules -### Duration +## Clearance cookie duration Clearance cookies generated by the Turnstile widget will be valid for the time specified by the zone-level Challenge Passage value. To configure the Challenge Passage setting, refer to the [WAF documentation](/waf/tools/challenge-passage/). -## Enable pre-clearance on a new site - -1. Log in to the [Cloudflare dashboard](https://dash.cloudflare.com/login) and select your account. -2. Go to **Turnstile** > **Add widget**. -3. Under **Would you like to opt for pre-clearance for this site?** select **Yes**. -4. Choose the pre-clearance level from the select box. -5. Select **Create**. - -## Enable pre-clearance on an existing site - -1. Log in to the [Cloudflare dashboard](https://dash.cloudflare.com/login) and select your account. -2. Go to **Turnstile**. -3. Go to the existing widget or site and select **Settings**. -4. Under **Would you like to opt for pre-clearance for this site?** select **Yes**. -5. Choose the pre-clearance level from the select box. -6. Select **Update**. - -## Verified bots - -If a [verified bot](/bots/concepts/bot/#verified-bots) encounters a page where a Turnstile widget is implemented, the challenge will fail and the verified bot will see a `403` error from the Turnstile endpoint. +## Setup -However, if a verified bot is excluded from the rule which pre-clearance will grant clearance for, it will pass. Users can create a [WAF custom rule](/waf/custom-rules/) to exclude verified bots. +To set up pre-clearance cookies, refer to [Enable pre-clearance cookies](/turnstile/get-started/pre-clearance/). \ No newline at end of file diff --git a/src/content/docs/turnstile/get-started/index.mdx b/src/content/docs/turnstile/get-started/index.mdx index ca1c99c1c83e3a..5f8aecec8e8f37 100644 --- a/src/content/docs/turnstile/get-started/index.mdx +++ b/src/content/docs/turnstile/get-started/index.mdx @@ -31,7 +31,7 @@ You can find special sitekeys to be used for testing in the [testing](/turnstile 1. Log in to the [Cloudflare dashboard](https://dash.cloudflare.com/?to=/:account/turnstile) and select your account. 2. Go to **Turnstile**. -3. Select **Add widget** and fill out the site name and your website's hostname or select from your existing websites on Cloudflare. +3. Select **Add widget** and fill out the site name and [your website's hostname or select from your existing websites](/turnstile/concepts/hostname-management/) on Cloudflare. 4. Select the widget mode. 5. (Optional) Opt in for [pre-clearance support](/turnstile/concepts/pre-clearance-support/). 6. Copy your sitekey and secret key. @@ -41,8 +41,9 @@ You can find special sitekeys to be used for testing in the [testing](/turnstile 1. Log in to the [Cloudflare dashboard](https://dash.cloudflare.com/?to=/:account/turnstile) and select your account. 2. Go to **Turnstile**. 3. In the widget overview, select **Settings**. -4. (Optional) Opt in for [pre-clearance support](/turnstile/concepts/pre-clearance-support/). -5. Copy your sitekey and secret key. +4. Confirm the [hostnames](/turnstile/concepts/hostname-management/) configured. +5. (Optional) Opt in for [pre-clearance support](/turnstile/concepts/pre-clearance-support/). +6. Copy your sitekey and secret key. ## Add the Turnstile widget to your site diff --git a/src/content/docs/turnstile/get-started/mobile-implementation.mdx b/src/content/docs/turnstile/get-started/mobile-implementation.mdx index 490754c87e9b70..99196efb9d7478 100644 --- a/src/content/docs/turnstile/get-started/mobile-implementation.mdx +++ b/src/content/docs/turnstile/get-started/mobile-implementation.mdx @@ -2,7 +2,7 @@ title: Mobile implementation pcx_content_type: concept sidebar: - order: 5 + order: 6 --- diff --git a/src/content/docs/turnstile/get-started/pre-clearance.mdx b/src/content/docs/turnstile/get-started/pre-clearance.mdx new file mode 100644 index 00000000000000..ebf3327b32d54d --- /dev/null +++ b/src/content/docs/turnstile/get-started/pre-clearance.mdx @@ -0,0 +1,37 @@ +--- +title: Enable pre-clearance cookies +pcx_content_type: get-started +sidebar: + order: 3 + label: Pre-clearance cookies + +--- + +import { Render } from "~/components" + +## Prerequisites + +To enable pre-clearance, you must ensure that the hostname of the Turnstile widget matches the zone with the WAF rules. During the Turnstile configuration setup in the Cloudflare dashboard, you can see the registered zones. Select the appropriate hostname from this list. + +The prerequisite is crucial for pre-clearance to function properly. If set up correctly, visitors who successfully solve Turnstile will receive a cookie with the security clearance level set by the customer. When encountering a WAF challenge on the same zone, they will bypass additional challenges for the configured clearance level and below. + +For more details on managing hostnames, refer to the [Hostname Management documentation](/turnstile/concepts/hostname-management/). + + + +## Enable pre-clearance on a new site + +1. Log in to the [Cloudflare dashboard](https://dash.cloudflare.com/login) and select your account. +2. Go to **Turnstile** > **Add widget**. +3. Under **Would you like to opt for pre-clearance for this site?** select **Yes**. +4. Choose the pre-clearance level from the select box. +5. Select **Create**. + +## Enable pre-clearance on an existing site + +1. Log in to the [Cloudflare dashboard](https://dash.cloudflare.com/login) and select your account. +2. Go to **Turnstile**. +3. Go to the existing widget or site and select **Settings**. +4. Under **Would you like to opt for pre-clearance for this site?** select **Yes**. +5. Choose the pre-clearance level from the select box. +6. Select **Update**. \ No newline at end of file diff --git a/src/content/docs/turnstile/get-started/supported-browsers.mdx b/src/content/docs/turnstile/get-started/supported-browsers.mdx index 9c76e244028f7b..ab5003e17935d1 100644 --- a/src/content/docs/turnstile/get-started/supported-browsers.mdx +++ b/src/content/docs/turnstile/get-started/supported-browsers.mdx @@ -3,6 +3,6 @@ pcx_content_type: concept title: Supported browsers external_link: /waf/reference/cloudflare-challenges/#browser-support sidebar: - order: 4 + order: 5 --- diff --git a/src/content/docs/turnstile/get-started/terraform.mdx b/src/content/docs/turnstile/get-started/terraform.mdx index 8562bdf165ee0e..a0077458d31a99 100644 --- a/src/content/docs/turnstile/get-started/terraform.mdx +++ b/src/content/docs/turnstile/get-started/terraform.mdx @@ -2,7 +2,7 @@ pcx_content_type: how-to title: Terraform sidebar: - order: 3 + order: 4 --- :::note[Requirements] diff --git a/src/content/docs/turnstile/troubleshooting/challenge-solve-issues.mdx b/src/content/docs/turnstile/troubleshooting/challenge-solve-issues.mdx index 1f8cc724ffbd1c..1329ee39f76b2d 100644 --- a/src/content/docs/turnstile/troubleshooting/challenge-solve-issues.mdx +++ b/src/content/docs/turnstile/troubleshooting/challenge-solve-issues.mdx @@ -10,7 +10,7 @@ import { Render } from "~/components" ## Challenge loops -You may encounter a challenge loop where the challenge keeps reappearing without being solved. This can happen for several reasons: +You may encounter a challenge loop where the challenge keeps reappearing without being solved. This is in very specific cases where we detect strong bot signals. If you are a legitimate human, you can follow the troubleshooting guide below to resolve the issue or submit a feedback report. Challenge loops can happen for several reasons: - **Network issues**: Poor or unstable network connections can prevent the challenge from being completed. - **Browser configuration**: Some browser settings or extensions may block the scripts needed to execute the challenge. diff --git a/src/content/docs/turnstile/tutorials/excluding-turnstile-from-e2e-tests.mdx b/src/content/docs/turnstile/tutorials/excluding-turnstile-from-e2e-tests.mdx new file mode 100644 index 00000000000000..fb8074098d0ba6 --- /dev/null +++ b/src/content/docs/turnstile/tutorials/excluding-turnstile-from-e2e-tests.mdx @@ -0,0 +1,128 @@ +--- +title: Exclude Turnstile from E2E tests +pcx_content_type: tutorial +updated: 2025-01-24 +difficulty: Intermediate +content_type: 📝 Tutorial +languages: + - TypeScript +tags: + - Node.js +sidebar: + order: 6 +--- + +This tutorial explains how to handle Turnstile in your end-to-end (E2E) tests by using Turnstile's dedicated testing keys. + +## Overview + +When running E2E tests, you often want to bypass or simplify the Turnstile verification process. Cloudflare provides official test credentials that always pass verification, making them perfect for testing environments: + +- Test sitekey: `1x00000000000000000000AA` +- Test secret key: `1x0000000000000000000000000000000AA` + +For more details, refer to the [testing documentation](/turnstile/troubleshooting/testing/). + +:::caution + +Never use test credentials in production. Always ensure: +- Test credentials are only used in test environments. +- Production credentials are properly protected. +- Your deployment process prevents test credentials from reaching production. +::: + +## Implementation + +The key to implementing test-environment detection is identifying test requests server-side. Here is a simple approach: + +```typescript +// Detect test environments using IP addresses or headers +function isTestEnvironment(request) { + const testIPs = ['127.0.0.1', '::1']; + const isTestIP = testIPs.includes(request.ip); + const hasTestHeader = request.headers['x-test-environment'] === 'secret-token'; + + return isTestIP || hasTestHeader; +} + +// Use the appropriate credentials based on the environment +function getTurnstileCredentials(request) { + if (isTestEnvironment(request)) { + return { + sitekey: '1x00000000000000000000AA', + secretKey: '1x0000000000000000000000000000000AA' + }; + } + + return { + sitekey: process.env.TURNSTILE_SITE_KEY, + secretKey: process.env.TURNSTILE_SECRET_KEY + }; +} +``` + +## Server-side integration + +When rendering your page, inject the appropriate sitekey based on the environment: + +```typescript +app.get('/your-form', (req, res) => { + const { sitekey } = getTurnstileCredentials(req); + res.render('form', { sitekey }); +}); +``` + +## Client-side integration + +Your template can then use the injected sitekey: + +```html +
+``` + +## Best practices + +1. **Environment detection** + - Use multiple factors to identify test environments (IP, headers, etc.). + - Keep your test environment identifiers secure if you need to test from the public web. + +2. **Credential management** + - Store production credentials securely (for example, in environment variables). + - Never commit credentials to version control. + - Use different credentials for each environment. + +3. **Deployment safety** + - Add checks to prevent test credentials in production. + - Include credential validation in your CI/CD pipeline. + - Monitor for accidental test credential usage. + +## Testing considerations + +- Test credentials will always pass verification. +- They are perfect for automated testing environments. +- They help avoid rate limiting during testing. +- They make tests more predictable and faster. + +## Example test setup + +For Cypress or similar E2E testing frameworks: + +```typescript +// Set test header for all test requests +beforeEach(() => { + cy.intercept('*', (req) => { + req.headers['x-test-environment'] = 'secret-token'; + }); +}); + +// Your test can now interact with the form normally +it('submits form successfully', () => { + cy.visit('/your-form'); + cy.get('form').submit(); + // Turnstile will automatically pass verification +}); +``` + +## Conclusion + +By using Turnstile's test credentials and proper environment detection, you can create reliable E2E tests while maintaining security in production. Remember to always keep test credentials separate from production and implement proper safeguards in your deployment process. diff --git a/src/content/docs/turnstile/tutorials/protecting-your-payment-form-from-attackers-bots-using-turnstile.mdx b/src/content/docs/turnstile/tutorials/protecting-your-payment-form-from-attackers-bots-using-turnstile.mdx index 369559c59c722e..d7e6cefe837216 100644 --- a/src/content/docs/turnstile/tutorials/protecting-your-payment-form-from-attackers-bots-using-turnstile.mdx +++ b/src/content/docs/turnstile/tutorials/protecting-your-payment-form-from-attackers-bots-using-turnstile.mdx @@ -22,7 +22,7 @@ sidebar: order: 2 --- -import { Render, TabItem, Tabs } from "~/components"; +import { Render, TabItem, Tabs, PackageManagers } from "~/components"; This tutorial shows how you can build a more secure payment form using Turnstile. You can learn how to block bot access on the checkout page and trigger additional authentication flows by integrating Turnstile with Stripe. @@ -49,25 +49,11 @@ To efficiently create and manage multiple APIs, let's use [`Hono`](https://hono. Open your command line interface (CLI) and run the following command: - - -```sh -npm create cloudflare@latest secure-payment-form -- --framework hono -``` - - - -```sh -yarn create cloudflare@latest secure-payment-form -- --framework hono -``` - - - -```sh -pnpm create cloudflare@latest secure-payment-form -- --framework hono -``` - - + If this is your first time running the `C3` command, you will be asked whether you want to install it. Confirm that the package name for installation is `create-cloudflare` and answer `y`. @@ -164,7 +150,7 @@ Since we will use JSX to dynamically create HTML, you will need to change `src/i mv src/index.ts src/index.tsx ``` -At the same time, change the filename specified in the `wrangler.toml`. +At the same time, change the filename specified in the `wrangler.toml / wrangler.json` file. ```diff #:schema node_modules/wrangler/config-schema.json diff --git a/src/content/docs/vectorize/examples/agents.mdx b/src/content/docs/vectorize/examples/agents.mdx new file mode 100644 index 00000000000000..2ba4fdef824cfc --- /dev/null +++ b/src/content/docs/vectorize/examples/agents.mdx @@ -0,0 +1,9 @@ +--- +pcx_content_type: navigation +title: Agents +external_link: /agents/ +sidebar: + order: 10 +head: [] +description: Build AI-powered Agents on Cloudflare +--- \ No newline at end of file diff --git a/src/content/docs/vectorize/get-started/embeddings.mdx b/src/content/docs/vectorize/get-started/embeddings.mdx index 97206d50964240..9a74850a867fde 100644 --- a/src/content/docs/vectorize/get-started/embeddings.mdx +++ b/src/content/docs/vectorize/get-started/embeddings.mdx @@ -5,7 +5,7 @@ sidebar: order: 3 --- -import { Render, PackageManagers } from "~/components"; +import { Render, PackageManagers, WranglerConfig } from "~/components"; @@ -57,7 +57,7 @@ Open your terminal and create a new project named `embeddings-tutorial` by runni This will create a new `embeddings-tutorial` directory. Your new `embeddings-tutorial` directory will include: - A `"Hello World"` [Worker](/workers/get-started/guide/#3-write-code) at `src/index.ts`. -- A [`wrangler.toml`](/workers/wrangler/configuration/) configuration file. `wrangler.toml` is how your `embeddings-tutorial` Worker will access your index. +- A [`wrangler.json`](/workers/wrangler/configuration/) configuration file. `wrangler.json` is how your `embeddings-tutorial` Worker will access your index. :::note @@ -107,11 +107,9 @@ This will create a new vector database, and output the [binding](/workers/runtim ## 3. Bind your Worker to your index -You must create a binding for your Worker to connect to your Vectorize index. [Bindings](/workers/runtime-apis/bindings/) allow your Workers to access resources, like Vectorize or R2, from Cloudflare Workers. You create bindings by updating your `wrangler.toml` file. +You must create a binding for your Worker to connect to your Vectorize index. [Bindings](/workers/runtime-apis/bindings/) allow your Workers to access resources, like Vectorize or R2, from Cloudflare Workers. You create bindings by updating your Wrangler file. -To bind your index to your Worker, add the following to the end of your `wrangler.toml` file: - -import { WranglerConfig } from "~/components"; +To bind your index to your Worker, add the following to the end of your Wrangler file: @@ -133,7 +131,7 @@ Specifically: Before you deploy your embedding example, ensure your Worker uses your model catalog, including the [text embedding model](/workers-ai/models/#text-embeddings) built-in. -From within the `embeddings-tutorial` directory, open your `wrangler.toml` file in your editor and add the new `[[ai]]` binding to make Workers AI's models available in your Worker: +From within the `embeddings-tutorial` directory, open your Wrangler file in your editor and add the new `[[ai]]` binding to make Workers AI's models available in your Worker: diff --git a/src/content/docs/vectorize/get-started/intro.mdx b/src/content/docs/vectorize/get-started/intro.mdx index 9bd0c1402a096e..882753ab081b4a 100644 --- a/src/content/docs/vectorize/get-started/intro.mdx +++ b/src/content/docs/vectorize/get-started/intro.mdx @@ -5,7 +5,7 @@ sidebar: order: 2 --- -import { Render, PackageManagers } from "~/components"; +import { Render, PackageManagers, WranglerConfig } from "~/components"; @@ -62,7 +62,7 @@ Create a new project named `vectorize-tutorial` by running: This will create a new `vectorize-tutorial` directory. Your new `vectorize-tutorial` directory will include: - A `"Hello World"` [Worker](/workers/get-started/guide/#3-write-code) at `src/index.ts`. -- A [`wrangler.toml`](/workers/wrangler/configuration/) configuration file. `wrangler.toml` is how your `vectorize-tutorial` Worker will access your index. +- A [`wrangler.json`](/workers/wrangler/configuration/) configuration file. `wrangler.json` is how your `vectorize-tutorial` Worker will access your index. :::note @@ -114,11 +114,9 @@ The command above will create a new vector database, and output the [binding](/w ## 3. Bind your Worker to your index -You must create a binding for your Worker to connect to your Vectorize index. [Bindings](/workers/runtime-apis/bindings/) allow your Workers to access resources, like Vectorize or R2, from Cloudflare Workers. You create bindings by updating the worker's `wrangler.toml` file. +You must create a binding for your Worker to connect to your Vectorize index. [Bindings](/workers/runtime-apis/bindings/) allow your Workers to access resources, like Vectorize or R2, from Cloudflare Workers. You create bindings by updating the worker's Wrangler file. -To bind your index to your Worker, add the following to the end of your `wrangler.toml` file: - -import { WranglerConfig } from "~/components"; +To bind your index to your Worker, add the following to the end of your Wrangler file: @@ -274,7 +272,7 @@ export default { In the code above, you: -1. Define a binding to your Vectorize index from your Workers code. This binding matches the `binding` value you set in `wrangler.toml` under `[[vectorize]]`. +1. Define a binding to your Vectorize index from your Workers code. This binding matches the `binding` value you set in the `wrangler.toml / wrangler.json` file under `[[vectorize]]`. 2. Specify a set of example vectors that you will query against in the next step. 3. Insert those vectors into the index and confirm it was successful. diff --git a/src/content/docs/vectorize/reference/client-api.mdx b/src/content/docs/vectorize/reference/client-api.mdx index 81a8e8916fdde8..c0b20e5b4eba2c 100644 --- a/src/content/docs/vectorize/reference/client-api.mdx +++ b/src/content/docs/vectorize/reference/client-api.mdx @@ -5,7 +5,7 @@ sidebar: order: 2 --- -import { Render } from "~/components"; +import { Render, WranglerConfig } from "~/components"; This page covers the Vectorize API available within [Cloudflare Workers](/workers/), including usage examples. @@ -200,12 +200,10 @@ let vectorExample = { [Bindings](/workers/runtime-apis/bindings/) allow you to attach resources, including Vectorize indexes or R2 buckets, to your Worker. -Bindings are defined in either the [`wrangler.toml`](/workers/wrangler/configuration/) configuration associated with your Workers project, or via the Cloudflare dashboard for your project. +Bindings are defined in either the [`wrangler.toml / wrangler.json` file](/workers/wrangler/configuration/) associated with your Workers project, or via the Cloudflare dashboard for your project. Vectorize indexes are bound by name. A binding for an index named `production-doc-search` would resemble the below: -import { WranglerConfig } from "~/components"; - ```toml diff --git a/src/content/docs/waf/analytics/security-analytics.mdx b/src/content/docs/waf/analytics/security-analytics.mdx index 40317832e71023..06c0018c14bf1c 100644 --- a/src/content/docs/waf/analytics/security-analytics.mdx +++ b/src/content/docs/waf/analytics/security-analytics.mdx @@ -12,7 +12,7 @@ Security Analytics displays information about all incoming HTTP requests for you Use the Security Analytics dashboard to: - View the traffic distribution for your domain. -- Understand which traffic is being mitigated by Cloudflare security products, and where non-mitigated traffic is being served from (Cloudflare global network or origin server). +- Understand which traffic is being mitigated by Cloudflare security products, and where non-mitigated traffic is being served from (Cloudflare global network or [origin server](https://www.cloudflare.com/learning/cdn/glossary/origin-server/)). - Analyze suspicious traffic and create tailored WAF custom rules based on applied filters. - Learn more about Cloudflare's security scores (attack score, [bot score](/bots/concepts/bot-score/), [malicious uploads](/waf/detections/malicious-uploads/), and [leaked credentials](/waf/detections/leaked-credentials/) results) with real data. - [Find an appropriate rate limit](/waf/rate-limiting-rules/find-rate-limit/) for incoming traffic. diff --git a/src/content/docs/waf/custom-rules/use-cases/allow-traffic-from-verified-bots.mdx b/src/content/docs/waf/custom-rules/use-cases/allow-traffic-from-verified-bots.mdx index 1af3b3320fb6c9..bedb069cc927f2 100644 --- a/src/content/docs/waf/custom-rules/use-cases/allow-traffic-from-verified-bots.mdx +++ b/src/content/docs/waf/custom-rules/use-cases/allow-traffic-from-verified-bots.mdx @@ -17,5 +17,5 @@ The rule expression uses the [`cf.client.bot`](/ruleset-engine/rules-language/fi - [Use case: Challenge bad bots](/waf/custom-rules/use-cases/challenge-bad-bots/) - [Cloudflare bot solutions](/bots/) -- [Troubleshooting: Bing’s Site Scan blocked by a WAF managed rule](/waf/troubleshooting/blocked-bing-site-scans/) +- [Troubleshooting: Bing's Site Scan blocked by a WAF managed rule](/waf/troubleshooting/blocked-bing-site-scans/) - [Learning Center: What is a web crawler?](https://www.cloudflare.com/learning/bots/what-is-a-web-crawler/) diff --git a/src/content/docs/waf/custom-rules/use-cases/challenge-bad-bots.mdx b/src/content/docs/waf/custom-rules/use-cases/challenge-bad-bots.mdx index 46b102962745a6..d547d4436a61bb 100644 --- a/src/content/docs/waf/custom-rules/use-cases/challenge-bad-bots.mdx +++ b/src/content/docs/waf/custom-rules/use-cases/challenge-bad-bots.mdx @@ -57,7 +57,7 @@ When a request is definitely automated (score of 1) or likely automated (scores #### Exempt API traffic -Since Bot Management detects automated users, you need to explicitly allow your **good** automated traffic⁠ — this includes your APIs and partner APIs. +Since Bot Management detects automated users, you need to explicitly allow your **good** automated traffic⁠ — this includes your [APIs](https://www.cloudflare.com/learning/security/api/what-is-an-api/) and partner APIs. This example offers the same protection as the browser-only rule, but allows automated traffic to your API. diff --git a/src/content/docs/waf/detections/attack-score.mdx b/src/content/docs/waf/detections/attack-score.mdx index b6fdb0e8dd2045..7cc7e847b1be5a 100644 --- a/src/content/docs/waf/detections/attack-score.mdx +++ b/src/content/docs/waf/detections/attack-score.mdx @@ -24,13 +24,17 @@ This feature is available to Enterprise customers. Business plans have access to The Cloudflare WAF provides the following attack score fields: -| Score | Data type | Minimum plan required | Attack vector | Field | -| ---------------------- | --------- | --------------------- | --------------------------- | --------------------------------------------------------------------------------------------- | -| WAF Attack Score | Number | Enterprise | N/A (global score) | [`cf.waf.score`](/ruleset-engine/rules-language/fields/reference/cf.waf.score/) | -| WAF SQLi Attack Score | Number | Enterprise | SQL injection (SQLi) | [`cf.waf.score.sqli`](/ruleset-engine/rules-language/fields/reference/cf.waf.score.sqli/) | -| WAF XSS Attack Score | Number | Enterprise | Cross-site scripting (XSS) | [`cf.waf.score.xss`](/ruleset-engine/rules-language/fields/reference/cf.waf.score.xss/) | -| WAF RCE Attack Score | Number | Enterprise | Remote Code Execution (RCE) | [`cf.waf.score.rce`](/ruleset-engine/rules-language/fields/reference/cf.waf.score.rce/) | -| WAF Attack Score Class | String | Business | N/A (global classification) | [`cf.waf.score.class`](/ruleset-engine/rules-language/fields/reference/cf.waf.score.class/) | +| Score | Data type | Minimum plan required | Attack vector | Field | +| ---------------------- | --------- | --------------------- | -------------------------------- | ------------------------------------------------------------------------------------------- | +| WAF Attack Score | Number | Enterprise | N/A (global score) | [`cf.waf.score`](/ruleset-engine/rules-language/fields/reference/cf.waf.score/) | +| WAF SQLi Attack Score | Number | Enterprise | [SQL injection][1] (SQLi) | [`cf.waf.score.sqli`](/ruleset-engine/rules-language/fields/reference/cf.waf.score.sqli/) | +| WAF XSS Attack Score | Number | Enterprise | [Cross-site scripting][2] (XSS) | [`cf.waf.score.xss`](/ruleset-engine/rules-language/fields/reference/cf.waf.score.xss/) | +| WAF RCE Attack Score | Number | Enterprise | [Remote code execution][3] (RCE) | [`cf.waf.score.rce`](/ruleset-engine/rules-language/fields/reference/cf.waf.score.rce/) | +| WAF Attack Score Class | String | Business | N/A (global classification) | [`cf.waf.score.class`](/ruleset-engine/rules-language/fields/reference/cf.waf.score.class/) | + +[1]: https://www.cloudflare.com/learning/security/threats/sql-injection/ +[2]: https://www.cloudflare.com/learning/security/threats/cross-site-scripting/ +[3]: https://www.cloudflare.com/learning/security/what-is-remote-code-execution/ You can use these fields in expressions of [custom rules](/waf/custom-rules/) and [rate limiting rules](/waf/rate-limiting-rules/). Attack score fields of data type `Number` vary between `1` and `99` with the following meaning: diff --git a/src/content/docs/waf/detections/leaked-credentials/get-started.mdx b/src/content/docs/waf/detections/leaked-credentials/get-started.mdx index e7c8d9927745f9..f30c3dd57aee7b 100644 --- a/src/content/docs/waf/detections/leaked-credentials/get-started.mdx +++ b/src/content/docs/waf/detections/leaked-credentials/get-started.mdx @@ -76,7 +76,7 @@ For additional examples, refer to [Mitigation examples](/waf/detections/leaked-c ### Handle detected leaked credentials at the origin server -Additionally, you may want to handle leaked credentials detected by Cloudflare at your origin server. +Additionally, you may want to handle leaked credentials detected by Cloudflare at your [origin server](https://www.cloudflare.com/learning/cdn/glossary/origin-server/). 1. Turn on the [**Add Leaked Credentials Checks Header** managed transform](/rules/transform/managed-transforms/reference/#add-leaked-credentials-checks-header). diff --git a/src/content/docs/waf/detections/leaked-credentials/index.mdx b/src/content/docs/waf/detections/leaked-credentials/index.mdx index d948e30330d824..db34cd3e2fbbbb 100644 --- a/src/content/docs/waf/detections/leaked-credentials/index.mdx +++ b/src/content/docs/waf/detections/leaked-credentials/index.mdx @@ -7,7 +7,7 @@ sidebar: label: Leaked credentials --- -The leaked credentials [traffic detection](/waf/detections/) scans incoming requests for previously leaked credentials (usernames and passwords) previously leaked from data breaches. +The leaked credentials [traffic detection](/waf/detections/) scans incoming requests for previously leaked credentials (usernames and passwords) previously leaked from [data breaches](https://www.cloudflare.com/learning/security/what-is-a-data-breach/). :::note If you are currently using [Exposed Credentials Check](/waf/managed-rules/check-for-exposed-credentials/) (a previous implementation) and want to upgrade to leaked credentials detection, refer to our [upgrade guide](/waf/managed-rules/check-for-exposed-credentials/upgrade-to-leaked-credentials-detection/). @@ -26,7 +26,7 @@ In addition, leaked credentials detection provides a [managed transform](/rules/ One common approach used in web applications when detecting the use of stolen credentials is to warn end users about the situation and ask them to update their password. You can do this based on the managed header received at your origin server. :::note -Cloudflare may detect leaked credentials either because an attacker is performing a credential stuffing attack or because a legitimate end user is reusing a previously leaked password. +Cloudflare may detect leaked credentials either because an attacker is performing a [credential stuffing](https://www.cloudflare.com/learning/bots/what-is-credential-stuffing/) attack or because a legitimate end user is reusing a previously leaked password. ::: ## Availability diff --git a/src/content/docs/waf/get-started.mdx b/src/content/docs/waf/get-started.mdx index 55c4e2fb5937fb..6f07346a91c96f 100644 --- a/src/content/docs/waf/get-started.mdx +++ b/src/content/docs/waf/get-started.mdx @@ -52,7 +52,7 @@ For more information on configuring the Cloudflare Managed Ruleset in the dashbo WAF attack score is only available to Business customers (limited access to a single field) and Enterprise customers (full access). ::: -[WAF attack score](/waf/detections/attack-score/) is a machine-learning layer that complements Cloudflare's managed rulesets, providing additional protection against SQL injection (SQLi), Cross-site scripting (XSS), and many remote code execution (RCE) attacks. It helps identify rule bypasses and potentially new, undiscovered attacks. +[WAF attack score](/waf/detections/attack-score/) is a machine-learning layer that complements Cloudflare's managed rulesets, providing additional protection against [SQL injection](https://www.cloudflare.com/learning/security/threats/sql-injection/) (SQLi), [cross-site scripting](https://www.cloudflare.com/learning/security/threats/cross-site-scripting/) (XSS), and many [remote code execution](https://www.cloudflare.com/learning/security/what-is-remote-code-execution/) (RCE) attacks. It helps identify rule bypasses and potentially new, undiscovered attacks. If you are an Enterprise customer, do the following: @@ -79,7 +79,7 @@ If you are on a Business plan, create a custom rule as mentioned above but use t Bot score is only available to Enterprise customers with [Bot Management](/bots/get-started/bm-subscription/). Customers on Pro and Business plans may enable [Super Bot Fight mode](/bots/get-started/pro/) instead. ::: -Customers with access to [Bot Management](/bots/get-started/bm-subscription/) can block automated traffic (for example, from bots scraping online content) using a custom rule with bot score, preventing this traffic from hitting your application. +Customers with access to [Bot Management](/bots/get-started/bm-subscription/) can block automated traffic (for example, from [bots scraping online content](https://www.cloudflare.com/learning/bots/what-is-content-scraping/)) using a custom rule with bot score, preventing this traffic from hitting your application. 1. Go to your domain > **Security** > **WAF** and select the **Custom rules** tab. @@ -158,7 +158,7 @@ Create a rate limiting rule to [apply rate limiting on a login endpoint](/waf/ra ### Prevent credential stuffing attacks -Use [leaked credential checks](/waf/managed-rules/check-for-exposed-credentials/) to prevent credential stuffing attacks on your applications. +Use [leaked credential checks](/waf/managed-rules/check-for-exposed-credentials/) to prevent credential stuffing attacks on your applications. ### Prevent users from uploading malware into your applications diff --git a/src/content/docs/waf/managed-rules/check-for-exposed-credentials/index.mdx b/src/content/docs/waf/managed-rules/check-for-exposed-credentials/index.mdx index 3fa33d6d51fdd0..45b82cc8dea3ff 100644 --- a/src/content/docs/waf/managed-rules/check-for-exposed-credentials/index.mdx +++ b/src/content/docs/waf/managed-rules/check-for-exposed-credentials/index.mdx @@ -7,7 +7,7 @@ sidebar: import { GlossaryTooltip, Render } from "~/components"; -Many web applications have suffered credential stuffing attacks in the recent past. In these attacks there is a massive number of login attempts using username/password pairs from databases of exposed credentials. +Many web applications have suffered credential stuffing attacks in the recent past. In these attacks there is a massive number of login attempts using username/password pairs from databases of exposed credentials. Cloudflare offers you automated checks for exposed credentials using Cloudflare Web Application Firewall (WAF). diff --git a/src/content/docs/waf/managed-rules/reference/sensitive-data-detection.mdx b/src/content/docs/waf/managed-rules/reference/sensitive-data-detection.mdx index ddfd760dd857b8..4dd807083454e8 100644 --- a/src/content/docs/waf/managed-rules/reference/sensitive-data-detection.mdx +++ b/src/content/docs/waf/managed-rules/reference/sensitive-data-detection.mdx @@ -13,9 +13,9 @@ This feature requires an Enterprise plan with a paid add-on. The Cloudflare Sensitive Data Detection managed ruleset helps identify data leaks generated by your origin servers. Its rules run on the body of the response looking for patterns of common sensitive data, including: -- Personal identifiable information (PII) — for example, passport numbers -- Financial information — for example, credit card numbers -- Secrets — for example, API keys +- [Personally identifiable information](https://www.cloudflare.com/learning/privacy/what-is-pii/) (PII) — For example, passport numbers. +- Financial information — For example, credit card numbers. +- Secrets — For example, API keys. Turning on Cloudflare Sensitive Data Detection will not introduce additional latency, since the detection occurs outside the response path. For this reason, rules are always deployed with the _Log_ action (you cannot block a response that was already sent), providing you with visibility on the sensitive data leaving your origin servers. diff --git a/src/content/docs/waf/rate-limiting-rules/best-practices.mdx b/src/content/docs/waf/rate-limiting-rules/best-practices.mdx index c53bb3622be290..2db4ddfd067570 100644 --- a/src/content/docs/waf/rate-limiting-rules/best-practices.mdx +++ b/src/content/docs/waf/rate-limiting-rules/best-practices.mdx @@ -78,7 +78,7 @@ _This example rule requires Advanced Rate Limiting._ ## Protecting against credential stuffing -A typical use case of rate limiting is to protect a login endpoint. The following example contains three different rate limiting rules with increasing penalties to manage clients making too many requests. +A typical use case of rate limiting is to protect a login endpoint against attacks such as [credential stuffing](https://www.cloudflare.com/learning/bots/what-is-credential-stuffing/). The following example contains three different rate limiting rules with increasing penalties to manage clients making too many requests. **Rule #1** @@ -134,7 +134,7 @@ Login endpoints are also commonly protected against the [use of exposed credenti ## Limiting the number of operations -You can use rate limiting to limit the number of operations performed by a client. The exact rule providing this protection will depend on your application. The following examples address content scraping via query string parameters or JSON body. +You can use rate limiting to limit the number of operations performed by a client. The exact rule providing this protection will depend on your application. The following examples address [content scraping](https://www.cloudflare.com/learning/bots/what-is-content-scraping/) via query string parameters or JSON body. ### Prevent content scraping (via query string) diff --git a/src/content/docs/waf/rate-limiting-rules/index.mdx b/src/content/docs/waf/rate-limiting-rules/index.mdx index 5bc5bd1b06a2b0..95457b4b7efb14 100644 --- a/src/content/docs/waf/rate-limiting-rules/index.mdx +++ b/src/content/docs/waf/rate-limiting-rules/index.mdx @@ -50,3 +50,5 @@ Refer to the following resources: - [Rate limiting rulesets](/waf/account/rate-limiting-rulesets/): Some Enterprise customers can create rate limiting rulesets at the account level that they can deploy to multiple Enterprise zones. - [Cloudflare Rate Limiting (previous version, now deprecated)](/waf/reference/legacy/old-rate-limiting/): Documentation for the previous version of rate limiting rules (billed based on usage). + +- [Learning Center: What is rate limiting?](https://www.cloudflare.com/learning/bots/what-is-rate-limiting/) diff --git a/src/content/docs/waf/tools/scrape-shield/hotlink-protection.mdx b/src/content/docs/waf/tools/scrape-shield/hotlink-protection.mdx index a9d72369bbf9df..e2ab511ef3808d 100644 --- a/src/content/docs/waf/tools/scrape-shield/hotlink-protection.mdx +++ b/src/content/docs/waf/tools/scrape-shield/hotlink-protection.mdx @@ -8,7 +8,7 @@ sidebar: import { Render, TabItem, Tabs } from "~/components"; -Hotlink Protection prevents your images from being used by other sites, which can reduce the bandwidth consumed by your origin server. +Hotlink Protection prevents your images from being used by other sites, which can reduce the bandwidth consumed by your [origin server](https://www.cloudflare.com/learning/cdn/glossary/origin-server/). :::note diff --git a/src/content/docs/waf/tools/zone-lockdown.mdx b/src/content/docs/waf/tools/zone-lockdown.mdx index 4b316ea83c5e5f..f7942670582962 100644 --- a/src/content/docs/waf/tools/zone-lockdown.mdx +++ b/src/content/docs/waf/tools/zone-lockdown.mdx @@ -19,7 +19,7 @@ Cloudflare recommends that you create [WAF custom rules](/waf/custom-rules/) ins For example, a custom rule equivalent to the Zone Lockdown [example rule](#example-rule) provided in this page could have the following configuration: - **Description**: `Block all traffic to staging and wiki unless it comes from HQ or branch offices` -- **Expression**: `((http.host eq "staging.example.com") or (http.host eq "staging.example.com" and starts_with(http.request.uri.path, "/wiki/")) and not ip.src in {192.0.2.0/24 2001:DB8::/64 203.0.133.1}` +- **Expression**: `((http.host eq "staging.example.com") or (http.host eq "example.com" and starts_with(http.request.uri.path, "/wiki/")) and not ip.src in {192.0.2.0/24 2001:DB8::/64 203.0.133.1}` - **Action**: _Block_ ::: diff --git a/src/content/docs/waf/troubleshooting/faq.mdx b/src/content/docs/waf/troubleshooting/faq.mdx index 36a514e5a18d17..7d29eaa3641d0e 100644 --- a/src/content/docs/waf/troubleshooting/faq.mdx +++ b/src/content/docs/waf/troubleshooting/faq.mdx @@ -137,12 +137,12 @@ Block Amazon Web Services (AWS) and Google Cloud Platform (GCP) because of large - Basic rule, no exclusion: - - **Expression**: `(ip.src.asnum in {16509 15169})` + - **Expression**: `(ip.src.asnum in {16509 15169} and not cf.client.bot)` - **Action**: Block (or a challenge action) - Rule that excludes IP addresses from being blocked/challenged: - - **Expression**: `(http.host eq "example.com" and cf.threat_score > 5) and not (ip.src in {192.0.2.1 198.51.100.42 203.0.113.0/24})` + - **Expression**: `(ip.src.asnum in {16509 15169} and not cf.client.bot) and not (ip.src in {192.0.2.1 198.51.100.42 203.0.113.0/24})` - **Action**: Block (or a challenge action) - Two rules to skip remaining custom rules for specific IPs and block the rest. @@ -154,7 +154,7 @@ Block Amazon Web Services (AWS) and Google Cloud Platform (GCP) because of large 2. Rule 2: - - Expression: `(http.host eq "example.com" and cf.threat_score > 5)` + - Expression: `(ip.src.asnum in {16509 15169} and not cf.client.bot)` - Action: Block (or a challenge action) ### Do the Challenge actions support content types other than HTML (for example, AJAX or XHR requests)? diff --git a/src/content/docs/workers-ai/configuration/ai-sdk.mdx b/src/content/docs/workers-ai/configuration/ai-sdk.mdx index 2eff0c111f514b..2c0fbe6e1cbbd8 100644 --- a/src/content/docs/workers-ai/configuration/ai-sdk.mdx +++ b/src/content/docs/workers-ai/configuration/ai-sdk.mdx @@ -16,7 +16,7 @@ Install the [`workers-ai-provider` provider](https://sdk.vercel.ai/providers/com npm install workers-ai-provider ``` -Then, add an AI binding in your Workers project `wrangler.toml` file: +Then, add an AI binding in your Workers project Wrangler file: ```toml [ai] diff --git a/src/content/docs/workers-ai/configuration/bindings.mdx b/src/content/docs/workers-ai/configuration/bindings.mdx index bcc052d223d465..c5992550a082fa 100644 --- a/src/content/docs/workers-ai/configuration/bindings.mdx +++ b/src/content/docs/workers-ai/configuration/bindings.mdx @@ -6,17 +6,15 @@ sidebar: --- -import { Type, MetaInfo } from "~/components"; +import { Type, MetaInfo, WranglerConfig } from "~/components"; ## Workers [Workers](/workers/) provides a serverless execution environment that allows you to create new applications or augment existing ones. -To use Workers AI with Workers, you must create a Workers AI [binding](/workers/runtime-apis/bindings/). Bindings allow your Workers to interact with resources, like Workers AI, on the Cloudflare Developer Platform. You create bindings on the Cloudflare dashboard or by updating your [`wrangler.toml` file](/workers/wrangler/configuration/). +To use Workers AI with Workers, you must create a Workers AI [binding](/workers/runtime-apis/bindings/). Bindings allow your Workers to interact with resources, like Workers AI, on the Cloudflare Developer Platform. You create bindings on the Cloudflare dashboard or by updating your [Wrangler file](/workers/wrangler/configuration/). -To bind Workers AI to your Worker, add the following to the end of your `wrangler.toml` file: - -import { WranglerConfig } from "~/components"; +To bind Workers AI to your Worker, add the following to the end of your Wrangler file: diff --git a/src/content/docs/workers-ai/function-calling/embedded/examples/kv.mdx b/src/content/docs/workers-ai/function-calling/embedded/examples/kv.mdx index 894102287d8fbe..a14b0f0475122f 100644 --- a/src/content/docs/workers-ai/function-calling/embedded/examples/kv.mdx +++ b/src/content/docs/workers-ai/function-calling/embedded/examples/kv.mdx @@ -17,7 +17,7 @@ In this example we show how embedded function calling can interact with other re For this example to work, you need to provision a [KV](/kv/) namespace first. To do so, follow the [KV - Get started ](/kv/get-started/) guide. -Importantly, your `wrangler.toml` file must be updated to include the `KV` binding definition to your respective namespace. +Importantly, your Wrangler file must be updated to include the `KV` binding definition to your respective namespace. ## Worker code diff --git a/src/content/docs/workers-ai/get-started/workers-wrangler.mdx b/src/content/docs/workers-ai/get-started/workers-wrangler.mdx index 75f84d268f2e1d..f39f353d294ccd 100644 --- a/src/content/docs/workers-ai/get-started/workers-wrangler.mdx +++ b/src/content/docs/workers-ai/get-started/workers-wrangler.mdx @@ -9,7 +9,7 @@ head: description: Deploy your first Cloudflare Workers AI project using the CLI. --- -import { Render, PackageManagers } from "~/components"; +import { Render, PackageManagers, WranglerConfig } from "~/components"; This guide will instruct you through setting up and deploying your first Workers AI project. You will use [Workers](/workers/), a Workers AI binding, and a large language model (LLM) to deploy your first AI-powered application on the Cloudflare global network. @@ -38,7 +38,7 @@ Running `npm create cloudflare@latest` will prompt you to install the [`create-c This will create a new `hello-ai` directory. Your new `hello-ai` directory will include: - A `"Hello World"` [Worker](/workers/get-started/guide/#3-write-code) at `src/index.ts`. -- A [`wrangler.toml`](/workers/wrangler/configuration/) configuration file. +- A [`wrangler.json`](/workers/wrangler/configuration/) configuration file. Go to your application directory: @@ -50,13 +50,11 @@ cd hello-ai You must create an AI binding for your Worker to connect to Workers AI. [Bindings](/workers/runtime-apis/bindings/) allow your Workers to interact with resources, like Workers AI, on the Cloudflare Developer Platform. -To bind Workers AI to your Worker, add the following to the end of your `wrangler.toml` file: - -import { WranglerConfig } from "~/components"; +To bind Workers AI to your Worker, add the following to the end of your Wrangler file: -```toml title="wrangler.toml" +```toml [ai] binding = "AI" ``` @@ -77,7 +75,7 @@ Update the `index.ts` file in your `hello-ai` application directory with the fol ```typescript title="src/index.ts" export interface Env { - // If you set another name in wrangler.toml as the value for 'binding', + // If you set another name in the Wrangler config file as the value for 'binding', // replace "AI" with the variable name you defined. AI: Ai; } diff --git a/src/content/docs/workers-ai/guides/agents.mdx b/src/content/docs/workers-ai/guides/agents.mdx new file mode 100644 index 00000000000000..2ba4fdef824cfc --- /dev/null +++ b/src/content/docs/workers-ai/guides/agents.mdx @@ -0,0 +1,9 @@ +--- +pcx_content_type: navigation +title: Agents +external_link: /agents/ +sidebar: + order: 10 +head: [] +description: Build AI-powered Agents on Cloudflare +--- \ No newline at end of file diff --git a/src/content/docs/workers-ai/platform/pricing.mdx b/src/content/docs/workers-ai/platform/pricing.mdx index 14a47880b4026e..55c8b706ec5006 100644 --- a/src/content/docs/workers-ai/platform/pricing.mdx +++ b/src/content/docs/workers-ai/platform/pricing.mdx @@ -3,17 +3,14 @@ pcx_content_type: concept title: Pricing sidebar: order: 1 - --- :::note - -Workers AI has deprecated the usage of neurons in favor of unit-based pricing. The Cloudflare dashboards will be migrated this unit-based pricing soon so you can track your usage. Individual model pages will soon document the price for each model. We also made pricing cheaper! +Workers AI has deprecated the usage of neurons in favor of unit-based pricing. The Cloudflare dashboards will be migrated this unit-based pricing soon so you can track your usage. Individual model pages will soon document the price for each model. We also made pricing cheaper! We will begin billing for all models under this new pricing structure beginning November 1, 2024. - ::: Workers AI is included in both the [Free and Paid Workers plans](/workers/platform/pricing/) and is priced based on model task, model size, and units. @@ -24,20 +21,24 @@ These docs will be updated as we add new pricing for new task types in our model ## Pricing Structure +Some models may have specific pricing. For specific details, check the page of the [specific model](/workers-ai/models/). + ### Text Generation LLMs (incl Vision models) + Model size is measured in parameters. Pricing is based on blended tokens (input + output). Vision models will convert the image input into tokens for billing. Depending on size and aspect ratio, images will be charged for between 1,601 and 6,404 tokens. Most images that are more that 224 pixels wide or tall will be charged as 6,404 tokens each. -| Model Size | Pricing | -| ---------------- | ------------------------ | -| \<= 3B | $0.10 per Million Tokens | -| 3.1B - 8B | $0.15 per Million Tokens | -| 8.1B - 20B | $0.20 per Million Tokens | -| 20.1B - 40B | $0.50 per Million Tokens | -| 40.1B+ | $0.75 per Million Tokens | +| Model Size | Pricing | +| ----------- | ------------------------ | +| \<= 3B | $0.10 per Million Tokens | +| 3.1B - 8B | $0.15 per Million Tokens | +| 8.1B - 20B | $0.20 per Million Tokens | +| 20.1B - 40B | $0.50 per Million Tokens | +| 40.1B+ | $0.75 per Million Tokens | ### Embeddings + Model size is measured in parameters. Pricing is based on input tokens. @@ -47,30 +48,30 @@ Pricing is based on input tokens. | 151M+ parameters | $0.015 per Million Tokens | ## Image Generation + Standard models are large image models such as `@cf/stabilityai/stable-diffusion-xl-base-1.0` Fast models are usually smaller image models that require fewer steps to generate an image, such as `@cf/black-forest-labs/flux-1-schnell` and `@cf/bytedance/stable-diffusion-xl-lightning` We take the maximum of the image height and width to calculate pricing. For example, an image of 1024x768 would fall under 1024x1024 pricing. -| Image Size | Price | -| ------------ | --------------------- | -| \<=256x256 | $0.00025 per 5 steps | -| \<=512x512 | $0.0005 per 5 steps | -| \<=1024x1024 | $0.001 per 5 steps | -| \<=2048x2048 | $0.002 per 5 steps | +| Image Size | Price | +| ------------ | -------------------- | +| \<=256x256 | $0.00025 per 5 steps | +| \<=512x512 | $0.0005 per 5 steps | +| \<=1024x1024 | $0.001 per 5 steps | +| \<=2048x2048 | $0.002 per 5 steps | ## Speech-to-text + Speech-to-text models like `@cf/openai/whisper` are billed on minutes of audio input. | Price | | --------------------------------- | | $0.0039 per minute of audio input | - ## Free Allocation Our free allocation allows anyone to use Workers AI up to a certain limit per day. To use more than the free allocation, upgrade to the Workers Paid plan, where you will be charged on any usage above the free tier based on the pricing structure above. - | Model | Free tier size | | --------------------- | -------------------------------------------- | | Text Generation - LLM | 10,000 tokens a day across any model size | @@ -80,7 +81,6 @@ Our free allocation allows anyone to use Workers AI up to a certain limit per da All limits reset daily at 00:00 UTC. If you exceed any one of the above limits, further operations will fail with an error. - ## Archived Pricing Workers AI was previously metered by Neurons. We deprecated this in favor of unit-based pricing on September 26, 2024. We wanted to make it simple for people to compare and contrast Workers AI with other providers, and we also generally updated pricing to be cheaper with these new units. diff --git a/src/content/docs/workers-ai/tutorials/build-a-retrieval-augmented-generation-ai.mdx b/src/content/docs/workers-ai/tutorials/build-a-retrieval-augmented-generation-ai.mdx index ed689e6a15fc19..7c6ff29c7b5045 100644 --- a/src/content/docs/workers-ai/tutorials/build-a-retrieval-augmented-generation-ai.mdx +++ b/src/content/docs/workers-ai/tutorials/build-a-retrieval-augmented-generation-ai.mdx @@ -1,11 +1,12 @@ --- -updated: 2024-08-19 +updated: 2024-11-21 difficulty: Beginner content_type: 📝 Tutorial pcx_content_type: tutorial title: Build a Retrieval Augmented Generation (RAG) AI products: - Workers + - D1 - Vectorize tags: - AI @@ -16,7 +17,7 @@ sidebar: order: 2 --- -import { Details, Render, PackageManagers } from "~/components"; +import { Details, Render, PackageManagers, WranglerConfig } from "~/components"; This guide will instruct you through setting up and deploying your first application with Cloudflare AI. You will build a fully-featured AI-powered application, using tools like Workers AI, Vectorize, D1, and Cloudflare Workers. @@ -24,7 +25,7 @@ At the end of this tutorial, you will have built an AI tool that allows you to s -You will also need access to [Vectorize](/vectorize/platform/pricing/). +You will also need access to [Vectorize](/vectorize/platform/pricing/). During this tutorial, we will show how you can optionally integrate with [Anthropic Claude](http://anthropic.com) as well. You will need an [Anthropic API key](https://docs.anthropic.com/en/api/getting-started) to do so. ## 1. Create a new Worker project @@ -52,7 +53,7 @@ In your project directory, C3 has generated several files.
-1. `wrangler.toml`: Your [Wrangler](/workers/wrangler/configuration/#sample-wrangler-configuration) configuration file. +1. `wrangler.json`: Your [Wrangler](/workers/wrangler/configuration/#sample-wrangler-configuration) configuration file. 2. `worker.js` (in `/src`): A minimal `'Hello World!'` Worker written in [ES module](/workers/reference/migrate-to-module-workers/) syntax. 3. `package.json`: A minimal Node dependencies configuration file. 4. `package-lock.json`: Refer to [`npm` documentation on `package-lock.json`](https://docs.npmjs.com/cli/v9/configuring-npm/package-lock-json). @@ -88,12 +89,10 @@ You will now be able to go to [http://localhost:8787](http://localhost:8787) to ## 3. Adding the AI binding -To begin using Cloudflare's AI products, you can add the `ai` block to `wrangler.toml`. This will set up a binding to Cloudflare's AI models in your code that you can use to interact with the available AI models on the platform. +To begin using Cloudflare's AI products, you can add the `ai` block to the `wrangler.toml / wrangler.json` file. This will set up a binding to Cloudflare's AI models in your code that you can use to interact with the available AI models on the platform. This example features the [`@cf/meta/llama-3-8b-instruct` model](/workers-ai/models/llama-3-8b-instruct/), which generates text. -import { WranglerConfig } from "~/components"; - ```toml @@ -145,7 +144,7 @@ To begin using Vectorize, create a new embeddings index using `wrangler`. This i npx wrangler vectorize create vector-index --dimensions=768 --metric=cosine ``` -Then, add the configuration details for your new Vectorize index to `wrangler.toml`: +Then, add the configuration details for your new Vectorize index to the `wrangler.toml / wrangler.json` file: @@ -171,9 +170,7 @@ Create a new D1 database using `wrangler`: npx wrangler d1 create database ``` -Then, paste the configuration details output from the previous command into `wrangler.toml`: - - +Then, paste the configuration details output from the previous command into the `wrangler.toml / wrangler.json` file: @@ -200,7 +197,42 @@ Now, we can add a new note to our database using `wrangler d1 execute`: npx wrangler d1 execute database --remote --command "INSERT INTO notes (text) VALUES ('The best pizza topping is pepperoni')" ``` -## 5. Creating notes and adding them to Vectorize +## 5. Creating a workflow + +Before we begin creating notes, we will introduce a [Cloudflare Workflow](/workflows). This will allow us to define a durable workflow that can safely and robustly execute all the steps of the RAG process. + +To begin, add a new `[[workflows]]` block to `wrangler.toml`: + +```toml +# ... existing wrangler configuration + +[[workflows]] +name = "rag" +binding = "RAG_WORKFLOW" +class_name = "RAGWorkflow" +``` + +In `src/index.js`, add a new class called `RAGWorkflow` that extends `Workflow`: + +```js +export class RAGWorkflow { + async run(event, step) { + await step.do('example step', async () => { + console.log("Hello World!") + }) + } +} +``` + +This class will define a single workflow step that will log "Hello World!" to the console. You can add as many steps as you need to your workflow. + +On its own, this workflow will not do anything. To execute the workflow, we will call the `RAG_WORKFLOW` binding, passing in any parameters that the workflow needs to properly complete. Here is an example of how we can call the workflow: + +```js +env.RAG_WORKFLOW.create({ params: { text } }) +``` + +## 6. Creating notes and adding them to Vectorize To expand on your Workers function in order to handle multiple routes, we will add `hono`, a routing library for Workers. This will allow us to create a new route for adding notes to our database. Install `hono` using `npm`: @@ -225,61 +257,69 @@ app.get("/", async (c) => { export default app; ``` -This will establish a route at the root path `/` that is functionally equivalent to the previous version of your application. Now, we can add a new route for adding notes to our database. +This will establish a route at the root path `/` that is functionally equivalent to the previous version of your application. + +Now, we can update our workflow to begin adding notes to our database, and generating the related embeddings for them. This example features the [`@cf/baai/bge-base-en-v1.5` model](/workers-ai/models/bge-base-en-v1.5/), which can be used to create an embedding. Embeddings are stored and retrieved inside [Vectorize](/vectorize/), Cloudflare's vector database. The user query is also turned into an embedding so that it can be used for searching within Vectorize. ```js -app.post("/notes", async (c) => { - const { text } = await c.req.json(); - if (!text) { - return c.text("Missing text", 400); - } - - const { results } = await c.env.DB.prepare( - "INSERT INTO notes (text) VALUES (?) RETURNING *", - ) - .bind(text) - .run(); - - const record = results.length ? results[0] : null; - - if (!record) { - return c.text("Failed to create note", 500); - } - - const { data } = await c.env.AI.run("@cf/baai/bge-base-en-v1.5", { - text: [text], - }); - const values = data[0]; - - if (!values) { - return c.text("Failed to generate vector embedding", 500); +export class RAGWorkflow { + async run(event, step) { + const { text } = event.params + + const record = await step.do(`create database record`, async () => { + const query = "INSERT INTO notes (text) VALUES (?) RETURNING *" + + const { results } = await env.DATABASE.prepare(query) + .bind(text) + .run() + + const record = results[0] + if (!record) throw new Error("Failed to create note") + return record; + }) + + const embedding = await step.do(`generate embedding`, async () => { + const embeddings = await env.AI.run('@cf/baai/bge-base-en-v1.5', { text: text }) + const values = embeddings.data[0] + if (!values) throw new Error("Failed to generate vector embedding") + return values + }) + + await step.do(`insert vector`, async () => { + return env.VECTOR_INDEX.upsert([ + { + id: record.id.toString(), + values: embedding, + } + ]); + }) } - - const { id } = record; - const inserted = await c.env.VECTOR_INDEX.upsert([ - { - id: id.toString(), - values, - }, - ]); - - return c.json({ id, text, inserted }); -}); +} ``` -This function does the following things: +The workflow does the following things: -1. Parse the JSON body of the request to get the `text` field. +1. Accepts a `text` parameter. 2. Insert a new row into the `notes` table in D1, and retrieve the `id` of the new row. 3. Convert the `text` into a vector using the `embeddings` model of the LLM binding. 4. Upsert the `id` and `vectors` into the `vector-index` index in Vectorize. -5. Return the `id` and `text` of the new note as JSON. By doing this, you will create a new vector representation of the note, which can be used to retrieve the note later. -## 6. Querying Vectorize to retrieve notes +To complete the code, we will add a route that allows users to submit notes to the database. This route will parse the JSON request body, get the `note` parameter, and create a new instance of the workflow, passing the parameter: + +```js +app.post('/notes', async (c) => { + const { text } = await c.req.json(); + if (!text) return c.text("Missing text", 400); + await c.env.RAG_WORKFLOW.create({ params: { text } }) + return c.text("Created note", 201); +}) +``` + +## 7. Querying Vectorize to retrieve notes To complete your code, you can update the root path (`/`) to query Vectorize. You will convert the query into a vector, and then use the `vector-index` index to find the most similar vectors. @@ -337,7 +377,6 @@ app.get('/', async (c) => { ) return c.text(answer); - }); app.onError((err, c) => { @@ -347,7 +386,80 @@ app.onError((err, c) => { export default app; ``` -## 7. Deleting notes and vectors +## 8. Adding Anthropic Claude model (optional) + +If you are working with larger documents, you have the option to use Anthropic's [Claude models](https://claude.ai/), which have large context windows and are well-suited to RAG workflows. + +To begin, install the `@anthropic-ai/sdk` package: + +```sh +npm install @anthropic-ai/sdk +``` + +In `src/index.js`, you can update the `GET /` route to check for the `ANTHROPIC_API_KEY` environment variable. If it's set, we can generate text using the Anthropic SDK. If it isn't set, we'll fall back to the existing Workers AI code: + +```js +import Anthropic from '@anthropic-ai/sdk'; + +app.get('/', async (c) => { + // ... Existing code + const systemPrompt = `When answering the question or responding, use the context provided, if it is provided and relevant.` + + let modelUsed: string = "" + let response = null + + if (c.env.ANTHROPIC_API_KEY) { + const anthropic = new Anthropic({ + apiKey: c.env.ANTHROPIC_API_KEY + }) + + const model = "claude-3-5-sonnet-latest" + modelUsed = model + + const message = await anthropic.messages.create({ + max_tokens: 1024, + model, + messages: [ + { role: 'user', content: question } + ], + system: [systemPrompt, notes ? contextMessage : ''].join(" ") + }) + + response = { + response: message.content.map(content => content.text).join("\n") + } + } else { + const model = "@cf/meta/llama-3.1-8b-instruct" + modelUsed = model + + response = await c.env.AI.run( + model, + { + messages: [ + ...(notes.length ? [{ role: 'system', content: contextMessage }] : []), + { role: 'system', content: systemPrompt }, + { role: 'user', content: question } + ] + } + ) + } + + if (response) { + c.header('x-model-used', modelUsed) + return c.text(response.response) + } else { + return c.text("We were unable to generate output", 500) + } +}) +``` + +Finally, you'll need to set the `ANTHROPIC_API_KEY` environment variable in your Workers application. You can do this by using `wrangler secret put`: + +```sh +$ npx wrangler secret put ANTHROPIC_API_KEY +``` + +## 9. Deleting notes and vectors If you no longer need a note, you can delete it from the database. Any time that you delete a note, you will also need to delete the corresponding vector from Vectorize. You can implement this by building a `DELETE /notes/:id` route in your `src/index.js` file: @@ -364,7 +476,85 @@ app.delete("/notes/:id", async (c) => { }); ``` -## 8. Deploy your project +## 10. Text splitting (optional) + +For large pieces of text, it is recommended to split the text into smaller chunks. This allows LLMs to more effectively gather relevant context, without needing to retrieve large pieces of text. + +To implement this, we'll add a new NPM package to our project, `@langchain/textsplitters': + +```sh +npm install @cloudflare/textsplitters +``` + +The `RecursiveCharacterTextSplitter` class provided by this package will split the text into smaller chunks. It can be customized to your liking, but the default config works in most cases: + +```js +import { RecursiveCharacterTextSplitter } from "@langchain/textsplitters"; + +const text = "Some long piece of text..."; + +const splitter = new RecursiveCharacterTextSplitter({ + // These can be customized to change the chunking size + // chunkSize: 1000, + // chunkOverlap: 200, +}); + +const output = await splitter.createDocuments([text]); +console.log(output) // [{ pageContent: 'Some long piece of text...' }] +``` + +To use this splitter, we'll update the workflow to split the text into smaller chunks. We'll then iterate over the chunks and run the rest of the workflow for each chunk of text: + +```js +export class RAGWorkflow { + async run(event, step) { + const env = this.env + const { text } = event.payload; + let texts = await step.do('split text', async () => { + const splitter = new RecursiveCharacterTextSplitter(); + const output = await splitter.createDocuments([text]); + return output.map(doc => doc.pageContent); + }) + + console.log("RecursiveCharacterTextSplitter generated ${texts.length} chunks") + + for (const index in texts) { + const text = texts[index] + const record = await step.do(`create database record: ${index}/${texts.length}`, async () => { + const query = "INSERT INTO notes (text) VALUES (?) RETURNING *" + + const { results } = await env.DATABASE.prepare(query) + .bind(text) + .run() + + const record = results[0] + if (!record) throw new Error("Failed to create note") + return record; + }) + + const embedding = await step.do(`generate embedding: ${index}/${texts.length}`, async () => { + const embeddings = await env.AI.run('@cf/baai/bge-base-en-v1.5', { text: text }) + const values = embeddings.data[0] + if (!values) throw new Error("Failed to generate vector embedding") + return values + }) + + await step.do(`insert vector: ${index}/${texts.length}`, async () => { + return env.VECTOR_INDEX.upsert([ + { + id: record.id.toString(), + values: embedding, + } + ]); + }) + } + } +} +``` + +Now, when large pieces of text are submitted to the `/notes` endpoint, they will be split into smaller chunks, and each chunk will be processed by the workflow. + +## 11. Deploy your project If you did not deploy your Worker during [step 1](/workers/get-started/guide/#1-create-a-new-worker-project), deploy your Worker via Wrangler, to a `*.workers.dev` subdomain, or a [Custom Domain](/workers/configuration/routing/custom-domains/), if you have one configured. If you have not configured any subdomain or domain, Wrangler will prompt you during the publish process to set one up. @@ -392,4 +582,4 @@ To do more: - Explore [Examples](/workers/examples/) to experiment with copy and paste Worker code. - Understand how Workers works in [Reference](/workers/reference/). - Learn about Workers features and functionality in [Platform](/workers/platform/). -- Set up [Wrangler](/workers/wrangler/install-and-update/) to programmatically create, test, and deploy your Worker projects. +- Set up [Wrangler](/workers/wrangler/install-and-update/) to programmatically create, test, and deploy your Worker projects. \ No newline at end of file diff --git a/src/content/docs/workers-ai/tutorials/build-a-voice-notes-app-with-auto-transcription.mdx b/src/content/docs/workers-ai/tutorials/build-a-voice-notes-app-with-auto-transcription.mdx index 03f77c7e9b69b2..3b028a57979d24 100644 --- a/src/content/docs/workers-ai/tutorials/build-a-voice-notes-app-with-auto-transcription.mdx +++ b/src/content/docs/workers-ai/tutorials/build-a-voice-notes-app-with-auto-transcription.mdx @@ -104,7 +104,7 @@ This API makes use of Workers AI to transcribe the voice recordings. To use Work -Add the `AI` binding to the `wrangler.toml` file. +Add the `AI` binding to the Wrangler file. ```toml title="wrangler.toml" [ai] @@ -153,7 +153,7 @@ The above code does the following: ## 3. Create an API endpoint for uploading audio recordings to R2 -Before uploading the audio recordings to `R2`, you need to create a bucket first. You will also need to add the R2 binding to your `wrangler.toml` file and regenerate the Cloudflare type definitions. +Before uploading the audio recordings to `R2`, you need to create a bucket first. You will also need to add the R2 binding to your Wrangler file and regenerate the Cloudflare type definitions. Create an `R2` bucket. @@ -181,7 +181,7 @@ pnpm dlx wrangler r2 bucket create -Add the storage binding to your `wrangler.toml` file. +Add the storage binding to your Wrangler file. ```toml title="wrangler.toml" [[r2_buckets]] @@ -254,7 +254,7 @@ pnpm dlx wrangler d1 create -Add the D1 bindings to the `wrangler.toml` file. You can get the `DB_ID` from the output of the `d1 create` command. +Add the D1 bindings to the Wrangler file. You can get the `DB_ID` from the output of the `d1 create` command. ```toml title="wrangler.toml" [[d1_databases]] diff --git a/src/content/docs/workers-ai/tutorials/build-ai-interview-practice-tool.mdx b/src/content/docs/workers-ai/tutorials/build-ai-interview-practice-tool.mdx index 8ab69b2460d4a3..9c9cfdef7aece1 100644 --- a/src/content/docs/workers-ai/tutorials/build-ai-interview-practice-tool.mdx +++ b/src/content/docs/workers-ai/tutorials/build-ai-interview-practice-tool.mdx @@ -363,7 +363,7 @@ Now that you have your authentication system in place, create a Durable Object t - Handles multiple interview sessions efficiently without performance issues. - Creates a dedicated instance for each user, giving them their own isolated environment. -First, you will need to configure the Durable Object in `wrangler.toml` file. Add the following configuration: +First, you will need to configure the Durable Object in Wrangler file. Add the following configuration: ```toml title="wrangler.toml" [[durable_objects.bindings]] @@ -735,36 +735,36 @@ export class InterviewDatabaseService { // ... previous queries ... INSERT_INTERVIEW: ` - INSERT INTO ${CONFIG.database.tables.interviews} + INSERT INTO ${CONFIG.database.tables.interviews} (interviewId, title, skills, status, createdAt, updatedAt) VALUES (?, ?, ?, ?, ?, ?) `, GET_ALL_INTERVIEWS: ` - SELECT - interviewId, - title, - skills, - createdAt, - updatedAt, - status - FROM ${CONFIG.database.tables.interviews} + SELECT + interviewId, + title, + skills, + createdAt, + updatedAt, + status + FROM ${CONFIG.database.tables.interviews} ORDER BY createdAt DESC `, INSERT_MESSAGE: ` - INSERT INTO ${CONFIG.database.tables.messages} + INSERT INTO ${CONFIG.database.tables.messages} (messageId, interviewId, role, content, timestamp) VALUES (?, ?, ?, ?, ?) `, GET_INTERVIEW: ` - SELECT - i.interviewId, - i.title, - i.skills, - i.status, - i.createdAt, + SELECT + i.interviewId, + i.title, + i.skills, + i.status, + i.createdAt, i.updatedAt, COALESCE( json_group_array( @@ -1197,7 +1197,7 @@ Your `handleBinaryAudio` method currently logs when it receives audio data. Next Now that audio processing pipeline is set up, you will now integrate Workers AI's Whisper model for speech-to-text transcription. -Configure the Worker AI binding in your `wrangler.toml` file by adding: +Configure the Worker AI binding in your Wrangler file by adding: ```toml # ... previous configuration ... diff --git a/src/content/docs/workers-ai/tutorials/explore-workers-ai-models-using-a-jupyter-notebook.mdx b/src/content/docs/workers-ai/tutorials/explore-workers-ai-models-using-a-jupyter-notebook.mdx index b15784913c30af..391dc10f2ddce7 100644 --- a/src/content/docs/workers-ai/tutorials/explore-workers-ai-models-using-a-jupyter-notebook.mdx +++ b/src/content/docs/workers-ai/tutorials/explore-workers-ai-models-using-a-jupyter-notebook.mdx @@ -34,11 +34,6 @@ Or you can run this on [Google Colab](https://colab.research.google.com/github/c This notebook will explore the Workers AI REST API using the [official Python SDK](https://github.com/cloudflare/cloudflare-python). -```python -import sys -!{sys.executable} -m pip install python-dotenv requests -!{sys.executable} -m pip install --pre cloudflare -``` ```python import os @@ -49,13 +44,12 @@ from IPython.display import display, Image, Markdown, Audio import requests ``` + ```python %load_ext dotenv %dotenv ``` -```python -``` ### Configuring your environment @@ -70,6 +64,7 @@ CLOUDFLARE_ACCOUNT_ID="YOUR-ACCOUNT-ID" Otherwise you can just enter the values securely when prompted below. + ```python if "CLOUDFLARE_API_TOKEN" in os.environ: api_token = os.environ["CLOUDFLARE_API_TOKEN"] @@ -77,6 +72,7 @@ else: api_token = getpass("Enter you Cloudflare API Token") ``` + ```python if "CLOUDFLARE_ACCOUNT_ID" in os.environ: account_id = os.environ["CLOUDFLARE_ACCOUNT_ID"] @@ -84,6 +80,7 @@ else: account_id = getpass("Enter your account id") ``` + ```python # Initialize client client = Cloudflare(api_token=api_token) @@ -95,6 +92,7 @@ client = Cloudflare(api_token=api_token) Explore all [Text Generation Models](/workers-ai/models#text-generation) + ```python result = client.workers.ai.run( "@cf/meta/llama-3-8b-instruct" , @@ -112,32 +110,41 @@ result = client.workers.ai.run( display(Markdown(result["response"])) ``` -Using keyboard shortcuts to execute cells in Jupyter Notebook can save you a lot of time and increase your productivity! -Here are some keyboard shortcuts to execute cells in Jupyter Notebook: +**Using Keyboard Shortcuts to Execute Cells in Jupyter Notebooks** +=============================================================== -**Mac Users:** +Executing cells in Jupyter Notebooks can be done quickly and efficiently using various keyboard shortcuts, saving you time and effort. Here are the shortcuts you can use: -* `Cmd + Enter` (⌘ + Enter) to execute a cell -* `Shift + Enter` to execute a cell and move to the next cell below -* `Cmd + Shift + Enter` (⌘ + Shift + Enter) to execute a cell and move to the next cell below without closing the output +**Mac** -**Windows Users:** +* **Shift + Enter**: Execute the current cell and insert a new cell below. +* **Ctrl + Enter**: Execute the current cell and insert a new cell below, without creating a new output display. -* `Ctrl + Enter` to execute a cell -* `Shift + Enter` to execute a cell and move to the next cell below -* `Ctrl + Shift + Enter` to execute a cell and move to the next cell below without closing the output +**Windows/Linux** -These keyboard shortcuts are Windows-compatible, so you can use them in Jupyter Notebook on your Windows machine! +* **Shift + Enter**: Execute the current cell and insert a new cell below. +* **Ctrl + Enter**: Execute the current cell and move to the next cell. -You can also use the `Escape` key to clear the output of a cell, and `Alt + Enter` to execute a cell recursively (i.e., execute all cells below the current cell). +**Additional Shortcuts** + +* **Alt + Enter**: Execute the current cell and create a new output display below (Mac), or move to the next cell (Windows/Linux). +* **Ctrl + Shift + Enter**: Execute the current cell and create a new output display below (Mac), or create a new cell below (Windows/Linux). + +**Tips and Tricks** + +* You can also use the **Run Cell** button in the Jupyter Notebook toolbar, or the **Run** menu option (macOS) or **Run -> Run Cell** (Windows/Linux). +* To execute a selection of cells, use **Shift + Alt + Enter** (Mac) or **Shift + Ctrl + Enter** (Windows/Linux). +* To execute a cell and move to the next cell, use **Ctrl + Shift + Enter** (all platforms). + +By using these keyboard shortcuts, you'll be able to work more efficiently and quickly in your Jupyter Notebooks. Happy coding! -Remember to customize your Jupyter Notebook settings to fit your workflow and preferences! ### Text to Image Explore all [Text to Image models](/workers-ai/models#text-to-image) + ```python data = client.workers.ai.with_raw_response.run( "@cf/lykon/dreamshaper-8-lcm", @@ -148,12 +155,16 @@ data = client.workers.ai.with_raw_response.run( display(Image(data.read())) ``` + + ![png](/workers-ai-notebooks/cloudflare-workers-ai/assets/output_13_0.png) + ### Image to Text Explore all [Image to Text](/workers-ai/models/#image-to-text) models + ```python url = "https://blog.cloudflare.com/content/images/2017/11/lava-lamps.jpg" @@ -172,15 +183,19 @@ data = client.workers.ai.run( print(data["description"]) ``` -![jpeg](/workers-ai-notebooks/cloudflare-workers-ai/assets/output_15_0.jpg) -``` - The image features a display of colorful, glowing lava lamps. There are numerous lava lamps of various sizes and colors, arranged in a visually appealing manner. The lamps are placed in a row, with some positioned closer to the front and others further back. The vibrant colors and captivating glow of the lava lamps create an eye-catching and lively scene. -``` + +![lava lamps](https://blog.cloudflare.com/content/images/2017/11/lava-lamps.jpg) + + + + The image features a display of various colored lava lamps. There are at least 14 lava lamps in the scene, each with a different color and design. The lamps are arranged in a visually appealing manner, with some placed closer to the foreground and others further back. The display creates an eye-catching and vibrant atmosphere, showcasing the diverse range of lava lamps available. + ### Automatic Speech Recognition -Explore all [Speech Recognition models](/workers-ai/models/#automatic-speech-recognition) +Explore all [Speech Recognition models](/workers-ai/models#speech-recognition) + ```python url = "https://raw.githubusercontent.com/craigsdennis/notebooks-cloudflare-workers-ai/main/assets/craig-rambling.mp3" @@ -196,110 +211,121 @@ response = client.workers.ai.run( response ``` - + + + + + + + +```javascript + {'text': "Hello there, I'm making a recording for a Jupiter notebook. That's a Python notebook, Jupiter, J-U-P-Y-T-E-R. Not to be confused with the planet. Anyways, let me hear, I'm gonna talk a little bit, I'm gonna make a little bit of noise, say some hard words, I'm gonna say Kubernetes, I'm not actually even talking about Kubernetes, I just wanna see if I can do Kubernetes. Anyway, this is a test of transcription and let's see how we're dead.", + 'word_count': 84, + 'vtt': "WEBVTT\n\n00.280 --> 01.840\nHello there, I'm making a\n\n01.840 --> 04.060\nrecording for a Jupiter notebook.\n\n04.060 --> 06.440\nThat's a Python notebook, Jupiter,\n\n06.440 --> 07.720\nJ -U -P -Y -T\n\n07.720 --> 09.420\n-E -R. Not to be\n\n09.420 --> 12.140\nconfused with the planet. Anyways,\n\n12.140 --> 12.940\nlet me hear, I'm gonna\n\n12.940 --> 13.660\ntalk a little bit, I'm\n\n13.660 --> 14.600\ngonna make a little bit\n\n14.600 --> 16.180\nof noise, say some hard\n\n16.180 --> 17.540\nwords, I'm gonna say Kubernetes,\n\n17.540 --> 18.420\nI'm not actually even talking\n\n18.420 --> 19.500\nabout Kubernetes, I just wanna\n\n19.500 --> 20.300\nsee if I can do\n\n20.300 --> 22.120\nKubernetes. Anyway, this is a\n\n22.120 --> 24.080\ntest of transcription and let's\n\n24.080 --> 26.280\nsee how we're dead.", + 'words': [{'word': 'Hello', + 'start': 0.2800000011920929, + 'end': 0.7400000095367432}, + {'word': 'there,', 'start': 0.7400000095367432, 'end': 1.2400000095367432}, + {'word': "I'm", 'start': 1.2400000095367432, 'end': 1.4800000190734863}, + {'word': 'making', 'start': 1.4800000190734863, 'end': 1.6799999475479126}, + {'word': 'a', 'start': 1.6799999475479126, 'end': 1.840000033378601}, + {'word': 'recording', 'start': 1.840000033378601, 'end': 2.2799999713897705}, + {'word': 'for', 'start': 2.2799999713897705, 'end': 2.6600000858306885}, + {'word': 'a', 'start': 2.6600000858306885, 'end': 2.799999952316284}, + {'word': 'Jupiter', 'start': 2.799999952316284, 'end': 3.2200000286102295}, + {'word': 'notebook.', 'start': 3.2200000286102295, 'end': 4.059999942779541}, + {'word': "That's", 'start': 4.059999942779541, 'end': 4.28000020980835}, + {'word': 'a', 'start': 4.28000020980835, 'end': 4.380000114440918}, + {'word': 'Python', 'start': 4.380000114440918, 'end': 4.679999828338623}, + {'word': 'notebook,', 'start': 4.679999828338623, 'end': 5.460000038146973}, + {'word': 'Jupiter,', 'start': 5.460000038146973, 'end': 6.440000057220459}, + {'word': 'J', 'start': 6.440000057220459, 'end': 6.579999923706055}, + {'word': '-U', 'start': 6.579999923706055, 'end': 6.920000076293945}, + {'word': '-P', 'start': 6.920000076293945, 'end': 7.139999866485596}, + {'word': '-Y', 'start': 7.139999866485596, 'end': 7.440000057220459}, + {'word': '-T', 'start': 7.440000057220459, 'end': 7.71999979019165}, + {'word': '-E', 'start': 7.71999979019165, 'end': 7.920000076293945}, + {'word': '-R.', 'start': 7.920000076293945, 'end': 8.539999961853027}, + {'word': 'Not', 'start': 8.539999961853027, 'end': 8.880000114440918}, + {'word': 'to', 'start': 8.880000114440918, 'end': 9.300000190734863}, + {'word': 'be', 'start': 9.300000190734863, 'end': 9.420000076293945}, + {'word': 'confused', 'start': 9.420000076293945, 'end': 9.739999771118164}, + {'word': 'with', 'start': 9.739999771118164, 'end': 9.9399995803833}, + {'word': 'the', 'start': 9.9399995803833, 'end': 10.039999961853027}, + {'word': 'planet.', 'start': 10.039999961853027, 'end': 11.380000114440918}, + {'word': 'Anyways,', 'start': 11.380000114440918, 'end': 12.140000343322754}, + {'word': 'let', 'start': 12.140000343322754, 'end': 12.420000076293945}, + {'word': 'me', 'start': 12.420000076293945, 'end': 12.520000457763672}, + {'word': 'hear,', 'start': 12.520000457763672, 'end': 12.800000190734863}, + {'word': "I'm", 'start': 12.800000190734863, 'end': 12.880000114440918}, + {'word': 'gonna', 'start': 12.880000114440918, 'end': 12.9399995803833}, + {'word': 'talk', 'start': 12.9399995803833, 'end': 13.100000381469727}, + {'word': 'a', 'start': 13.100000381469727, 'end': 13.260000228881836}, + {'word': 'little', 'start': 13.260000228881836, 'end': 13.380000114440918}, + {'word': 'bit,', 'start': 13.380000114440918, 'end': 13.5600004196167}, + {'word': "I'm", 'start': 13.5600004196167, 'end': 13.65999984741211}, + {'word': 'gonna', 'start': 13.65999984741211, 'end': 13.739999771118164}, + {'word': 'make', 'start': 13.739999771118164, 'end': 13.920000076293945}, + {'word': 'a', 'start': 13.920000076293945, 'end': 14.199999809265137}, + {'word': 'little', 'start': 14.199999809265137, 'end': 14.4399995803833}, + {'word': 'bit', 'start': 14.4399995803833, 'end': 14.600000381469727}, + {'word': 'of', 'start': 14.600000381469727, 'end': 14.699999809265137}, + {'word': 'noise,', 'start': 14.699999809265137, 'end': 15.460000038146973}, + {'word': 'say', 'start': 15.460000038146973, 'end': 15.859999656677246}, + {'word': 'some', 'start': 15.859999656677246, 'end': 16}, + {'word': 'hard', 'start': 16, 'end': 16.18000030517578}, + {'word': 'words,', 'start': 16.18000030517578, 'end': 16.540000915527344}, + {'word': "I'm", 'start': 16.540000915527344, 'end': 16.639999389648438}, + {'word': 'gonna', 'start': 16.639999389648438, 'end': 16.719999313354492}, + {'word': 'say', 'start': 16.719999313354492, 'end': 16.920000076293945}, + {'word': 'Kubernetes,', + 'start': 16.920000076293945, + 'end': 17.540000915527344}, + {'word': "I'm", 'start': 17.540000915527344, 'end': 17.65999984741211}, + {'word': 'not', 'start': 17.65999984741211, 'end': 17.719999313354492}, + {'word': 'actually', 'start': 17.719999313354492, 'end': 18}, + {'word': 'even', 'start': 18, 'end': 18.18000030517578}, + {'word': 'talking', 'start': 18.18000030517578, 'end': 18.420000076293945}, + {'word': 'about', 'start': 18.420000076293945, 'end': 18.6200008392334}, + {'word': 'Kubernetes,', 'start': 18.6200008392334, 'end': 19.1200008392334}, + {'word': 'I', 'start': 19.1200008392334, 'end': 19.239999771118164}, + {'word': 'just', 'start': 19.239999771118164, 'end': 19.360000610351562}, + {'word': 'wanna', 'start': 19.360000610351562, 'end': 19.5}, + {'word': 'see', 'start': 19.5, 'end': 19.719999313354492}, + {'word': 'if', 'start': 19.719999313354492, 'end': 19.8799991607666}, + {'word': 'I', 'start': 19.8799991607666, 'end': 19.940000534057617}, + {'word': 'can', 'start': 19.940000534057617, 'end': 20.079999923706055}, + {'word': 'do', 'start': 20.079999923706055, 'end': 20.299999237060547}, + {'word': 'Kubernetes.', + 'start': 20.299999237060547, + 'end': 21.440000534057617}, + {'word': 'Anyway,', 'start': 21.440000534057617, 'end': 21.799999237060547}, + {'word': 'this', 'start': 21.799999237060547, 'end': 21.920000076293945}, + {'word': 'is', 'start': 21.920000076293945, 'end': 22.020000457763672}, + {'word': 'a', 'start': 22.020000457763672, 'end': 22.1200008392334}, + {'word': 'test', 'start': 22.1200008392334, 'end': 22.299999237060547}, + {'word': 'of', 'start': 22.299999237060547, 'end': 22.639999389648438}, + {'word': 'transcription', + 'start': 22.639999389648438, + 'end': 23.139999389648438}, + {'word': 'and', 'start': 23.139999389648438, 'end': 23.6200008392334}, + {'word': "let's", 'start': 23.6200008392334, 'end': 24.079999923706055}, + {'word': 'see', 'start': 24.079999923706055, 'end': 24.299999237060547}, + {'word': 'how', 'start': 24.299999237060547, 'end': 24.559999465942383}, + {'word': "we're", 'start': 24.559999465942383, 'end': 24.799999237060547}, + {'word': 'dead.', 'start': 24.799999237060547, 'end': 26.280000686645508}]} ``` -{'text': "Hello there, I'm making a recording for a Jupiter notebook. That's a Python notebook, Jupiter, J-U-P-Y-T-E-R. Not to be confused with the planet. Anyways, let me hear, I'm gonna talk a little bit, I'm gonna make a little bit of noise, say some hard words, I'm gonna say Kubernetes, I'm not actually even talking about Kubernetes, I just wanna see if I can do Kubernetes. Anyway, this is a test of transcription and let's see how we're dead.", - 'word_count': 84, - 'words': [{'word': 'Hello', - 'start': 0.2800000011920929, - 'end': 0.7400000095367432}, - {'word': 'there,', 'start': 0.7400000095367432, 'end': 1.2400000095367432}, - {'word': "I'm", 'start': 1.2400000095367432, 'end': 1.4800000190734863}, - {'word': 'making', 'start': 1.4800000190734863, 'end': 1.6799999475479126}, - {'word': 'a', 'start': 1.6799999475479126, 'end': 1.840000033378601}, - {'word': 'recording', 'start': 1.840000033378601, 'end': 2.2799999713897705}, - {'word': 'for', 'start': 2.2799999713897705, 'end': 2.6600000858306885}, - {'word': 'a', 'start': 2.6600000858306885, 'end': 2.799999952316284}, - {'word': 'Jupiter', 'start': 2.799999952316284, 'end': 3.2200000286102295}, - {'word': 'notebook.', 'start': 3.2200000286102295, 'end': 4.059999942779541}, - {'word': "That's", 'start': 4.059999942779541, 'end': 4.28000020980835}, - {'word': 'a', 'start': 4.28000020980835, 'end': 4.380000114440918}, - {'word': 'Python', 'start': 4.380000114440918, 'end': 4.679999828338623}, - {'word': 'notebook,', 'start': 4.679999828338623, 'end': 5.460000038146973}, - {'word': 'Jupiter,', 'start': 5.460000038146973, 'end': 6.440000057220459}, - {'word': 'J', 'start': 6.440000057220459, 'end': 6.579999923706055}, - {'word': '-U', 'start': 6.579999923706055, 'end': 6.920000076293945}, - {'word': '-P', 'start': 6.920000076293945, 'end': 7.139999866485596}, - {'word': '-Y', 'start': 7.139999866485596, 'end': 7.440000057220459}, - {'word': '-T', 'start': 7.440000057220459, 'end': 7.71999979019165}, - {'word': '-E', 'start': 7.71999979019165, 'end': 7.920000076293945}, - {'word': '-R.', 'start': 7.920000076293945, 'end': 8.539999961853027}, - {'word': 'Not', 'start': 8.539999961853027, 'end': 8.880000114440918}, - {'word': 'to', 'start': 8.880000114440918, 'end': 9.300000190734863}, - {'word': 'be', 'start': 9.300000190734863, 'end': 9.420000076293945}, - {'word': 'confused', 'start': 9.420000076293945, 'end': 9.739999771118164}, - {'word': 'with', 'start': 9.739999771118164, 'end': 9.9399995803833}, - {'word': 'the', 'start': 9.9399995803833, 'end': 10.039999961853027}, - {'word': 'planet.', 'start': 10.039999961853027, 'end': 11.380000114440918}, - {'word': 'Anyways,', 'start': 11.380000114440918, 'end': 12.140000343322754}, - {'word': 'let', 'start': 12.140000343322754, 'end': 12.420000076293945}, - {'word': 'me', 'start': 12.420000076293945, 'end': 12.520000457763672}, - {'word': 'hear,', 'start': 12.520000457763672, 'end': 12.800000190734863}, - {'word': "I'm", 'start': 12.800000190734863, 'end': 12.880000114440918}, - {'word': 'gonna', 'start': 12.880000114440918, 'end': 12.9399995803833}, - {'word': 'talk', 'start': 12.9399995803833, 'end': 13.100000381469727}, - {'word': 'a', 'start': 13.100000381469727, 'end': 13.260000228881836}, - {'word': 'little', 'start': 13.260000228881836, 'end': 13.380000114440918}, - {'word': 'bit,', 'start': 13.380000114440918, 'end': 13.5600004196167}, - {'word': "I'm", 'start': 13.5600004196167, 'end': 13.65999984741211}, - {'word': 'gonna', 'start': 13.65999984741211, 'end': 13.739999771118164}, - {'word': 'make', 'start': 13.739999771118164, 'end': 13.920000076293945}, - {'word': 'a', 'start': 13.920000076293945, 'end': 14.199999809265137}, - {'word': 'little', 'start': 14.199999809265137, 'end': 14.4399995803833}, - {'word': 'bit', 'start': 14.4399995803833, 'end': 14.600000381469727}, - {'word': 'of', 'start': 14.600000381469727, 'end': 14.699999809265137}, - {'word': 'noise,', 'start': 14.699999809265137, 'end': 15.460000038146973}, - {'word': 'say', 'start': 15.460000038146973, 'end': 15.859999656677246}, - {'word': 'some', 'start': 15.859999656677246, 'end': 16}, - {'word': 'hard', 'start': 16, 'end': 16.18000030517578}, - {'word': 'words,', 'start': 16.18000030517578, 'end': 16.540000915527344}, - {'word': "I'm", 'start': 16.540000915527344, 'end': 16.639999389648438}, - {'word': 'gonna', 'start': 16.639999389648438, 'end': 16.719999313354492}, - {'word': 'say', 'start': 16.719999313354492, 'end': 16.920000076293945}, - {'word': 'Kubernetes,', - 'start': 16.920000076293945, - 'end': 17.540000915527344}, - {'word': "I'm", 'start': 17.540000915527344, 'end': 17.65999984741211}, - {'word': 'not', 'start': 17.65999984741211, 'end': 17.719999313354492}, - {'word': 'actually', 'start': 17.719999313354492, 'end': 18}, - {'word': 'even', 'start': 18, 'end': 18.18000030517578}, - {'word': 'talking', 'start': 18.18000030517578, 'end': 18.420000076293945}, - {'word': 'about', 'start': 18.420000076293945, 'end': 18.6200008392334}, - {'word': 'Kubernetes,', 'start': 18.6200008392334, 'end': 19.1200008392334}, - {'word': 'I', 'start': 19.1200008392334, 'end': 19.239999771118164}, - {'word': 'just', 'start': 19.239999771118164, 'end': 19.360000610351562}, - {'word': 'wanna', 'start': 19.360000610351562, 'end': 19.5}, - {'word': 'see', 'start': 19.5, 'end': 19.719999313354492}, - {'word': 'if', 'start': 19.719999313354492, 'end': 19.8799991607666}, - {'word': 'I', 'start': 19.8799991607666, 'end': 19.940000534057617}, - {'word': 'can', 'start': 19.940000534057617, 'end': 20.079999923706055}, - {'word': 'do', 'start': 20.079999923706055, 'end': 20.299999237060547}, - {'word': 'Kubernetes.', - 'start': 20.299999237060547, - 'end': 21.440000534057617}, - {'word': 'Anyway,', 'start': 21.440000534057617, 'end': 21.799999237060547}, - {'word': 'this', 'start': 21.799999237060547, 'end': 21.920000076293945}, - {'word': 'is', 'start': 21.920000076293945, 'end': 22.020000457763672}, - {'word': 'a', 'start': 22.020000457763672, 'end': 22.1200008392334}, - {'word': 'test', 'start': 22.1200008392334, 'end': 22.299999237060547}, - {'word': 'of', 'start': 22.299999237060547, 'end': 22.639999389648438}, - {'word': 'transcription', - 'start': 22.639999389648438, - 'end': 23.139999389648438}, - {'word': 'and', 'start': 23.139999389648438, 'end': 23.6200008392334}, - {'word': "let's", 'start': 23.6200008392334, 'end': 24.079999923706055}, - {'word': 'see', 'start': 24.079999923706055, 'end': 24.299999237060547}, - {'word': 'how', 'start': 24.299999237060547, 'end': 24.559999465942383}, - {'word': "we're", 'start': 24.559999465942383, 'end': 24.799999237060547}, - {'word': 'dead.', 'start': 24.799999237060547, 'end': 26.280000686645508}], - 'vtt': "WEBVTT\n\n00.280 --> 01.840\nHello there, I'm making a\n\n01.840 --> 04.060\nrecording for a Jupiter notebook.\n\n04.060 --> 06.440\nThat's a Python notebook, Jupiter,\n\n06.440 --> 07.720\nJ -U -P -Y -T\n\n07.720 --> 09.420\n-E -R. Not to be\n\n09.420 --> 12.140\nconfused with the planet. Anyways,\n\n12.140 --> 12.940\nlet me hear, I'm gonna\n\n12.940 --> 13.660\ntalk a little bit, I'm\n\n13.660 --> 14.600\ngonna make a little bit\n\n14.600 --> 16.180\nof noise, say some hard\n\n16.180 --> 17.540\nwords, I'm gonna say Kubernetes,\n\n17.540 --> 18.420\nI'm not actually even talking\n\n18.420 --> 19.500\nabout Kubernetes, I just wanna\n\n19.500 --> 20.300\nsee if I can do\n\n20.300 --> 22.120\nKubernetes. Anyway, this is a\n\n22.120 --> 24.080\ntest of transcription and let's\n\n24.080 --> 26.280\nsee how we're dead."} -``` + ### Translations Explore all [Translation models](/workers-ai/models#translation) + ```python result = client.workers.ai.run( "@cf/meta/m2m100-1.2b", @@ -313,14 +339,14 @@ result = client.workers.ai.run( print(result["translated_text"]) ``` -``` -La inteligencia artificial es bastante impresionante en estos días.Es un buen momento para ser un constructor -``` + La inteligencia artificial es bastante impresionante en estos días.Es un buen momento para ser un constructor + ### Text Classification Explore all [Text Classification models](/workers-ai/models#text-classification) + ```python result = client.workers.ai.run( "@cf/huggingface/distilbert-sst-2-int8", @@ -331,14 +357,18 @@ result = client.workers.ai.run( result ``` -``` -[TextClassification(label='NEGATIVE', score=0.00012679687642958015), - TextClassification(label='POSITIVE', score=0.999873161315918)] -``` + + + + [TextClassification(label='NEGATIVE', score=0.00012679687642958015), + TextClassification(label='POSITIVE', score=0.999873161315918)] + + ### Image Classification -Explore all [Image Classification models](/workers-ai/models/#image-classification) +Explore all [Image Classification models](/workers-ai/models#image-classification/) + ```python url = "https://raw.githubusercontent.com/craigsdennis/notebooks-cloudflare-workers-ai/main/assets/craig-and-a-burrito.jpg" @@ -353,28 +383,40 @@ response = client.workers.ai.run( response ``` + + ![jpeg](/workers-ai-notebooks/cloudflare-workers-ai/assets/output_27_0.jpg) -``` -[TextClassification(label='BURRITO', score=0.9999678134918213), - TextClassification(label='GUACAMOLE', score=8.525597877451219e-06), - TextClassification(label='BAGEL', score=4.702816113422159e-06), - TextClassification(label='SPATULA', score=4.094248197361594e-06), - TextClassification(label='POTPIE', score=3.0966698432166595e-06)] -``` + + + + + + [TextClassification(label='BURRITO', score=0.9999679327011108), + TextClassification(label='GUACAMOLE', score=8.516660273016896e-06), + TextClassification(label='BAGEL', score=4.689153229264775e-06), + TextClassification(label='SPATULA', score=4.075985089002643e-06), + TextClassification(label='POTPIE', score=3.0849002996546915e-06)] + + ## Summarization Explore all [Summarization](/workers-ai/models#summarization) based models + ```python declaration_of_independence = """In Congress, July 4, 1776. The unanimous Declaration of the thirteen united States of America, When in the Course of human events, it becomes necessary for one people to dissolve the political bands which have connected them with another, and to assume among the powers of the earth, the separate and equal station to which the Laws of Nature and of Nature's God entitle them, a decent respect to the opinions of mankind requires that they should declare the causes which impel them to the separation. We hold these truths to be self-evident, that all men are created equal, that they are endowed by their Creator with certain unalienable Rights, that among these are Life, Liberty and the pursuit of Happiness.--That to secure these rights, Governments are instituted among Men, deriving their just powers from the consent of the governed, --That whenever any Form of Government becomes destructive of these ends, it is the Right of the People to alter or to abolish it, and to institute new Government, laying its foundation on such principles and organizing its powers in such form, as to them shall seem most likely to effect their Safety and Happiness. Prudence, indeed, will dictate that Governments long established should not be changed for light and transient causes; and accordingly all experience hath shewn, that mankind are more disposed to suffer, while evils are sufferable, than to right themselves by abolishing the forms to which they are accustomed. But when a long train of abuses and usurpations, pursuing invariably the same Object evinces a design to reduce them under absolute Despotism, it is their right, it is their duty, to throw off such Government, and to provide new Guards for their future security.--Such has been the patient sufferance of these Colonies; and such is now the necessity which constrains them to alter their former Systems of Government. The history of the present King of Great Britain is a history of repeated injuries and usurpations, all having in direct object the establishment of an absolute Tyranny over these States. To prove this, let Facts be submitted to a candid world. He has refused his Assent to Laws, the most wholesome and necessary for the public good. He has forbidden his Governors to pass Laws of immediate and pressing importance, unless suspended in their operation till his Assent should be obtained; and when so suspended, he has utterly neglected to attend to them. He has refused to pass other Laws for the accommodation of large districts of people, unless those people would relinquish the right of Representation in the Legislature, a right inestimable to them and formidable to tyrants only. He has called together legislative bodies at places unusual, uncomfortable, and distant from the depository of their public Records, for the sole purpose of fatiguing them into compliance with his measures. He has dissolved Representative Houses repeatedly, for opposing with manly firmness his invasions on the rights of the people. He has refused for a long time, after such dissolutions, to cause others to be elected; whereby the Legislative powers, incapable of Annihilation, have returned to the People at large for their exercise; the State remaining in the mean time exposed to all the dangers of invasion from without, and convulsions within. He has endeavoured to prevent the population of these States; for that purpose obstructing the Laws for Naturalization of Foreigners; refusing to pass others to encourage their migrations hither, and raising the conditions of new Appropriations of Lands. He has obstructed the Administration of Justice, by refusing his Assent to Laws for establishing Judiciary powers. He has made Judges dependent on his Will alone, for the tenure of their offices, and the amount and payment of their salaries. He has erected a multitude of New Offices, and sent hither swarms of Officers to harrass our people, and eat out their substance. He has kept among us, in times of peace, Standing Armies without the Consent of our legislatures. He has affected to render the Military independent of and superior to the Civil power. He has combined with others to subject us to a jurisdiction foreign to our constitution, and unacknowledged by our laws; giving his Assent to their Acts of pretended Legislation: For Quartering large bodies of armed troops among us: For protecting them, by a mock Trial, from punishment for any Murders which they should commit on the Inhabitants of these States: For cutting off our Trade with all parts of the world: For imposing Taxes on us without our Consent: For depriving us in many cases, of the benefits of Trial by Jury: For transporting us beyond Seas to be tried for pretended offences For abolishing the free System of English Laws in a neighbouring Province, establishing therein an Arbitrary government, and enlarging its Boundaries so as to render it at once an example and fit instrument for introducing the same absolute rule into these Colonies: For taking away our Charters, abolishing our most valuable Laws, and altering fundamentally the Forms of our Governments: For suspending our own Legislatures, and declaring themselves invested with power to legislate for us in all cases whatsoever. He has abdicated Government here, by declaring us out of his Protection and waging War against us. He has plundered our seas, ravaged our Coasts, burnt our towns, and destroyed the lives of our people. He is at this time transporting large Armies of foreign Mercenaries to compleat the works of death, desolation and tyranny, already begun with circumstances of Cruelty & perfidy scarcely paralleled in the most barbarous ages, and totally unworthy the Head of a civilized nation. He has constrained our fellow Citizens taken Captive on the high Seas to bear Arms against their Country, to become the executioners of their friends and Brethren, or to fall themselves by their Hands. He has excited domestic insurrections amongst us, and has endeavoured to bring on the inhabitants of our frontiers, the merciless Indian Savages, whose known rule of warfare, is an undistinguished destruction of all ages, sexes and conditions. In every stage of these Oppressions We have Petitioned for Redress in the most humble terms: Our repeated Petitions have been answered only by repeated injury. A Prince whose character is thus marked by every act which may define a Tyrant, is unfit to be the ruler of a free people. Nor have We been wanting in attentions to our Brittish brethren. We have warned them from time to time of attempts by their legislature to extend an unwarrantable jurisdiction over us. We have reminded them of the circumstances of our emigration and settlement here. We have appealed to their native justice and magnanimity, and we have conjured them by the ties of our common kindred to disavow these usurpations, which, would inevitably interrupt our connections and correspondence. They too have been deaf to the voice of justice and of consanguinity. We must, therefore, acquiesce in the necessity, which denounces our Separation, and hold them, as we hold the rest of mankind, Enemies in War, in Peace Friends. We, therefore, the Representatives of the united States of America, in General Congress, Assembled, appealing to the Supreme Judge of the world for the rectitude of our intentions, do, in the Name, and by Authority of the good People of these Colonies, solemnly publish and declare, That these United Colonies are, and of Right ought to be Free and Independent States; that they are Absolved from all Allegiance to the British Crown, and that all political connection between them and the State of Great Britain, is and ought to be totally dissolved; and that as Free and Independent States, they have full Power to levy War, conclude Peace, contract Alliances, establish Commerce, and to do all other Acts and Things which Independent States may of right do. And for the support of this Declaration, with a firm reliance on the protection of divine Providence, we mutually pledge to each other our Lives, our Fortunes and our sacred Honor.""" len(declaration_of_independence) ``` -``` -8116 -``` + + + + 8116 + + + ```python response = client.workers.ai.run( @@ -386,6 +428,9 @@ response = client.workers.ai.run( response["summary"] ``` -``` -'The Declaration of Independence was signed by the thirteen states on July 4, 1776. It was the first attempt at a U.S. Constitution. It declared the right of the people to change their Government.' -``` + + + + 'The Declaration of Independence was signed by the thirteen states on July 4, 1776. It was the first attempt at a U.S. Constitution. It declared the right of the people to change their Government.' + + diff --git a/src/content/docs/workers-ai/tutorials/how-to-choose-the-right-text-generation-model.mdx b/src/content/docs/workers-ai/tutorials/how-to-choose-the-right-text-generation-model.mdx index 7754b72e65121d..f7f9b825b1faa6 100644 --- a/src/content/docs/workers-ai/tutorials/how-to-choose-the-right-text-generation-model.mdx +++ b/src/content/docs/workers-ai/tutorials/how-to-choose-the-right-text-generation-model.mdx @@ -36,7 +36,7 @@ You can [download the Workers AI Text Generation Exploration notebook](/workers- Models come in different shapes and sizes, and choosing the right one for the task, can cause analysis paralysis. -The good news is that on the [Workers AI Text Generation](/workers-ai/models/#text-generation) interface is always the same, no matter which model you choose. +The good news is that on the [Workers AI Text Generation](/workers-ai/models/) interface is always the same, no matter which model you choose. In an effort to aid you in your journey of finding the right model, this notebook will help you get to know your options in a speed dating type of scenario. @@ -130,7 +130,7 @@ def speed_date(models, questions): Who better to tell you about the specific models than themselves?! -The timing here is specific to the entire completion, but remember all Text Generation models on [Workers AI support streaming](/workers-ai/models/#text-generation). +The timing here is specific to the entire completion, but remember all Text Generation models on [Workers AI support streaming](/workers-ai/models/). ```python models = [ diff --git a/src/content/docs/workers-ai/tutorials/image-generation-playground/image-generator-flux-newmodels.mdx b/src/content/docs/workers-ai/tutorials/image-generation-playground/image-generator-flux-newmodels.mdx index c494bc95736d99..45601f0543dabf 100644 --- a/src/content/docs/workers-ai/tutorials/image-generation-playground/image-generator-flux-newmodels.mdx +++ b/src/content/docs/workers-ai/tutorials/image-generation-playground/image-generator-flux-newmodels.mdx @@ -14,6 +14,7 @@ tags: languages: - Typescript prev: true +next: true --- diff --git a/src/content/docs/workers-ai/tutorials/image-generation-playground/image-generator-store-and-catalog.mdx b/src/content/docs/workers-ai/tutorials/image-generation-playground/image-generator-store-and-catalog.mdx new file mode 100644 index 00000000000000..7b590471419773 --- /dev/null +++ b/src/content/docs/workers-ai/tutorials/image-generation-playground/image-generator-store-and-catalog.mdx @@ -0,0 +1,33 @@ +--- +updated: 2025-01-29 +difficulty: Beginner +content_type: 🎥 Video +pcx_content_type: video +title: Store and Catalog AI Generated Images with R2 (Part 3) +sidebar: + order: 3 +products: + - Workers +tags: + - AI + - Workers + - R2 +languages: + - Typescript +prev: true + +--- + +import { Details, DirectoryListing, Stream } from "~/components" + +In the final part of the AI Image Playground series, Kristian teaches how to utilize Cloudflare's [R2](/r2) object storage in order to maintain and keep track of each AI generated image. + + + +Refer to the AI Image Playground [GitHub repository](https://github.com/kristianfreeman/workers-ai-image-playground) to follow along locally. + +
+ + + +
\ No newline at end of file diff --git a/src/content/docs/workers-ai/tutorials/image-generator-flux.mdx b/src/content/docs/workers-ai/tutorials/image-generation-playground/index.mdx similarity index 89% rename from src/content/docs/workers-ai/tutorials/image-generator-flux.mdx rename to src/content/docs/workers-ai/tutorials/image-generation-playground/index.mdx index 5f086352dd3000..244d57d7162577 100644 --- a/src/content/docs/workers-ai/tutorials/image-generator-flux.mdx +++ b/src/content/docs/workers-ai/tutorials/image-generation-playground/index.mdx @@ -3,7 +3,7 @@ updated: 2024-10-17 difficulty: Beginner content_type: 🎥 Video pcx_content_type: tutorial -title: How to build an Image Generator using Workers AI +title: How to Build an Image Generator using Workers AI products: - Workers tags: diff --git a/src/content/docs/workers-ai/tutorials/using-bigquery-with-workers-ai.mdx b/src/content/docs/workers-ai/tutorials/using-bigquery-with-workers-ai.mdx index 82e0158215487a..8b3b32ba0b2563 100644 --- a/src/content/docs/workers-ai/tutorials/using-bigquery-with-workers-ai.mdx +++ b/src/content/docs/workers-ai/tutorials/using-bigquery-with-workers-ai.mdx @@ -15,6 +15,7 @@ sidebar: order: 2 --- +import { WranglerConfig } from "~/components"; The easiest way to get started with [Workers AI](/workers-ai/) is to try it out in the [Multi-modal Playground](https://multi-modal.ai.cloudflare.com/) and the [LLM playground](https://playground.ai.cloudflare.com/). If you decide that you want to integrate your code with Workers AI, you may then decide to then use its [REST API endpoints](/workers-ai/get-started/rest-api/) or via a [Worker binding](/workers-ai/configuration/bindings/). @@ -445,9 +446,7 @@ formattedResults = formattedResults?.map((formattedResult, i) => { ``` -Uncomment the following lines from the `wrangler.toml` file in your project: - -import { WranglerConfig } from "~/components"; +Uncomment the following lines from the Wrangler file in your project: diff --git a/src/content/docs/workers/ci-cd/builds/advanced-setups.mdx b/src/content/docs/workers/ci-cd/builds/advanced-setups.mdx index d8a8b56e993283..88d853f6e75057 100644 --- a/src/content/docs/workers/ci-cd/builds/advanced-setups.mdx +++ b/src/content/docs/workers/ci-cd/builds/advanced-setups.mdx @@ -1,6 +1,6 @@ --- pcx_content_type: reference -title: Advanced Setups +title: Advanced setups description: Learn how to use Workers Builds with more advanced setups sidebar: order: 7 @@ -8,13 +8,25 @@ sidebar: ## Monorepos -While the Workers Builds beta has limited support for monorepos, it is still possible to set up a monorepo workflow. In the Cloudflare Dashboard, you must connect your monorepo to each of the existing Worker projects. When a new commit is detected in the monorepo, a new build/deploy will trigger for each Worker. +To set up a monorepo workflow: + +1. Find the Workers associated with your project in the [Workers & Pages Dashboard](https://dash.cloudflare.com). +2. Connect your monorepo to each Worker in the repository. +3. Set the root directory for each Worker to specify the location of its `wrangler.toml` and where build and deploy commands should run. +4. Optionally, configure unique build and deploy commands for each Worker. +5. Optionally, configure [build watch paths](/workers/ci-cd/builds/build-watch-paths/) for each Worker to monitor specific paths for changes. + +When a new commit is made to the monorepo, a new build and deploy will trigger for each Worker if the change is within each of its included watch paths. You can also check on the status of each build associated with your repository within GitHub with [check runs](/workers/ci-cd/builds/git-integration/github-integration/#check-run) or within GitLab with [commit statuses](/workers/ci-cd/builds/git-integration/gitlab-integration/#commit-status). ### Example -In the example `ecommerce-monorepo`, a Workers project should be created for `product-service`, `auth-service`, `order-service`, and `notification-service`. +In the example `ecommerce-monorepo`, a Workers project should be created for `product-service`, `order-service`, and `notification-service`. + +A Git connection to `ecommerce-monorepo` should be added in all of the Workers projects. If you are using a monorepo tool, such as [Turborepo](https://turbo.build/), you can configure a different deploy command for each Worker, for example, `turbo deploy -F product-service`. -A git connection to `ecommerce-monorepo` should be added in all of the Workers projects. If you are using a monorepo tool (e.g. [Turborepo](https://turbo.build/)), you can configure a different deploy command for each Worker (e.g. `turbo deploy -F product-service`). When a new commit is made to `ecommerce-monorepo`, a build and deploy will be triggered for each of the Workers (i.e. `product-service`, `auth-service`, `order-service`, `notification-service`) and respect the configured commands for that Worker. +Set the root directory of each Worker to where its wrangler.toml is located. For example, for `product-service`, the root directory should be `/workers/product-service/`. Optionally, you can add [build watch paths](/workers/ci-cd/builds/build-watch-paths/) to optimize your builds. + +When a new commit is made to `ecommerce-monorepo`, a build and deploy will be triggered for each of the Workers if the change is within its included watch paths using the configured commands for that Worker. ``` ecommerce-monorepo/ @@ -23,9 +35,6 @@ ecommerce-monorepo/ │ ├── product-service/ │ │ ├── src/ │ │ └── wrangler.toml -│ ├── auth-service/ -│ │ ├── src/ -│ │ └── wrangler.toml │ ├── order-service/ │ │ ├── src/ │ │ └── wrangler.toml @@ -37,11 +46,11 @@ ecommerce-monorepo/ └── README.md ``` -## Wrangler environments +## Wrangler Environments -If you are using [Wrangler Environments](/workers/wrangler/environments/), you can choose to continue using with Workers Builds with a bit of set up: +You can use [Wrangler Environments](/workers/wrangler/environments/) with Workers Builds by completing the following steps: -1. [Deploy via Wrangler](/workers/wrangler/commands/#deploy) to create the Workers for your environments in the Dashboard, if you don't already have them. +1. [Deploy via Wrangler](/workers/wrangler/commands/#deploy) to create the Workers for your environments on the Dashboard, if you do not already have them. 2. Find the Workers for your environments. They are typically named `[name of Worker] - [environment name]`. 3. Connect your repository to each of the Workers for your environment. 4. In each of the Workers, edit your Wrangler deploy command to include the flag `--env: ` in the build configurations. @@ -50,17 +59,6 @@ When a new commit is detected in the repository, a new build/deploy will trigger ### Example -Imagine you have a Worker named `my-worker`, and you want to set up two environments `staging` and `production` set in the `wrangler.toml`. If you haven't already, you can deploy `my-worker` for each environment using the commands `wrangler deploy --env staging` and `wrangler deploy --env production`. - -In your Cloudflare Dashboard, you should find two Workers `my-worker-staging` and `my-worker-production`. A git connection to a `my-worker` git repository should be added to both of the environment Workers. In the build configurations of each environment Worker, edit the deploy commands to be `npx wrangler deploy --env staging` and `npx wrangler deploy --env production` respectively. +Imagine you have a Worker named `my-worker`, and you want to set up two environments `staging` and `production` set in the `wrangler.toml`. If you have not already, you can deploy `my-worker` for each environment using the commands `wrangler deploy --env staging` and `wrangler deploy --env production`. -```mermaid -graph TD - A[Git Repo for my-worker] --> |Connect| B[my-worker-staging] - A --> |Connect| C[my-worker-production] - - subgraph Cloudflare Dashboard - B - C - end -``` +In your Cloudflare Dashboard, you should find the two Workers `my-worker-staging` and `my-worker-production`. Then, connect the Git repository for the Worker, `my-worker`, to both of the environment Workers. In the build configurations of each environment Worker, edit the deploy commands to be `npx wrangler deploy --env staging` and `npx wrangler deploy --env production` respectively. diff --git a/src/content/docs/workers/ci-cd/builds/build-caching.mdx b/src/content/docs/workers/ci-cd/builds/build-caching.mdx index 92cf20b3a9eda6..0761c4b3785b70 100644 --- a/src/content/docs/workers/ci-cd/builds/build-caching.mdx +++ b/src/content/docs/workers/ci-cd/builds/build-caching.mdx @@ -6,30 +6,11 @@ sidebar: order: 5 --- -Improve Workers Builds build times by turning on build caching to restore dependencies and build output between builds. The first build to occur after enabling build caching on your Pages project will save to cache. Every subsequent build will restore from cache unless configured otherwise. +Improve Workers build times by caching dependencies and build output between builds with a project-wide shared cache. -## Configuration +The first build to occur after enabling build caching on your Workers project will save relevant artifacts to cache. Every subsequent build will restore from cache unless configured otherwise. -### Enable build caching - -To enable build caching in the Cloudflare dashboard: - -1. Log in to the [Cloudflare dashboard](https://dash.cloudflare.com) and select your account. -2. In Account Home, select **Workers & Pages**. -3. In **Overview**, select your Workers project. -4. Go to **Settings** > **Build** > **Build cache** and select **Enable**. - -### Clear cache - -The build cache can be cleared for a project when needed, such as when debugging build issues. To clear the build cache: - -1. Log in to the [Cloudflare dashboard](https://dash.cloudflare.com) and select your account. -2. In Account Home, select **Workers & Pages**. -3. In **Overview**, select your Workers project. -4. Go to **Settings** > **Build** > **Build cache**. -5. Select **Clear Cache** to clear the build cache. - -## How build caching works +## About build cache When enabled, build caching will automatically detect which package manager and framework the project is using from its `package.json` and cache data accordingly for the build. @@ -48,6 +29,8 @@ Workers build cache will cache the global cache directories of the following pac ### Frameworks +Some frameworks provide a cache directory that is typically populated by the framework with intermediate build outputs or dependencies during build time. Workers Builds will automatically detect the framework you are using and cache this directory for reuse in subsequent builds. + The following frameworks support build output caching: | Framework | Directories cached | @@ -63,9 +46,27 @@ The following frameworks support build output caching: [Static assets](/workers/static-assets/) and [frameworks](/workers/frameworks/) are now supported in Cloudflare Workers. ::: -## Limits +### Limits The following limits are imposed for build caching: - **Retention**: Cache is purged 7 days after its last read date. Unread cache artifacts are purged 7 days after creation. - **Storage**: Every project is allocated 10 GB. If the project cache exceeds this limit, the project will automatically start deleting artifacts that were read least recently. + +## Enable build cache + +To enable build caching: + +1. Navigate to [Workers & Pages Overview](https://dash.cloudflare.com) on the Dashboard. +2. Find your Workers project. +3. Go to **Settings** > **Build** > **Build cache**. +4. Select **Enable** to turn on build caching. + +## Clear build cache + +The build cache can be cleared for a project when needed, such as when debugging build issues. To clear the build cache: + +1. Navigate to [Workers & Pages Overview](https://dash.cloudflare.com) on the Dashboard. +2. Find your Workers project. +3. Go to **Settings** > **Build** > **Build cache**. +4. Select **Clear Cache** to clear the build cache. diff --git a/src/content/docs/workers/ci-cd/builds/build-image.mdx b/src/content/docs/workers/ci-cd/builds/build-image.mdx index ebecf3cf9ba478..11e9e2ff8b0268 100644 --- a/src/content/docs/workers/ci-cd/builds/build-image.mdx +++ b/src/content/docs/workers/ci-cd/builds/build-image.mdx @@ -1,6 +1,6 @@ --- pcx_content_type: reference -title: Build Image +title: Build image description: Understand the build image used in Workers Builds. sidebar: order: 4 diff --git a/src/content/docs/workers/ci-cd/builds/build-watch-paths.mdx b/src/content/docs/workers/ci-cd/builds/build-watch-paths.mdx index 90200ff65bbbb0..bc437662381b2b 100644 --- a/src/content/docs/workers/ci-cd/builds/build-watch-paths.mdx +++ b/src/content/docs/workers/ci-cd/builds/build-watch-paths.mdx @@ -8,7 +8,7 @@ sidebar: When you connect a git repository to Workers, by default a change to any file in the repository will trigger a build. You can configure Workers to include or exclude specific paths to specify if Workers should skip a build for a given path. This can be especially helpful if you are using a monorepo project structure and want to limit the amount of builds being kicked off. -## Configure paths +## Configure Paths To configure which paths are included and excluded: diff --git a/src/content/docs/workers/ci-cd/builds/configuration.mdx b/src/content/docs/workers/ci-cd/builds/configuration.mdx index 5176821a997b7b..ec4ca15299093a 100644 --- a/src/content/docs/workers/ci-cd/builds/configuration.mdx +++ b/src/content/docs/workers/ci-cd/builds/configuration.mdx @@ -6,27 +6,61 @@ sidebar: order: 2 --- -When connecting your repository, you can configure how to build and deploy your Worker. +import { DirectoryListing } from "~/components"; -## Build Settings +When connecting your Git repository to your Worker, you can customize the configurations needed to build and deploy your Worker. -Build settings can be found by navigating to **Settings** > **Build** within your Worker. Note that when you update and save build settings, the updated settings will be applied in your next build. The following configurations are available: +## Build settings -| Setting | Description | -| -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Git account** | Select the git account you would like to use. After initial connection, you can continue to use this git account for future projects. | -| **Git repository** | Choose the git repository you would like to connect your Worker to. | -| **Git branch** | Select the branch you would like Cloudflare to listen to for new commits. This will be defaulted to `main`. | -| **Build command** _(Optional)_ | Set a build command if your project requires a build step. This is necessary, for example, when using a front-end framework such as Astro or Remix. -| **Deploy command** | The deploy command lets you set the **specific** Wrangler command to deploy your Worker. Your deploy command will default to `npx wrangler deploy` but you may customize this command if for example you want to create a [version](/workers/configuration/versions-and-deployments/gradual-deployments/) of your Worker or just run `npm run deploy`. Workers Builds will use the Wrangler version set in your `package json`. | -| **Root directory** _(Optional)_ | Specify the root directory of your repository. The root directory describes where the build command will be run. | -| **API token** _(Optional)_ | By default, Cloudflare will automatically generate an API token for your account when using Workers Builds. Workers Builds will continue to use this API token for all subsequent projects and builds. Alternatively, you can [create your own API token](/workers/wrangler/migration/v1-to-v2/wrangler-legacy/authentication/#generate-tokens), or select one that you already own. | -| **Build variables and secrets** _(Optional)_ | Add environment variables and secrets accessible only to your build. Build variables will not be accessible at runtime. If you would like to configure runtime variables you can do so in **Settings** > **Variables & Secrets** | +Build settings can be found by navigating to **Settings** > **Build** within your Worker. -:::note[API Token Permissions] -When you connect your Worker to a git repository and configure Workers Builds, Workers Builds will create an API token automatically with the following permissions: +Note that when you update and save build settings, the updated settings will be applied to your _next_ build. When you _retry_ a build, the build configurations that exist when the build is retried will be applied. + +### Overview + +| Setting | Description | +| ---------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Git account** | Select the Git account you would like to use. After the initial connection, you can continue to use this Git account for future projects. | +| **Git repository** | Choose the Git repository you would like to connect your Worker to. | +| **Git branch** | Select the branch you would like Cloudflare to listen to for new commits. This will be defaulted to `main`. | +| **Build command** _(Optional)_ | Set a build command if your project requires a build step (e.g. `npm run build`). This is necessary, for example, when using a [front-end framework](/workers/ci-cd/builds/configuration/#framework-support) such as Next.js or Remix. | +| **[Deploy command](/workers/ci-cd/builds/configuration/#deploy-command)** | The deploy command lets you set the [specific Wrangler command](/workers/wrangler/commands/#deploy) used to deploy your Worker. Your deploy command will default to `npx wrangler deploy` but you may customize this command. Workers Builds will use the Wrangler version set in your `package json`. | +| **Root directory** _(Optional)_ | Specify the path to your project. The root directory defines where the build command will be run and can be helpful in [monorepos](/workers/ci-cd/builds/advanced-setups/#monorepos) to isolate a specific project within the repository for builds. | +| **[API token](/workers/ci-cd/builds/configuration/#api-token)** _(Optional)_ | The API token is used to authenticate your build request and authorize the upload and deployment of your Worker to Cloudflare. By default, Cloudflare will automatically generate an API token for your account when using Workers Builds, and continue to use this API token for all subsequent builds. Alternatively, you can [create your own API token](/workers/wrangler/migration/v1-to-v2/wrangler-legacy/authentication/#generate-tokens), or select one that you already own. | +| **Build variables and secrets** _(Optional)_ | Add environment variables and secrets accessible only to your build. Build variables will not be accessible at runtime. If you would like to configure runtime variables you can do so in **Settings** > **Variables & Secrets** | + +:::note +Currently, Workers Builds does not honor the configurations set in [Custom Builds](/workers/wrangler/custom-builds/) within your wrangler.toml file. +::: + +### Deploy command + +You can run your deploy command using the package manager of your choice. + +If you have added a Wrangler deploy command as a script in your `package.json`, then you can run it by setting it as your deploy command. For example, `npm run deploy`. + +Examples of other deploy commands you can set include: + +| Example Command | Description | +| ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `npx wrangler versions upload` | Upload a [version](/workers/configuration/versions-and-deployments/) of your Worker without deploying it as the Active Deployment. | +| `npx wrangler deploy --assets ./public/` | Deploy your Worker along with static assets from the specified directory. Alternatively, you can use the [assets binding](/workers/static-assets/binding/). | +| `npx wrangler deploy --env staging` | If you have a [Wrangler environment](/workers/ci-cd/builds/advanced-setups/#wrangler-environments) Worker, you should set your deploy command with the environment flag. For more details, see [Advanced Setups](/workers/ci-cd/builds/advanced-setups/#wrangler-environments). | + +### API token + +When you select **Create new token**, a new API token will be created automatically with the following permissions: - **Account:** Account Settings (read), Workers Scripts (edit), Workers KV Storage (edit), Workers R2 Storage (edit) - **Zone:** Workers Routes (edit) for all zones on the account - **User:** User Details (read), Memberships (read) - ::: + +You can configure the permissions of this API token by navigating to **My Profile** > **API Tokens** for user tokens. + +It is recommended to consistently use the same API token across all uploads and deployments of your Worker to maintain consistent access permissions. + +## Framework support + +[Static assets](/workers/static-assets/) and [frameworks](/workers/frameworks/) are now supported in Cloudflare Workers. Learn to set up Workers projects and the commands for each framework in the framework guides: + + diff --git a/src/content/docs/workers/ci-cd/builds/git-integration.mdx b/src/content/docs/workers/ci-cd/builds/git-integration.mdx deleted file mode 100644 index 0ec7d8d1ffc981..00000000000000 --- a/src/content/docs/workers/ci-cd/builds/git-integration.mdx +++ /dev/null @@ -1,68 +0,0 @@ ---- -pcx_content_type: configuration -title: Git Integration -description: Learn how to configure your git integration for Workers Builds -sidebar: - order: 3 ---- - -Cloudflare supports connecting Cloudflare Workers to your GitHub and GitLab repositories to look for new changes to your Worker. Workers does not currently support self-hosted instances of GitHub or GitLab, but you can use `wrangler deploy` with an [external CI/CD provider](/workers/ci-cd/external-cicd/). - -## Organizational access - -You can deploy projects to Cloudflare Workers from your open-source team, company, or side project on both GitHub and GitLab. - -### GitHub - -When authorizing Cloudflare Workers to access a GitHub account, you can specify access to your individual account or an organization that you belong to on GitHub. - -To add Cloudflare Workers installation to an organization, your user account must be an owner or have the appropriate role within the organization (i.e. the GitHub Apps Manager role). More information on these roles can be seen on [GitHub's documentation](https://docs.github.com/en/organizations/managing-peoples-access-to-your-organization-with-roles/roles-in-an-organization#github-app-managers). - -:::caution[GitHub security consideration] - -A GitHub account should only point to one Cloudflare account, however, this is not enforced. If you are setting up Cloudflare with GitHub for your organization, Cloudflare recommends that you limit the scope of the application to only the repositories you intend to build with Workers at the time that you set up your project. You can modify these permissions as you build more applications. - -::: - -### GitLab - -By authorizing Cloudflare Workers to access your GitLab account, you will automatically allow access to organizations, groups, and namespaces your GitLab account can access for use by Cloudflare Workers. Managing access to these organizations and groups is handled by GitLab. - -## Removing access - -### GitHub - -You can remove Cloudflare Workers' access to your GitHub account by viewing the [**Applications** page](https://github.com/settings/installations) on GitHub. The GitHub App is named Cloudflare Workers and Pages, and it is shared between Workers and Pages projects. - -Note that removing access to GitHub will disable new builds for Workers and Pages, though the last build of your project will continue to be hosted via Cloudflare Workers. - -### GitLab - -You can remove Cloudflare Workers' access to your GitLab account by navigating to **User Settings** > **Applications** > **Authorized Applications**. Find the applications called Cloudflare Pages and select the **Revoke** button to revoke access. - -Note that the GitLab application Cloudflare Pages is shared between Workers and Pages projects, and removing access to GitLab will disable new builds for Workers and Pages, though the last build of your project will continue to be hosted via Cloudflare Workers. - -## Reinstall a Git installation - -When encountering Git integration related issues, one potential troubleshooting step is attempting to uninstall and reinstall the GitHub or GitLab application associated with the Cloudflare Workers & Pages installation. The process for each Git provider is provided below. - -### GitHub - -1. Go to the installation settings page on GitHub: - 1. `https://github.com/settings/installations` for individual accounts. - 2. `https://github.com/organizations//settings/installations` for organizational accounts. -2. If the Cloudflare Workers and Pages installation is there, click **Configure**, and click **Uninstall "Cloudflare Workers and Pages"** (if there is no "Cloudflare Workers and Pages" installation, then no action is needed) -3. Go back to the **Workers & Pages** overview page. Select a Worker, then go to **Settings > Build**. -4. In the Build settings, either select the **GitHub button** to establish a GitHub connection, or select **Connect** then go to the Git Account dropdown and select **+ New GitHub Connection** -5. Click the **+ Add account** button, click the GitHub account you want to add, and then click **Install & Authorize**. -6. You should be redirected to the create project page with your GitHub account or organization in the account list. -7. Attempt to make a new deployment with your project which was previously broken. - -### GitLab - -1. Go to your application settings page on GitLab located here: [https://gitlab.com/-/profile/applications](https://gitlab.com/-/profile/applications) -2. Click the "Revoke" button on your Cloudflare Pages installation if it exists. -3. Go back to the **Workers & Pages** overview page. Select a Worker, then go to **Settings > Build**. -4. In the Build settings, either select the **GitLab button** to establish a GitLab connection, or select **Connect** then go to the Git Account dropdown and select **+ New GitLab Connection** -5. You should be redirected to the create project page with your GitLab account or organization in the account list. -6. Attempt to make a new deployment with your project which was previously broken. diff --git a/src/content/docs/workers/ci-cd/builds/git-integration/github-integration.mdx b/src/content/docs/workers/ci-cd/builds/git-integration/github-integration.mdx new file mode 100644 index 00000000000000..31dc52e8fa08d5 --- /dev/null +++ b/src/content/docs/workers/ci-cd/builds/git-integration/github-integration.mdx @@ -0,0 +1,84 @@ +--- +pcx_content_type: reference +title: GitHub integration +description: Learn how to manage your GitHub integration for Workers Builds +sidebar: + order: 2 +--- + +Cloudflare supports connecting your GitHub repository to your Cloudflare Worker, and will automatically deploy your code every time you push a change to a selected branch. + +## Features + +Beyond automatic builds and deployments, the Cloudflare GitHub integration lets you monitor builds directly in GitHub, keeping you informed without leaving your workflow. + +:::note[Upcoming features] +In Beta, Workers Builds supports automatic builds and deployments only from a single selected branch (e.g. `main`). + +Support for building and deploying preview versions from multiple branches will be added soon, along with the ability to generate [Preview URLs](/workers/configuration/previews/) for pull requests (PRs). +::: + +### Check run + +If you have one or multiple Workers connected to a repository (i.e. a [monorepo](/workers/ci-cd/builds/advanced-setups/#monorepos)), you can check on the status of each build within GitHub via [GitHub check runs](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/collaborating-on-repositories-with-code-quality-features/about-status-checks#checks). + +You can see the checks by selecting on the status icon next to a commit within your GitHub repository. In the example below, you can select the green check mark to see the results of the check run. + +![GitHub status](~/assets/images/workers/platform/ci-cd/gh-status-check-runs.png) + +Check runs will appear like the following in your repository. You can select **Details** to view the build (Build ID) and project (Script) associated with each check. + +![GitHub check runs](~/assets/images/workers/platform/ci-cd/workers-builds-gh-check-runs.png) + +Note that when using [build watch paths](/workers/ci-cd/builds/build-watch-paths/), only projects that trigger a build will generate a check run. + +## Manage access + +You can deploy projects to Cloudflare Workers from your company or side project on GitHub using the [Cloudflare Workers & Pages GitHub App](https://github.com/apps/cloudflare-workers-and-pages). + +### Organizational access + +When authorizing Cloudflare Workers to access a GitHub account, you can specify access to your individual account or an organization that you belong to on GitHub. + +To add Cloudflare Workers installation to an organization, your user account must be an owner or have the appropriate role within the organization (i.e. the GitHub Apps Manager role). More information on these roles can be seen on [GitHub's documentation](https://docs.github.com/en/organizations/managing-peoples-access-to-your-organization-with-roles/roles-in-an-organization#github-app-managers). + +:::caution[GitHub security consideration] + +A GitHub account should only point to one Cloudflare account. If you are setting up Cloudflare with GitHub for your organization, Cloudflare recommends that you limit the scope of the application to only the repositories you intend to build with Pages. To modify these permissions, go to the [Applications page](https://github.com/settings/installations) on GitHub and select **Switch settings context** to access your GitHub organization settings. Then, select **Cloudflare Workers & Pages** > For **Repository access**, select **Only select repositories** > select your repositories. + +::: + +### Remove access + +You can remove Cloudflare Workers' access to your GitHub repository or account by going to the [Applications page](https://github.com/settings/installations) on GitHub (if you are in an organization, select Switch settings context to access your GitHub organization settings). The GitHub App is named Cloudflare Workers and Pages, and it is shared between Workers and Pages projects. + +#### Remove Cloudflare access to a GitHub repository + +To remove access to an individual GitHub repository, you can navigate to **Repository access**. Select the **Only select repositories** option, and configure which repositories you would like Cloudflare to have access to. + +![GitHub Repository Access](~/assets/images/workers/platform/ci-cd/github-repository-access.png) + +#### Remove Cloudflare access to the entire GitHub account + +To remove Cloudflare Workers and Pages access to your entire Git account, you can navigate to **Uninstall "Cloudflare Workers and Pages"**, then select **Uninstall**. Removing access to the Cloudflare Workers and Pages app will revoke Cloudflare's access to _all repositories_ from that GitHub account. If you want to only disable automatic builds and deployments, follow the [Disable Build](/workers/ci-cd/builds/#disabling-builds) instructions. + +Note that removing access to GitHub will disable new builds for Workers and Pages project that were connected to those repositories, though your previous deployments will continue to be hosted by Cloudflare Workers. + +### Reinstall the Cloudflare GitHub App + +When encountering Git integration related issues, one potential troubleshooting step is attempting to uninstall and reinstall the GitHub or GitLab application associated with the Cloudflare Pages installation. The process for each Git provider is provided below. + +1. Go to the installation settings page on GitHub: + - Navigate to **Settings > Builds** for the Workers or Pages project and select **Manage** under Git Repository. + - Alternatively, visit these links to find the Cloudflare Workers and Pages installation and select **Configure**: + +| | | +| ---------------- | ---------------------------------------------------------------------------------- | +| **Individual** | `https://github.com/settings/installations` | +| **Organization** | `https://github.com/organizations//settings/installations` | + +2. In the Cloudflare Workers and Pages GitHub App settings page, navigate to **Uninstall "Cloudflare Workers and Pages"** and select **Uninstall**. +3. Go back to the [**Workers & Pages** overview](https://dash.cloudflare.com) page. Select **Create application** > **Pages** > **Connect to Git**. +4. Select the **+ Add account** button, select the GitHub account you want to add, and then select **Install & Authorize**. +5. You should be redirected to the create project page with your GitHub account or organization in the account list. +6. Attempt to make a new deployment with your project which was previously broken. diff --git a/src/content/docs/workers/ci-cd/builds/git-integration/gitlab-integration.mdx b/src/content/docs/workers/ci-cd/builds/git-integration/gitlab-integration.mdx new file mode 100644 index 00000000000000..4b77d2ff221b2c --- /dev/null +++ b/src/content/docs/workers/ci-cd/builds/git-integration/gitlab-integration.mdx @@ -0,0 +1,56 @@ +--- +pcx_content_type: reference +title: GitLab integration +description: Learn how to manage your GitLab integration for Workers Builds +sidebar: + order: 2 +--- + +Cloudflare supports connecting your GitLab repository to your Cloudflare Worker, and will automatically deploy your code every time you push a change to a selected branch. + +## Features + +Beyond automatic builds and deployments, the Cloudflare GitLab integration lets you monitor builds directly in GitLab, keeping you informed without leaving your workflow. + +:::note[Upcoming features] +In Beta, Workers Builds supports automatic builds and deployments only from a single selected branch (e.g. `main`). + +Support for building and deploying preview versions from multiple branches will be added soon, along with the ability to generate [Preview URLs](/workers/configuration/previews/) for pull requests (PRs). +::: + +### Commit Status + +If you have one or multiple Workers connected to a repository (i.e. a [monorepo](/workers/ci-cd/builds/advanced-setups/#monorepos)), you can check on the status of each build within GitLab via [GitLab commit status](https://docs.gitlab.com/ee/user/project/merge_requests/status_checks.html). + +You can see the statuses by selecting the status icon next to a commit or by going to **Build** > **Pipelines** within your GitLab repository. In the example below, you can select on the green check mark to see the results of the check run. + +![GitLab Status](~/assets/images/workers/platform/ci-cd/gl-status-checks.png) + +Check runs will appear like the following in your repository. You can select one of the statuses to view the build on the Cloudflare Dashboard. + +![GitLab Commit Status](~/assets/images/workers/platform/ci-cd/gl-commit-status.png) + +Note that when using [build watch paths](/workers/ci-cd/builds/build-watch-paths/), only projects that trigger a build will generate a commit status. + +## Manage access + +You can deploy projects to Cloudflare Workers from your company or side project on GitLab using the Cloudflare Pages app. + +### Organizational access + +When you authorize Cloudflare Workers to access your GitLab account, you automatically give Cloudflare Workers access to organizations, groups, and namespaces accessed by your GitLab account. Managing access to these organizations and groups is handled by GitLab. + +### Remove access + +You can remove Cloudflare Workers' access to your GitLab account by navigating to [Authorized Applications page](https://gitlab.com/-/profile/applications) on GitLab. Find the applications called Cloudflare Pages and select the **Revoke** button to revoke access. + +Note that the GitLab application Cloudflare Workers is shared between Workers and Pages projects, and removing access to GitLab will disable new builds for Workers and Pages, though your previous deployments will continue to be hosted by Cloudflare Workers. + +### Reinstall the Cloudflare GitLab App + +1. Go to your application settings page on GitLab: [https://gitlab.com/-/profile/applications](https://gitlab.com/-/profile/applications) +2. Click the "Revoke" button on your Cloudflare Workers installation if it exists. +3. Go back to the [**Workers & Pages** overview](https://dash.cloudflare.com) page. Select **Create application** > **Pages** > **Connect to Git**. +4. Select the **+ Add account** button, select the GitLab account you want to add, and then select **Install & Authorize**. +5. You should be redirected to the create project page with your GitLab account or organization in the account list. +6. Attempt to make a new deployment with your project which was previously broken. diff --git a/src/content/docs/workers/ci-cd/builds/git-integration/index.mdx b/src/content/docs/workers/ci-cd/builds/git-integration/index.mdx new file mode 100644 index 00000000000000..b408ab1644c2a7 --- /dev/null +++ b/src/content/docs/workers/ci-cd/builds/git-integration/index.mdx @@ -0,0 +1,38 @@ +--- +pcx_content_type: configuration +title: Git integration +description: Learn how to add and manage your Git integration for Workers Builds +sidebar: + order: 3 +--- + +Cloudflare supports connecting your [GitHub](/workers/ci-cd/builds/git-integration/github-integration/) and [GitLab](/workers/ci-cd/builds/git-integration/gitlab-integration/) repository to your Cloudflare Worker, and will automatically deploy your code every time you push a change to a selected branch. + +Adding a Git integration also lets you monitor build statuses directly in your Git provider using [check runs](/workers/ci-cd/builds/git-integration/github-integration/#check-run) or [commit statuses](/workers/ci-cd/builds/git-integration/gitlab-integration/#commit-status), so you can manage deployments without leaving your workflow. + +## Supported Git Providers + +Cloudflare supports connecting Cloudflare Workers to your GitHub and GitLab repositories. Workers Builds does not currently support connecting self-hosted instances of GitHub or GitLab. + +If you using a different Git provider (e.g. Bitbucket), you can use an [external CI/CD provider (e.g. GitHub Actions)](/workers/ci-cd/external-cicd/) and deploy using [Wrangler CLI](/workers/wrangler/commands/#deploy). + +## Add a Git Integration + +Workers Builds provides direct integration with GitHub and GitLab accounts, including both individual and organization accounts, that are _not_ self-hosted. + +If you do not have a Git account linked to your Cloudflare account, you will be prompted to set up an installation to GitHub or GitLab when [connecting a repository](/workers/ci-cd/builds/#get-started) for the first time, or when adding a new Git account. Follow the prompts and authorize the Cloudflare Git integration. + +![Git providers](~/assets/images/workers/platform/ci-cd/workers-git-provider.png) + +You can check the following pages to see if your Git integration has been installed: + +- [GitHub Applications page](https://github.com/settings/installations) (if you are in an organization, select **Switch settings context** to access your GitHub organization settings) +- [GitLab Authorized Applications page](https://gitlab.com/-/profile/applications) + +For details on providing access to organization accounts, see [GitHub organizational access](/workers/ci-cd/builds/git-integration/github-integration/#organizational-access) and [GitLab organizational access](/workers/ci-cd/builds/git-integration/gitlab-integration/#organizational-access). + +## Manage a Git Integration + +You can manage the Git installation associated with your repository connection by navigating to the Worker, then going to **Settings** > **Builds** and selecting **Manage** under **Git Repository**. + +This can be useful for managing repository access or troubleshooting installation issues by reinstalling. For more details, see the [GitHub](/workers/ci-cd/builds/git-integration/github-integration) and [GitLab](/workers/ci-cd/builds/git-integration/gitlab-integration) guides for how to manage your installation. diff --git a/src/content/docs/workers/ci-cd/builds/index.mdx b/src/content/docs/workers/ci-cd/builds/index.mdx index 32d78bef7eaeff..5944da38fa8ae1 100644 --- a/src/content/docs/workers/ci-cd/builds/index.mdx +++ b/src/content/docs/workers/ci-cd/builds/index.mdx @@ -1,26 +1,48 @@ --- pcx_content_type: concept title: Builds -description: Use Workers Builds to integrate with Git and automatically build and deploy your Worker when you merge a pull request +description: Use Workers Builds to integrate with Git and automatically build and deploy your Worker when pushing a change sidebar: group: badge: text: Beta --- -Workers Builds allows you to connect an existing Worker to a GitHub or GitLab repository to set up automatic builds and deployments for your development workflow. Creating a new Worker from a git repository will be supported soon. +Workers Builds allows you to connect an _existing Worker_ to its GitHub or GitLab repository, enabling automated builds and deployments for your project on push. -## Get Started +Support for creating a _new Worker_ from importing a Git repository is coming soon. -To set up your Git integration with Workers: +## Get started -1. **Select your Worker** in the [Workers & Pages dashboard](https://dash.cloudflare.com) and navigate to **Settings > Build** -2. **Select the Git provider** you'd like to connect to by clicking "Connect". Follow the prompts to install the Cloudflare application on your git account. -3. **Configure your build settings** by selecting your desired git repository, branch, and [configuring](/workers/ci-cd/builds/configuration/) a deploy command and optionally a build command. -4. **Push a commit** to your git repository to trigger your first build and deploy. +If you have an existing Worker and have pushed the project to a Git repository, you can now connect the repository to your Worker, enabling automatic builds and deployments. -## View Build Details +To set up builds for your Worker: -Once a build is in-progress, you can monitor its build logs and view build history by navigating to **View build history** at the bottom of the deployments tab of your Worker. +1. Select your Worker in the [Workers & Pages Dashboard](https://dash.cloudflare.com) and navigate to **Settings > Build**. +2. Select the Git provider you would like to connect to or select **Connect** and follow the prompts to install the Cloudflare [Git integration](/workers/ci-cd/builds/git-integration/) on your Git account. +3. Configure your [build settings](/workers/ci-cd/builds/configuration/) by selecting your desired Git repository, branch, and configure commands for your build. +4. Push a commit to your Git repository to trigger a build and deploy for your Worker. -If the build is successful, you can also view the build details by selecting **View build** in the associated new [version](/workers/configuration/versions-and-deployments/) created under **Version History**. +:::caution + +When connecting a repository to a Workers project, the Worker name in the Cloudflare dashboard must match the `name` in the wrangler.toml file in the specified root directory, or the build will fail. This ensures that the Worker deployed from the repository is consistent with the Worker registered in the Cloudflare dashboard. For details, see [Workers name requirement](/workers/ci-cd/builds/troubleshoot/#workers-name-requirement). + +::: + +## View build and preview URL + +You can monitor a build's status and its build logs by navigating to **View build history** at the bottom of the **Deployments** tab of your Worker. + +If the build is successful, you can view the build details by selecting **View build** in the associated new [version](/workers/configuration/versions-and-deployments/) created under Version History. There you will also find the [preview URL](/workers/configuration/previews/) generated by the version under Version ID. + +:::note[Builds, versions, deployments] + +If a build succeeds, it is uploaded as a version. If the build is configured to deploy (for example, with `wrangler deploy` set as the deploy command), the uploaded version will be automatically promoted to the Active Deployment. + +::: + +## Disconnecting builds + +To disable automatic builds and deployments from your Git repository, go to **Settings** > **Builds** and select **Disconnect** under **Git Repositories**. If you want to switch to a different repository for your Worker, you must first disable builds, then reconnect to select the new repository. + +To disable automatic deployments while still allowing builds to run automatically and save as [versions](/workers/configuration/versions-and-deployments/) (without promoting them to an active deployment), update your deploy command to: `npx wrangler versions upload`. diff --git a/src/content/docs/workers/ci-cd/builds/limits-and-pricing.mdx b/src/content/docs/workers/ci-cd/builds/limits-and-pricing.mdx index dd743b8326f377..f6bf58b7e0f3c6 100644 --- a/src/content/docs/workers/ci-cd/builds/limits-and-pricing.mdx +++ b/src/content/docs/workers/ci-cd/builds/limits-and-pricing.mdx @@ -1,6 +1,6 @@ --- pcx_content_type: concept -title: Limits & Pricing +title: Limits & pricing description: Limits & pricing for Workers Builds sidebar: order: 8 @@ -19,7 +19,7 @@ While in open beta, the following limits are applicable for Workers Builds. Plea | **Memory** | Amount of memory available to the build. | 8GB | | **Disk space** | Disk space available to your build | 8GB | -## Future Pricing +## Future pricing During the beta, Workers Builds will be free to try with the limits stated above. diff --git a/src/content/docs/workers/ci-cd/builds/troubleshoot.mdx b/src/content/docs/workers/ci-cd/builds/troubleshoot.mdx index 1a367c2d24ffb0..4c1bc495026ef5 100644 --- a/src/content/docs/workers/ci-cd/builds/troubleshoot.mdx +++ b/src/content/docs/workers/ci-cd/builds/troubleshoot.mdx @@ -1,18 +1,61 @@ --- pcx_content_type: troubleshooting -title: Troubleshooting -description: Learn about troubleshooting and known issues in Workers Builds. +title: Troubleshooting builds +description: Learn how to troubleshoot common and known issues in Workers Builds. sidebar: order: 9 --- -Workers Builds provides build logs for every build started. You can view build logs by navigating to your **Worker project** > **Deployments** > **View Build History** > **View Build**. +This guide explains how to identify and resolve build errors, as well as troubleshoot common issues in the Workers Builds deployment process. -While Workers Builds is in Open Beta, the following issues and limitations may apply: +To view your build history, go to your Worker project in the Cloudflare dashboard, select **Deployment**, select **View Build History** at the bottom of the page, and select the build you want to view. To retry a build, select the ellipses next to the build and select **Retry build**. Alternatively, you can select **Retry build** on the Build Details page. -- **Worker name:** The Worker name in your Cloudflare dashboard and the Worker name written in the associated `wrangler.toml` must be the same. If they do not match, the deploy will fail, and you must update either the file or dashboard. -- **Updating API tokens:** If you have updated or deleted an API Token, the changes may not be reflected in the Build Configuration settings on the dashboard. If you are encountering authentication errors after updating your build's API Token, we recommend creating a new API Token for the build. -- **Failed builds stuck in in-progress:** If your build has failed but the status still show that the build is "In-progress", you should cancel the build, review your build configuration, then retry the build. -- **Git integration:** If you are running into errors associated with your git integration, you can try [removing access](/workers/ci-cd/builds/git-integration/#removing-access) to your GitHub or GitLab from Cloudflare, then [reinstalling the git integration](/workers/ci-cd/builds/git-integration/#reinstall-a-git-installation). +## Known issues or limitations -If you discover additional issues or would like to provide feedback, please notify us in the [Discord](https://discord.com/channels/595317990191398933/1052656806058528849). +Here are some common build errors that may surface in the build logs or general issues and how you can resolve them. + +### Workers name requirement + +`✘ [ERROR] The name in your wrangler.toml file () must match the name of your Worker. Please update the name field in your wrangler.toml file.` + +When connecting a Git repository to your Workers project, the specified name for the Worker on the Cloudflare dashboard must match the `name` argument in the wrangler.toml file located in the specified root directory. If it does not match, update the name field in your wrangler.toml file to match the name of the Worker on the dashboard. + +The build system uses the `name` argument in the wrangler.toml to determine which Worker to deploy to Cloudflare's global network. This requirement ensures consistency between the Worker's name on the dashboard and the deployed Worker. + +:::note +This does not apply to [Wrangler Environments](/workers/wrangler/environments/) if the Worker name before the `-` suffix matches the name in wrangler.toml. + +For example, a Worker named `my-worker-staging` on the dashboard can be deployed from a repository that contains a wrangler.toml with the arguments `name = my-worker` and `[env.staging]` using the deploy command `npx wrangler deploy --env staging`. +::: + +### Missing wrangler.toml + +`✘ [ERROR] Missing entry-point: The entry-point should be specified via the command line (e.g. wrangler deploy path/to/script) or the main config field.` + +If you see this error, a wrangler.toml is likely missing from the root directory. Navigate to **Settings** > **Build** > **Build Configuration** to update the root directory, or add a [wrangler.toml](/workers/wrangler/configuration/) to the specified directory. + +### Incorrect account_id + +`Could not route to /client/v4/accounts//workers/services/, perhaps your object identifier is invalid? [code: 7003]` + +If you see this error, the wrangler.toml likely has an `account_id` for a different account. Remove the `account_id` argument or update it with your account's `account_id`, available in **Workers & Pages Overview** under **Account Details**. + +### Stale API token + +` Failed: The build token selected for this build has been deleted or rolled and cannot be used for this build. Please update your build token in the Worker Builds settings and retry the build.` + +The API Token dropdown in Build Configuration settings may show stale tokens that were edited, deleted, or rolled. If you encounter an error due to a stale token, create a new API Token and select it for the build. + +### Build timed out + +`Build was timed out` + +There is a maximum build duration of 20 minutes. If a build exceeds this time, then the build will be terminated and the above error log is shown. For more details, see [Workers Builds limits](/workers/ci-cd/builds/limits-and-pricing/). + +### Git integration issues + +If you are running into errors associated with your Git integration, you can try removing access to your [GitHub](/workers/ci-cd/builds/git-integration/github-integration/#removing-access) or [GitLab](/workers/ci-cd/builds/git-integration/gitlab-integration/#removing-access) integration from Cloudflare, then reinstalling the [GitHub](/workers/ci-cd/builds/git-integration/github-integration/#reinstall-a-git-integration) or [GitLab](/workers/ci-cd/builds/git-integration/gitlab-integration/#reinstall-a-git-integration) integration. + +## For additional support + +If you discover additional issues or would like to provide feedback, reach out to us in the [Cloudflare Developers Discord](https://discord.com/channels/595317990191398933/1052656806058528849). diff --git a/src/content/docs/workers/ci-cd/external-cicd/gitlab-pipelines.mdx b/src/content/docs/workers/ci-cd/external-cicd/gitlab-cicd.mdx similarity index 99% rename from src/content/docs/workers/ci-cd/external-cicd/gitlab-pipelines.mdx rename to src/content/docs/workers/ci-cd/external-cicd/gitlab-cicd.mdx index 87e8f0f69000c7..ecc25e37d5ac5b 100644 --- a/src/content/docs/workers/ci-cd/external-cicd/gitlab-pipelines.mdx +++ b/src/content/docs/workers/ci-cd/external-cicd/gitlab-cicd.mdx @@ -1,6 +1,6 @@ --- pcx_content_type: how-to -title: GitLab Pipelines +title: GitLab CI/CD description: Integrate Workers development into your existing GitLab Pipelines workflows. --- diff --git a/src/content/docs/workers/ci-cd/external-cicd/index.mdx b/src/content/docs/workers/ci-cd/external-cicd/index.mdx index 2dd07281ac60e3..77c39b6fb084af 100644 --- a/src/content/docs/workers/ci-cd/external-cicd/index.mdx +++ b/src/content/docs/workers/ci-cd/external-cicd/index.mdx @@ -9,6 +9,6 @@ Deploying Cloudflare Workers with CI/CD ensures reliable, automated deployments If you prefer to use your existing CI/CD provider instead of [Workers Builds](/workers/ci-cd/builds/), this section offers guides for popular providers: - [**GitHub Actions**](/workers/ci-cd/external-cicd/github-actions/) -- [**GitLab Pipelines**](/workers/ci-cd/external-cicd/gitlab-pipelines/) +- [**GitLab CI/CD**](/workers/ci-cd/external-cicd/gitlab-cicd/) Other CI/CD options including but not limited to Terraform, CircleCI, Jenkins, and more, can also be used to deploy Workers following a similar set up process. diff --git a/src/content/docs/workers/ci-cd/index.mdx b/src/content/docs/workers/ci-cd/index.mdx index 1e647cea4a41d2..ae936ee0273a91 100644 --- a/src/content/docs/workers/ci-cd/index.mdx +++ b/src/content/docs/workers/ci-cd/index.mdx @@ -6,15 +6,16 @@ sidebar: order: 8 --- -You can set up continuous integration and continuous deployment (CI/CD) for your Workers by using either the native build system, [Workers Builds](#workers-builds), or using [external providers](#external-cicd) to optimize your development workflow. +You can set up continuous integration and continuous deployment (CI/CD) for your Workers by using either the integrated build system, [Workers Builds](#workers-builds), or using [external providers](#external-cicd) to optimize your development workflow. ## Why use CI/CD? -It is best practice to deploy your Workers with a CI/CD pipeline to automate the build and deployment process. A CI/CD pipeline offers several advantages: +Using a CI/CD pipeline to deploy your Workers is a best practice because it: -- Streamlines the build and deployment process, eliminating the need for manual adhoc `wrangler deploy` commands -- Ensures your Worker is always built and deployed in a uniform environment, reducing variability and potential errors -- Simplifies managing access to production credentials +- Automates the build and deployment process, removing the need for manual `wrangler deploy` commands. +- Ensures consistent builds and deployments across your team by using the same source control management (SCM) system. +- Reduces variability and errors by deploying in a uniform environment. +- Simplifies managing access to production credentials. ## Which CI/CD should I use? @@ -22,20 +23,20 @@ Choose [Workers Builds](/workers/ci-cd/builds) if you want a fully integrated so We recommend using [external CI/CD providers](/workers/ci-cd/external-cicd) if: -- You have a self-hosted instance of GitHub or GitLabs, which is currently not supported in Workers Builds' git integration -- You are using a git provider that is not GitHub or GitLab +- You have a self-hosted instance of GitHub or GitLabs, which is currently not supported in Workers Builds' [Git integration](/workers/ci-cd/builds/git-integration/) +- You are using a Git provider that is not GitHub or GitLab ## Workers Builds -[Workers Builds](/workers/ci-cd/builds) is Cloudflare's native CI/CD system that allows you to integrate with GitHub or GitLab, and automatically deploy your changes with each new commit. +[Workers Builds](/workers/ci-cd/builds) is Cloudflare's native CI/CD system that allows you to integrate with GitHub or GitLab to automatically deploy changes with each new push to a selected branch (e.g. `main`). ![Workers Builds Workflow Diagram](~/assets/images/workers/platform/ci-cd/workers-builds-workflow.png) -Ready to streamline your Workers deployment? Get started with [Workers Builds](/workers/ci-cd/builds/#get-started). +Ready to streamline your Workers deployments? Get started with [Workers Builds](/workers/ci-cd/builds/#get-started). ## External CI/CD You can also choose to set up your CI/CD pipeline with an external provider. - [GitHub Actions](/workers/ci-cd/external-cicd/github-actions/) -- [GitLab Pipelines](/workers/ci-cd/external-cicd/gitlab-pipelines/) +- [GitLab CI/CD](/workers/ci-cd/external-cicd/gitlab-cicd/) diff --git a/src/content/docs/workers/configuration/compatibility-dates.mdx b/src/content/docs/workers/configuration/compatibility-dates.mdx index efc2f169a5a7db..7c2d819ff1fc66 100644 --- a/src/content/docs/workers/configuration/compatibility-dates.mdx +++ b/src/content/docs/workers/configuration/compatibility-dates.mdx @@ -6,6 +6,8 @@ head: [] description: Opt into a specific version of the Workers runtime for your Workers project. --- +import { WranglerConfig } from "~/components"; + Cloudflare regularly updates the Workers runtime. These updates apply to all Workers globally and should never cause a Worker that is already deployed to stop functioning. Sometimes, though, some changes may be backwards-incompatible. In particular, there might be bugs in the runtime API that existing Workers may inadvertently depend upon. Cloudflare implements bug fixes that new Workers can opt into while existing Workers will continue to see the buggy behavior to prevent breaking deployed Workers. The compatibility date and flags are how you, as a developer, opt into these runtime changes. [Compatibility flags](/workers/configuration/compatibility-flags) will often have a date in which they are enabled by default, and so, by specifying a `compatibility_date` for your Worker, you can quickly enable all of these various compatibility flags up to, and including, that date. @@ -23,9 +25,7 @@ However, even though you do not need to update the `compatibility_date` field, i #### Via Wrangler -The compatibility date can be set in a Worker's [`wrangler.toml`](/workers/wrangler/configuration/) file. - -import { WranglerConfig } from "~/components"; +The compatibility date can be set in a Worker's [`wrangler.toml / wrangler.json` file](/workers/wrangler/configuration/). diff --git a/src/content/docs/workers/configuration/compatibility-flags.mdx b/src/content/docs/workers/configuration/compatibility-flags.mdx index 10a4bb927fc827..7ffa42342644dd 100644 --- a/src/content/docs/workers/configuration/compatibility-flags.mdx +++ b/src/content/docs/workers/configuration/compatibility-flags.mdx @@ -6,7 +6,7 @@ head: [] description: Opt into a specific features of the Workers runtime for your Workers project. --- -import { CompatibilityFlags } from "~/components"; +import { CompatibilityFlags, WranglerConfig } from "~/components"; Compatibility flags enable specific features. They can be useful if you want to help the Workers team test upcoming changes that are not yet enabled by default, or if you need to hold back a change that your code depends on but still want to apply other compatibility changes. @@ -18,12 +18,10 @@ You may provide a list of `compatibility_flags`, which enable or disable specifi #### Via Wrangler -Compatibility flags can be set in a Worker's [`wrangler.toml`](/workers/wrangler/configuration/) file. +Compatibility flags can be set in a Worker's [`wrangler.toml / wrangler.json` file](/workers/wrangler/configuration/). This example enables the specific flag `formdata_parser_supports_files`, which is described [below](/workers/configuration/compatibility-flags/#formdata-parsing-supports-file). As of the specified date, `2021-09-14`, this particular flag was not yet enabled by default, but, by specifying it in `compatibility_flags`, we can enable it anyway. `compatibility_flags` can also be used to disable changes that became the default in the past. -import { WranglerConfig } from "~/components"; - ```toml diff --git a/src/content/docs/workers/configuration/cron-triggers.mdx b/src/content/docs/workers/configuration/cron-triggers.mdx index 76d2c88f8e9527..d58257ace20de3 100644 --- a/src/content/docs/workers/configuration/cron-triggers.mdx +++ b/src/content/docs/workers/configuration/cron-triggers.mdx @@ -5,6 +5,8 @@ head: [] description: Enable your Worker to be executed on a schedule. --- +import { WranglerConfig } from "~/components"; + ## Background Cron Triggers allow users to map a cron expression to a Worker using a [`scheduled()` handler](/workers/runtime-apis/handlers/scheduled/) that enables Workers to be executed on a schedule. @@ -34,13 +36,11 @@ Refer to the following examples to write your code: After you have updated your Worker code to include a `"scheduled"` event, you must update your Worker project configuration. -#### Via `wrangler.toml` +#### Via the `wrangler.toml / wrangler.json` file -If a Worker is managed with Wrangler, Cron Triggers should be exclusively managed through the [`wrangler.toml`](/workers/wrangler/configuration/) file. +If a Worker is managed with Wrangler, Cron Triggers should be exclusively managed through the [`wrangler.toml / wrangler.json` file](/workers/wrangler/configuration/). -Refer to the example below for a sample `wrangler.toml` Cron Triggers configuration: - -import { WranglerConfig } from "~/components"; +Refer to the example below for a Cron Triggers configuration: @@ -55,7 +55,7 @@ crons = [ "*/3 * * * *", "0 15 1 * *", "59 23 LW * *" ] -You also can set a different Cron Trigger for each [environment](/workers/wrangler/environments/) in your `wrangler.toml`. You need to put the `[triggers]` table under your chosen environment. For example: +You also can set a different Cron Trigger for each [environment](/workers/wrangler/environments/) in your `wrangler.toml / wrangler.json` file. You need to put the `[triggers]` table under your chosen environment. For example: @@ -173,7 +173,7 @@ To delete a Cron Trigger on a deployed Worker via the dashboard: :::note -You can only delete Cron Triggers using the Cloudflare dashboard (and not through your `wrangler.toml` file). +You can only delete Cron Triggers using the Cloudflare dashboard (and not through your Wrangler file). ::: @@ -198,5 +198,5 @@ Green Compute can be configured at the account level: ## Related resources -- [Triggers](/workers/wrangler/configuration/#triggers) - Review `wrangler.toml` syntax for Cron Triggers. +- [Triggers](/workers/wrangler/configuration/#triggers) - Review `wrangler.toml / wrangler.json` file syntax for Cron Triggers. - Learn how to access Cron Triggers in [ES modules syntax](/workers/reference/migrate-to-module-workers/) for an optimized experience. diff --git a/src/content/docs/workers/configuration/environment-variables.mdx b/src/content/docs/workers/configuration/environment-variables.mdx index d64e189fd25748..92c7f177c05600 100644 --- a/src/content/docs/workers/configuration/environment-variables.mdx +++ b/src/content/docs/workers/configuration/environment-variables.mdx @@ -6,7 +6,7 @@ description: Environment variables are a type of binding that allow you to attac --- -import { Render, TabItem, Tabs } from "~/components" +import { Render, TabItem, Tabs, WranglerConfig } from "~/components" ## Background @@ -16,7 +16,7 @@ Text strings and JSON values are not encrypted and are useful for storing applic ## Add environment variables via Wrangler -Text and JSON values are defined via the `[vars]` configuration in your `wrangler.toml` file. In the following example, `API_HOST` and `API_ACCOUNT_ID` are text values and `SERVICE_X_DATA` is a JSON value. +Text and JSON values are defined via the `[vars]` configuration in your Wrangler file. In the following example, `API_HOST` and `API_ACCOUNT_ID` are text values and `SERVICE_X_DATA` is a JSON value. @@ -52,8 +52,6 @@ export default { To define environment variables for different environments, refer to the example below: -import { WranglerConfig } from "~/components"; - ```toml @@ -72,14 +70,14 @@ SERVICE_X_DATA = { URL = "service-x-api.prod.example", MY_ID = 456 } -For local development with `wrangler dev`, variables in `wrangler.toml` are automatically overridden by any values defined in a `.dev.vars` file located in the root directory of your worker. This is useful for providing values you do not want to check in to source control. +For local development with `wrangler dev`, variables in the `wrangler.toml / wrangler.json` file are automatically overridden by any values defined in a `.dev.vars` file located in the root directory of your worker. This is useful for providing values you do not want to check in to source control. ```shell API_HOST = "localhost:4000" API_ACCOUNT_ID = "local_example_user" ``` -Alternatively, you can specify per-environment values in `wrangler.toml` and provide an `environment` value via the `env` flag when developing locally like so `wrangler dev --env=local`. +Alternatively, you can specify per-environment values in the `wrangler.toml / wrangler.json` file and provide an `environment` value via the `env` flag when developing locally like so `wrangler dev --env=local`. ## Add environment variables via the dashboard diff --git a/src/content/docs/workers/configuration/previews.mdx b/src/content/docs/workers/configuration/previews.mdx index 3ba95c1e0652b2..70e9bc1cfd2cf8 100644 --- a/src/content/docs/workers/configuration/previews.mdx +++ b/src/content/docs/workers/configuration/previews.mdx @@ -8,7 +8,7 @@ sidebar: description: Preview URLs allow you to preview new versions of your project without deploying it to production. --- -import { Render } from "~/components"; +import { Render, WranglerConfig } from "~/components"; Preview URLs allow you to preview new versions of your Worker without deploying it to production. @@ -60,7 +60,7 @@ You must press enter after you input your Application domain for it to save. You 6. Go to the next page. 7. Add a name for your access policy (for example, "Allow employees access to preview URLs for my-worker"). -8. In the **Configure rules** section create a new rule with the **Emails** selector, or any other attributes which you wish to gate access to previews with. +8. In the **Configure rules** section create a new rule with the **Emails** selector, or any other attributes which you wish to gate access to previews with. 9. Enter the emails you want to authorize. View [access policies](/cloudflare-one/policies/access/#selectors) to learn about configuring alternate rules. 10. Go to the next page. 11. Add application. @@ -77,15 +77,13 @@ To disable Preview URLs for a Worker: 4. On "Preview URLs" click "Disable". 5. Confirm you want to disable. -### Disabling Preview URLs in `wrangler.toml` +### Disabling Preview URLs in the `wrangler.toml / wrangler.json` file :::note Wrangler 3.91.0 or higher is required to use this feature. ::: -To disable Preview URLs for a Worker, include the following in your Worker's `wrangler.toml` file: - -import { WranglerConfig } from "~/components"; +To disable Preview URLs for a Worker, include the following in your Worker's Wrangler file: @@ -99,7 +97,7 @@ When you redeploy your Worker with this change, Preview URLs will be disabled. :::caution -If you disable Preview URLs in the Cloudflare dashboard but do not update your Worker's `wrangler.toml` file with `preview_urls = false`, then Preview URLs will be re-enabled the next time you deploy your Worker with Wrangler. +If you disable Preview URLs in the Cloudflare dashboard but do not update your Worker's Wrangler file with `preview_urls = false`, then Preview URLs will be re-enabled the next time you deploy your Worker with Wrangler. ::: ## Limitations diff --git a/src/content/docs/workers/configuration/routing/custom-domains.mdx b/src/content/docs/workers/configuration/routing/custom-domains.mdx index b84a05ded426af..8cf7e10d0838be 100644 --- a/src/content/docs/workers/configuration/routing/custom-domains.mdx +++ b/src/content/docs/workers/configuration/routing/custom-domains.mdx @@ -4,6 +4,8 @@ title: Custom Domains --- +import { WranglerConfig } from "~/components"; + ## Background Custom Domains allow you to connect your Worker to a domain or subdomain, without having to make changes to your DNS settings or perform any certificate management. After you set up a Custom Domain for your Worker, Cloudflare will create DNS records and issue necessary certificates on your behalf. The created DNS records will point directly to your Worker. Unlike [Routes](/workers/configuration/routing/routes/#set-up-a-route), Custom Domains point all paths of a domain or subdomain to your Worker. @@ -47,11 +49,9 @@ To set up a Custom Domain in the dashboard: After you have added the domain or subdomain, Cloudflare will create a new DNS record for you. You can add multiple Custom Domains. -### Set up a Custom Domain in your `wrangler.toml` +### Set up a Custom Domain in your `wrangler.toml / wrangler.json` file -To configure a Custom Domain in your `wrangler.toml`, add the `custom_domain=true` option on each pattern under `routes`. For example, to configure a Custom Domain: - -import { WranglerConfig } from "~/components"; +To configure a Custom Domain in your `wrangler.toml / wrangler.json` file, add the `custom_domain=true` option on each pattern under `routes`. For example, to configure a Custom Domain: @@ -156,11 +156,11 @@ To migrate the route `example.com/*`: ### Migrate from Routes via Wrangler -To migrate the route `example.com/*` in your `wrangler.toml`: +To migrate the route `example.com/*` in your `wrangler.toml / wrangler.json` file: 1. Log in to the [Cloudflare dashboard](https://dash.cloudflare.com) and select your account. 2. Go to **DNS** and delete the CNAME record for `example.com`. -3. Add the following to your `wrangler.toml` file: +3. Add the following to your Wrangler file: diff --git a/src/content/docs/workers/configuration/routing/routes.mdx b/src/content/docs/workers/configuration/routing/routes.mdx index 38a3c8892f5fdd..417be53e981bc7 100644 --- a/src/content/docs/workers/configuration/routing/routes.mdx +++ b/src/content/docs/workers/configuration/routing/routes.mdx @@ -3,6 +3,8 @@ pcx_content_type: concept title: Routes --- +import { WranglerConfig } from "~/components"; + ## Background Routes allow users to map a URL pattern to a Worker. When a request comes in to the Cloudflare network that matches the specified URL pattern, your Worker will execute on that route. @@ -47,13 +49,11 @@ To set up a route in the dashboard: 4. Select the zone and enter the route pattern. 5. Select **Add route**. -### Set up a route in `wrangler.toml` +### Set up a route in the `wrangler.toml / wrangler.json` file Before you set up a route, make sure you have a DNS record set up for the [domain](/dns/manage-dns-records/how-to/create-zone-apex/) or [subdomain](/dns/manage-dns-records/how-to/create-subdomain/) you would like to route to. -To configure a route using your `wrangler.toml` file, refer to the following example. - -import { WranglerConfig } from "~/components"; +To configure a route using your Wrangler file, refer to the following example. diff --git a/src/content/docs/workers/configuration/routing/workers-dev.mdx b/src/content/docs/workers/configuration/routing/workers-dev.mdx index 25c7c26915dfaa..546227fa80916a 100644 --- a/src/content/docs/workers/configuration/routing/workers-dev.mdx +++ b/src/content/docs/workers/configuration/routing/workers-dev.mdx @@ -3,6 +3,8 @@ pcx_content_type: concept title: workers.dev --- +import { WranglerConfig } from "~/components"; + Cloudflare Workers accounts come with a `workers.dev` subdomain that is configurable in the Cloudflare dashboard. Your `workers.dev` subdomain allows you getting started quickly by deploying Workers without first onboarding your custom domain to Cloudflare. It's recommended to run production Workers on a [Workers route or custom domain](/workers/configuration/routing/), rather than on your `workers.dev` subdomain. Your `workers.dev` subdomain is treated as a [Free website](https://www.cloudflare.com/plans/) and is intended for personal or hobby projects that aren't business-critical. @@ -29,11 +31,9 @@ To disable the `workers.dev` route for a Worker: 4. On `workers.dev` click "Disable". 5. Confirm you want to disable. -### Disabling `workers.dev` in `wrangler.toml` +### Disabling `workers.dev` in the `wrangler.toml / wrangler.json` file -To disable the `workers.dev` route for a Worker, include the following in your Worker's `wrangler.toml` file: - -import { WranglerConfig } from "~/components"; +To disable the `workers.dev` route for a Worker, include the following in your Worker's Wrangler file: @@ -45,11 +45,11 @@ workers_dev = false When you redeploy your Worker with this change, the `workers.dev` route will be disabled. Disabling your `workers.dev` route does not disable Preview URLs. Learn how to [disable Preview URLs](/workers/configuration/previews/#disabling-preview-urls). -If you do not specify `workers_dev = false` but add a [`routes` component](/workers/wrangler/configuration/#routes) to your `wrangler.toml`, the value of `workers_dev` will be inferred as `false` on the next deploy. +If you do not specify `workers_dev = false` but add a [`routes` component](/workers/wrangler/configuration/#routes) to your `wrangler.toml / wrangler.json` file, the value of `workers_dev` will be inferred as `false` on the next deploy. :::caution -If you disable your `workers.dev` route in the Cloudflare dashboard but do not update your Worker's `wrangler.toml` file with `workers_dev = false`, the `workers.dev` route will be re-enabled the next time you deploy your Worker with Wrangler. +If you disable your `workers.dev` route in the Cloudflare dashboard but do not update your Worker's Wrangler file with `workers_dev = false`, the `workers.dev` route will be re-enabled the next time you deploy your Worker with Wrangler. ::: ## Limitations @@ -59,4 +59,4 @@ If you disable your `workers.dev` route in the Cloudflare dashboard but do not u ## Related resources - [Announcing `workers.dev`](https://blog.cloudflare.com/announcing-workers-dev) -- [`wrangler.toml` routes configuration](/workers/wrangler/configuration/#types-of-routes) +- [Wrangler routes configuration](/workers/wrangler/configuration/#types-of-routes) diff --git a/src/content/docs/workers/configuration/sites/configuration.mdx b/src/content/docs/workers/configuration/sites/configuration.mdx index a0e70ed61fd4cd..26203d3d2b6f3d 100644 --- a/src/content/docs/workers/configuration/sites/configuration.mdx +++ b/src/content/docs/workers/configuration/sites/configuration.mdx @@ -6,21 +6,21 @@ sidebar: --- -import { Render } from "~/components" +import { Render, WranglerConfig } from "~/components" Workers Sites require the latest version of [Wrangler](https://github.com/cloudflare/workers-sdk/tree/main/packages/wrangler). -## wrangler.toml +## Wrangler configuration file -There are a few specific configuration settings for Workers Sites in your `wrangler.toml` file: +There are a few specific configuration settings for Workers Sites in your Wrangler file: * `bucket` required - * The directory containing your static assets, path relative to your `wrangler.toml`. Example: `bucket = "./public"`. + * The directory containing your static assets, path relative to your `wrangler.toml / wrangler.json` file. Example: `bucket = "./public"`. * `include` optional @@ -41,9 +41,7 @@ If your project uses [environments](/workers/wrangler/environments/), make sure ::: -Example of a `wrangler.toml`: - -import { WranglerConfig } from "~/components"; +Example of a `wrangler.toml / wrangler.json` file: @@ -80,7 +78,7 @@ This means that you should use gitignore semantics when declaring which director ### Exclusively including files/directories -If you want to include only a certain set of files or directories in your `bucket`, you can add an `include` field to your `[site]` section of your `wrangler.toml` file: +If you want to include only a certain set of files or directories in your `bucket`, you can add an `include` field to your `[site]` section of your Wrangler file: @@ -98,7 +96,7 @@ Wrangler will only upload files or directories matching the patterns in the `inc ### Excluding files/directories -If you want to exclude files or directories in your `bucket`, you can add an `exclude` field to your `[site]` section of your `wrangler.toml` file: +If you want to exclude files or directories in your `bucket`, you can add an `exclude` field to your `[site]` section of your Wrangler file: diff --git a/src/content/docs/workers/configuration/sites/start-from-existing.mdx b/src/content/docs/workers/configuration/sites/start-from-existing.mdx index 6c00ad676f8aa8..efcbaacb27c500 100644 --- a/src/content/docs/workers/configuration/sites/start-from-existing.mdx +++ b/src/content/docs/workers/configuration/sites/start-from-existing.mdx @@ -21,7 +21,7 @@ To deploy a pre-existing static site project, start with a pre-generated site. W ## Getting started -1. Run the `wrangler init` command in the root of your project’s directory to generate a basic Worker: +1. Run the `wrangler init` command in the root of your project's directory to generate a basic Worker: ```sh wrangler init -y @@ -29,12 +29,12 @@ To deploy a pre-existing static site project, start with a pre-generated site. W This command adds/update the following files: - - `wrangler.toml`: The file containing project configuration. + - `wrangler.json`: The file containing project configuration. - `package.json`: Wrangler `devDependencies` are added. - `tsconfig.json`: Added if not already there to support writing the Worker in TypeScript. - `src/index.ts`: A basic Cloudflare Worker, written in TypeScript. -2. Add your site’s build/output directory to the `wrangler.toml` file: +2. Add your site's build/output directory to the Wrangler file: @@ -124,7 +124,7 @@ async function handleEvent(event) { npx wrangler deploy ``` -6. Deploy your site to a [custom domain](/workers/configuration/routing/custom-domains/) that you own and have already attached as a Cloudflare zone. Add a `route` property to the `wrangler.toml` file. +6. Deploy your site to a [custom domain](/workers/configuration/routing/custom-domains/) that you own and have already attached as a Cloudflare zone. Add a `route` property to the Wrangler file. diff --git a/src/content/docs/workers/configuration/sites/start-from-scratch.mdx b/src/content/docs/workers/configuration/sites/start-from-scratch.mdx index f7312ead5b407d..c5198648b52b17 100644 --- a/src/content/docs/workers/configuration/sites/start-from-scratch.mdx +++ b/src/content/docs/workers/configuration/sites/start-from-scratch.mdx @@ -42,11 +42,11 @@ The template project contains the following files and directories: - `public`: The static assets for your project. By default it contains an `index.html` and a `favicon.ico`. - `src`: The Worker configured for serving your assets. You do not need to edit this but if you want to see how it works or add more functionality to your Worker, you can edit `src/index.ts`. -- `wrangler.toml`: The file containing project configuration. +- `wrangler.json`: The file containing project configuration. The `bucket` property tells Wrangler where to find the static assets (e.g. `site = { bucket = "./public" }`). - `package.json`/`package-lock.json`: define the required Node.js dependencies. -## Customize `wrangler.toml`: +## Customize the `wrangler.toml / wrangler.json` file: - Change the `name` property to the name of your project: diff --git a/src/content/docs/workers/configuration/sites/start-from-worker.mdx b/src/content/docs/workers/configuration/sites/start-from-worker.mdx index 403b6dddbb553a..46d789a4db225d 100644 --- a/src/content/docs/workers/configuration/sites/start-from-worker.mdx +++ b/src/content/docs/workers/configuration/sites/start-from-worker.mdx @@ -17,7 +17,7 @@ If you have a pre-existing Worker project, you can use Workers Sites to serve st 1. Create a directory that will contain the assets in the root of your project (for example, `./public`) -2. Add configuration to your `wrangler.toml` file to point to it. +2. Add configuration to your Wrangler file to point to it. diff --git a/src/content/docs/workers/configuration/smart-placement.mdx b/src/content/docs/workers/configuration/smart-placement.mdx index 5db5172f9093f2..13f448cd4862ac 100644 --- a/src/content/docs/workers/configuration/smart-placement.mdx +++ b/src/content/docs/workers/configuration/smart-placement.mdx @@ -45,7 +45,7 @@ To enable Smart Placement via Wrangler: 1. Make sure that you have `wrangler@2.20.0` or later [installed](/workers/wrangler/install-and-update/). -2. Add the following to your Worker project's `wrangler.toml` file: +2. Add the following to your Worker project's Wrangler file: diff --git a/src/content/docs/workers/configuration/versions-and-deployments/index.mdx b/src/content/docs/workers/configuration/versions-and-deployments/index.mdx index 0bb98d87f708e4..86e982765b9f91 100644 --- a/src/content/docs/workers/configuration/versions-and-deployments/index.mdx +++ b/src/content/docs/workers/configuration/versions-and-deployments/index.mdx @@ -17,17 +17,9 @@ Using versions and deployments is useful if: - You want to monitor for performance differences when deploying new versions of your Worker. - You have a CI/CD pipeline configured for Workers but want to cut manual releases. -:::note - -Versions and deployments are in **beta and under active development**. Refer to [Limits](/workers/configuration/versions-and-deployments/#limits) before using these features. - -Provide your feedback on versions and deployments through the [feedback form](https://www.cloudflare.com/lp/developer-week-deployments). - -::: - ## Versions -A version is defined by the state of code as well as the state of configuration in a Worker's [`wrangler.toml`](/workers/wrangler/configuration/) file. Versions track historical changes to [bundled code](/workers/wrangler/bundling/), [static assets](/workers/static-assets/) and changes to configuration like [bindings](/workers/runtime-apis/bindings/) and [compatibility date and compatibility flags](/workers/configuration/compatibility-dates/) over time. +A version is defined by the state of code as well as the state of configuration in a Worker's [Wrangler configuration](/workers/wrangler/configuration/) file. Versions track historical changes to [bundled code](/workers/wrangler/bundling/), [static assets](/workers/static-assets/) and changes to configuration like [bindings](/workers/runtime-apis/bindings/) and [compatibility date and compatibility flags](/workers/configuration/compatibility-dates/) over time. Versions also track metadata associated with a version, including: the version ID, the user that created the version, deploy source, and timestamp. Optionally, a version message and version tag can be configured on version upload. diff --git a/src/content/docs/workers/examples/cron-trigger.mdx b/src/content/docs/workers/examples/cron-trigger.mdx index 1260b238dd734b..5facd46b6575d0 100644 --- a/src/content/docs/workers/examples/cron-trigger.mdx +++ b/src/content/docs/workers/examples/cron-trigger.mdx @@ -13,7 +13,7 @@ sidebar: description: Set a Cron Trigger for your Worker. --- -import { TabItem, Tabs } from "~/components"; +import { TabItem, Tabs, WranglerConfig } from "~/components"; @@ -46,9 +46,7 @@ export default { Refer to [Cron Triggers](/workers/configuration/cron-triggers/) for more information on how to add a Cron Trigger. -If you are deploying with Wrangler, set the cron syntax (once per hour as shown below) by adding this to your `wrangler.toml` file: - -import { WranglerConfig } from "~/components"; +If you are deploying with Wrangler, set the cron syntax (once per hour as shown below) by adding this to your Wrangler file: @@ -63,7 +61,7 @@ crons = ["0 * * * *"] -You also can set a different Cron Trigger for each [environment](/workers/wrangler/environments/) in your `wrangler.toml`. You need to put the `[triggers]` table under your chosen environment. For example: +You also can set a different Cron Trigger for each [environment](/workers/wrangler/environments/) in your `wrangler.toml / wrangler.json` file. You need to put the `[triggers]` table under your chosen environment. For example: diff --git a/src/content/docs/workers/examples/turnstile-html-rewriter.mdx b/src/content/docs/workers/examples/turnstile-html-rewriter.mdx index 075ca432742fda..05ee91234faa4a 100644 --- a/src/content/docs/workers/examples/turnstile-html-rewriter.mdx +++ b/src/content/docs/workers/examples/turnstile-html-rewriter.mdx @@ -23,7 +23,8 @@ import { TabItem, Tabs } from "~/components"; ```js export default { async fetch(request, env) { - const SITE_KEY = env.SITE_KEY + const SITE_KEY = env.SITE_KEY; // The Turnstile Sitekey of your widget (pass as env or secret) + const TURNSTILE_ATTR_NAME = 'your_id_to_replace'; // The id of the element to put a Turnstile widget in let res = await fetch(request) // Instantiate the API to run on specific elements, for example, `head`, `div` @@ -32,17 +33,15 @@ export default { // `.on` attaches the element handler and this allows you to match on element/attributes or to use the specific methods per the API .on('head', { element(element) { - // In this case, you are using `append` to add a new script to the `head` element element.append(``, { html: true }); }, }) .on('div', { element(element) { - - // You are using the `getAttribute` method here to retrieve the `id` or `class` of an element - if (element.getAttribute('id') === ) { - element.append(`
`, { html: true }); + // Add a turnstile widget element into if an element with the id of TURNSTILE_ATTR_NAME is found + if (element.getAttribute('id') === TURNSTILE_ATTR_NAME) { + element.append(`
`, { html: true }); } }, }) @@ -57,7 +56,9 @@ export default { ```ts export default { async fetch(request, env): Promise { - const SITE_KEY = env.SITE_KEY + const SITE_KEY = env.SITE_KEY; // The Turnstile Sitekey of your widget (pass as env or secret) + const TURNSTILE_ATTR_NAME = 'your_id_to_replace'; // The id of the element to put a Turnstile widget in + let res = await fetch(request) // Instantiate the API to run on specific elements, for example, `head`, `div` @@ -73,9 +74,8 @@ export default { }) .on('div', { element(element) { - - // You are using the `getAttribute` method here to retrieve the `id` or `class` of an element - if (element.getAttribute('id') === ) { + // Add a turnstile widget element into if an element with the id of TURNSTILE_ATTR_NAME is found + if (element.getAttribute('id') === TURNSTILE_ATTR_NAME) { element.append(`
`, { html: true }); } }, @@ -94,6 +94,7 @@ from js import HTMLRewriter, fetch async def on_fetch(request, env): site_key = env.SITE_KEY + attr_name = env.TURNSTILE_ATTR_NAME res = await fetch(request) class Append: @@ -112,7 +113,7 @@ async def on_fetch(request, env): # Instantiate the API to run on specific elements, for example, `head`, `div` head = create_proxy(Append()) - div = create_proxy(AppendOnID("NAME_OF_ATTRIBUTE")) + div = create_proxy(AppendOnID(attr_name)) new_res = HTMLRewriter.new().on("head", head).on("div", div).transform(res) return new_res @@ -128,7 +129,7 @@ This is only half the implementation for Turnstile. The corresponding token that ```js -async function handlePost(request) { +async function handlePost(request, env) { const body = await request.formData(); // Turnstile injects a token in `cf-turnstile-response`. const token = body.get('cf-turnstile-response'); @@ -137,10 +138,10 @@ async function handlePost(request) { // Validate the token by calling the `/siteverify` API. let formData = new FormData(); - // `secret_key` here is set using Wrangler secrets - formData.append('secret', secret_key); + // `secret_key` here is the Turnstile Secret key, which should be set using Wrangler secrets + formData.append('secret', env.SECRET_KEY); formData.append('response', token); - formData.append('remoteip', ip); + formData.append('remoteip', ip); //This is optional. const url = 'https://challenges.cloudflare.com/turnstile/v0/siteverify'; const result = await fetch(url, { @@ -155,16 +156,26 @@ async function handlePost(request) { } // The Turnstile token was successfully validated. Proceed with your application logic. // Validate login, redirect user, etc. - return await fetch(request) + + // Clone the original request with a new body + const newRequest = new Request(request, { + body: request.body, // Reuse the body + method: request.method, + headers: request.headers + }); + + return await fetch(newRequest); } export default { async fetch(request, env) { - const SITE_KEY = env.SITE_KEY + const SITE_KEY = env.SITE_KEY; // The Turnstile Sitekey of your widget (pass as env or secret) + const TURNSTILE_ATTR_NAME = 'your_id_to_replace'; // The id of the element to put a Turnstile widget in + let res = await fetch(request) if (request.method === 'POST') { - return handlePost(request) + return handlePost(request, env) } // Instantiate the API to run on specific elements, for example, `head`, `div` diff --git a/src/content/docs/workers/frameworks/framework-guides/nextjs.mdx b/src/content/docs/workers/frameworks/framework-guides/nextjs.mdx index f01e1b0a5051b7..0f35165902cc91 100644 --- a/src/content/docs/workers/frameworks/framework-guides/nextjs.mdx +++ b/src/content/docs/workers/frameworks/framework-guides/nextjs.mdx @@ -12,6 +12,7 @@ import { Render, PackageManagers, Stream, + WranglerConfig } from "~/components"; ## New apps @@ -49,11 +50,9 @@ First, install [@opennextjs/cloudflare](https://www.npmjs.com/package/@opennextj npm install --save-dev @opennextjs/cloudflare ``` -### 2. Add a `wrangler.toml` file +### 2. Add a Wrangler file -Then, add a [`wrangler.toml`](/workers/wrangler/configuration/) file to the root directory of your Next.js app: - -import { WranglerConfig } from "~/components"; +Then, add a [`wrangler.toml / wrangler.json` file](/workers/wrangler/configuration/) to the root directory of your Next.js app: @@ -71,7 +70,7 @@ assets = { directory = ".open-next/assets", binding = "ASSETS" } As shown above, you must enable the [`nodejs_compat` compatibility flag](/workers/runtime-apis/nodejs/) _and_ set your [compatibility date](/workers/configuration/compatibility-dates/) to `2024-09-23` or later for your Next.js app to work with @opennextjs/cloudflare. ::: -`wrangler.toml` is where you configure your Worker and define what resources it can access via [bindings](/workers/runtime-apis/bindings/). +You configure your Worker and define what resources it can access via [bindings](/workers/runtime-apis/bindings/) in the `wrangler.toml / wrangler.json` file. ### 3. Update `package.json` diff --git a/src/content/docs/workers/get-started/dashboard.mdx b/src/content/docs/workers/get-started/dashboard.mdx index 7162f89e4be2a1..75d3c45499c09b 100644 --- a/src/content/docs/workers/get-started/dashboard.mdx +++ b/src/content/docs/workers/get-started/dashboard.mdx @@ -6,10 +6,9 @@ sidebar: head: - tag: title content: Get started - Dashboard - --- -import { Render } from "~/components" +import { Render } from "~/components"; Follow this guide to create a Workers application using [the Cloudflare dashboard](https://dash.cloudflare.com). @@ -38,6 +37,7 @@ To create a Workers application: To do more: +- Push your project to a GitHub or GitLab respoitory then [connect to builds](/workers/ci-cd/builds/#get-started) to enable automatic builds and deployments. - Review our [Examples](/workers/examples/) and [Tutorials](/workers/tutorials/) for inspiration. - Set up [bindings](/workers/runtime-apis/bindings/) to allow your Worker to interact with other resources and unlock new functionality. - Learn how to [test and debug](/workers/testing/) your Workers. diff --git a/src/content/docs/workers/get-started/guide.mdx b/src/content/docs/workers/get-started/guide.mdx index 2c81d3294e5071..0f27ef2688fe99 100644 --- a/src/content/docs/workers/get-started/guide.mdx +++ b/src/content/docs/workers/get-started/guide.mdx @@ -48,7 +48,7 @@ cd my-first-worker In your project directory, C3 will have generated the following: -* `wrangler.toml`: Your [Wrangler](/workers/wrangler/configuration/#sample-wrangler-configuration) configuration file. +* `wrangler.json`: Your [Wrangler](/workers/wrangler/configuration/#sample-wrangler-configuration) configuration file. * `index.js` (in `/src`): A minimal `'Hello World!'` Worker written in [ES module](/workers/reference/migrate-to-module-workers/) syntax. * `package.json`: A minimal Node dependencies configuration file. * `package-lock.json`: Refer to [`npm` documentation on `package-lock.json`](https://docs.npmjs.com/cli/v9/configuring-npm/package-lock-json). @@ -78,8 +78,8 @@ npm create cloudflare@latest -- --template Your existing template folder must contain the following files, at a minimum, to meet the requirements for Cloudflare Workers: - `package.json` -- `wrangler.toml` [See sample Wrangler configuration](/workers/wrangler/configuration/#sample-wrangler-configuration) -- `src/` containing a worker script referenced from `wrangler.toml` +- `wrangler.json` [See sample Wrangler configuration](/workers/wrangler/configuration/#sample-wrangler-configuration) +- `src/` containing a worker script referenced from `wrangler.json`
@@ -191,7 +191,7 @@ Preview your Worker at `..workers.dev`.
-If you see [`523` errors](/support/troubleshooting/cloudflare-errors/troubleshooting-cloudflare-5xx-errors/#error-523-origin-is-unreachable) when pushing your `*.workers.dev` subdomain for the first time, wait a minute or so and the errors will resolve themselves. +If you see [`523` errors](/support/troubleshooting/cloudflare-errors/troubleshooting-cloudflare-5xx-errors/#error-523-origin-is-unreachable) when pushing your `*.workers.dev` subdomain for the first time, wait a minute or so and the errors will resolve themselves.
@@ -199,6 +199,7 @@ If you see [`523` errors](/support/troubleshooting/cloudflare-errors/troubleshoo To do more: +- Push your project to a GitHub or GitLab respoitory then [connect to builds](/workers/ci-cd/builds/#get-started) to enable automatic builds and deployments. - Visit the [Cloudflare dashboard](https://dash.cloudflare.com/) for simpler editing. - Review our [Examples](/workers/examples/) and [Tutorials](/workers/tutorials/) for inspiration. - Set up [bindings](/workers/runtime-apis/bindings/) to allow your Worker to interact with other resources and unlock new functionality. diff --git a/src/content/docs/workers/languages/python/ffi.mdx b/src/content/docs/workers/languages/python/ffi.mdx index fc0683958a47a1..cae76aaaded497 100644 --- a/src/content/docs/workers/languages/python/ffi.mdx +++ b/src/content/docs/workers/languages/python/ffi.mdx @@ -8,6 +8,8 @@ head: --- +import { WranglerConfig } from "~/components"; + Via [Pyodide](https://pyodide.org/en/stable/), Python Workers provide a [Foreign Function Interface (FFI)](https://en.wikipedia.org/wiki/Foreign_function_interface) to JavaScript. This allows you to: * Use [bindings](/workers/runtime-apis/bindings/) to resources on Cloudflare, including [Workers AI](/workers-ai/), [Vectorize](/vectorize/), [R2](/r2/), [KV](/kv/), [D1](/d1/), [Queues](/queues/), [Durable Objects](/durable-objects/), [Service Bindings](/workers/runtime-apis/bindings/service-bindings/) and more. @@ -20,9 +22,7 @@ The details of Pyodide's Foreign Function Interface are documented [here](https: Bindings allow your Worker to interact with resources on the Cloudflare Developer Platform. When you declare a binding on your Worker, you grant it a specific capability, such as being able to read and write files to an [R2](/r2/) bucket. -For example, to access a [KV](/kv) namespace from a Python Worker, you would declare the following in your Worker's [`wrangler.toml`](/workers/wrangler/configuration/): - -import { WranglerConfig } from "~/components"; +For example, to access a [KV](/kv) namespace from a Python Worker, you would declare the following in your Worker's [`wrangler.toml / wrangler.json` file](/workers/wrangler/configuration/): diff --git a/src/content/docs/workers/languages/python/how-python-workers-work.mdx b/src/content/docs/workers/languages/python/how-python-workers-work.mdx index 0a895058ab5c34..43b2a786fc6aec 100644 --- a/src/content/docs/workers/languages/python/how-python-workers-work.mdx +++ b/src/content/docs/workers/languages/python/how-python-workers-work.mdx @@ -9,7 +9,7 @@ head: --- -import { Render } from "~/components" +import { Render, WranglerConfig } from "~/components" Workers written in Python are executed by [Pyodide](https://pyodide.org/en/stable/index.html). Pyodide is a port of [CPython](https://github.com/python) (the reference implementation of Python — commonly referred to as just "Python") to WebAssembly. @@ -24,9 +24,7 @@ async def on_fetch(request, env): return Response.new("Hello world!") ``` -…with a wrangler.toml file that points to a .py file: - -import { WranglerConfig } from "~/components"; +…with a `wrangler.toml / wrangler.json` file that points to a .py file: diff --git a/src/content/docs/workers/languages/python/index.mdx b/src/content/docs/workers/languages/python/index.mdx index 8f062f87a4f7b3..e16aa3a196f9d4 100644 --- a/src/content/docs/workers/languages/python/index.mdx +++ b/src/content/docs/workers/languages/python/index.mdx @@ -11,6 +11,8 @@ head: description: Write Workers in 100% Python --- +import { WranglerConfig } from "~/components"; + Cloudflare Workers provides first-class support for Python, including support for: - The majority of Python's [Standard library](/workers/languages/python/stdlib/) @@ -121,10 +123,7 @@ the Python `fetch` handler and can be used to access [secrets](/workers/configuration/secrets/),and [bindings](/workers/runtime-apis/bindings/). -For example, let's try setting and using an environment variable in a Python -Worker. First, add the environment variable to your Worker's `wrangler.toml`: - -import { WranglerConfig } from "~/components"; +For example, let us try setting and using an environment variable in a Python Worker. First, add the environment variable to your Worker's `wrangler.toml / wrangler.json` file: diff --git a/src/content/docs/workers/languages/python/packages/index.mdx b/src/content/docs/workers/languages/python/packages/index.mdx index cc2200c9a3c692..be355eb14c02b8 100644 --- a/src/content/docs/workers/languages/python/packages/index.mdx +++ b/src/content/docs/workers/languages/python/packages/index.mdx @@ -10,7 +10,7 @@ import { Render } from "~/components"; -To import a Python package, add the package name to the `requirements.txt` file within the same directory as your `wrangler.toml` configuration file. +To import a Python package, add the package name to the `requirements.txt` file within the same directory as your `wrangler.toml / wrangler.json` file. For example, if your Worker depends on [FastAPI](https://fastapi.tiangolo.com/), you would add the following: diff --git a/src/content/docs/workers/languages/rust/index.mdx b/src/content/docs/workers/languages/rust/index.mdx index 8c87688d83be74..8ce5f9a98844d9 100644 --- a/src/content/docs/workers/languages/rust/index.mdx +++ b/src/content/docs/workers/languages/rust/index.mdx @@ -11,6 +11,8 @@ head: description: Write Workers in 100% Rust using the [`workers-rs` crate](https://github.com/cloudflare/workers-rs) --- +import { WranglerConfig } from "~/components"; + Cloudflare Workers provides support for Rust via the [`workers-rs` crate](https://github.com/cloudflare/workers-rs), which makes [Runtime APIs](/workers/runtime-apis) and [bindings](/workers/runtime-apis/bindings/) to developer platform products, such as [Workers KV](/kv/concepts/how-kv-works/), [R2](/r2/), and [Queues](/queues/), available directly from your Rust code. By following this guide, you will learn how to build a Worker entirely in the Rust programming language. @@ -44,7 +46,7 @@ cargo generate cloudflare/workers-rs Your project will be created in a new directory that you named, in which you will find the following files and folders: - `Cargo.toml` - The standard project configuration file for Rust's [`Cargo`](https://doc.rust-lang.org/cargo/) package manager. The template pre-populates some best-practice settings for building for Wasm on Workers. -- `wrangler.toml` - Wrangler configuration, pre-populated with a custom build command to invoke `worker-build` (Refer to [Wrangler Bundling](/workers/languages/rust/#bundling-worker-build)). +- `wrangler.json` - Wrangler configuration, pre-populated with a custom build command to invoke `worker-build` (Refer to [Wrangler Bundling](/workers/languages/rust/#bundling-worker-build)). - `src` - Rust source directory, pre-populated with Hello World Worker. ## 2. Develop locally @@ -110,7 +112,7 @@ An object representing the incoming request. This includes methods for accessing Provides access to Worker [bindings](/workers/runtime-apis/bindings/). - [`Secret`](https://github.com/cloudflare/workers-rs/blob/e15f88110d814c2d7759b2368df688433f807694/worker/src/env.rs#L92) - Secret value configured in Cloudflare dashboard or using `wrangler secret put`. -- [`Var`](https://github.com/cloudflare/workers-rs/blob/e15f88110d814c2d7759b2368df688433f807694/worker/src/env.rs#L92) - Environment variable defined in `wrangler.toml`. +- [`Var`](https://github.com/cloudflare/workers-rs/blob/e15f88110d814c2d7759b2368df688433f807694/worker/src/env.rs#L92) - Environment variable defined in `wrangler.json`. - [`KvStore`](https://docs.rs/worker-kv/latest/worker_kv/struct.KvStore.html) - Workers [KV](/kv/api/) namespace binding. - [`ObjectNamespace`](https://docs.rs/worker/latest/worker/durable/struct.ObjectNamespace.html) - [Durable Object](/durable-objects/) binding. - [`Fetcher`](https://docs.rs/worker/latest/worker/struct.Fetcher.html) - [Service binding](/workers/runtime-apis/bindings/service-bindings/) to another Worker. @@ -206,14 +208,12 @@ To run the resulting Wasm binary on Workers, `workers-rs` includes a build tool 2. Invokes `web-pack` to minify and bundle the JavaScript code. 3. Outputs a directory structure that Wrangler can use to bundle and deploy the final Worker. -`worker-build` is invoked by default in the template project using a custom build command specified in `wrangler.toml`. +`worker-build` is invoked by default in the template project using a custom build command specified in the `wrangler.toml / wrangler.json` file. ### Binary Size (`wasm-opt`) Unoptimized Rust Wasm binaries can be large and may exceed Worker bundle size limits or experience long startup times. The template project pre-configures several useful size optimizations in your `Cargo.toml` file: -import { WranglerConfig } from "~/components"; - ```toml @@ -229,4 +229,4 @@ Finally, `worker-bundle` automatically invokes [`wasm-opt`](https://github.com/b ## Related resources -- [Rust Wasm Book](https://rustwasm.github.io/book/introduction.html) +- [Rust Wasm Book](https://rustwasm.github.io/docs/book/) diff --git a/src/content/docs/workers/languages/typescript/index.mdx b/src/content/docs/workers/languages/typescript/index.mdx index dd8d1887200576..3e061693ea04fc 100644 --- a/src/content/docs/workers/languages/typescript/index.mdx +++ b/src/content/docs/workers/languages/typescript/index.mdx @@ -24,7 +24,7 @@ This means the correct TypeScript types for your Worker depend on: 1. Your Worker's [Compatibility Date](/workers/configuration/compatibility-dates/). 2. Your Worker's [Compatibility Flags](/workers/configuration/compatibility-flags/). -For example, if you have `compatibility_flags = ["nodejs_als"]` in your `wrangler.toml`, then the runtime will allow you to use the [`AsyncLocalStorage`](https://nodejs.org/api/async_context.html#class-asynclocalstorage) class in your worker code, but you will not see this reflected in the type definitions in `@cloudflare/workers-types`. +For example, if you have `compatibility_flags = ["nodejs_als"]` in your `wrangler.toml / wrangler.json` file, then the runtime will allow you to use the [`AsyncLocalStorage`](https://nodejs.org/api/async_context.html#class-asynclocalstorage) class in your worker code, but you will not see this reflected in the type definitions in `@cloudflare/workers-types`. In order to solve this issue, and to ensure that your type definitions are always up-to-date with your compatibility settings, you can dynamically generate the runtime types (as of `wrangler 3.66.0`): @@ -102,7 +102,7 @@ Note that if you have specified a custom path for the runtime types file, you sh When switching to `wrangler types --experimental-include-runtime`, you'll want to ensure that your development process always uses the most up-to-date types. The main thing to remember here is that - regardless of your specific framework or build tools - you should run the `wrangler types --experimental-include-runtime` command before any development tasks that rely on TypeScript. This ensures your editor and build tools always have access to the latest types. -Most projects will have existing build and development scripts scripts, as well as some type-checking. In the example below, we're adding the `wrangler types --experimental-include-runtime` before the type-checking script in the project: +Most projects will have existing build and development scripts, as well as some type-checking. In the example below, we're adding the `wrangler types --experimental-include-runtime` before the type-checking script in the project: ```json { @@ -114,7 +114,7 @@ Most projects will have existing build and development scripts scripts, as well } ``` -In CI, you may have a separate build and test commands. It is best practice to run `wrangler types --experimental-include-runtime` before other CI commands. For example: +In CI, you may have separate build and test commands. It is best practice to run `wrangler types --experimental-include-runtime` before other CI commands. For example: @@ -156,7 +156,7 @@ By integrating the `wrangler types --experimental-include-runtime` command into #### Transitive loading of `@types/node` overrides `@cloudflare/workers-types` -You project's dependencies may load the `@types/node` package on their own. As of `@types/node@20.8.4` that package now overrides `Request`, `Response` and `fetch` types (possibly others) specified by `@cloudflare/workers-types` causing type errors. +Your project's dependencies may load the `@types/node` package on their own. As of `@types/node@20.8.4` that package now overrides `Request`, `Response` and `fetch` types (possibly others) specified by `@cloudflare/workers-types` causing type errors. The way to get around this issue currently is to pin the version of `@types/node` to `20.8.3` in your `package.json` like this: diff --git a/src/content/docs/workers/observability/dev-tools/index.mdx b/src/content/docs/workers/observability/dev-tools/index.mdx index 6fd5d91b5d2e61..5db135d0af7d23 100644 --- a/src/content/docs/workers/observability/dev-tools/index.mdx +++ b/src/content/docs/workers/observability/dev-tools/index.mdx @@ -8,7 +8,7 @@ meta: ## Using DevTools -When running your Worker locally using `wrangler dev`, you automatically have access to [Cloudflare's implementation](https://github.com/cloudflare/workers-sdk/tree/main/packages/wrangler-devtools?cf_target_id=115890352C73E75FD7D837D0B8720E96) of [Chrome's DevTools](https://developer.chrome.com/docs/devtools/overview). +When running your Worker locally using `wrangler dev`, you automatically have access to [Cloudflare's implementation](https://github.com/cloudflare/workers-sdk/tree/main/packages/chrome-devtools-patches) of [Chrome's DevTools](https://developer.chrome.com/docs/devtools/overview). DevTools help you debug and optimize your Workers. :::note diff --git a/src/content/docs/workers/observability/errors.mdx b/src/content/docs/workers/observability/errors.mdx index 176fe32502abc2..719e07ddf35305 100644 --- a/src/content/docs/workers/observability/errors.mdx +++ b/src/content/docs/workers/observability/errors.mdx @@ -30,7 +30,7 @@ Other `11xx` errors generally indicate a problem with the Workers runtime itself ### Loop limit -A Worker cannot call itself or another Worker more than 16 times. In order to prevent infinite loops between Workers, the [`CF-EW-Via`](/fundamentals/reference/http-request-headers/#cf-ew-via) header's value is an integer that indicates how many invocations are left. Every time a Worker is invoked, the integer will decrement by 1. If the count reaches zero, a [`1019`](#error-pages-generated-by-workers) error is returned. +A Worker cannot call itself or another Worker more than 16 times. In order to prevent infinite loops between Workers, the [`CF-EW-Via`](/fundamentals/reference/http-headers/#cf-ew-via) header's value is an integer that indicates how many invocations are left. Every time a Worker is invoked, the integer will decrement by 1. If the count reaches zero, a [`1019`](#error-pages-generated-by-workers) error is returned. ### "The script will never generate a response" errors @@ -132,7 +132,6 @@ export default { }; ``` - ### Cannot perform I/O on behalf of a different request ``` @@ -149,12 +148,14 @@ This error is most commonly caused by attempting to cache an I/O object, like a let cachedResponse = null; export default { - async fetch(request, env, ctx) { - if (cachedResponse) { return cachedResponse; } - cachedResponse = new Response('Hello, world!'); - await new Promise(resolve => setTimeout(resolve, 5000)); // Sleep for 5s to demonstrate this particular error case - return cachedResponse; - } + async fetch(request, env, ctx) { + if (cachedResponse) { + return cachedResponse; + } + cachedResponse = new Response("Hello, world!"); + await new Promise((resolve) => setTimeout(resolve, 5000)); // Sleep for 5s to demonstrate this particular error case + return cachedResponse; + }, }; ``` @@ -164,12 +165,14 @@ You can fix this by instead storing only the data in global scope, rather than t let cachedData = null; export default { - async fetch(request, env, ctx) { - if (cachedData) { return new Response(cachedData); } - const response = new Response('Hello, world!'); - cachedData = await response.text(); - return new Response(cachedData, response); - } + async fetch(request, env, ctx) { + if (cachedData) { + return new Response(cachedData); + } + const response = new Response("Hello, world!"); + cachedData = await response.text(); + return new Response(cachedData, response); + }, }; ``` @@ -199,7 +202,7 @@ These errors occur when a Worker is uploaded or modified. ### Validation Errors (10021) -The 10021 error code includes all errors that occur when you attempt to deploy a Worker, and Cloudflare then attempts to load and run the top-level scope (everything that happens before your Worker's [handler](/workers/runtime-apis/handlers/) is invoked). For example, if you attempt to deploy a broken Worker with invalid JavaScript that would throw a `SyntaxError` — Cloudflare will not deploy your Worker. +The 10021 error code includes all errors that occur when you attempt to deploy a Worker, and Cloudflare then attempts to load and run the top-level scope (everything that happens before your Worker's [handler](/workers/runtime-apis/handlers/) is invoked). For example, if you attempt to deploy a broken Worker with invalid JavaScript that would throw a `SyntaxError` — Cloudflare will not deploy your Worker. Specific error cases include but are not limited to: @@ -334,4 +337,4 @@ async function handleRequest(request) { - [Log from Workers](/workers/observability/logs/) - Learn how to log your Workers. - [Logpush](/workers/observability/logs/logpush/) - Learn how to push Workers Trace Event Logs to supported destinations. -- [RPC error handling](/workers/runtime-apis/rpc/error-handling/) - Learn how to handle errors from remote-procedure calls. \ No newline at end of file +- [RPC error handling](/workers/runtime-apis/rpc/error-handling/) - Learn how to handle errors from remote-procedure calls. diff --git a/src/content/docs/workers/observability/logs/logpush.mdx b/src/content/docs/workers/observability/logs/logpush.mdx index 1472b5baa1f50c..0ab799f1704299 100644 --- a/src/content/docs/workers/observability/logs/logpush.mdx +++ b/src/content/docs/workers/observability/logs/logpush.mdx @@ -9,6 +9,8 @@ sidebar: --- +import { WranglerConfig } from "~/components"; + [Cloudflare Logpush](/logs/about/) supports the ability to send [Workers Trace Event Logs](/logs/reference/log-fields/account/workers_trace_events/) to a [supported destination](/logs/get-started/enable-destinations/). Worker’s Trace Events Logpush includes metadata about requests and responses, unstructured `console.log()` messages and any uncaught exceptions. This product is available on the Workers Paid plan. For pricing information, refer to [Pricing](/workers/platform/pricing/#workers-trace-events-logpush). :::caution @@ -73,9 +75,7 @@ In Logpush, you can configure [filters](/logs/reference/filters/) and a [samplin ## Enable logging on your Worker -Enable logging on your Worker by adding a new property, `logpush = true`, to your `wrangler.toml` file. This can be added either in the top-level configuration or under an [environment](/workers/wrangler/environments/). Any new Workers with this property will automatically get picked up by the Logpush job. - -import { WranglerConfig } from "~/components"; +Enable logging on your Worker by adding a new property, `logpush = true`, to your Wrangler file. This can be added either in the top-level configuration or under an [environment](/workers/wrangler/environments/). Any new Workers with this property will automatically get picked up by the Logpush job. diff --git a/src/content/docs/workers/observability/logs/tail-workers.mdx b/src/content/docs/workers/observability/logs/tail-workers.mdx index 4bc84300502b70..fceb06aad8c046 100644 --- a/src/content/docs/workers/observability/logs/tail-workers.mdx +++ b/src/content/docs/workers/observability/logs/tail-workers.mdx @@ -11,6 +11,8 @@ sidebar: --- +import { WranglerConfig } from "~/components"; + A Tail Worker receives information about the execution of other Workers (known as producer Workers), such as HTTP statuses, data passed to `console.log()` or uncaught exceptions. Tail Workers can process logs for alerts, debugging, or analytics. Tail Workers are available to all customers on the Workers Paid and Enterprise tiers. Tail Workers are billed by [CPU time](/workers/platform/pricing/#workers), not by the number of requests. @@ -83,9 +85,7 @@ The following Worker code is an example of what the `events` object may look lik ] ``` -3. Add the following to the `wrangler.toml` file of the producer Worker: - -import { WranglerConfig } from "~/components"; +3. Add the following to the Wrangler file of the producer Worker: diff --git a/src/content/docs/workers/observability/logs/workers-logs.mdx b/src/content/docs/workers/observability/logs/workers-logs.mdx index 80c5558f5961b6..a8f6fb07c48aeb 100644 --- a/src/content/docs/workers/observability/logs/workers-logs.mdx +++ b/src/content/docs/workers/observability/logs/workers-logs.mdx @@ -27,7 +27,7 @@ To send logs to a third party, use [Workers Logpush](/workers/observability/logs Minimum required Wrangler version: 3.78.6. Check your version by running `wrangler version`. To update Wrangler, refer to [Install/Update Wrangler](/workers/wrangler/install-and-update/). ::: -You must add the observability setting for your Worker to write logs to Workers Logs. Add the following setting to your Worker's `wrangler.toml` file and redeploy your Worker. +You must add the observability setting for your Worker to write logs to Workers Logs. Add the following setting to your Worker's Wrangler file and redeploy your Worker. diff --git a/src/content/docs/workers/observability/source-maps.mdx b/src/content/docs/workers/observability/source-maps.mdx index 28f4c96d86da2b..c710a010c48e1c 100644 --- a/src/content/docs/workers/observability/source-maps.mdx +++ b/src/content/docs/workers/observability/source-maps.mdx @@ -9,7 +9,7 @@ sidebar: --- -import { Render } from "~/components" +import { Render, WranglerConfig } from "~/components" @@ -23,9 +23,7 @@ Support for uploading source maps is available now in open beta. Minimum require ## Source Maps -To enable source maps, add the following to your Worker's [`wrangler.toml`](/workers/wrangler/configuration/) file: - -import { WranglerConfig } from "~/components"; +To enable source maps, add the following to your Worker's [Wrangler configuration](/workers/wrangler/configuration/) file: diff --git a/src/content/docs/workers/platform/pricing.mdx b/src/content/docs/workers/platform/pricing.mdx index b264a22bd1d60f..728c3bb1c245d5 100644 --- a/src/content/docs/workers/platform/pricing.mdx +++ b/src/content/docs/workers/platform/pricing.mdx @@ -93,7 +93,7 @@ A high traffic Worker that serves 100 million requests per month, and uses an av :::note[Custom limits] -To prevent accidental runaway bills or denial-of-wallet attacks, configure the maximum amount of CPU time that can be used per invocation by [defining limits in your Worker's `wrangler.toml` file](/workers/wrangler/configuration/#limits), or via the Cloudflare dashboard (Workers & Pages > Select your Worker > Settings > CPU Limits). +To prevent accidental runaway bills or denial-of-wallet attacks, configure the maximum amount of CPU time that can be used per invocation by [defining limits in your Worker's Wrangler file](/workers/wrangler/configuration/#limits), or via the Cloudflare dashboard (**Workers & Pages** > Select your Worker > **Settings** > **CPU Limits**). If you had a Worker on the Bundled usage model prior to the migration to Standard pricing on March 1, 2024, Cloudflare has automatically added a 50 ms CPU limit on your Worker. diff --git a/src/content/docs/workers/reference/migrate-to-module-workers.mdx b/src/content/docs/workers/reference/migrate-to-module-workers.mdx index ab7f176c368c2e..981542bcf8997e 100644 --- a/src/content/docs/workers/reference/migrate-to-module-workers.mdx +++ b/src/content/docs/workers/reference/migrate-to-module-workers.mdx @@ -6,6 +6,8 @@ description: Write your Worker code in ES modules syntax for an optimized experi --- +import { WranglerConfig } from "~/components"; + This guide will show you how to migrate your Workers from the [Service Worker](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API) format to the [ES modules](https://blog.cloudflare.com/workers-javascript-modules/) format. ## Advantages of migrating @@ -63,9 +65,7 @@ To understand bindings, refer the following `TODO` KV namespace binding example. 1. Create a KV namespace named `My Tasks` and receive an ID that you will use in your binding. 2. Create a Worker. -3. Find your Worker's `wrangler.toml` configuration file and add a KV namespace binding: - -import { WranglerConfig } from "~/components"; +3. Find your Worker's `wrangler.toml / wrangler.json` file and add a KV namespace binding: @@ -141,9 +141,7 @@ export { getTodos } [Environment variables](/workers/configuration/environment-variables/) are accessed differently in code written in ES modules format versus Service Worker format. -Review the following example environment variable configuration in `wrangler.toml`: - - +Review the following example environment variable configuration in the `wrangler.toml / wrangler.json` file: diff --git a/src/content/docs/workers/runtime-apis/bindings/index.mdx b/src/content/docs/workers/runtime-apis/bindings/index.mdx index 2dba2a391786a5..bea8670fd9eac7 100644 --- a/src/content/docs/workers/runtime-apis/bindings/index.mdx +++ b/src/content/docs/workers/runtime-apis/bindings/index.mdx @@ -6,7 +6,7 @@ description: Worker Bindings that allow for interaction with other Cloudflare Re --- -import { DirectoryListing } from "~/components" +import { DirectoryListing, WranglerConfig } from "~/components" Bindings allow your Worker to interact with resources on the Cloudflare Developer Platform. @@ -18,8 +18,6 @@ The following bindings available today: When you declare a binding on your Worker, you grant it a specific capability, such as being able to read and write files to an [R2](/r2/) bucket. For example: -import { WranglerConfig } from "~/components"; - ```toml diff --git a/src/content/docs/workers/runtime-apis/bindings/mTLS.mdx b/src/content/docs/workers/runtime-apis/bindings/mTLS.mdx index 1677d1ce146bba..57261b9f6c5454 100644 --- a/src/content/docs/workers/runtime-apis/bindings/mTLS.mdx +++ b/src/content/docs/workers/runtime-apis/bindings/mTLS.mdx @@ -6,13 +6,13 @@ description: Configure your Worker to present a client certificate to services that enforce an mTLS connection. --- -import { TabItem, Tabs } from "~/components"; +import { TabItem, Tabs, WranglerConfig } from "~/components"; When using [HTTPS](https://www.cloudflare.com/learning/ssl/what-is-https/), a server presents a certificate for the client to authenticate in order to prove their identity. For even tighter security, some services require that the client also present a certificate. This process - known as [mTLS](https://www.cloudflare.com/learning/access-management/what-is-mutual-tls/) - moves authentication to the protocol of TLS, rather than managing it in application code. Connections from unauthorized clients are rejected during the TLS handshake instead. -To present a client certificate when communicating with a service, create a mTLS certificate [binding](/workers/runtime-apis/bindings/) in your Worker project's `wrangler.toml` file. This will allow your Worker to present a client certificate to a service on your behalf. +To present a client certificate when communicating with a service, create a mTLS certificate [binding](/workers/runtime-apis/bindings/) in your Worker project's Wrangler file. This will allow your Worker to present a client certificate to a service on your behalf. :::caution @@ -31,9 +31,7 @@ The `wrangler mtls-certificate upload` command requires the [SSL and Certificate npx wrangler mtls-certificate upload --cert cert.pem --key key.pem --name my-client-cert ``` -Then, update your Worker project's `wrangler.toml` file to create an mTLS certificate binding: - -import { WranglerConfig } from "~/components"; +Then, update your Worker project's Wrangler file to create an mTLS certificate binding: diff --git a/src/content/docs/workers/runtime-apis/bindings/rate-limit.mdx b/src/content/docs/workers/runtime-apis/bindings/rate-limit.mdx index 9e9cf821e4be46..17f854aa119209 100644 --- a/src/content/docs/workers/runtime-apis/bindings/rate-limit.mdx +++ b/src/content/docs/workers/runtime-apis/bindings/rate-limit.mdx @@ -9,7 +9,7 @@ sidebar: --- -import { TabItem, Tabs } from "~/components" +import { TabItem, Tabs, WranglerConfig } from "~/components" The Rate Limiting API lets you define rate limits and write code around them in your Worker. @@ -36,8 +36,6 @@ We want your feedback. Tell us what you'd like to see in the [#workers-discussio First, add a [binding](/workers/runtime-apis/bindings) to your Worker that gives it access to the Rate Limiting API: -import { WranglerConfig } from "~/components"; - ```toml diff --git a/src/content/docs/workers/runtime-apis/bindings/service-bindings/http.mdx b/src/content/docs/workers/runtime-apis/bindings/service-bindings/http.mdx index 62cce30a3526fb..407a241931f0ce 100644 --- a/src/content/docs/workers/runtime-apis/bindings/service-bindings/http.mdx +++ b/src/content/docs/workers/runtime-apis/bindings/service-bindings/http.mdx @@ -8,12 +8,12 @@ description: Facilitate Worker-to-Worker communication by forwarding Request obj --- +import { WranglerConfig } from "~/components"; + Worker A that declares a Service binding to Worker B can forward a [`Request`](/workers/runtime-apis/request/) object to Worker B, by calling the `fetch()` method that is exposed on the binding object. For example, consider the following Worker that implements a [`fetch()` handler](/workers/runtime-apis/handlers/fetch/): -import { WranglerConfig } from "~/components"; - ```toml diff --git a/src/content/docs/workers/runtime-apis/bindings/service-bindings/index.mdx b/src/content/docs/workers/runtime-apis/bindings/service-bindings/index.mdx index 34cb96e76f820e..0adf12fae27e4f 100644 --- a/src/content/docs/workers/runtime-apis/bindings/service-bindings/index.mdx +++ b/src/content/docs/workers/runtime-apis/bindings/service-bindings/index.mdx @@ -8,6 +8,8 @@ description: Facilitate Worker-to-Worker communication. --- +import { WranglerConfig } from "~/components"; + ## About Service bindings [Service bindings](/workers/runtime-apis/bindings/service-bindings/) allow one worker to call into another, without going through a publicly-accessible URL. A Service binding allows Worker A to call a method on Worker B, or to forward a request from Worker A to Worker B. @@ -28,11 +30,9 @@ Service bindings are commonly used to: ## Configuration -You add a Service binding by modifying the `wrangler.toml` of the caller — the Worker that you want to be able to initiate requests. +You add a Service binding by modifying the `wrangler.toml / wrangler.json` file of the caller — the Worker that you want to be able to initiate requests. -For example, if you want Worker A to be able to call Worker B — you'd add the following to the `wrangler.toml` for Worker A: - -import { WranglerConfig } from "~/components"; +For example, if you want Worker A to be able to call Worker B — you'd add the following to the `wrangler.toml / wrangler.json` file for Worker A: @@ -128,7 +128,7 @@ Your worker has access to the following bindings: - ANOTHER_WORKER: another-worker [not connected] ``` -Wrangler also supports running multiple Workers at once with one command. To try it out, pass multiple `-c` flags to Wrangler, like this: `wrangler dev -c wrangler.toml -c ../other-worker/wrangler.toml`. The first config will be treated as the _primary_ worker, which will be exposed over HTTP as usual at `http://localhost:8787`. The remaining config files will be treated as _secondary_ and will only be accessible via a service binding from the primary worker. +Wrangler also supports running multiple Workers at once with one command. To try it out, pass multiple `-c` flags to Wrangler, like this: `wrangler dev -c wrangler.json -c ../other-worker/wrangler.json`. The first config will be treated as the _primary_ worker, which will be exposed over HTTP as usual at `http://localhost:8787`. The remaining config files will be treated as _secondary_ and will only be accessible via a service binding from the primary worker. :::caution diff --git a/src/content/docs/workers/runtime-apis/bindings/service-bindings/rpc.mdx b/src/content/docs/workers/runtime-apis/bindings/service-bindings/rpc.mdx index ba34c3c6e08623..cb5e29f610183d 100644 --- a/src/content/docs/workers/runtime-apis/bindings/service-bindings/rpc.mdx +++ b/src/content/docs/workers/runtime-apis/bindings/service-bindings/rpc.mdx @@ -8,7 +8,7 @@ description: Facilitate Worker-to-Worker communication via RPC. --- -import { DirectoryListing, Render } from "~/components" +import { DirectoryListing, Render, WranglerConfig } from "~/components" [Service bindings](/workers/runtime-apis/bindings/service-bindings) allow one Worker to call into another, without going through a publicly-accessible URL. @@ -49,8 +49,6 @@ The [`env`](/workers/runtime-apis/bindings) object is exposed as a class propert For example, a Worker that declares a binding to the [environment variable](/workers/configuration/environment-variables/) `GREETING`: -import { WranglerConfig } from "~/components"; - ```toml diff --git a/src/content/docs/workers/runtime-apis/bindings/version-metadata.mdx b/src/content/docs/workers/runtime-apis/bindings/version-metadata.mdx index a667aa7ef9fff8..1b0d8b4f6fdd6b 100644 --- a/src/content/docs/workers/runtime-apis/bindings/version-metadata.mdx +++ b/src/content/docs/workers/runtime-apis/bindings/version-metadata.mdx @@ -13,15 +13,13 @@ sidebar: --- -import { TabItem, Tabs } from "~/components" +import { TabItem, Tabs, WranglerConfig } from "~/components" The version metadata binding can be used to access metadata associated with a [version](/workers/configuration/versions-and-deployments/#versions) from inside the Workers runtime. Worker version ID, version tag and timestamp of when the version was created are available through the version metadata binding. They can be used in events sent to [Workers Analytics Engine](/analytics/analytics-engine/) or to any third-party analytics/metrics service in order to aggregate by Worker version. -To use the version metadata binding, update your Worker's `wrangler.toml` file: - -import { WranglerConfig } from "~/components"; +To use the version metadata binding, update your Worker's Wrangler file: diff --git a/src/content/docs/workers/runtime-apis/headers.mdx b/src/content/docs/workers/runtime-apis/headers.mdx index e671a910ce370e..21e10fa3aa517b 100644 --- a/src/content/docs/workers/runtime-apis/headers.mdx +++ b/src/content/docs/workers/runtime-apis/headers.mdx @@ -49,9 +49,9 @@ console.log(headers.getAll("Set-Cookie")); Cloudflare sets a number of its own custom headers on incoming requests and outgoing responses. While some may be used for its own tracking and bookkeeping, many of these can be useful to your own applications – or Workers – too. -For a list of documented Cloudflare request headers, refer to [HTTP request headers](/fundamentals/reference/http-request-headers/). +For a list of documented Cloudflare request headers, refer to [Cloudflare HTTP headers](/fundamentals/reference/http-headers/). ## Related resources * [Logging headers to console](/workers/examples/logging-headers/) - Review how to log headers in the console. -* [HTTP request headers](/fundamentals/reference/http-request-headers/) - A list of specific headers Cloudflare adds. +* [Cloudflare HTTP headers](/fundamentals/reference/http-headers/) - Contains a list of specific headers that Cloudflare adds. \ No newline at end of file diff --git a/src/content/docs/workers/runtime-apis/nodejs/assert.mdx b/src/content/docs/workers/runtime-apis/nodejs/assert.mdx index 2f2fd14973dca0..27073dff3bdb86 100644 --- a/src/content/docs/workers/runtime-apis/nodejs/assert.mdx +++ b/src/content/docs/workers/runtime-apis/nodejs/assert.mdx @@ -1,39 +1,35 @@ --- pcx_content_type: configuration title: assert - --- -import { Render } from "~/components" +import { Render } from "~/components"; The `assert` module in Node.js provides a number of useful assertions that are useful when building tests. ```js -import { - strictEqual, - deepStrictEqual, - ok, - doesNotReject, -} from 'node:assert'; +import { strictEqual, deepStrictEqual, ok, doesNotReject } from "node:assert"; strictEqual(1, 1); // ok! strictEqual(1, "1"); // fails! throws AssertionError -deepStrictEqual({ a: { b: 1 }}, { a: { b: 1 }});// ok! -deepStrictEqual({ a: { b: 1 }}, { a: { b: 2 }});// fails! throws AssertionError +deepStrictEqual({ a: { b: 1 } }, { a: { b: 1 } }); // ok! +deepStrictEqual({ a: { b: 1 } }, { a: { b: 2 } }); // fails! throws AssertionError ok(true); // ok! ok(false); // fails! throws AssertionError await doesNotReject(async () => {}); // ok! -await doesNotReject(async () => { throw new Error('boom') }); // fails! throws AssertionError +await doesNotReject(async () => { + throw new Error("boom"); +}); // fails! throws AssertionError ``` :::note -In the Workers implementation of `assert`, all assertions run in, what Node.js calls, the strict assertion mode. In strict assertion mode, non-strict methods behave like their corresponding strict methods. For example, `deepEqual()` will behave like `deepStrictEqual()`. +In the Workers implementation of `assert`, all assertions run in, what Node.js calls, the strict assertion mode. In strict assertion mode, non-strict methods behave like their corresponding strict methods. For example, `deepEqual()` will behave like `deepStrictEqual()`. ::: Refer to the [Node.js documentation for `assert`](https://nodejs.org/dist/latest-v19.x/docs/api/assert.html) for more information. diff --git a/src/content/docs/workers/runtime-apis/nodejs/dns.mdx b/src/content/docs/workers/runtime-apis/nodejs/dns.mdx new file mode 100644 index 00000000000000..d41053bcab712e --- /dev/null +++ b/src/content/docs/workers/runtime-apis/nodejs/dns.mdx @@ -0,0 +1,29 @@ +--- +pcx_content_type: configuration +title: dns +--- + +import { Render, TypeScriptExample } from "~/components"; + + + +You can use [`node:dns`](https://nodejs.org/api/dns.html) for name resolution via [DNS over HTTPS](/1.1.1.1/encryption/dns-over-https/) using +[Cloudflare DNS](https://www.cloudflare.com/application-services/products/dns/) at 1.1.1.1. + + +```ts +import dns from 'node:dns'; + +let responese = await dns.promises.resolve4('cloudflare.com', 'NS'); +``` + + +All `node:dns` functions are available, except `lookup`, `lookupService`, and `resolve` which throw "Not implemented" errors when called. + +:::note + +DNS requests will execute a subrequest, counts for your [Worker's subrequest limit](/workers/platform/limits/#subrequests). + +::: + +The full `node:dns` API is documented in the [Node.js documentation for `node:dns`](https://nodejs.org/api/dns.html). diff --git a/src/content/docs/workers/runtime-apis/nodejs/index.mdx b/src/content/docs/workers/runtime-apis/nodejs/index.mdx index fcfa2b566a089a..c935e4eba65820 100644 --- a/src/content/docs/workers/runtime-apis/nodejs/index.mdx +++ b/src/content/docs/workers/runtime-apis/nodejs/index.mdx @@ -5,7 +5,7 @@ head: [] description: Node.js APIs available in Cloudflare Workers --- -import { DirectoryListing } from "~/components"; +import { DirectoryListing, WranglerConfig } from "~/components"; When you write a Worker, you may need to import packages from [npm](https://www.npmjs.com/). Many npm packages rely on APIs from the [Node.js runtime](https://nodejs.org/en/about), and will not work unless these Node.js APIs are available. @@ -14,7 +14,7 @@ Cloudflare Workers provides a subset of Node.js APIs in two forms: 1. As built-in APIs provided by the Workers Runtime 2. As polyfills that [Wrangler](/workers/wrangler/) adds to your Worker's code -You can view which APIs are supported using the [Node.js compatability matrix](https://workers-nodejs-compat-matrix.pages.dev). +You can view which APIs are supported using the [Node.js compatibility matrix](https://workers-nodejs-compat-matrix.pages.dev). ## Get Started @@ -32,7 +32,7 @@ Unless otherwise specified, implementations of Node.js APIs in Workers are inten ## Node.js API Polyfills -When you enable the `nodejs_compat` compatability flag and set your compatibility date to `2024-09-23` or later, in addition to enabling Node.js APIs in the Workers Runtime, [Wrangler](/workers/wrangler/) will use [unenv](https://github.com/unjs/unenv) to automatically detect uses of Node.js APIs, and add polyfills where relevant. +When you enable the `nodejs_compat` compatibility flag and set your compatibility date to `2024-09-23` or later, in addition to enabling Node.js APIs in the Workers Runtime, [Wrangler](/workers/wrangler/) will use [unenv](https://github.com/unjs/unenv) to automatically detect uses of Node.js APIs, and add polyfills where relevant. Adding polyfills maximizes compatibility with existing npm packages, while recognizing that not all APIs from Node.js make sense in the context of serverless functions. @@ -46,7 +46,7 @@ Calling these mocked methods will either noop or will throw an error with a mess This allows you to import packages that use these Node.js modules, even if certain methods are not supported. -For a full list of APIs supported, including information on which are mocked, see the [Node.js compatability matrix](https://workers-nodejs-compat-matrix.pages.dev). +For a full list of APIs supported, including information on which are mocked, see the [Node.js compatibility matrix](https://workers-nodejs-compat-matrix.pages.dev). If an API you wish to use is missing and you want to suggest that Workers support it, please add a post or comment in the [Node.js APIs discussions category](https://github.com/cloudflare/workerd/discussions/categories/node-js-apis) on GitHub. @@ -55,8 +55,6 @@ If an API you wish to use is missing and you want to suggest that Workers suppor To enable only the Node.js `AsyncLocalStorage` API, use the `nodejs_als` compatibility flag. -import { WranglerConfig } from "~/components"; - ```toml diff --git a/src/content/docs/workers/runtime-apis/nodejs/net.mdx b/src/content/docs/workers/runtime-apis/nodejs/net.mdx new file mode 100644 index 00000000000000..1b96480c5da865 --- /dev/null +++ b/src/content/docs/workers/runtime-apis/nodejs/net.mdx @@ -0,0 +1,43 @@ +--- +pcx_content_type: configuration +title: net +--- + +import { Render, TypeScriptExample } from "~/components"; + + + +You can use [`node:net`](https://nodejs.org/api/net.html) to create a direct connection to servers via a TCP sockets +with [`net.Socket`](https://nodejs.org/api/net.html#class-netsocket). + +These functions use [`connect`](/workers/runtime-apis/tcp-sockets/#connect) functionality from the built-in `cloudflare:sockets` module. + + +```ts +import net from "node:net"; + +const exampleIP = "127.0.0.1"; + +export default { + async fetch(req): Promise { + const socket = new net.Socket(); + socket.connect(4000, exampleIP, function () { + console.log("Connected"); + }); + + socket.write("Hello, Server!"); + socket.end(); + + return new Response("Wrote to server", { status: 200 }); + }, +} satisfies ExportedHandler; + +``` + + +Additionally, other APIs such as [`net.BlockList`](https://nodejs.org/api/net.html#class-netblocklist) +and [`net.SocketAddress`](https://nodejs.org/api/net.html#class-netsocketaddress) are available. + +Note that the [`net.Server`](https://nodejs.org/api/net.html#class-netserver) class is not supported by Workers. + +The full `node:net` API is documented in the [Node.js documentation for `node:net`](https://nodejs.org/api/net.html). diff --git a/src/content/docs/workers/runtime-apis/nodejs/path.mdx b/src/content/docs/workers/runtime-apis/nodejs/path.mdx index a1c0f4a6030236..259940aed82c90 100644 --- a/src/content/docs/workers/runtime-apis/nodejs/path.mdx +++ b/src/content/docs/workers/runtime-apis/nodejs/path.mdx @@ -1,24 +1,18 @@ --- pcx_content_type: configuration title: path - --- -import { Render } from "~/components" +import { Render } from "~/components"; The [`node:path`](https://nodejs.org/api/path.html) module provides utilities for working with file and directory paths. The `node:path` module can be accessed using: ```js -import path from "node:path" -path.join('/foo', 'bar', 'baz/asdf', 'quux', '..'); +import path from "node:path"; +path.join("/foo", "bar", "baz/asdf", "quux", ".."); // Returns: '/foo/bar/baz/asdf' ``` -:::note - -In the Workers implementation of `path`, the [path.win32](https://nodejs.org/api/path.html#windows-vs-posix) variants of the path API are not implemented, and will throw an exception. -::: - Refer to the [Node.js documentation for `path`](https://nodejs.org/api/path.html) for more information. diff --git a/src/content/docs/workers/runtime-apis/nodejs/timers.mdx b/src/content/docs/workers/runtime-apis/nodejs/timers.mdx new file mode 100644 index 00000000000000..6fddbfb4c456dc --- /dev/null +++ b/src/content/docs/workers/runtime-apis/nodejs/timers.mdx @@ -0,0 +1,43 @@ +--- +pcx_content_type: configuration +title: timers +--- + +import { Render, TypeScriptExample } from "~/components"; + + + +Use [`node:timers`](https://nodejs.org/api/timers.html) APIs to schedule functions to be executed later. + +This includes [`setTimeout`](https://nodejs.org/api/timers.html#settimeoutcallback-delay-args) for calling a function after a delay, +[`setInterval`](https://nodejs.org/api/timers.html#clearintervaltimeout) for calling a function repeatedly, +and [`setImmediate`](https://nodejs.org/api/timers.html#setimmediatecallback-args) for calling a function in the next iteration of the event loop. + + +```ts +import timers from "node:timers"; + +console.log("first"); +timers.setTimeout(() => { + console.log("last"); +}, 10); + +timers.setTimeout(() => { + console.log("next"); +}); +``` + + +:::note +Due to [security-based restrictions on timers](/workers/reference/security-model/#step-1-disallow-timers-and-multi-threading) in Workers, +timers are limited to returning the time of the last I/O. This means that while setTimeout, setInterval, and setImmediate will defer your function execution +until after other events have run, they will not delay them for the full time specified. +::: + +:::note +When called from a global level (on [`globalThis`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/globalThis)), +functions such as `clearTimeout` and `setTimeout` will respect web standards rather than Node.js-specific functionality. For complete Node.js +compatibility, you must call functions from the `node:timers` module. +::: + +The full `node:timers` API is documented in the [Node.js documentation for `node:timers`](https://nodejs.org/api/timers.html). diff --git a/src/content/docs/workers/runtime-apis/rpc/index.mdx b/src/content/docs/workers/runtime-apis/rpc/index.mdx index 3d7f1a6be71f29..eb597955f83593 100644 --- a/src/content/docs/workers/runtime-apis/rpc/index.mdx +++ b/src/content/docs/workers/runtime-apis/rpc/index.mdx @@ -7,7 +7,7 @@ description: The built-in, JavaScript-native RPC system built into Workers and --- -import { DirectoryListing, Render, Stream } from "~/components" +import { DirectoryListing, Render, Stream, WranglerConfig } from "~/components" :::note To use RPC, [define a compatibility date](/workers/configuration/compatibility-dates) of `2024-04-03` or higher, or include `rpc` in your [compatibility flags](/workers/configuration/compatibility-flags/#nodejs-compatibility-flag). @@ -68,8 +68,6 @@ To use an instance of a class that you define as a parameter or return value of Consider the following example: -import { WranglerConfig } from "~/components"; - ```toml diff --git a/src/content/docs/workers/runtime-apis/webassembly/javascript.mdx b/src/content/docs/workers/runtime-apis/webassembly/javascript.mdx index d8ad8e0697cfd5..c91dc4f5728cdc 100644 --- a/src/content/docs/workers/runtime-apis/webassembly/javascript.mdx +++ b/src/content/docs/workers/runtime-apis/webassembly/javascript.mdx @@ -47,7 +47,7 @@ wat2wasm src/simple.wat -o src/simple.wasm ## Bundling -Wrangler will bundle any Wasm module that ends in `.wasm` or `.wasm?module`, so that it is available at runtime within your Worker. This is done using a default bundling rule which can be customized in `wrangler.toml`. Refer to [Wrangler Bundling](/workers/wrangler/bundling/) for more information. +Wrangler will bundle any Wasm module that ends in `.wasm` or `.wasm?module`, so that it is available at runtime within your Worker. This is done using a default bundling rule which can be customized in the `wrangler.toml / wrangler.json` file. Refer to [Wrangler Bundling](/workers/wrangler/bundling/) for more information. ## Use from JavaScript diff --git a/src/content/docs/workers/static-assets/binding.mdx b/src/content/docs/workers/static-assets/binding.mdx index 3c6855147c4c7c..38c47b44b0f768 100644 --- a/src/content/docs/workers/static-assets/binding.mdx +++ b/src/content/docs/workers/static-assets/binding.mdx @@ -15,11 +15,10 @@ import { Render, TabItem, Tabs, + WranglerConfig } from "~/components"; -import { WranglerConfig } from "~/components"; - -Configuring a Worker with assets requires specifying a [directory](/workers/static-assets/binding/#directory) and, optionally, an [assets binding](/workers/static-assets/binding/), in your Worker's `wrangler.toml` file. The [assets binding](/workers/static-assets/binding/) allows you to dynamically fetch assets from within your Worker script (e.g. `env.ASSETS.fetch()`), similarly to how you might with a make a `fetch()` call with a [Service binding](/workers/runtime-apis/bindings/service-bindings/http/). +Configuring a Worker with assets requires specifying a [directory](/workers/static-assets/binding/#directory) and, optionally, an [assets binding](/workers/static-assets/binding/), in your Worker's Wrangler file. The [assets binding](/workers/static-assets/binding/) allows you to dynamically fetch assets from within your Worker script (e.g. `env.ASSETS.fetch()`), similarly to how you might with a make a `fetch()` call with a [Service binding](/workers/runtime-apis/bindings/service-bindings/http/). Only one collection of static assets can be configured in each Worker. diff --git a/src/content/docs/workers/static-assets/compatibility-matrix.mdx b/src/content/docs/workers/static-assets/compatibility-matrix.mdx index f826d2e6c17981..9e2f59f5b61b2e 100644 --- a/src/content/docs/workers/static-assets/compatibility-matrix.mdx +++ b/src/content/docs/workers/static-assets/compatibility-matrix.mdx @@ -82,6 +82,11 @@ We plan to bridge the gaps between Workers and Pages and provide ways to migrate | **Pages Functions** | | | | [File-based Routing](/pages/functions/routing/) | ❌ [^5] | ✅ | | [Pages Plugins](/pages/functions/plugins/) | ❌ [^6] | ✅ | +| **Domain Configuration** | | | +| [Custom domains](/workers/configuration/routing/custom-domains/#add-a-custom-domain)| ✅ | ✅ | +| [Custom subdomains](/workers/configuration/routing/custom-domains/#set-up-a-custom-domain-in-the-dashboard)|✅|✅| +| [Custom domains outside Cloudflare zones](/pages/configuration/custom-domains/#add-a-custom-cname-record)|❌|✅| +| [Non-root routes](/workers/configuration/routing/routes/) | ✅ | ❌ | [^1]: Similar to 3, to customize the HTTP headers that are returned by static assets, you can use [Service bindings](/workers/runtime-apis/bindings/service-bindings/) to connect a Worker in front of the Worker with assets. diff --git a/src/content/docs/workers/static-assets/routing.mdx b/src/content/docs/workers/static-assets/routing.mdx index e9318c11cc81a5..37c2bdb2435c1e 100644 --- a/src/content/docs/workers/static-assets/routing.mdx +++ b/src/content/docs/workers/static-assets/routing.mdx @@ -15,10 +15,9 @@ import { Render, TabItem, Tabs, + WranglerConfig } from "~/components"; -import { WranglerConfig } from "~/components"; - ## Default behavior By default, assets are served by attempting to match up the incoming request's pathname to a static asset. The structure and organization of files in your static asset directory, along with any routing configuration, determine the routing paths for your application. When a request invokes a Worker with assets: @@ -33,19 +32,19 @@ In this example, request to `example.com/blog` serves the `blog.html` file. If a Worker is configured, and there are no assets that match the current route requested, the Worker will be invoked. The Worker can then "fall back" to `not_found_handling` asset behavior, by passing the incoming request through to the [asset binding](/workers/static-assets/binding/#runtime-api-reference). -In this example, request to `example.com/api` doesn't match a static asset so the Worker is invoked. +In this example, a request to `example.com/api` doesn't match a static asset so the Worker is invoked. ![A request to `example.com/blog` runs the Worker.](~/assets/images/workers/platform/assets/workers-assets-invoke-worker.png) ## Invoking Worker Script Ahead of Assets -You may wish to run code before assets are served. This is often the case when implementing authentication, logging, personalization, internationalization, or other similar functions. [`experimental_serve_directly`](/workers/static-assets/binding/#experimental_serve_directly) is a configuration option available in `wrangler.toml` which controls this behavior. When disabled, `experimental_serve_directly = false` will invoke your Worker's code, regardless of any assets that would have otherwise matched. +You may wish to run code before assets are served. This is often the case when implementing authentication, logging, personalization, internationalization, or other similar functions. [`experimental_serve_directly`](/workers/static-assets/binding/#experimental_serve_directly) is a configuration option available in the `wrangler.toml / wrangler.json` file which controls this behavior. When disabled, `experimental_serve_directly = false` will invoke your Worker's code, regardless of any assets that would have otherwise matched. -Take the following directory structure, wrangler.toml, and user Worker code: +Take the following directory structure, `wrangler.toml / wrangler.json` file, and user Worker code: -- wrangler.toml +- wrangler.json - package.json - public - supersecret.txt @@ -95,7 +94,7 @@ In this example, any request will be routed to our user Worker, due to `experime ## Routing configuration -There are two options for asset serving that can be [configured in `wrangler.toml`](/workers/wrangler/configuration/#assets): +There are two options for asset serving that can be [configured in the `wrangler.toml / wrangler.json` file](/workers/wrangler/configuration/#assets): #### 1. `html_handling` @@ -157,9 +156,9 @@ For all non-matching requests, Cloudflare will return a null-body 404-status res ### Alternate configuration options -Alternate configuration options are outlined on this page and can be specified in your project's [`wrangler.toml`](/workers/wrangler/configuration/#assets) file. If you're deploying using a [framework](/workers/frameworks/), these options will be defined by the framework provider. +Alternate configuration options are outlined on this page and can be specified in your project's [`wrangler.toml / wrangler.json` file](/workers/wrangler/configuration/#assets). If you're deploying using a [framework](/workers/frameworks/), these options will be defined by the framework provider. -Example `wrangler.toml` configuration: +Example `wrangler.toml / wrangler.json` file: @@ -304,7 +303,7 @@ For example, to serve assets from `example.com/blog/*`, create a `blog` director - post2.html -With a Wrangler configuration file like so: +With a `wrangler.toml / wrangler.json` file like so: ```toml diff --git a/src/content/docs/workers/testing/index.mdx b/src/content/docs/workers/testing/index.mdx index 4ede7ed43eceb8..559425debea07e 100644 --- a/src/content/docs/workers/testing/index.mdx +++ b/src/content/docs/workers/testing/index.mdx @@ -13,19 +13,19 @@ Review the tools available for testing and debugging Workers. ## Testing comparison matrix -| Feature | Vitest Pool | `unstable_dev()` | Miniflare's API | -| ----------------------------------------- | ----------- | ---------------- | --------------- | -| Unit testing | ✅ | ❌ | ❌ | -| Integration testing | ✅ | ✅ | ✅ | -| Loading Wrangler configuration files | ✅ | ✅ | ❌ | -| Bindings directly in tests | ✅ | ❌ | ✅ | -| Isolated per-test storage | ✅ | ❌ | ❌ | -| Outbound request mocking | ✅ | ❌ | ✅ | -| Multiple Worker support | ✅ | 🚧[^1] | ✅ | -| Direct access to Durable Objects | ✅ | ❌ | ❌ | -| Run Durable Object alarms immediately | ✅ | ❌ | ❌ | -| List Durable Objects | ✅ | ❌ | ❌ | -| Testing service Workers | ❌ | ✅ | ✅ | +| Feature | Vitest Pool | `unstable_dev()` | Miniflare's API | +| ----------------------------------------------- | ----------- | ---------------- | --------------- | +| Unit testing | ✅ | ❌ | ❌ | +| Integration testing | ✅ | ✅ | ✅ | +| Loading `wrangler.toml / wrangler.json` files | ✅ | ✅ | ❌ | +| Bindings directly in tests | ✅ | ❌ | ✅ | +| Isolated per-test storage | ✅ | ❌ | ❌ | +| Outbound request mocking | ✅ | ❌ | ✅ | +| Multiple Worker support | ✅ | 🚧[^1] | ✅ | +| Direct access to Durable Objects | ✅ | ❌ | ❌ | +| Run Durable Object alarms immediately | ✅ | ❌ | ❌ | +| List Durable Objects | ✅ | ❌ | ❌ | +| Testing service Workers | ❌ | ✅ | ✅ | [^1]: Support for multiple Workers in [`unstable_dev()`](/workers/wrangler/api/#unstable_dev) relies on `wrangler dev`'s service registry which can be unreliable when running multiple tests in parallel. diff --git a/src/content/docs/workers/testing/integration-testing.mdx b/src/content/docs/workers/testing/integration-testing.mdx index a23e47eed47fa7..4a7675c568df83 100644 --- a/src/content/docs/workers/testing/integration-testing.mdx +++ b/src/content/docs/workers/testing/integration-testing.mdx @@ -76,7 +76,7 @@ it("dispatches fetch event", async () => { Instead of running the Worker-under-test in the same Worker as the test runner like `SELF`, this example defines the Worker-under-test as an _auxiliary_ Worker. This means the Worker runs in a separate isolate to the test runner, with a different global scope. The Worker-under-test runs in an environment closer to production, but Vite transformations and hot-module-reloading aren't applied to the Worker—you must compile your TypeScript to JavaScript beforehand. -Auxiliary Workers cannot be configured from `wrangler.toml` files. You must use Miniflare [`WorkerOptions`](https://github.com/cloudflare/workers-sdk/tree/main/packages/miniflare#interface-workeroptions) in `vitest.config.ts`. +Auxiliary Workers cannot be configured from Wrangler files. You must use Miniflare [`WorkerOptions`](https://github.com/cloudflare/workers-sdk/tree/main/packages/miniflare#interface-workeroptions) in `vitest.config.ts`. :::note @@ -86,7 +86,7 @@ This method is less recommended than `SELF` for integration tests because of its ## Wrangler's `unstable_dev()` API -If you do not want to use Vitest and would like to write integration tests for a single Worker, consider using [Wrangler's `unstable_dev()` API](/workers/wrangler/api/#unstable_dev). `unstable_dev()` allows you to start an HTTP server similar to [`wrangler dev`](/workers/wrangler/commands/#dev) that you can send HTTP requests to. `unstable_dev()` will automatically load options from your Wrangler configuration file. Note that `unstable_dev()` is an experimental API subject to breaking changes. +If you do not want to use Vitest and would like to write integration tests for a single Worker, consider using [Wrangler's `unstable_dev()` API](/workers/wrangler/api/#unstable_dev). `unstable_dev()` allows you to start an HTTP server similar to [`wrangler dev`](/workers/wrangler/commands/#dev) that you can send HTTP requests to. `unstable_dev()` will automatically load options from your `wrangler.toml / wrangler.json` file. Note that `unstable_dev()` is an experimental API subject to breaking changes. ```js import assert from "node:assert"; @@ -109,7 +109,7 @@ If you have been using `unstable_dev()` for integration testing and want to migr ## Miniflare's API -If you would like to write integration tests for multiple Workers, need direct access to [bindings](/workers/runtime-apis/bindings/) outside your Worker in tests, or have another advanced use case, consider using [Miniflare's API](/workers/testing/miniflare) directly. Miniflare is the foundation for the other testing tools on this page, exposing a JavaScript API for the [`workerd` runtime](https://github.com/cloudflare/workerd) and local simulators for the other Developer Platform products. Unlike `unstable_dev()`, Miniflare does not automatically load options from your Wrangler configuration file. +If you would like to write integration tests for multiple Workers, need direct access to [bindings](/workers/runtime-apis/bindings/) outside your Worker in tests, or have another advanced use case, consider using [Miniflare's API](/workers/testing/miniflare) directly. Miniflare is the foundation for the other testing tools on this page, exposing a JavaScript API for the [`workerd` runtime](https://github.com/cloudflare/workerd) and local simulators for the other Developer Platform products. Unlike `unstable_dev()`, Miniflare does not automatically load options from your `wrangler.toml / wrangler.json` file. ```js import assert from "node:assert"; diff --git a/src/content/docs/workers/testing/local-development.mdx b/src/content/docs/workers/testing/local-development.mdx index 0ad894cf04cab4..00e608b7c07820 100644 --- a/src/content/docs/workers/testing/local-development.mdx +++ b/src/content/docs/workers/testing/local-development.mdx @@ -60,9 +60,9 @@ With any bindings that are not supported locally, you will need to use the `--re When running `wrangler dev`, resources such as KV, Durable Objects, D1, and R2 will be stored and persisted locally and not affect the production resources. -### Use bindings in `wrangler.toml` +### Use bindings in Wrangler configuration files -[Wrangler](/workers/wrangler/) will automatically create local versions of bindings found in the `wrangler.toml` [configuration file](/workers/wrangler/configuration/). These local resources will not have data in them initially, so you will need to add data manually via Wrangler commands and the [`--local` flag](/workers/testing/local-development/#use---local-flag). +[Wrangler](/workers/wrangler/) will automatically create local versions of bindings found in the [`wrangler.toml / wrangler.json` file](/workers/wrangler/configuration/). These local resources will not have data in them initially, so you will need to add data manually via Wrangler commands and the [`--local` flag](/workers/testing/local-development/#use---local-flag). When you run `wrangler dev` Wrangler stores local resources in a `.wrangler/state` folder, which is automatically created. @@ -97,7 +97,7 @@ If using `--persist-to` to specify a custom folder with `wrangler dev` you shoul npx wrangler kv:key put test 12345 --binding MY_KV_NAMESPACE --local --persist-to worker-local ``` -Running `wrangler kv:key put` will create a new key `test` with a value of `12345` on the local namespace specified via the binding `MY_KV_NAMESPACE` in `wrangler.toml`. This example command sets the local persistence directory to `worker-local` using `--persist-to`, to ensure that the data is created in the correct location. If `--persist-to` was not set, it would create the data in the `.wrangler` folder. +Running `wrangler kv:key put` will create a new key `test` with a value of `12345` on the local namespace specified via the binding `MY_KV_NAMESPACE` in the `wrangler.toml / wrangler.json` file. This example command sets the local persistence directory to `worker-local` using `--persist-to`, to ensure that the data is created in the correct location. If `--persist-to` was not set, it would create the data in the `.wrangler` folder. ### Clear Wrangler's local storage @@ -107,7 +107,7 @@ Any deleted folders will be created automatically the next time you run `wrangle ## Local-only environment variables -When running `wrangler dev`, variables in `wrangler.toml` are automatically overridden by values defined in a `.dev.vars` file located in the root directory of your worker. This is useful for providing values you do not want to check in to source control. +When running `wrangler dev`, variables in the `wrangler.toml / wrangler.json` file are automatically overridden by values defined in a `.dev.vars` file located in the root directory of your worker. This is useful for providing values you do not want to check in to source control. ```shell API_HOST = "localhost:4000" @@ -122,7 +122,7 @@ There may be times you want to develop against remote resources and bindings. To npx wrangler dev --remote ``` -For some products like KV and R2, remote resources used for `wrangler dev --remote` must be specified with preview ID/names in `wrangler.toml` such as `preview_id` for KV or `preview_bucket name` for R2. Resources used for remote mode (preview) can be different from resources used for production to prevent changing production data during development. To use production data in `wrangler dev --remote`, set the preview ID/name of the resource to the ID/name of your production resource. +For some products like KV and R2, remote resources used for `wrangler dev --remote` must be specified with preview ID/names in the `wrangler.toml / wrangler.json` file such as `preview_id` for KV or `preview_bucket name` for R2. Resources used for remote mode (preview) can be different from resources used for production to prevent changing production data during development. To use production data in `wrangler dev --remote`, set the preview ID/name of the resource to the ID/name of your production resource. ## Customize `wrangler dev` diff --git a/src/content/docs/workers/testing/vitest-integration/configuration.mdx b/src/content/docs/workers/testing/vitest-integration/configuration.mdx index ad10d50a6e38bb..9ad1971fdc887e 100644 --- a/src/content/docs/workers/testing/vitest-integration/configuration.mdx +++ b/src/content/docs/workers/testing/vitest-integration/configuration.mdx @@ -145,7 +145,7 @@ The following functions are exported from the `@cloudflare/vitest-pool-workers/c * `miniflare`: `SourcelessWorkerOptions & { workers?: WorkerOptions\[]; }` optional - * Use this to provide configuration information that is typically stored within the Wrangler configuration file, such as [bindings](/workers/runtime-apis/bindings/), [compatibility dates](/workers/configuration/compatibility-dates/), and [compatibility flags](/workers/configuration/compatibility-flags/). The `WorkerOptions` interface is defined [here](https://github.com/cloudflare/workers-sdk/tree/main/packages/miniflare#interface-workeroptions). Use the `main` option above to configure the entry point, instead of the Miniflare `script`, `scriptPath`, or `modules` options. + * Use this to provide configuration information that is typically stored within the `wrangler.toml / wrangler.json` file, such as [bindings](/workers/runtime-apis/bindings/), [compatibility dates](/workers/configuration/compatibility-dates/), and [compatibility flags](/workers/configuration/compatibility-flags/). The `WorkerOptions` interface is defined [here](https://github.com/cloudflare/workers-sdk/tree/main/packages/miniflare#interface-workeroptions). Use the `main` option above to configure the entry point, instead of the Miniflare `script`, `scriptPath`, or `modules` options. * If your project makes use of multiple Workers, you can configure auxiliary Workers that run in the same `workerd` process as your tests and can be bound to. Auxiliary Workers are configured using the `workers` array, containing regular Miniflare [`WorkerOptions`](https://github.com/cloudflare/workers-sdk/tree/main/packages/miniflare#interface-workeroptions) objects. Note that unlike the `main` Worker, auxiliary Workers: * Cannot have TypeScript entrypoints. You must compile auxiliary Workers to JavaScript first. You can use the [`wrangler deploy --dry-run --outdir dist`](/workers/wrangler/commands/#deploy) command for this. @@ -157,7 +157,7 @@ The following functions are exported from the `@cloudflare/vitest-pool-workers/c * `wrangler`: `{ configPath?: string; environment?: string; }` optional - * Path to Wrangler configuration file to load `main`, [compatibility settings](/workers/configuration/compatibility-dates/) and [bindings](/workers/runtime-apis/bindings/) from. These options will be merged with the `miniflare` option above, with `miniflare` values taking precedence. For example, if your Wrangler configuration defined a [service binding](/workers/runtime-apis/bindings/service-bindings/) named `SERVICE` to a Worker named `service`, but you included `serviceBindings: { SERVICE(request) { return new Response("body"); } }` in the `miniflare` option, all requests to `SERVICE` in tests would return `body`. Note `configPath` accepts both `.toml` and `.json` files. + * Path to `wrangler.toml / wrangler.json` file to load `main`, [compatibility settings](/workers/configuration/compatibility-dates/) and [bindings](/workers/runtime-apis/bindings/) from. These options will be merged with the `miniflare` option above, with `miniflare` values taking precedence. For example, if your Wrangler configuration defined a [service binding](/workers/runtime-apis/bindings/service-bindings/) named `SERVICE` to a Worker named `service`, but you included `serviceBindings: { SERVICE(request) { return new Response("body"); } }` in the `miniflare` option, all requests to `SERVICE` in tests would return `body`. Note `configPath` accepts both `.toml` and `.json` files. * The environment option can be used to specify the [Wrangler environment](/workers/wrangler/environments/) to pick up bindings and variables from. diff --git a/src/content/docs/workers/testing/vitest-integration/get-started/migrate-from-miniflare-2.mdx b/src/content/docs/workers/testing/vitest-integration/get-started/migrate-from-miniflare-2.mdx index 3d1792271e0732..875a0fcfc212b2 100644 --- a/src/content/docs/workers/testing/vitest-integration/get-started/migrate-from-miniflare-2.mdx +++ b/src/content/docs/workers/testing/vitest-integration/get-started/migrate-from-miniflare-2.mdx @@ -36,7 +36,7 @@ npm install --save-dev @cloudflare/vitest-pool-workers ## Update your Vitest configuration file -After installing the Workers Vitest configuration, update your Vitest configuration file to use the pool instead. Most Miniflare configuration previously specified `environmentOptions` can be moved to `poolOptions.workers.miniflare` instead. Refer to [Miniflare's `WorkerOptions` interface](https://github.com/cloudflare/workers-sdk/blob/main/packages/miniflare/README.md#interface-workeroptions) for supported options and the [Miniflare version 2 to 3 migration guide](https://miniflare.dev/get-started/migrating#api-changes) for more information. If you relied on configuration stored in a `wrangler.toml` file, set `wrangler.configPath` too. +After installing the Workers Vitest configuration, update your Vitest configuration file to use the pool instead. Most Miniflare configuration previously specified `environmentOptions` can be moved to `poolOptions.workers.miniflare` instead. Refer to [Miniflare's `WorkerOptions` interface](https://github.com/cloudflare/workers-sdk/blob/main/packages/miniflare/README.md#interface-workeroptions) for supported options and the [Miniflare version 2 to 3 migration guide](https://miniflare.dev/get-started/migrating#api-changes) for more information. If you relied on configuration stored in a Wrangler file, set `wrangler.configPath` too. ```diff + import { defineWorkersConfig } from "@cloudflare/vitest-pool-workers/config"; diff --git a/src/content/docs/workers/testing/vitest-integration/get-started/migrate-from-unstable-dev.mdx b/src/content/docs/workers/testing/vitest-integration/get-started/migrate-from-unstable-dev.mdx index 9895f441c18d6e..48932cd85249c9 100644 --- a/src/content/docs/workers/testing/vitest-integration/get-started/migrate-from-unstable-dev.mdx +++ b/src/content/docs/workers/testing/vitest-integration/get-started/migrate-from-unstable-dev.mdx @@ -28,7 +28,7 @@ it("dispatches fetch event", () => { }) ``` -With the Workers Vitest integration, you can accomplish the same goal using `SELF` from `cloudflare:test`. `SELF` is a [service binding](/workers/runtime-apis/bindings/service-bindings/) to the default export defined by the `main` option in your `wrangler.toml`. This `main` Worker runs in the same isolate as tests so any global mocks will apply to it too. +With the Workers Vitest integration, you can accomplish the same goal using `SELF` from `cloudflare:test`. `SELF` is a [service binding](/workers/runtime-apis/bindings/service-bindings/) to the default export defined by the `main` option in your `wrangler.toml / wrangler.json` file. This `main` Worker runs in the same isolate as tests so any global mocks will apply to it too. ```js import { SELF } from "cloudflare:test"; @@ -46,7 +46,7 @@ With the Workers Vitest integration, there is no need to stop a Worker via `work ## Import Wrangler configuration -Via the `unstable_dev` API, you can reference a `wrangler.toml` configuration file by adding it as an option: +Via the `unstable_dev` API, you can reference a `wrangler.toml / wrangler.json` file by adding it as an option: ```js await unstable_dev("src/index.ts", { diff --git a/src/content/docs/workers/testing/vitest-integration/get-started/write-your-first-test.mdx b/src/content/docs/workers/testing/vitest-integration/get-started/write-your-first-test.mdx index 4914465a5aa2ae..3a14774726ad46 100644 --- a/src/content/docs/workers/testing/vitest-integration/get-started/write-your-first-test.mdx +++ b/src/content/docs/workers/testing/vitest-integration/get-started/write-your-first-test.mdx @@ -17,7 +17,7 @@ This guide will instruct you through installing and setting up the `@cloudflare/ - Make sure that your Worker is developed using the ES modules format. To migrate from the service worker format to the ES modules format, refer to the [Migrate to the ES modules format](/workers/reference/migrate-to-module-workers/) guide. -- In your project's `wrangler.toml` configuration file, define a [compatibility date](/workers/configuration/compatibility-dates/) of `2022-10-31` or higher, and include `nodejs_compat` in your [compatibility flags](/workers/wrangler/configuration/#use-runtime-apis-directly). +- In your project's `wrangler.toml / wrangler.json` file, define a [compatibility date](/workers/configuration/compatibility-dates/) of `2022-10-31` or higher, and include `nodejs_compat` in your [compatibility flags](/workers/wrangler/configuration/#use-runtime-apis-directly). ## Install Vitest and `@cloudflare/vitest-pool-workers` @@ -39,7 +39,7 @@ Currently, the `@cloudflare/vitest-pool-workers` package _only_ works with Vites ## Define Vitest configuration If you do not already have a `vitest.config.js` or `vitest.config.ts` file, you will need to create one and define the following configuration. -You can reference a `wrangler.toml` file to leverage its `main` entry point, [compatibility settings](/workers/configuration/compatibility-dates/), and [bindings](/workers/runtime-apis/bindings/). +You can reference a Wrangler file to leverage its `main` entry point, [compatibility settings](/workers/configuration/compatibility-dates/), and [bindings](/workers/runtime-apis/bindings/). ```js import { defineWorkersConfig } from "@cloudflare/vitest-pool-workers/config"; diff --git a/src/content/docs/workers/tutorials/automated-analytics-reporting/index.mdx b/src/content/docs/workers/tutorials/automated-analytics-reporting/index.mdx index 197869ca1b676e..d749c538b2e914 100644 --- a/src/content/docs/workers/tutorials/automated-analytics-reporting/index.mdx +++ b/src/content/docs/workers/tutorials/automated-analytics-reporting/index.mdx @@ -16,8 +16,7 @@ languages: - JavaScript --- -import { Render, PackageManagers } from "~/components"; -import { TabItem, Tabs } from "~/components"; +import { Render, PackageManagers, TabItem, Tabs, WranglerConfig } from "~/components"; In this tutorial, you will create a [Cloudflare Worker](https://workers.cloudflare.com/) that fetches analytics data about your account from Cloudflare's [GraphQL Analytics API](https://developers.cloudflare.com/analytics/graphql-api/). You will be able to view the account analytics data in your browser and receive a scheduled email report. @@ -93,10 +92,11 @@ yarn add mimetext -## 2. Update wrangler.toml file +## 2. Update Wrangler configuration file -[`wrangler.toml`](https://developers.cloudflare.com/workers/wrangler/configuration/) is the configuration file for your Worker. It was created when you ran `c3` CLI. Open `wrangler.toml` in your code editor and update it with the following configuration: +[`wrangler.json`](/workers/wrangler/configuration/) contains the configuration for your Worker. It was created when you ran `c3` CLI. Open `wrangler.json` in your code editor and update it with the following configuration: + ```toml name = "account-analytics" main = "src/index.js" @@ -130,6 +130,7 @@ RECIPIENT_EMAIL = "<>" # This value will be used as the subject of the email EMAIL_SUBJECT = "Cloudflare Analytics Report" ``` + Before you continue, update the following: @@ -408,7 +409,7 @@ async function sendEmail(env, content) { This function sends an email with the formatted analytics data to the specified recipient email address using Cloudflare's Email Routing service. :::note -`sendEmail` function uses multiple environment variables that are set in the `wrangler.toml` file. +`sendEmail` function uses multiple environment variables that are set in the Wrangler file. ::: ## 4. Test the Worker diff --git a/src/content/docs/workers/tutorials/build-a-jamstack-app/index.mdx b/src/content/docs/workers/tutorials/build-a-jamstack-app/index.mdx index fe7fa2b677b6b4..6a26c677f32cf1 100644 --- a/src/content/docs/workers/tutorials/build-a-jamstack-app/index.mdx +++ b/src/content/docs/workers/tutorials/build-a-jamstack-app/index.mdx @@ -10,7 +10,7 @@ languages: - JavaScript --- -import { Render, PackageManagers } from "~/components"; +import { Render, PackageManagers, WranglerConfig } from "~/components"; In this tutorial, you will build a todo list application using HTML, CSS, and JavaScript. The application data will be stored in [Workers KV](/kv/api/). @@ -87,9 +87,7 @@ To get started with KV, set up a namespace. All of your cached data will be stor npx wrangler kv:namespace create "TODOS" --preview ``` -The associated namespace can be combined with a `--preview` flag to interact with a preview namespace instead of a production namespace. Namespaces can be added to your application by defining them inside your Wrangler configuration. Copy your newly created namespace ID, and in your `wrangler.toml`, define a `kv_namespaces` key to set up your namespace: - -import { WranglerConfig } from "~/components"; +The associated namespace can be combined with a `--preview` flag to interact with a preview namespace instead of a production namespace. Namespaces can be added to your application by defining them inside your Wrangler configuration. Copy your newly created namespace ID, and in your `wrangler.toml / wrangler.json` file, define a `kv_namespaces` key to set up your namespace: diff --git a/src/content/docs/workers/tutorials/connect-to-turso-using-workers/index.mdx b/src/content/docs/workers/tutorials/connect-to-turso-using-workers/index.mdx index 0a81709ac834bb..66d9d917fa0c02 100644 --- a/src/content/docs/workers/tutorials/connect-to-turso-using-workers/index.mdx +++ b/src/content/docs/workers/tutorials/connect-to-turso-using-workers/index.mdx @@ -9,7 +9,7 @@ languages: - SQL --- -import { Render, PackageManagers } from "~/components"; +import { Render, PackageManagers, WranglerConfig } from "~/components"; This tutorial will guide you on how to build globally distributed applications with Cloudflare Workers, and [Turso](https://chiselstrike.com/), an edge-hosted distributed database based on libSQL. By using Workers and Turso, you can create applications that are close to your end users without having to maintain or operate infrastructure in tens or hundreds of regions. @@ -130,12 +130,12 @@ cd worker-turso-ts In your project directory, you now have the following files: -- `wrangler.toml`: Your Wrangler configuration file. +- `wrangler.json`: your `wrangler.toml / wrangler.json` file. - `src/index.ts`: A minimal Hello World Worker written in TypeScript - `package.json`: A minimal Node dependencies configuration file. - `tsconfig.json`: TypeScript configuration that includes Workers types. Only generated if indicated. -For this tutorial, only the `wrangler.toml` and `src/index.ts` files are relevant. You will not need to edit the other files, and they should be left as is. +For this tutorial, only the `wrangler.toml / wrangler.json` file and `src/index.ts` file are relevant. You will not need to edit the other files, and they should be left as is. ## Configure your Worker for your Turso database @@ -154,9 +154,7 @@ turso db show my-db --url libsql://my-db-.turso.io ``` -Open `wrangler.toml` in your editor and at the bottom of the file, create a new `[vars]` section representing the [environment variables](/workers/configuration/environment-variables/) for your project: - -import { WranglerConfig } from "~/components"; +Open the `wrangler.toml / wrangler.json` file in your editor and at the bottom of the file, create a new `[vars]` section representing the [environment variables](/workers/configuration/environment-variables/) for your project: @@ -167,7 +165,7 @@ LIBSQL_DB_URL = "paste-your-url-here" -Save the changes to `wrangler.toml`. +Save the changes to the `wrangler.toml / wrangler.json` file. Next, create a long-lived authentication token for your Worker to use when connecting to your database. Run the following Turso CLI command, and copy the output to your clipboard: @@ -359,7 +357,7 @@ You should see JSON similar to the following containing the data from the `examp If you see an error instead of a list of users, double check that: -- You have entered the correct value for your `LIBSQL_DB_URL` in `wrangler.toml`. +- You have entered the correct value for your `LIBSQL_DB_URL` in the `wrangler.toml / wrangler.json` file. - You have set a secret called `LIBSQL_DB_AUTH_TOKEN` with your database authentication token. Both of these need to be present and match the variable names in your Worker's code. diff --git a/src/content/docs/workers/tutorials/create-finetuned-chatgpt-ai-models-with-r2/index.mdx b/src/content/docs/workers/tutorials/create-finetuned-chatgpt-ai-models-with-r2/index.mdx index 7634b2188d9a3b..0cbff4a9d1729e 100644 --- a/src/content/docs/workers/tutorials/create-finetuned-chatgpt-ai-models-with-r2/index.mdx +++ b/src/content/docs/workers/tutorials/create-finetuned-chatgpt-ai-models-with-r2/index.mdx @@ -15,7 +15,7 @@ sidebar: order: 1 --- -import { Render, PackageManagers } from "~/components"; +import { Render, PackageManagers, WranglerConfig } from "~/components"; In this tutorial, you will use the [OpenAI](https://openai.com) API and [Cloudflare R2](/r2) to create a [fine-tuned model](https://platform.openai.com/docs/guides/fine-tuning). @@ -91,9 +91,7 @@ npx wrangler r2 object put -f A binding is how your Worker interacts with external resources such as the R2 bucket. -To bind the R2 bucket to your Worker, add the following to your `wrangler.toml` file. Update the binding property to a valid JavaScript variable identifier. Replace `` with the name of the bucket you created in [step 2](#2-upload-a-fine-tune-document-to-r2): - -import { WranglerConfig } from "~/components"; +To bind the R2 bucket to your Worker, add the following to your Wrangler file. Update the binding property to a valid JavaScript variable identifier. Replace `` with the name of the bucket you created in [step 2](#2-upload-a-fine-tune-document-to-r2): @@ -119,7 +117,7 @@ You also need to install the [OpenAI Node API library](https://www.npmjs.com/pac npm install openai ``` -Next, open the `src/index.ts` file and replace the default code with the below code. Replace `` with the binding name you set in `wrangler.toml` file. +Next, open the `src/index.ts` file and replace the default code with the below code. Replace `` with the binding name you set in Wrangler file. ```typescript import { Context, Hono } from "hono"; @@ -161,7 +159,7 @@ In `createFile`, your Worker reads the file from R2 and converts it to a `File` The `GET /files` route listens for `GET` requests with a query parameter `file`, representing a filename of an uploaded fine-tune document in R2. The function uses the `createFile` function to manage the file upload process. -Replace `` with the binding name you set in `wrangler.toml` file. +Replace `` with the binding name you set in Wrangler file. ```typescript // New import added at beginning of file diff --git a/src/content/docs/workers/tutorials/deploy-a-realtime-chat-app/index.mdx b/src/content/docs/workers/tutorials/deploy-a-realtime-chat-app/index.mdx index dc023bb0bf6ccf..e6654391c484e9 100644 --- a/src/content/docs/workers/tutorials/deploy-a-realtime-chat-app/index.mdx +++ b/src/content/docs/workers/tutorials/deploy-a-realtime-chat-app/index.mdx @@ -10,7 +10,7 @@ languages: - JavaScript --- -import { Render } from "~/components"; +import { Render, WranglerConfig } from "~/components"; In this tutorial, you will deploy a serverless, real-time chat application that runs using [Durable Objects](/durable-objects/). @@ -48,11 +48,9 @@ Your application will be deployed to your `*.workers.dev` subdomain. To deploy your application to a custom domain within the Cloudflare dashboard, go to your Worker > **Triggers** > **Add Custom Domain**. -To deploy your application to a custom domain using Wrangler, open your project's `wrangler.toml`. +To deploy your application to a custom domain using Wrangler, open your project's `wrangler.toml / wrangler.json` file. -To configure a route in your `wrangler.toml`, add the following to your environment: - -import { WranglerConfig } from "~/components"; +To configure a route in your `wrangler.toml / wrangler.json` file, add the following to your environment: @@ -64,11 +62,9 @@ routes = [ -If you have specified your zone ID in the environment of your `wrangler.toml`, you will not need to write it again in object form. - -To configure a subdomain in your `wrangler.toml`, add the following to your environment: - +If you have specified your zone ID in the environment of your `wrangler.toml / wrangler.json` file, you will not need to write it again in object form. +To configure a subdomain in your `wrangler.toml / wrangler.json` file, add the following to your environment: @@ -89,7 +85,7 @@ To test your live application: ## Uninstall your application -To uninstall your chat application, modify your `wrangler.toml` file to remove the `durable_objects` bindings and add a `deleted_classes` migration: +To uninstall your chat application, modify your Wrangler file to remove the `durable_objects` bindings and add a `deleted_classes` migration: diff --git a/src/content/docs/workers/tutorials/generate-dynamic-og-images-using-workers/index.mdx b/src/content/docs/workers/tutorials/generate-dynamic-og-images-using-workers/index.mdx index b682418ded929f..04295050121aa5 100644 --- a/src/content/docs/workers/tutorials/generate-dynamic-og-images-using-workers/index.mdx +++ b/src/content/docs/workers/tutorials/generate-dynamic-og-images-using-workers/index.mdx @@ -18,7 +18,7 @@ spotlight: author_bio_source: GitHub --- -import { PackageManagers, Render, Tabs, TabItem } from "~/components"; +import { PackageManagers, Render, Tabs, TabItem, WranglerConfig } from "~/components"; Social media thrives on compelling visuals. With Cloudflare Workers, you can effortlessly generate dynamic Open Graph (OG) images that grab attention and boost platform performance. In this tutorial, you'll learn how to create a customizable OG image generator powered by serverless edge computing. Cloudflare Workers enable you to deliver blazing-fast visuals globally, ensuring a seamless experience for your users. Let's dive in to see how you can take your OG images to the next level with Cloudflare Workers. @@ -203,8 +203,9 @@ Key TypeScript configuration features: ### Configure Wrangler for runtime compatibility and static assets -Before starting, ensure your `wrangler.toml` includes these essential configurations: +Before starting, ensure your `wrangler.toml / wrangler.json` file includes these essential configurations: + ```toml title="wrangler.toml" compatibility_date = "2024-11-06" compatibility_flags = [ "nodejs_compat_v2" ] @@ -213,6 +214,7 @@ minify = true [build] watch_dir = "public" ``` + [The `nodejs_compat` flag](/workers/configuration/compatibility-flags/#nodejs-compatibility-flag) enables runtime compatibility features required by the OG image generation library, even when using Bun. While we're using Bun as our development runtime, this flag ensures all necessary APIs are available in the Workers environment. The `assets` configuration maps your Worker's public directory, allowing direct access to static files like fonts, images, and favicons through URL paths (for example, `/fonts/Inter.ttf`, `/images/logo.png`). diff --git a/src/content/docs/workers/tutorials/generate-youtube-thumbnails-with-workers-and-images/index.mdx b/src/content/docs/workers/tutorials/generate-youtube-thumbnails-with-workers-and-images/index.mdx index 48e62c09777b66..d6a0bb12c47af6 100644 --- a/src/content/docs/workers/tutorials/generate-youtube-thumbnails-with-workers-and-images/index.mdx +++ b/src/content/docs/workers/tutorials/generate-youtube-thumbnails-with-workers-and-images/index.mdx @@ -11,7 +11,7 @@ languages: - Rust --- -import { Render, PackageManagers } from "~/components"; +import { Render, PackageManagers, WranglerConfig } from "~/components"; In this tutorial, you will learn how to programmatically generate a custom YouTube thumbnail using Cloudflare Workers and Cloudflare Image Resizing. You may want to generate a custom YouTube thumbnail to customize the thumbnail's design, call-to-actions and images used to encourage more viewers to watch your video. @@ -335,9 +335,7 @@ Adding a query parameter with custom text, you should receive: ![Follow the instructions above to receive an output image](~/assets/images/workers/tutorials/youtube-thumbnails/build-serverles.png) -To deploy your Worker, open your `wrangler.toml` file and update the `name` key with your project's name. Below is an example with this tutorial's project name: - -import { WranglerConfig } from "~/components"; +To deploy your Worker, open your Wrangler file and update the `name` key with your project's name. Below is an example with this tutorial's project name: @@ -498,7 +496,7 @@ fetch(imageURL, { Image transformations can only be tested when you deploy your Worker. -To deploy your Worker, open your `wrangler.toml` file and update the `name` key with your project's name. Below is an example with this tutorial's project name: +To deploy your Worker, open your Wrangler file and update the `name` key with your project's name. Below is an example with this tutorial's project name: diff --git a/src/content/docs/workers/tutorials/github-sms-notifications-using-twilio/index.mdx b/src/content/docs/workers/tutorials/github-sms-notifications-using-twilio/index.mdx index cd617d5b4c086f..afdd3b7af06c1b 100644 --- a/src/content/docs/workers/tutorials/github-sms-notifications-using-twilio/index.mdx +++ b/src/content/docs/workers/tutorials/github-sms-notifications-using-twilio/index.mdx @@ -8,7 +8,7 @@ languages: - JavaScript --- -import { Render, PackageManagers } from "~/components"; +import { Render, PackageManagers, WranglerConfig } from "~/components"; In this tutorial, you will learn to build an SMS notification system on Workers to receive updates on a GitHub repository. Your Worker will send you a text update using Twilio when there is new activity on your repository. @@ -153,9 +153,7 @@ To make this work, you need to use [`wrangler secret put`](/workers/wrangler/com npx wrangler secret put GITHUB_SECRET_TOKEN ``` -Add the nodejs_compat flag to your `wrangler.toml` file: - -import { WranglerConfig } from "~/components"; +Add the nodejs_compat flag to your Wrangler file: diff --git a/src/content/docs/workers/tutorials/handle-form-submissions-with-airtable/index.mdx b/src/content/docs/workers/tutorials/handle-form-submissions-with-airtable/index.mdx index 8dfcb0a8a582f4..af023926798948 100644 --- a/src/content/docs/workers/tutorials/handle-form-submissions-with-airtable/index.mdx +++ b/src/content/docs/workers/tutorials/handle-form-submissions-with-airtable/index.mdx @@ -10,7 +10,7 @@ languages: - JavaScript --- -import { Render, PackageManagers } from "~/components"; +import { Render, PackageManagers, WranglerConfig } from "~/components"; In this tutorial, you will use [Cloudflare Workers](/workers/) and [Airtable](https://airtable.com) to persist form submissions from a front-end user interface. Airtable is a free-to-use spreadsheet solution that has an approachable API for developers. Workers will handle incoming form submissions and use Airtable's [REST API](https://airtable.com/api) to asynchronously persist the data in an Airtable base (Airtable's term for a spreadsheet) for later reference. @@ -234,11 +234,9 @@ async function createAirtableRecord(env, body) { // export default ... ``` -To make an authenticated request to Airtable, you need to provide four constants that represent data about your Airtable account, base, and table name. You have already set `AIRTABLE_ACCESS_TOKEN` using `wrangler secret`, since it is a value that should be encrypted. The **Airtable base ID** and **table name**, and `FORM_URL` are values that can be publicly shared in places like GitHub. Use Wrangler's [`vars`](/workers/wrangler/migration/v1-to-v2/wrangler-legacy/configuration/#vars) feature to pass public environment variables from your `wrangler.toml` file. +To make an authenticated request to Airtable, you need to provide four constants that represent data about your Airtable account, base, and table name. You have already set `AIRTABLE_ACCESS_TOKEN` using `wrangler secret`, since it is a value that should be encrypted. The **Airtable base ID** and **table name**, and `FORM_URL` are values that can be publicly shared in places like GitHub. Use Wrangler's [`vars`](/workers/wrangler/migration/v1-to-v2/wrangler-legacy/configuration/#vars) feature to pass public environment variables from your Wrangler file. -Add a `vars` table at the end of your `wrangler.toml` file: - -import { WranglerConfig } from "~/components"; +Add a `vars` table at the end of your Wrangler file: diff --git a/src/content/docs/workers/tutorials/live-cursors-with-nextjs-rpc-do/index.mdx b/src/content/docs/workers/tutorials/live-cursors-with-nextjs-rpc-do/index.mdx index 8342fd6e6ed99f..d27595d4ba5969 100644 --- a/src/content/docs/workers/tutorials/live-cursors-with-nextjs-rpc-do/index.mdx +++ b/src/content/docs/workers/tutorials/live-cursors-with-nextjs-rpc-do/index.mdx @@ -348,7 +348,7 @@ that will be made available to the Next.js Worker using a [`WorkerEntrypoint`](/ ## 4. Build Next.js Worker functionality -1. In your Next.js `wrangler.toml` file, declare the external Durable Object binding and the Service binding to `SessionsRPC`: +1. In your Next.js Wrangler file, declare the external Durable Object binding and the Service binding to `SessionsRPC`: ```toml title="next-rpc/wrangler.toml" ins={10-18} # ... rest of the configuration diff --git a/src/content/docs/workers/tutorials/postgres/index.mdx b/src/content/docs/workers/tutorials/postgres/index.mdx index caac9a4cd70f90..e1ec2e65f71394 100644 --- a/src/content/docs/workers/tutorials/postgres/index.mdx +++ b/src/content/docs/workers/tutorials/postgres/index.mdx @@ -13,7 +13,7 @@ languages: - SQL --- -import { Render, PackageManagers } from "~/components"; +import { Render, PackageManagers, WranglerConfig } from "~/components"; In this tutorial, you will learn how to create a Cloudflare Workers application and connect it to a PostgreSQL database using [TCP Sockets](/workers/runtime-apis/tcp-sockets/) and [Hyperdrive](/hyperdrive/). The Workers application you create in this tutorial will interact with a product database inside of PostgreSQL. @@ -58,17 +58,9 @@ cd postgres-tutorial ### Enable Node.js compatibility - +[Node.js compatibility](/workers/runtime-apis/nodejs/) is required for database drivers, including Postgres.js, and needs to be configured for your Workers project. -import { WranglerConfig } from "~/components"; - - - -```toml title="wrangler.toml" -compatibility_flags = ["nodejs_compat_v2"] -``` - - + ## 2. Add the PostgreSQL connection library @@ -112,8 +104,6 @@ npx wrangler secret put DB_URL Set your `DB_URL` secret locally in a `.dev.vars` file as documented in [Local Development with Secrets](/workers/configuration/secrets/). - - ```toml @@ -124,9 +114,7 @@ DB_URL="" ### Set explicit parameters -Configure each database parameter as an [environment variable](/workers/configuration/environment-variables/) via the [Cloudflare dashboard](/workers/configuration/environment-variables/#add-environment-variables-via-the-dashboard) or in your `wrangler.toml` file. Refer to an example of a`wrangler.toml` file configuration: - - +Configure each database parameter as an [environment variable](/workers/configuration/environment-variables/) via the [Cloudflare dashboard](/workers/configuration/environment-variables/#add-environment-variables-via-the-dashboard) or in your Wrangler file. Refer to an example of aWrangler file configuration: @@ -327,9 +315,7 @@ npx wrangler hyperdrive create --connection-string=" You can also use explicit parameters by following the [wrangler documentation for Hyperdrive](/workers/wrangler/commands/#r2-bucket-create). -This command outputs the Hyperdrive configuration `id` that will be used for your Hyperdrive [binding](/workers/runtime-apis/bindings/). Set up your binding by specifying the `id` in the `wrangler.toml` file. - - +This command outputs the Hyperdrive configuration `id` that will be used for your Hyperdrive [binding](/workers/runtime-apis/bindings/). Set up your binding by specifying the `id` in the Wrangler file. diff --git a/src/content/docs/workers/tutorials/store-data-with-fauna/index.mdx b/src/content/docs/workers/tutorials/store-data-with-fauna/index.mdx index fbbd5c8baf7254..1a66b1262383b9 100644 --- a/src/content/docs/workers/tutorials/store-data-with-fauna/index.mdx +++ b/src/content/docs/workers/tutorials/store-data-with-fauna/index.mdx @@ -10,7 +10,7 @@ languages: - TypeScript --- -import { Render, TabItem, Tabs, PackageManagers } from "~/components"; +import { Render, TabItem, Tabs, PackageManagers, WranglerConfig } from "~/components"; In this tutorial, you learn how to store and retrieve data in your Cloudflare Workers applications by building a REST API that manages an inventory catalog using [Fauna](https://fauna.com/) as its data layer. @@ -112,9 +112,7 @@ Then, move into your newly created directory: cd fauna-workers ``` -Update the `wrangler.toml` file to set the name for the Worker. - -import { WranglerConfig } from "~/components"; +Update the Wrangler file to set the name for the Worker. diff --git a/src/content/docs/workers/tutorials/upload-assets-with-r2/index.mdx b/src/content/docs/workers/tutorials/upload-assets-with-r2/index.mdx index 443be11b154277..cb153e4436a25b 100644 --- a/src/content/docs/workers/tutorials/upload-assets-with-r2/index.mdx +++ b/src/content/docs/workers/tutorials/upload-assets-with-r2/index.mdx @@ -10,7 +10,7 @@ languages: - TypeScript --- -import { Render, PackageManagers } from "~/components"; +import { Render, PackageManagers, WranglerConfig } from "~/components"; This tutorial explains how to create a TypeScript-based Cloudflare Workers project that can securely access files from and upload files to a [Cloudflare R2](/r2/) bucket. Cloudflare R2 allows developers to store large amounts of unstructured data without the costly egress bandwidth fees associated with typical cloud storage services. @@ -66,9 +66,7 @@ npx wrangler r2 bucket list After your new R2 bucket is ready, use it inside your Worker application. -Use your R2 bucket inside your Worker project by modifying the `wrangler.toml` configuration file to include an R2 bucket [binding](/workers/runtime-apis/bindings/). Add the following R2 bucket binding to your `wrangler.toml` file: - -import { WranglerConfig } from "~/components"; +Use your R2 bucket inside your Worker project by modifying the `wrangler.toml / wrangler.json` file to include an R2 bucket [binding](/workers/runtime-apis/bindings/). Add the following R2 bucket binding to your Wrangler file: diff --git a/src/content/docs/workers/tutorials/workers-kv-from-rust/index.mdx b/src/content/docs/workers/tutorials/workers-kv-from-rust/index.mdx index 36e5136f475e0c..1b5f7374088569 100644 --- a/src/content/docs/workers/tutorials/workers-kv-from-rust/index.mdx +++ b/src/content/docs/workers/tutorials/workers-kv-from-rust/index.mdx @@ -10,7 +10,7 @@ languages: - Rust --- -import { Render } from "~/components"; +import { Render, WranglerConfig } from "~/components"; This tutorial will teach you how to read and write to KV directly from Rust using [workers-rs](https://github.com/cloudflare/workers-rs). @@ -50,9 +50,7 @@ In the terminal, use Wrangler to create a KV namespace for `cities`. This genera npx wrangler kv:namespace create cities ``` -To add this configuration to your project, open the `wrangler.toml` file and create an entry for `kv_namespaces` above the build command: - -import { WranglerConfig } from "~/components"; +To add this configuration to your project, open the Wrangler file and create an entry for `kv_namespaces` above the build command: diff --git a/src/content/docs/workers/wrangler/api.mdx b/src/content/docs/workers/wrangler/api.mdx index d097174f06251f..0c9e62edc35bc9 100644 --- a/src/content/docs/workers/wrangler/api.mdx +++ b/src/content/docs/workers/wrangler/api.mdx @@ -8,7 +8,7 @@ description: A set of programmatic APIs that can be integrated with local Cloudflare Workers-related workflows. --- -import { Render, TabItem, Tabs, Type, MetaInfo } from "~/components"; +import { Render, TabItem, Tabs, Type, MetaInfo, WranglerConfig } from "~/components"; Wrangler offers APIs to programmatically interact with your Cloudflare Workers. @@ -252,7 +252,7 @@ const platform = await getPlatformProxy(options); The path to the config file to use. - If no path is specified the default behavior is to search from the current directory up the filesystem for a `wrangler.toml` to use. + If no path is specified, the default behavior is to search from the current directory up the filesystem for a `wrangler.toml / wrangler.json` file to use. **Note:** this field is optional but if a path is specified it must point to a valid file on the filesystem. @@ -295,9 +295,7 @@ const platform = await getPlatformProxy(options); ### Usage -The `getPlatformProxy` function uses bindings found in `wrangler.toml`. For example, if you have an [environment variable](/workers/configuration/environment-variables/#add-environment-variables-via-wrangler) configuration set up in `wrangler.toml`: - -import { WranglerConfig } from "~/components"; +The `getPlatformProxy` function uses bindings found in the `wrangler.toml / wrangler.json` file. For example, if you have an [environment variable](/workers/configuration/environment-variables/#add-environment-variables-via-wrangler) configuration set up in the `wrangler.toml / wrangler.json` file: @@ -326,7 +324,7 @@ This will print the following output: `MY_VARIABLE = test`. ### Supported bindings -All supported bindings found in your `wrangler.toml` are available to you via `env`. +All supported bindings found in your `wrangler.toml / wrangler.json` file are available to you via `env`. The bindings supported by `getPlatformProxy` are: diff --git a/src/content/docs/workers/wrangler/commands.mdx b/src/content/docs/workers/wrangler/commands.mdx index 0dccb812351bd9..7707e2e9115b1d 100644 --- a/src/content/docs/workers/wrangler/commands.mdx +++ b/src/content/docs/workers/wrangler/commands.mdx @@ -7,7 +7,7 @@ head: description: Create, develop, and deploy your Cloudflare Workers with Wrangler commands. --- -import { TabItem, Tabs, Render, Type, MetaInfo } from "~/components"; +import { TabItem, Tabs, Render, Type, MetaInfo, WranglerConfig } from "~/components"; Wrangler offers a number of commands to manage your Cloudflare Workers. @@ -27,7 +27,7 @@ Wrangler offers a number of commands to manage your Cloudflare Workers. - [`r2 bucket`](#r2-bucket) - Manage Workers R2 buckets. - [`r2 object`](#r2-object) - Manage Workers R2 objects. - [`secret`](#secret) - Manage the secret variables for a Worker. -- [`secret:bulk`](#secretbulk) - Manage multiple secret variables for a Worker. +- [`secret bulk`](#secretbulk) - Manage multiple secret variables for a Worker. - [`workflows`](#workflows) - Manage and configure Workflows. - [`tail`](#tail) - Start a session to livestream logs from a deployed Worker. - [`pages`](#pages) - Configure Cloudflare Pages. @@ -40,6 +40,7 @@ Wrangler offers a number of commands to manage your Cloudflare Workers. - [`rollback`](#rollback) - Rollback to a recent deployment. - [`dispatch-namespace`](#dispatch-namespace) - Interact with a [dispatch namespace](/cloudflare-for-platforms/workers-for-platforms/reference/how-workers-for-platforms-works/#dispatch-namespace). - [`mtls-certificate`](#mtls-certificate) - Manage certificates used for mTLS connections. +- [`cert`](#cert) - Manage certificates used for mTLS and Certificate Authority (CA) chain connections. - [`types`](#types) - Generate types from bindings and module rules in configuration. - [`telemetry`](#telemetry) - Configure whether Wrangler can collect anonymous usage data. @@ -146,7 +147,7 @@ wrangler init [] [OPTIONS] ``` - `NAME` - - The name of the Workers project. This is both the directory name and `name` property in the generated `wrangler.toml` [configuration](/workers/wrangler/configuration/) file. + - The name of the Workers project. This is both the directory name and `name` property in the generated [Wrangler configuration](/workers/wrangler/configuration/) file. - `--yes` - Answer yes to any prompts for new projects. - `--from-dash` @@ -172,7 +173,7 @@ wrangler generate [] [TEMPLATE] ``` - `NAME` - - The name of the Workers project. This is both the directory name and `name` property in the generated `wrangler.toml` [configuration](/workers/wrangler/configuration/) file. + - The name of the Workers project. This is both the directory name and `name` property in the generated [Wrangler configuration](/workers/wrangler/configuration/) file. - `TEMPLATE` - The URL of a GitHub template, with a default [worker-template](https://github.com/cloudflare/worker-template). Browse a list of available templates on the [cloudflare/workers-sdk](https://github.com/cloudflare/workers-sdk/tree/main/templates#usage) repository. @@ -202,7 +203,7 @@ Interact with a [Vectorize](/vectorize/) vector database. ### `create` -Creates a new vector index, and provides the binding and name that you will put in your `wrangler.toml` file. +Creates a new vector index, and provides the binding and name that you will put in your Wrangler file. ```sh npx wrangler vectorize create [--dimensions=] [--metric=] [--description=] @@ -429,7 +430,7 @@ wrangler dev [