[{"data":1,"prerenderedAt":1225},["ShallowReactive",2],{"til-cloudflare-pages-wrangler-bindings":3},{"id":4,"title":5,"body":6,"date":1204,"description":1205,"extension":1206,"language":1207,"meta":1208,"navigation":253,"path":1210,"seo":1211,"stem":1212,"tags":1213,"__hash__":1224},"til/til/cloudflare-pages-wrangler-bindings.md","Cloudflare Pages: Environments mit wrangler.jsonc sauber trennen",{"type":7,"value":8,"toc":1186},"minimark",[9,27,32,73,77,82,97,103,136,140,146,167,175,195,202,209,407,417,425,713,718,741,745,970,992,996,1033,1037,1046,1085,1092,1096,1176,1182],[10,11,12,13,17,18,22,23,26],"p",{},"Wenn du ein ",[14,15,16],"strong",{},"Cloudflare Pages","-Projekt mit Nuxt/Nitro betreibst und separate Datenbanken für Production und Preview willst, stehst du vor einem Problem: Cloudflare Pages unterstützt die ",[19,20,21],"code",{},"env","-Sektion in der generierten Worker-Config ",[14,24,25],{},"nicht",". Hier ist die Lösung, die wir nach einigem Trial-and-Error gefunden haben.",[28,29,31],"h2",{"id":30},"das-ziel","Das Ziel",[33,34,35,52,66],"ul",{},[36,37,38,41,42,45,46,45,49],"li",{},[14,39,40],{},"Production"," → ",[19,43,44],{},"my-app-d1",", ",[19,47,48],{},"my-app-kv",[19,50,51],{},"my-app-r2",[36,53,54,41,57,45,60,45,63],{},[14,55,56],{},"Preview",[19,58,59],{},"my-app-d1-preview",[19,61,62],{},"my-app-kv-preview",[19,64,65],{},"my-app-r2-preview",[36,67,68,69,72],{},"Alles ",[14,70,71],{},"versioniert im Repo",", nicht manuell im Dashboard gepflegt",[28,74,76],{"id":75},"die-herausforderung","Die Herausforderung",[78,79,81],"h3",{"id":80},"workers-vs-pages","Workers vs. Pages",[10,83,84,85,88,89,92,93,96],{},"Bei Cloudflare ",[14,86,87],{},"Workers"," funktioniert ",[19,90,91],{},"env.preview"," in der ",[19,94,95],{},"wrangler.toml/jsonc"," einwandfrei — Wrangler wählt automatisch das richtige Environment.",[10,98,84,99,102],{},[14,100,101],{},"Pages"," ist das anders:",[33,104,105,116,126],{},[36,106,107,110,111,113,114],{},[19,108,109],{},"wrangler pages deploy --branch=preview"," wählt ",[14,112,25],{}," automatisch ",[19,115,91],{},[36,117,118,119,122,123,125],{},"Nitro/Nuxt kopiert die gesamte ",[19,120,121],{},"wrangler.jsonc"," (inkl. ",[19,124,21],{},") in den Build-Output",[36,127,128,129,132,133,135],{},"Cloudflare Pages ",[14,130,131],{},"verweigert"," den Deploy, wenn die generierte Config eine ",[19,134,21],{},"-Sektion enthält",[78,137,139],{"id":138},"was-nicht-funktioniert","Was NICHT funktioniert",[10,141,142,145],{},[14,143,144],{},"Dashboard als Source of Truth"," (alter Ansatz):",[33,147,148,154,164],{},[36,149,150,153],{},[19,151,152],{},"pages_build_output_dir"," aus der Config entfernen → Dashboard-Bindings bleiben editierbar",[36,155,156,157,160,161,163],{},"Problem: Bindings nicht im Git, ",[19,158,159],{},"postbuild","-Hack nötig um ",[19,162,152],{}," aus dem Nitro-Output zu entfernen",[36,165,166],{},"Fragil und intransparent",[10,168,169,174],{},[14,170,171,173],{},[19,172,21],{},"-Sektion direkt nutzen"," (naiver Ansatz):",[33,176,177],{},[36,178,179,181,182,184,185],{},[19,180,121],{}," mit ",[19,183,91],{}," → Nitro kopiert alles in den Output → Cloudflare Pages lehnt den Deploy ab mit:\n",[186,187,192],"pre",{"className":188,"code":190,"language":191},[189],"language-text","Redirected configurations cannot include environments\n","text",[19,193,190],{"__ignoreMap":194},"",[28,196,198,199,201],{"id":197},"die-lösung-wranglerjsonc-postbuild-script","Die Lösung: ",[19,200,121],{}," + Postbuild-Script",[78,203,205,206,208],{"id":204},"_1-wranglerjsonc-als-source-of-truth","1. ",[19,207,121],{}," als Source of Truth",[186,210,214],{"className":211,"code":212,"language":213,"meta":194,"style":194},"language-jsonc shiki shiki-themes github-light github-dark","{\n  \"name\": \"my-app\",\n  \"pages_build_output_dir\": \"dist\",\n  \"compatibility_date\": \"2025-07-15\",\n  \"compatibility_flags\": [\"nodejs_compat\"],\n\n  // Production bindings (default)\n  \"d1_databases\": [\n    { \"binding\": \"DB\", \"database_name\": \"my-app-d1\", \"database_id\": \"prod-id-hier\" }\n  ],\n  \"kv_namespaces\": [\n    { \"binding\": \"KV\", \"id\": \"prod-kv-id-hier\" }\n  ],\n  \"r2_buckets\": [\n    { \"binding\": \"BUCKET\", \"bucket_name\": \"my-app-r2\" }\n  ],\n\n  // Preview overrides — werden vom Postbuild-Script angewendet\n  \"env\": {\n    \"preview\": {\n      \"d1_databases\": [\n        { \"binding\": \"DB\", \"database_name\": \"my-app-d1-preview\", \"database_id\": \"preview-id-hier\" }\n      ],\n      \"kv_namespaces\": [\n        { \"binding\": \"KV\", \"id\": \"preview-kv-id-hier\" }\n      ],\n      \"r2_buckets\": [\n        { \"binding\": \"BUCKET\", \"bucket_name\": \"my-app-r2-preview\" }\n      ]\n    }\n  }\n}\n","jsonc",[19,215,216,224,230,236,242,248,255,261,267,273,279,285,291,296,302,308,313,318,324,330,336,342,348,354,360,366,371,377,383,389,395,401],{"__ignoreMap":194},[217,218,221],"span",{"class":219,"line":220},"line",1,[217,222,223],{},"{\n",[217,225,227],{"class":219,"line":226},2,[217,228,229],{},"  \"name\": \"my-app\",\n",[217,231,233],{"class":219,"line":232},3,[217,234,235],{},"  \"pages_build_output_dir\": \"dist\",\n",[217,237,239],{"class":219,"line":238},4,[217,240,241],{},"  \"compatibility_date\": \"2025-07-15\",\n",[217,243,245],{"class":219,"line":244},5,[217,246,247],{},"  \"compatibility_flags\": [\"nodejs_compat\"],\n",[217,249,251],{"class":219,"line":250},6,[217,252,254],{"emptyLinePlaceholder":253},true,"\n",[217,256,258],{"class":219,"line":257},7,[217,259,260],{},"  // Production bindings (default)\n",[217,262,264],{"class":219,"line":263},8,[217,265,266],{},"  \"d1_databases\": [\n",[217,268,270],{"class":219,"line":269},9,[217,271,272],{},"    { \"binding\": \"DB\", \"database_name\": \"my-app-d1\", \"database_id\": \"prod-id-hier\" }\n",[217,274,276],{"class":219,"line":275},10,[217,277,278],{},"  ],\n",[217,280,282],{"class":219,"line":281},11,[217,283,284],{},"  \"kv_namespaces\": [\n",[217,286,288],{"class":219,"line":287},12,[217,289,290],{},"    { \"binding\": \"KV\", \"id\": \"prod-kv-id-hier\" }\n",[217,292,294],{"class":219,"line":293},13,[217,295,278],{},[217,297,299],{"class":219,"line":298},14,[217,300,301],{},"  \"r2_buckets\": [\n",[217,303,305],{"class":219,"line":304},15,[217,306,307],{},"    { \"binding\": \"BUCKET\", \"bucket_name\": \"my-app-r2\" }\n",[217,309,311],{"class":219,"line":310},16,[217,312,278],{},[217,314,316],{"class":219,"line":315},17,[217,317,254],{"emptyLinePlaceholder":253},[217,319,321],{"class":219,"line":320},18,[217,322,323],{},"  // Preview overrides — werden vom Postbuild-Script angewendet\n",[217,325,327],{"class":219,"line":326},19,[217,328,329],{},"  \"env\": {\n",[217,331,333],{"class":219,"line":332},20,[217,334,335],{},"    \"preview\": {\n",[217,337,339],{"class":219,"line":338},21,[217,340,341],{},"      \"d1_databases\": [\n",[217,343,345],{"class":219,"line":344},22,[217,346,347],{},"        { \"binding\": \"DB\", \"database_name\": \"my-app-d1-preview\", \"database_id\": \"preview-id-hier\" }\n",[217,349,351],{"class":219,"line":350},23,[217,352,353],{},"      ],\n",[217,355,357],{"class":219,"line":356},24,[217,358,359],{},"      \"kv_namespaces\": [\n",[217,361,363],{"class":219,"line":362},25,[217,364,365],{},"        { \"binding\": \"KV\", \"id\": \"preview-kv-id-hier\" }\n",[217,367,369],{"class":219,"line":368},26,[217,370,353],{},[217,372,374],{"class":219,"line":373},27,[217,375,376],{},"      \"r2_buckets\": [\n",[217,378,380],{"class":219,"line":379},28,[217,381,382],{},"        { \"binding\": \"BUCKET\", \"bucket_name\": \"my-app-r2-preview\" }\n",[217,384,386],{"class":219,"line":385},29,[217,387,388],{},"      ]\n",[217,390,392],{"class":219,"line":391},30,[217,393,394],{},"    }\n",[217,396,398],{"class":219,"line":397},31,[217,399,400],{},"  }\n",[217,402,404],{"class":219,"line":403},32,[217,405,406],{},"}\n",[10,408,409,410,412,413,416],{},"Die ",[19,411,21],{},"-Sektion dient als ",[14,414,415],{},"Referenz und wird vom Postbuild-Script ausgewertet"," — Cloudflare Pages sieht sie nie.",[78,418,420,421,424],{"id":419},"_2-postbuild-script-scriptspostbuildmjs","2. Postbuild-Script (",[19,422,423],{},"scripts/postbuild.mjs",")",[186,426,430],{"className":427,"code":428,"language":429,"meta":194,"style":194},"language-js shiki shiki-themes github-light github-dark","/**\n * Cloudflare Pages unterstützt keine `env`-Sektion in der Worker-Config.\n * Dieses Script wendet die richtigen Bindings an und entfernt `env`.\n *\n * Usage: node scripts/postbuild.mjs [preview]\n */\nimport { readFileSync, writeFileSync } from 'node:fs'\n\nconst env = process.argv[2] // 'preview' oder undefined (= production)\nconst path = 'dist/_worker.js/wrangler.json'\nconst config = JSON.parse(readFileSync(path, 'utf8'))\n\nif (env && config.env?.[env]) {\n  const envConfig = config.env[env]\n  for (const [key, value] of Object.entries(envConfig)) {\n    config[key] = value\n  }\n  console.log(`✔ Applied \"${env}\" bindings`)\n}\n\ndelete config.env\nwriteFileSync(path, JSON.stringify(config, null, 2))\nconsole.log('✔ Ready for deploy')\n","js",[19,431,432,438,443,448,453,458,463,480,484,508,520,554,558,572,585,620,631,635,656,660,664,672,699],{"__ignoreMap":194},[217,433,434],{"class":219,"line":220},[217,435,437],{"class":436},"sJ8bj","/**\n",[217,439,440],{"class":219,"line":226},[217,441,442],{"class":436}," * Cloudflare Pages unterstützt keine `env`-Sektion in der Worker-Config.\n",[217,444,445],{"class":219,"line":232},[217,446,447],{"class":436}," * Dieses Script wendet die richtigen Bindings an und entfernt `env`.\n",[217,449,450],{"class":219,"line":238},[217,451,452],{"class":436}," *\n",[217,454,455],{"class":219,"line":244},[217,456,457],{"class":436}," * Usage: node scripts/postbuild.mjs [preview]\n",[217,459,460],{"class":219,"line":250},[217,461,462],{"class":436}," */\n",[217,464,465,469,473,476],{"class":219,"line":257},[217,466,468],{"class":467},"szBVR","import",[217,470,472],{"class":471},"sVt8B"," { readFileSync, writeFileSync } ",[217,474,475],{"class":467},"from",[217,477,479],{"class":478},"sZZnC"," 'node:fs'\n",[217,481,482],{"class":219,"line":263},[217,483,254],{"emptyLinePlaceholder":253},[217,485,486,489,493,496,499,502,505],{"class":219,"line":269},[217,487,488],{"class":467},"const",[217,490,492],{"class":491},"sj4cs"," env",[217,494,495],{"class":467}," =",[217,497,498],{"class":471}," process.argv[",[217,500,501],{"class":491},"2",[217,503,504],{"class":471},"] ",[217,506,507],{"class":436},"// 'preview' oder undefined (= production)\n",[217,509,510,512,515,517],{"class":219,"line":275},[217,511,488],{"class":467},[217,513,514],{"class":491}," path",[217,516,495],{"class":467},[217,518,519],{"class":478}," 'dist/_worker.js/wrangler.json'\n",[217,521,522,524,527,529,532,535,539,542,545,548,551],{"class":219,"line":281},[217,523,488],{"class":467},[217,525,526],{"class":491}," config",[217,528,495],{"class":467},[217,530,531],{"class":491}," JSON",[217,533,534],{"class":471},".",[217,536,538],{"class":537},"sScJk","parse",[217,540,541],{"class":471},"(",[217,543,544],{"class":537},"readFileSync",[217,546,547],{"class":471},"(path, ",[217,549,550],{"class":478},"'utf8'",[217,552,553],{"class":471},"))\n",[217,555,556],{"class":219,"line":287},[217,557,254],{"emptyLinePlaceholder":253},[217,559,560,563,566,569],{"class":219,"line":293},[217,561,562],{"class":467},"if",[217,564,565],{"class":471}," (env ",[217,567,568],{"class":467},"&&",[217,570,571],{"class":471}," config.env?.[env]) {\n",[217,573,574,577,580,582],{"class":219,"line":298},[217,575,576],{"class":467},"  const",[217,578,579],{"class":491}," envConfig",[217,581,495],{"class":467},[217,583,584],{"class":471}," config.env[env]\n",[217,586,587,590,593,595,598,601,603,606,608,611,614,617],{"class":219,"line":304},[217,588,589],{"class":467},"  for",[217,591,592],{"class":471}," (",[217,594,488],{"class":467},[217,596,597],{"class":471}," [",[217,599,600],{"class":491},"key",[217,602,45],{"class":471},[217,604,605],{"class":491},"value",[217,607,504],{"class":471},[217,609,610],{"class":467},"of",[217,612,613],{"class":471}," Object.",[217,615,616],{"class":537},"entries",[217,618,619],{"class":471},"(envConfig)) {\n",[217,621,622,625,628],{"class":219,"line":310},[217,623,624],{"class":471},"    config[key] ",[217,626,627],{"class":467},"=",[217,629,630],{"class":471}," value\n",[217,632,633],{"class":219,"line":315},[217,634,400],{"class":471},[217,636,637,640,643,645,648,650,653],{"class":219,"line":320},[217,638,639],{"class":471},"  console.",[217,641,642],{"class":537},"log",[217,644,541],{"class":471},[217,646,647],{"class":478},"`✔ Applied \"${",[217,649,21],{"class":471},[217,651,652],{"class":478},"}\" bindings`",[217,654,655],{"class":471},")\n",[217,657,658],{"class":219,"line":326},[217,659,406],{"class":471},[217,661,662],{"class":219,"line":332},[217,663,254],{"emptyLinePlaceholder":253},[217,665,666,669],{"class":219,"line":338},[217,667,668],{"class":467},"delete",[217,670,671],{"class":471}," config.env\n",[217,673,674,677,679,682,684,687,690,693,695,697],{"class":219,"line":344},[217,675,676],{"class":537},"writeFileSync",[217,678,547],{"class":471},[217,680,681],{"class":491},"JSON",[217,683,534],{"class":471},[217,685,686],{"class":537},"stringify",[217,688,689],{"class":471},"(config, ",[217,691,692],{"class":491},"null",[217,694,45],{"class":471},[217,696,501],{"class":491},[217,698,553],{"class":471},[217,700,701,704,706,708,711],{"class":219,"line":350},[217,702,703],{"class":471},"console.",[217,705,642],{"class":537},[217,707,541],{"class":471},[217,709,710],{"class":478},"'✔ Ready for deploy'",[217,712,655],{"class":471},[10,714,715],{},[14,716,717],{},"Was passiert:",[33,719,720,729],{},[36,721,722,725,726,728],{},[14,723,724],{},"Ohne Argument"," (Production): ",[19,727,21],{}," wird entfernt, Root-Bindings bleiben → Prod-Deploy",[36,730,731,737,738,740],{},[14,732,733,734],{},"Mit ",[19,735,736],{},"preview",": Preview-Bindings überschreiben die Root-Bindings, ",[19,739,21],{}," wird entfernt → Preview-Deploy",[78,742,744],{"id":743},"_3-taskfileyml-für-saubere-workflows","3. Taskfile.yml für saubere Workflows",[186,746,750],{"className":747,"code":748,"language":749,"meta":194,"style":194},"language-yaml shiki shiki-themes github-light github-dark","version: '3'\n\ntasks:\n  build:\n    desc: Build Nuxt app\n    cmds: [bunx nuxi build]\n\n  deploy:\n    desc: Build & deploy to production\n    cmds:\n      - task: build\n      - node scripts/postbuild.mjs\n      - bunx wrangler pages deploy dist --project-name=my-app --branch=main\n\n  deploy:preview:\n    desc: Build & deploy to preview\n    cmds:\n      - task: build\n      - node scripts/postbuild.mjs preview\n      - bunx wrangler pages deploy dist --project-name=my-app --branch=preview\n\n  deploy:all:\n    desc: Deploy to both environments\n    cmds:\n      - task: build\n      - node scripts/postbuild.mjs\n      - bunx wrangler pages deploy dist --project-name=my-app --branch=main\n      - node scripts/postbuild.mjs preview\n      - bunx wrangler pages deploy dist --project-name=my-app --branch=preview\n","yaml",[19,751,752,764,768,776,783,793,807,811,818,827,833,846,853,860,864,871,880,886,896,903,910,914,921,930,936,946,952,958,964],{"__ignoreMap":194},[217,753,754,758,761],{"class":219,"line":220},[217,755,757],{"class":756},"s9eBZ","version",[217,759,760],{"class":471},": ",[217,762,763],{"class":478},"'3'\n",[217,765,766],{"class":219,"line":226},[217,767,254],{"emptyLinePlaceholder":253},[217,769,770,773],{"class":219,"line":232},[217,771,772],{"class":756},"tasks",[217,774,775],{"class":471},":\n",[217,777,778,781],{"class":219,"line":238},[217,779,780],{"class":756},"  build",[217,782,775],{"class":471},[217,784,785,788,790],{"class":219,"line":244},[217,786,787],{"class":756},"    desc",[217,789,760],{"class":471},[217,791,792],{"class":478},"Build Nuxt app\n",[217,794,795,798,801,804],{"class":219,"line":250},[217,796,797],{"class":756},"    cmds",[217,799,800],{"class":471},": [",[217,802,803],{"class":478},"bunx nuxi build",[217,805,806],{"class":471},"]\n",[217,808,809],{"class":219,"line":257},[217,810,254],{"emptyLinePlaceholder":253},[217,812,813,816],{"class":219,"line":263},[217,814,815],{"class":756},"  deploy",[217,817,775],{"class":471},[217,819,820,822,824],{"class":219,"line":269},[217,821,787],{"class":756},[217,823,760],{"class":471},[217,825,826],{"class":478},"Build & deploy to production\n",[217,828,829,831],{"class":219,"line":275},[217,830,797],{"class":756},[217,832,775],{"class":471},[217,834,835,838,841,843],{"class":219,"line":281},[217,836,837],{"class":471},"      - ",[217,839,840],{"class":756},"task",[217,842,760],{"class":471},[217,844,845],{"class":478},"build\n",[217,847,848,850],{"class":219,"line":287},[217,849,837],{"class":471},[217,851,852],{"class":478},"node scripts/postbuild.mjs\n",[217,854,855,857],{"class":219,"line":293},[217,856,837],{"class":471},[217,858,859],{"class":478},"bunx wrangler pages deploy dist --project-name=my-app --branch=main\n",[217,861,862],{"class":219,"line":298},[217,863,254],{"emptyLinePlaceholder":253},[217,865,866,869],{"class":219,"line":304},[217,867,868],{"class":756},"  deploy:preview",[217,870,775],{"class":471},[217,872,873,875,877],{"class":219,"line":310},[217,874,787],{"class":756},[217,876,760],{"class":471},[217,878,879],{"class":478},"Build & deploy to preview\n",[217,881,882,884],{"class":219,"line":315},[217,883,797],{"class":756},[217,885,775],{"class":471},[217,887,888,890,892,894],{"class":219,"line":320},[217,889,837],{"class":471},[217,891,840],{"class":756},[217,893,760],{"class":471},[217,895,845],{"class":478},[217,897,898,900],{"class":219,"line":326},[217,899,837],{"class":471},[217,901,902],{"class":478},"node scripts/postbuild.mjs preview\n",[217,904,905,907],{"class":219,"line":332},[217,906,837],{"class":471},[217,908,909],{"class":478},"bunx wrangler pages deploy dist --project-name=my-app --branch=preview\n",[217,911,912],{"class":219,"line":338},[217,913,254],{"emptyLinePlaceholder":253},[217,915,916,919],{"class":219,"line":344},[217,917,918],{"class":756},"  deploy:all",[217,920,775],{"class":471},[217,922,923,925,927],{"class":219,"line":350},[217,924,787],{"class":756},[217,926,760],{"class":471},[217,928,929],{"class":478},"Deploy to both environments\n",[217,931,932,934],{"class":219,"line":356},[217,933,797],{"class":756},[217,935,775],{"class":471},[217,937,938,940,942,944],{"class":219,"line":362},[217,939,837],{"class":471},[217,941,840],{"class":756},[217,943,760],{"class":471},[217,945,845],{"class":478},[217,947,948,950],{"class":219,"line":368},[217,949,837],{"class":471},[217,951,852],{"class":478},[217,953,954,956],{"class":219,"line":373},[217,955,837],{"class":471},[217,957,859],{"class":478},[217,959,960,962],{"class":219,"line":379},[217,961,837],{"class":471},[217,963,902],{"class":478},[217,965,966,968],{"class":219,"line":385},[217,967,837],{"class":471},[217,969,909],{"class":478},[10,971,972,979,980,983,984,987,988,991],{},[14,973,974,975,978],{},"Wichtig bei ",[19,976,977],{},"deploy:all",":"," Es wird nur ",[14,981,982],{},"einmal"," gebaut. Das Postbuild-Script modifiziert nur die generierte ",[19,985,986],{},"wrangler.json"," im ",[19,989,990],{},"dist/","-Ordner — das geht schnell und erfordert keinen Rebuild.",[28,993,995],{"id":994},"deploy-workflow","Deploy-Workflow",[186,997,1001],{"className":998,"code":999,"language":1000,"meta":194,"style":194},"language-bash shiki shiki-themes github-light github-dark","task deploy           # Production\ntask deploy:preview   # Preview\ntask deploy:all       # Beide\n","bash",[19,1002,1003,1013,1023],{"__ignoreMap":194},[217,1004,1005,1007,1010],{"class":219,"line":220},[217,1006,840],{"class":537},[217,1008,1009],{"class":478}," deploy",[217,1011,1012],{"class":436},"           # Production\n",[217,1014,1015,1017,1020],{"class":219,"line":226},[217,1016,840],{"class":537},[217,1018,1019],{"class":478}," deploy:preview",[217,1021,1022],{"class":436},"   # Preview\n",[217,1024,1025,1027,1030],{"class":219,"line":232},[217,1026,840],{"class":537},[217,1028,1029],{"class":478}," deploy:all",[217,1031,1032],{"class":436},"       # Beide\n",[28,1034,1036],{"id":1035},"secrets","Secrets",[10,1038,1039,1040,1042,1043,1045],{},"Secrets (API-Keys, Auth-Secrets) gehören ",[14,1041,25],{}," in die ",[19,1044,121],{},". Sie werden pro Environment im Cloudflare Dashboard gesetzt:",[186,1047,1049],{"className":998,"code":1048,"language":1000,"meta":194,"style":194},"# Oder via CLI:\necho \"dein-secret\" | wrangler pages secret put SECRET_NAME --project-name=my-app\n",[19,1050,1051,1056],{"__ignoreMap":194},[217,1052,1053],{"class":219,"line":220},[217,1054,1055],{"class":436},"# Oder via CLI:\n",[217,1057,1058,1061,1064,1067,1070,1073,1076,1079,1082],{"class":219,"line":226},[217,1059,1060],{"class":491},"echo",[217,1062,1063],{"class":478}," \"dein-secret\"",[217,1065,1066],{"class":467}," |",[217,1068,1069],{"class":537}," wrangler",[217,1071,1072],{"class":478}," pages",[217,1074,1075],{"class":478}," secret",[217,1077,1078],{"class":478}," put",[217,1080,1081],{"class":478}," SECRET_NAME",[217,1083,1084],{"class":491}," --project-name=my-app\n",[10,1086,1087,1088],{},"Im Dashboard: ",[1089,1090,1091],"em",{},"Workers & Pages → Projekt → Settings → Environment Variables → Production/Preview wählen",[28,1093,1095],{"id":1094},"fazit","Fazit",[1097,1098,1099,1115],"table",{},[1100,1101,1102],"thead",{},[1103,1104,1105,1109,1112],"tr",{},[1106,1107,1108],"th",{},"Aspekt",[1106,1110,1111],{},"Alter Ansatz (Dashboard)",[1106,1113,1114],{},"Neuer Ansatz (wrangler.jsonc)",[1116,1117,1118,1130,1141,1152,1161],"tbody",{},[1103,1119,1120,1124,1127],{},[1121,1122,1123],"td",{},"Source of Truth",[1121,1125,1126],{},"Dashboard",[1121,1128,1129],{},"Git-Repo",[1103,1131,1132,1135,1138],{},[1121,1133,1134],{},"Versioniert",[1121,1136,1137],{},"❌",[1121,1139,1140],{},"✅",[1103,1142,1143,1146,1149],{},[1121,1144,1145],{},"Environment-Trennung",[1121,1147,1148],{},"Manuell im Dashboard",[1121,1150,1151],{},"Automatisch via Postbuild",[1103,1153,1154,1157,1159],{},[1121,1155,1156],{},"Reproduzierbar",[1121,1158,1137],{},[1121,1160,1140],{},[1103,1162,1163,1166,1171],{},[1121,1164,1165],{},"Workaround nötig",[1121,1167,1168,1170],{},[19,1169,152],{}," entfernen",[1121,1172,1173,1175],{},[19,1174,21],{}," strippen",[10,1177,1178,1179,1181],{},"Der Postbuild-Schritt ist ein Workaround für eine Cloudflare Pages Limitation — kein Hack. Sobald Cloudflare Pages ",[19,1180,21],{},"-Sektionen nativ unterstützt, kann das Script einfach gelöscht werden.",[1183,1184,1185],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":194,"searchDepth":226,"depth":226,"links":1187},[1188,1189,1193,1201,1202,1203],{"id":30,"depth":226,"text":31},{"id":75,"depth":226,"text":76,"children":1190},[1191,1192],{"id":80,"depth":232,"text":81},{"id":138,"depth":232,"text":139},{"id":197,"depth":226,"text":1194,"children":1195},"Die Lösung: wrangler.jsonc + Postbuild-Script",[1196,1198,1200],{"id":204,"depth":232,"text":1197},"1. wrangler.jsonc als Source of Truth",{"id":419,"depth":232,"text":1199},"2. Postbuild-Script (scripts/postbuild.mjs)",{"id":743,"depth":232,"text":744},{"id":994,"depth":226,"text":995},{"id":1035,"depth":226,"text":1036},{"id":1094,"depth":226,"text":1095},"2025-01-29","Wenn du ein Cloudflare Pages-Projekt mit Nuxt/Nitro betreibst und separate Datenbanken für Production und Preview willst, stehst du vor einem Problem: Cloudflare Pages unterstützt die env-Sektion in der generierten Worker-Config nicht. Hier ist die Lösung, die wir nach einigem Trial-and-Error gefunden haben.","md","de",{"updated":1209},"2026-01-30","/til/cloudflare-pages-wrangler-bindings",{"title":5,"description":1205},"til/cloudflare-pages-wrangler-bindings",[1214,1215,1216,1217,1218,1219,1220,1221,1222,1223],"cloudflare","pages","wrangler","d1","kv","r2","bindings","deployment","nuxt","nitro","sMFnJSOTGTxyLELgnOxR742lm0xiEpgVNMgpPx7u9lo",1789790494208]