[{"data":1,"prerenderedAt":2326},["ShallowReactive",2],{"navigation":3,"/docs/guides/ci-cd":137,"/docs/guides/ci-cd-surround":2321},[4,123],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":113},"Docs","i-lucide-book","/docs","docs",[10,34,58,73,84,95,114],{"title":11,"path":12,"stem":13,"children":14,"icon":33},"Getting Started","/docs/getting-started","docs/1.getting-started/1.index",[15,17,21,25,29],{"title":16,"path":12,"stem":13},"Introduction",{"title":18,"path":19,"stem":20},"Installation","/docs/getting-started/installation","docs/1.getting-started/2.installation",{"title":22,"path":23,"stem":24},"Deploy","/docs/getting-started/deploy","docs/1.getting-started/3.deploy",{"title":26,"path":27,"stem":28},"Migration","/docs/getting-started/migration","docs/1.getting-started/4.migration",{"title":30,"path":31,"stem":32},"Environments","/docs/getting-started/environments","docs/1.getting-started/5.environments","i-lucide-rocket",{"title":35,"path":36,"stem":37,"children":38,"icon":57},"Database","/docs/database","docs/2.database/1.index",[39,41,45,49,53],{"title":40,"path":36,"stem":37},"Setup",{"title":42,"path":43,"stem":44},"Schema","/docs/database/schema","docs/2.database/2.schema",{"title":46,"path":47,"stem":48},"Queries","/docs/database/query","docs/2.database/3.query",{"title":50,"path":51,"stem":52},"Migrations","/docs/database/migrations","docs/2.database/4.migrations",{"title":54,"path":55,"stem":56},"CLI","/docs/database/cli","docs/2.database/cli","i-lucide-database",{"title":59,"path":60,"stem":61,"children":62,"icon":72},"Blob","/docs/blob","docs/3.blob/1.index",[63,64,68],{"title":40,"path":60,"stem":61},{"title":65,"path":66,"stem":67},"Upload","/docs/blob/upload","docs/3.blob/2.upload",{"title":69,"path":70,"stem":71},"Blob SDK","/docs/blob/usage","docs/3.blob/3.usage","i-lucide-shapes",{"title":74,"path":75,"stem":76,"children":77,"icon":83},"Key Value","/docs/kv","docs/4.kv/1.index",[78,79],{"title":40,"path":75,"stem":76},{"title":80,"path":81,"stem":82},"KV SDK","/docs/kv/usage","docs/4.kv/2.usage","i-lucide-list",{"title":85,"path":86,"stem":87,"children":88,"icon":94},"Cache","/docs/cache","docs/5.cache/1.index",[89,90],{"title":40,"path":86,"stem":87},{"title":91,"path":92,"stem":93},"Usage","/docs/cache/usage","docs/5.cache/2.usage","i-lucide-zap",{"title":96,"icon":97,"path":98,"stem":99,"children":100,"page":113},"Guides","i-lucide-book-text","/docs/guides","docs/6.guides",[101,105,109],{"title":102,"path":103,"stem":104},"Pre-rendering","/docs/guides/pre-rendering","docs/6.guides/1.pre-rendering",{"title":106,"path":107,"stem":108},"Realtime","/docs/guides/realtime","docs/6.guides/2.realtime",{"title":110,"path":111,"stem":112},"CI/CD","/docs/guides/ci-cd","docs/6.guides/3.ci-cd",false,{"title":115,"path":116,"stem":117,"children":118,"page":113},"Reference","/docs/reference","docs/7.reference",[119],{"title":120,"path":121,"stem":122},"Environment Variables","/docs/reference/environment-variables","docs/7.reference/1.environment-variables",{"title":124,"icon":125,"path":126,"stem":127,"children":128,"page":113},"Changelog","i-lucide-megaphone","/changelog","changelog",[129,133],{"title":130,"path":131,"stem":132},"NuxtHub Multi-Vendor is now available","/changelog/nuxthub-multi-vendor","changelog/nuxthub-multi-vendor",{"title":134,"path":135,"stem":136},"Self-Hosting First & Cloud-Agnostic Future","/changelog/self-hosting-first","changelog/self-hosting-first",{"id":138,"title":139,"body":140,"description":2314,"extension":2315,"links":2316,"meta":2317,"navigation":2318,"path":111,"seo":2319,"stem":112,"__hash__":2320},"docs/docs/6.guides/3.ci-cd.md","CI/CD Deployment",{"type":141,"value":142,"toc":2293},"minimark",[143,147,152,157,168,191,380,422,434,467,476,480,483,834,838,842,846,849,860,864,867,889,903,912,1016,1021,1148,1152,1157,1165,1171,1234,1237,1255,1258,1295,1298,1304,1342,1348,1456,1713,1721,1724,1785,1799,1803,1806,1846,1852,1856,1859,2039,2043,2046,2049,2068,2072,2075,2142,2147,2151,2154,2160,2220,2224,2227,2285,2289],[144,145,146],"p",{},"NuxtHub applications deploy through standard CI/CD pipelines. Database migrations require special attention, particularly for Cloudflare D1.",[148,149,151],"h2",{"id":150},"cloudflare-deployment","Cloudflare Deployment",[153,154,156],"h3",{"id":155},"workers-builds","Workers Builds",[144,158,159,160,167],{},"The recommended approach is to use ",[161,162,166],"a",{"href":163,"rel":164},"https://developers.cloudflare.com/workers/ci-cd/builds/",[165],"nofollow","Cloudflare Workers Builds"," with explicit build, deploy, and preview deploy scripts. This keeps preview and production deploys aligned while applying D1 migrations before each deployment.",[169,170,171,180,183],"ol",{},[172,173,174,175],"li",{},"Create a Workers project in the ",[161,176,179],{"href":177,"rel":178},"https://dash.cloudflare.com/?to=/:account/workers-and-pages/create",[165],"Cloudflare dashboard",[172,181,182],{},"Connect your GitHub or GitLab repository",[172,184,185,186,190],{},"Add the following scripts to your ",[187,188,189],"code",{},"package.json",":",[192,193,198],"pre",{"className":194,"code":195,"filename":189,"language":196,"meta":197,"style":197},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"scripts\": {\n    \"build\": \"bash -lc 'if [[ -z \\\"${WORKERS_CI_BRANCH:-}\\\" || \\\"$WORKERS_CI_BRANCH\\\" == \\\"main\\\" ]]; then pnpm run build:production; else pnpm run build:preview; fi'\",\n    \"build:production\": \"NODE_OPTIONS=--max-old-space-size=4096 nuxt build\",\n    \"build:preview\": \"NODE_OPTIONS=--max-old-space-size=4096 nuxt build --envName preview\",\n    \"deploy:cloudflare\": \"sh -c 'pnpm exec wrangler --cwd .output/server d1 migrations apply DB --remote && pnpm exec wrangler --cwd .output deploy --keep-vars'\",\n    \"deploy:cloudflare:preview\": \"sh -c 'pnpm exec wrangler --cwd .output/server d1 migrations apply DB --remote && pnpm exec wrangler --cwd .output versions upload'\"\n  }\n}\n","json","",[187,199,200,209,227,285,306,327,348,368,374],{"__ignoreMap":197},[201,202,205],"span",{"class":203,"line":204},"line",1,[201,206,208],{"class":207},"sMK4o","{\n",[201,210,212,215,219,222,224],{"class":203,"line":211},2,[201,213,214],{"class":207},"  \"",[201,216,218],{"class":217},"spNyl","scripts",[201,220,221],{"class":207},"\"",[201,223,190],{"class":207},[201,225,226],{"class":207}," {\n",[201,228,230,233,237,239,241,244,248,252,255,257,260,262,265,267,270,272,275,277,280,282],{"class":203,"line":229},3,[201,231,232],{"class":207},"    \"",[201,234,236],{"class":235},"sBMFI","build",[201,238,221],{"class":207},[201,240,190],{"class":207},[201,242,243],{"class":207}," \"",[201,245,247],{"class":246},"sfazB","bash -lc 'if [[ -z ",[201,249,251],{"class":250},"sTEyZ","\\\"",[201,253,254],{"class":246},"${WORKERS_CI_BRANCH:-}",[201,256,251],{"class":250},[201,258,259],{"class":246}," || ",[201,261,251],{"class":250},[201,263,264],{"class":246},"$WORKERS_CI_BRANCH",[201,266,251],{"class":250},[201,268,269],{"class":246}," == ",[201,271,251],{"class":250},[201,273,274],{"class":246},"main",[201,276,251],{"class":250},[201,278,279],{"class":246}," ]]; then pnpm run build:production; else pnpm run build:preview; fi'",[201,281,221],{"class":207},[201,283,284],{"class":207},",\n",[201,286,288,290,293,295,297,299,302,304],{"class":203,"line":287},4,[201,289,232],{"class":207},[201,291,292],{"class":235},"build:production",[201,294,221],{"class":207},[201,296,190],{"class":207},[201,298,243],{"class":207},[201,300,301],{"class":246},"NODE_OPTIONS=--max-old-space-size=4096 nuxt build",[201,303,221],{"class":207},[201,305,284],{"class":207},[201,307,309,311,314,316,318,320,323,325],{"class":203,"line":308},5,[201,310,232],{"class":207},[201,312,313],{"class":235},"build:preview",[201,315,221],{"class":207},[201,317,190],{"class":207},[201,319,243],{"class":207},[201,321,322],{"class":246},"NODE_OPTIONS=--max-old-space-size=4096 nuxt build --envName preview",[201,324,221],{"class":207},[201,326,284],{"class":207},[201,328,330,332,335,337,339,341,344,346],{"class":203,"line":329},6,[201,331,232],{"class":207},[201,333,334],{"class":235},"deploy:cloudflare",[201,336,221],{"class":207},[201,338,190],{"class":207},[201,340,243],{"class":207},[201,342,343],{"class":246},"sh -c 'pnpm exec wrangler --cwd .output/server d1 migrations apply DB --remote && pnpm exec wrangler --cwd .output deploy --keep-vars'",[201,345,221],{"class":207},[201,347,284],{"class":207},[201,349,351,353,356,358,360,362,365],{"class":203,"line":350},7,[201,352,232],{"class":207},[201,354,355],{"class":235},"deploy:cloudflare:preview",[201,357,221],{"class":207},[201,359,190],{"class":207},[201,361,243],{"class":207},[201,363,364],{"class":246},"sh -c 'pnpm exec wrangler --cwd .output/server d1 migrations apply DB --remote && pnpm exec wrangler --cwd .output versions upload'",[201,366,367],{"class":207},"\"\n",[201,369,371],{"class":203,"line":370},8,[201,372,373],{"class":207},"  }\n",[201,375,377],{"class":203,"line":376},9,[201,378,379],{"class":207},"}\n",[169,381,382],{"start":287},[172,383,384,385],{},"Configure the Workers Builds settings:\n",[386,387,388,398,406,414],"ul",{},[172,389,390,394,395],{},[391,392,393],"strong",{},"Build command",": ",[187,396,397],{},"pnpm build",[172,399,400,394,403],{},[391,401,402],{},"Deploy command",[187,404,405],{},"pnpm run deploy:cloudflare",[172,407,408,394,411],{},[391,409,410],{},"Version command",[187,412,413],{},"pnpm run deploy:cloudflare:preview",[172,415,416,394,419],{},[391,417,418],{},"Root directory",[187,420,421],{},".",[423,424,425,426,429,430,433],"tip",{},"NuxtHub automatically generates wrangler bindings from your ",[187,427,428],{},"nuxt.config.ts"," during the build process. No manual ",[187,431,432],{},"wrangler.jsonc"," file is required.",[435,436,437,450],"note",{},[144,438,439,440,442,443,446,447,190],{},"If you use a custom ",[187,441,432],{}," with named environments, set ",[187,444,445],{},"CLOUDFLARE_ENV"," as a build-time variable for non-production environments in ",[391,448,449],{},"Workers Builds → Build configuration → Environment variables",[386,451,452,458,464],{},[172,453,454,457],{},[187,455,456],{},"CLOUDFLARE_ENV=preview"," for preview deployments",[172,459,460,463],{},[187,461,462],{},"CLOUDFLARE_ENV=staging"," for staging deployments",[172,465,466],{},"Leave unset for production (uses default environment)",[468,469,471,472,475],"warning",{"to":470},"#d1-migrations-in-cicd","If your project uses Cloudflare D1, keep the migration step inside your deploy and version commands. ",[187,473,474],{},"wrangler deploy"," and Workers Builds do not apply D1 migrations automatically.",[153,477,479],{"id":478},"github-actions","GitHub Actions",[144,481,482],{},"For more control over your deployment process, you can use GitHub Actions:",[192,484,489],{"className":485,"code":486,"filename":487,"language":488,"meta":197,"style":197},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","name: Deploy to Cloudflare\n\non:\n  push:\n    branches: [main]\n  pull_request:\n    branches: [main]\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Setup pnpm\n        uses: pnpm/action-setup@v6\n        with:\n          version: 11\n\n      - name: Setup Node.js\n        uses: actions/setup-node@v4\n        with:\n          node-version: 22\n          cache: pnpm\n\n      - name: Install dependencies\n        run: pnpm install\n\n      - name: Build\n        run: pnpm build\n        env:\n          CLOUDFLARE_ENV: ${{ github.ref == 'refs/heads/main' && '' || 'preview' }}\n\n      - name: Deploy\n        run: npx wrangler deploy\n        env:\n          CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}\n",".github/workflows/deploy.yml","yaml",[187,490,491,502,508,517,524,539,546,558,562,569,577,588,596,610,615,628,639,647,659,664,676,686,693,704,715,720,732,743,748,760,770,778,789,794,806,816,823],{"__ignoreMap":197},[201,492,493,497,499],{"class":203,"line":204},[201,494,496],{"class":495},"swJcz","name",[201,498,190],{"class":207},[201,500,501],{"class":246}," Deploy to Cloudflare\n",[201,503,504],{"class":203,"line":211},[201,505,507],{"emptyLinePlaceholder":506},true,"\n",[201,509,510,514],{"class":203,"line":229},[201,511,513],{"class":512},"sfNiH","on",[201,515,516],{"class":207},":\n",[201,518,519,522],{"class":203,"line":287},[201,520,521],{"class":495},"  push",[201,523,516],{"class":207},[201,525,526,529,531,534,536],{"class":203,"line":308},[201,527,528],{"class":495},"    branches",[201,530,190],{"class":207},[201,532,533],{"class":207}," [",[201,535,274],{"class":246},[201,537,538],{"class":207},"]\n",[201,540,541,544],{"class":203,"line":329},[201,542,543],{"class":495},"  pull_request",[201,545,516],{"class":207},[201,547,548,550,552,554,556],{"class":203,"line":350},[201,549,528],{"class":495},[201,551,190],{"class":207},[201,553,533],{"class":207},[201,555,274],{"class":246},[201,557,538],{"class":207},[201,559,560],{"class":203,"line":370},[201,561,507],{"emptyLinePlaceholder":506},[201,563,564,567],{"class":203,"line":376},[201,565,566],{"class":495},"jobs",[201,568,516],{"class":207},[201,570,572,575],{"class":203,"line":571},10,[201,573,574],{"class":495},"  deploy",[201,576,516],{"class":207},[201,578,580,583,585],{"class":203,"line":579},11,[201,581,582],{"class":495},"    runs-on",[201,584,190],{"class":207},[201,586,587],{"class":246}," ubuntu-latest\n",[201,589,591,594],{"class":203,"line":590},12,[201,592,593],{"class":495},"    steps",[201,595,516],{"class":207},[201,597,599,602,605,607],{"class":203,"line":598},13,[201,600,601],{"class":207},"      -",[201,603,604],{"class":495}," uses",[201,606,190],{"class":207},[201,608,609],{"class":246}," actions/checkout@v4\n",[201,611,613],{"class":203,"line":612},14,[201,614,507],{"emptyLinePlaceholder":506},[201,616,618,620,623,625],{"class":203,"line":617},15,[201,619,601],{"class":207},[201,621,622],{"class":495}," name",[201,624,190],{"class":207},[201,626,627],{"class":246}," Setup pnpm\n",[201,629,631,634,636],{"class":203,"line":630},16,[201,632,633],{"class":495},"        uses",[201,635,190],{"class":207},[201,637,638],{"class":246}," pnpm/action-setup@v6\n",[201,640,642,645],{"class":203,"line":641},17,[201,643,644],{"class":495},"        with",[201,646,516],{"class":207},[201,648,650,653,655],{"class":203,"line":649},18,[201,651,652],{"class":495},"          version",[201,654,190],{"class":207},[201,656,658],{"class":657},"sbssI"," 11\n",[201,660,662],{"class":203,"line":661},19,[201,663,507],{"emptyLinePlaceholder":506},[201,665,667,669,671,673],{"class":203,"line":666},20,[201,668,601],{"class":207},[201,670,622],{"class":495},[201,672,190],{"class":207},[201,674,675],{"class":246}," Setup Node.js\n",[201,677,679,681,683],{"class":203,"line":678},21,[201,680,633],{"class":495},[201,682,190],{"class":207},[201,684,685],{"class":246}," actions/setup-node@v4\n",[201,687,689,691],{"class":203,"line":688},22,[201,690,644],{"class":495},[201,692,516],{"class":207},[201,694,696,699,701],{"class":203,"line":695},23,[201,697,698],{"class":495},"          node-version",[201,700,190],{"class":207},[201,702,703],{"class":657}," 22\n",[201,705,707,710,712],{"class":203,"line":706},24,[201,708,709],{"class":495},"          cache",[201,711,190],{"class":207},[201,713,714],{"class":246}," pnpm\n",[201,716,718],{"class":203,"line":717},25,[201,719,507],{"emptyLinePlaceholder":506},[201,721,723,725,727,729],{"class":203,"line":722},26,[201,724,601],{"class":207},[201,726,622],{"class":495},[201,728,190],{"class":207},[201,730,731],{"class":246}," Install dependencies\n",[201,733,735,738,740],{"class":203,"line":734},27,[201,736,737],{"class":495},"        run",[201,739,190],{"class":207},[201,741,742],{"class":246}," pnpm install\n",[201,744,746],{"class":203,"line":745},28,[201,747,507],{"emptyLinePlaceholder":506},[201,749,751,753,755,757],{"class":203,"line":750},29,[201,752,601],{"class":207},[201,754,622],{"class":495},[201,756,190],{"class":207},[201,758,759],{"class":246}," Build\n",[201,761,763,765,767],{"class":203,"line":762},30,[201,764,737],{"class":495},[201,766,190],{"class":207},[201,768,769],{"class":246}," pnpm build\n",[201,771,773,776],{"class":203,"line":772},31,[201,774,775],{"class":495},"        env",[201,777,516],{"class":207},[201,779,781,784,786],{"class":203,"line":780},32,[201,782,783],{"class":495},"          CLOUDFLARE_ENV",[201,785,190],{"class":207},[201,787,788],{"class":246}," ${{ github.ref == 'refs/heads/main' && '' || 'preview' }}\n",[201,790,792],{"class":203,"line":791},33,[201,793,507],{"emptyLinePlaceholder":506},[201,795,797,799,801,803],{"class":203,"line":796},34,[201,798,601],{"class":207},[201,800,622],{"class":495},[201,802,190],{"class":207},[201,804,805],{"class":246}," Deploy\n",[201,807,809,811,813],{"class":203,"line":808},35,[201,810,737],{"class":495},[201,812,190],{"class":207},[201,814,815],{"class":246}," npx wrangler deploy\n",[201,817,819,821],{"class":203,"line":818},36,[201,820,775],{"class":495},[201,822,516],{"class":207},[201,824,826,829,831],{"class":203,"line":825},37,[201,827,828],{"class":495},"          CLOUDFLARE_API_TOKEN",[201,830,190],{"class":207},[201,832,833],{"class":246}," ${{ secrets.CLOUDFLARE_API_TOKEN }}\n",[148,835,837],{"id":836},"d1-migrations-in-cicd","D1 Migrations in CI/CD",[839,840,841],"important",{},"Cloudflare D1 databases require special handling because they are not accessible during build time in CI environments.",[153,843,845],{"id":844},"the-problem","The Problem",[144,847,848],{},"Unlike PostgreSQL or MySQL, where build-time migrations work because the database is reachable over the network, Cloudflare D1 presents unique challenges:",[386,850,851,854,857],{},[172,852,853],{},"It requires Worker bindings to access the database",[172,855,856],{},"These bindings are only available at runtime",[172,858,859],{},"CI build environments have no database connection",[153,861,863],{"id":862},"solution-migration-aware-deploy-commands","Solution: Migration-Aware Deploy Commands",[144,865,866],{},"Run migrations before deployment with Wrangler.",[144,868,869,870,873,874,877,878,881,882,884,885,888],{},"NuxtHub generates ",[187,871,872],{},"migrations_table"," and ",[187,875,876],{},"migrations_dir"," in ",[187,879,880],{},".output/server/wrangler.json"," for D1 projects. This enables Wrangler-managed migrations, but it does not execute them automatically during ",[187,883,474],{},". Your deploy and preview deploy commands should run ",[187,886,887],{},"wrangler d1 migrations apply"," first, then upload or deploy the Worker.",[468,890,891,892,895,896,899,900,902],{},"If you applied migrations with NuxtHub before v0.10 and you use Cloudflare D1, some rows in ",[187,893,894],{},"_hub_migrations"," may be missing the ",[187,897,898],{},".sql"," suffix. Wrangler requires ",[187,901,898],{}," in order to recognize the migration files.",[144,904,905,906,908,909,911],{},"Fix: Update the migration names in the ",[187,907,894],{}," table to include the ",[187,910,898],{}," suffix.",[192,913,917],{"className":914,"code":915,"language":916,"meta":197,"style":197},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","-- Preview affected rows\nSELECT id, name FROM _hub_migrations WHERE name NOT LIKE '%.sql';\n\n-- Append .sql\nUPDATE _hub_migrations SET name = name || '.sql' WHERE name NOT LIKE '%.sql';\n","sql",[187,918,919,925,964,968,973],{"__ignoreMap":197},[201,920,921],{"class":203,"line":204},[201,922,924],{"class":923},"sHwdD","-- Preview affected rows\n",[201,926,927,930,933,935,938,941,944,946,949,952,955,958,961],{"class":203,"line":211},[201,928,929],{"class":657},"SELECT",[201,931,932],{"class":250}," id, ",[201,934,496],{"class":657},[201,936,937],{"class":657}," FROM",[201,939,940],{"class":250}," _hub_migrations ",[201,942,943],{"class":657},"WHERE",[201,945,622],{"class":657},[201,947,948],{"class":657}," NOT",[201,950,951],{"class":657}," LIKE",[201,953,954],{"class":207}," '",[201,956,957],{"class":246},"%.sql",[201,959,960],{"class":207},"'",[201,962,963],{"class":250},";\n",[201,965,966],{"class":203,"line":229},[201,967,507],{"emptyLinePlaceholder":506},[201,969,970],{"class":203,"line":287},[201,971,972],{"class":923},"-- Append .sql\n",[201,974,975,978,980,983,985,988,990,993,995,997,999,1002,1004,1006,1008,1010,1012,1014],{"class":203,"line":308},[201,976,977],{"class":657},"UPDATE",[201,979,940],{"class":250},[201,981,982],{"class":657},"SET",[201,984,622],{"class":657},[201,986,987],{"class":207}," =",[201,989,622],{"class":657},[201,991,992],{"class":207}," ||",[201,994,954],{"class":207},[201,996,898],{"class":246},[201,998,960],{"class":207},[201,1000,1001],{"class":657}," WHERE",[201,1003,622],{"class":657},[201,1005,948],{"class":657},[201,1007,951],{"class":657},[201,1009,954],{"class":207},[201,1011,957],{"class":246},[201,1013,960],{"class":207},[201,1015,963],{"class":250},[1017,1018,1020],"h4",{"id":1019},"_1-disable-build-time-migrations","1. Disable Build-Time Migrations",[192,1022,1026],{"className":1023,"code":1024,"filename":428,"language":1025,"meta":197,"style":197},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  hub: {\n    db: {\n      dialect: 'sqlite',\n      driver: 'd1',\n      connection: { databaseId: '\u003Cdatabase-id>' },\n      applyMigrationsDuringBuild: false\n    }\n  }\n})\n","ts",[187,1027,1028,1046,1055,1064,1080,1096,1121,1131,1136,1140],{"__ignoreMap":197},[201,1029,1030,1034,1037,1041,1044],{"class":203,"line":204},[201,1031,1033],{"class":1032},"s7zQu","export",[201,1035,1036],{"class":1032}," default",[201,1038,1040],{"class":1039},"s2Zo4"," defineNuxtConfig",[201,1042,1043],{"class":250},"(",[201,1045,208],{"class":207},[201,1047,1048,1051,1053],{"class":203,"line":211},[201,1049,1050],{"class":495},"  hub",[201,1052,190],{"class":207},[201,1054,226],{"class":207},[201,1056,1057,1060,1062],{"class":203,"line":229},[201,1058,1059],{"class":495},"    db",[201,1061,190],{"class":207},[201,1063,226],{"class":207},[201,1065,1066,1069,1071,1073,1076,1078],{"class":203,"line":287},[201,1067,1068],{"class":495},"      dialect",[201,1070,190],{"class":207},[201,1072,954],{"class":207},[201,1074,1075],{"class":246},"sqlite",[201,1077,960],{"class":207},[201,1079,284],{"class":207},[201,1081,1082,1085,1087,1089,1092,1094],{"class":203,"line":308},[201,1083,1084],{"class":495},"      driver",[201,1086,190],{"class":207},[201,1088,954],{"class":207},[201,1090,1091],{"class":246},"d1",[201,1093,960],{"class":207},[201,1095,284],{"class":207},[201,1097,1098,1101,1103,1106,1109,1111,1113,1116,1118],{"class":203,"line":329},[201,1099,1100],{"class":495},"      connection",[201,1102,190],{"class":207},[201,1104,1105],{"class":207}," {",[201,1107,1108],{"class":495}," databaseId",[201,1110,190],{"class":207},[201,1112,954],{"class":207},[201,1114,1115],{"class":246},"\u003Cdatabase-id>",[201,1117,960],{"class":207},[201,1119,1120],{"class":207}," },\n",[201,1122,1123,1126,1128],{"class":203,"line":350},[201,1124,1125],{"class":495},"      applyMigrationsDuringBuild",[201,1127,190],{"class":207},[201,1129,1130],{"class":512}," false\n",[201,1132,1133],{"class":203,"line":370},[201,1134,1135],{"class":207},"    }\n",[201,1137,1138],{"class":203,"line":376},[201,1139,373],{"class":207},[201,1141,1142,1145],{"class":203,"line":571},[201,1143,1144],{"class":207},"}",[201,1146,1147],{"class":250},")\n",[1017,1149,1151],{"id":1150},"_2-add-the-migration-step-to-your-deployment-commands","2. Add the Migration Step to Your Deployment Commands",[144,1153,1154],{},[391,1155,1156],{},"Option A: Using Wrangler (recommended)",[144,1158,1159,1160,421],{},"Use Wrangler's built-in D1 migrations command. This requires your migrations to follow ",[161,1161,1164],{"href":1162,"rel":1163},"https://developers.cloudflare.com/d1/build-with-d1/d1-migrations/",[165],"Wrangler's migration format",[144,1166,1167,1168,1170],{},"NuxtHub already generates the required metadata in ",[187,1169,880],{},", so you can run migrations directly against the generated config. The following pattern works well with Workers Builds:",[192,1172,1174],{"className":194,"code":1173,"filename":189,"language":196,"meta":197,"style":197},"{\n  \"scripts\": {\n    \"deploy:cloudflare\": \"sh -c 'pnpm exec wrangler --cwd .output/server d1 migrations apply DB --remote && pnpm exec wrangler --cwd .output deploy --keep-vars'\",\n    \"deploy:cloudflare:preview\": \"sh -c 'pnpm exec wrangler --cwd .output/server d1 migrations apply DB --remote && pnpm exec wrangler --cwd .output versions upload'\"\n  }\n}\n",[187,1175,1176,1180,1192,1210,1226,1230],{"__ignoreMap":197},[201,1177,1178],{"class":203,"line":204},[201,1179,208],{"class":207},[201,1181,1182,1184,1186,1188,1190],{"class":203,"line":211},[201,1183,214],{"class":207},[201,1185,218],{"class":217},[201,1187,221],{"class":207},[201,1189,190],{"class":207},[201,1191,226],{"class":207},[201,1193,1194,1196,1198,1200,1202,1204,1206,1208],{"class":203,"line":229},[201,1195,232],{"class":207},[201,1197,334],{"class":235},[201,1199,221],{"class":207},[201,1201,190],{"class":207},[201,1203,243],{"class":207},[201,1205,343],{"class":246},[201,1207,221],{"class":207},[201,1209,284],{"class":207},[201,1211,1212,1214,1216,1218,1220,1222,1224],{"class":203,"line":287},[201,1213,232],{"class":207},[201,1215,355],{"class":235},[201,1217,221],{"class":207},[201,1219,190],{"class":207},[201,1221,243],{"class":207},[201,1223,364],{"class":246},[201,1225,367],{"class":207},[201,1227,1228],{"class":203,"line":308},[201,1229,373],{"class":207},[201,1231,1232],{"class":203,"line":329},[201,1233,379],{"class":207},[144,1235,1236],{},"This sequence does three things:",[386,1238,1239,1249,1252],{},[172,1240,1241,1242,1244,1245,873,1247],{},"It uses the generated ",[187,1243,880],{}," configuration, including ",[187,1246,872],{},[187,1248,876],{},[172,1250,1251],{},"It applies pending D1 migrations before deployment",[172,1253,1254],{},"It runs the correct Cloudflare command for production traffic or preview versions",[144,1256,1257],{},"After a successful deploy, verify that no migrations remain:",[192,1259,1264],{"className":1260,"code":1261,"filename":1262,"language":1263,"meta":197,"style":197},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npx wrangler d1 migrations list DB --remote --config .output/server/wrangler.json\n","Terminal","bash",[187,1265,1266],{"__ignoreMap":197},[201,1267,1268,1271,1274,1277,1280,1283,1286,1289,1292],{"class":203,"line":204},[201,1269,1270],{"class":235},"npx",[201,1272,1273],{"class":246}," wrangler",[201,1275,1276],{"class":246}," d1",[201,1278,1279],{"class":246}," migrations",[201,1281,1282],{"class":246}," list",[201,1284,1285],{"class":246}," DB",[201,1287,1288],{"class":246}," --remote",[201,1290,1291],{"class":246}," --config",[201,1293,1294],{"class":246}," .output/server/wrangler.json\n",[144,1296,1297],{},"Wrangler should report that there are no migrations to apply.",[144,1299,1300,1301,1303],{},"If you prefer to keep the commands in your CI workflow instead of ",[187,1302,189],{},", use the same sequence directly:",[192,1305,1307],{"className":1260,"code":1306,"filename":1262,"language":1263,"meta":197,"style":197},"npx wrangler d1 migrations apply DB --remote --config .output/server/wrangler.json && npx wrangler deploy\n",[187,1308,1309],{"__ignoreMap":197},[201,1310,1311,1313,1315,1317,1319,1322,1324,1326,1328,1331,1334,1337,1339],{"class":203,"line":204},[201,1312,1270],{"class":235},[201,1314,1273],{"class":246},[201,1316,1276],{"class":246},[201,1318,1279],{"class":246},[201,1320,1321],{"class":246}," apply",[201,1323,1285],{"class":246},[201,1325,1288],{"class":246},[201,1327,1291],{"class":246},[201,1329,1330],{"class":246}," .output/server/wrangler.json",[201,1332,1333],{"class":207}," &&",[201,1335,1336],{"class":235}," npx",[201,1338,1273],{"class":246},[201,1340,1341],{"class":246}," deploy\n",[144,1343,1344,1345,1347],{},"If you maintain a manual ",[187,1346,432],{},", configure it to use NuxtHub's migration table and output directory:",[192,1349,1353],{"className":1350,"code":1351,"filename":432,"language":1352,"meta":197,"style":197},"language-jsonc shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"d1_databases\": [{\n    \"binding\": \"DB\",\n    \"database_id\": \"\u003Cdatabase-id>\",\n    \"migrations_table\": \"_hub_migrations\",\n    \"migrations_dir\": \".output/server/db/migrations/sqlite/\"\n  }]\n}\n","jsonc",[187,1354,1355,1359,1373,1393,1412,1430,1447,1452],{"__ignoreMap":197},[201,1356,1357],{"class":203,"line":204},[201,1358,208],{"class":207},[201,1360,1361,1363,1366,1368,1370],{"class":203,"line":211},[201,1362,214],{"class":207},[201,1364,1365],{"class":217},"d1_databases",[201,1367,221],{"class":207},[201,1369,190],{"class":207},[201,1371,1372],{"class":207}," [{\n",[201,1374,1375,1377,1380,1382,1384,1386,1389,1391],{"class":203,"line":229},[201,1376,232],{"class":207},[201,1378,1379],{"class":235},"binding",[201,1381,221],{"class":207},[201,1383,190],{"class":207},[201,1385,243],{"class":207},[201,1387,1388],{"class":246},"DB",[201,1390,221],{"class":207},[201,1392,284],{"class":207},[201,1394,1395,1397,1400,1402,1404,1406,1408,1410],{"class":203,"line":287},[201,1396,232],{"class":207},[201,1398,1399],{"class":235},"database_id",[201,1401,221],{"class":207},[201,1403,190],{"class":207},[201,1405,243],{"class":207},[201,1407,1115],{"class":246},[201,1409,221],{"class":207},[201,1411,284],{"class":207},[201,1413,1414,1416,1418,1420,1422,1424,1426,1428],{"class":203,"line":308},[201,1415,232],{"class":207},[201,1417,872],{"class":235},[201,1419,221],{"class":207},[201,1421,190],{"class":207},[201,1423,243],{"class":207},[201,1425,894],{"class":246},[201,1427,221],{"class":207},[201,1429,284],{"class":207},[201,1431,1432,1434,1436,1438,1440,1442,1445],{"class":203,"line":329},[201,1433,232],{"class":207},[201,1435,876],{"class":235},[201,1437,221],{"class":207},[201,1439,190],{"class":207},[201,1441,243],{"class":207},[201,1443,1444],{"class":246},".output/server/db/migrations/sqlite/",[201,1446,367],{"class":207},[201,1448,1449],{"class":203,"line":350},[201,1450,1451],{"class":207},"  }]\n",[201,1453,1454],{"class":203,"line":370},[201,1455,379],{"class":207},[192,1457,1459],{"className":485,"code":1458,"filename":487,"language":488,"meta":197,"style":197},"jobs:\n  deploy:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Setup pnpm\n        uses: pnpm/action-setup@v6\n        with:\n          version: 11\n\n      - name: Setup Node.js\n        uses: actions/setup-node@v4\n        with:\n          node-version: 22\n          cache: pnpm\n\n      - name: Install dependencies\n        run: pnpm install\n\n      - name: Build\n        run: pnpm build\n\n      - name: Apply D1 Migrations\n        run: npx wrangler d1 migrations apply DB --remote --config .output/server/wrangler.json\n        env:\n          CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}\n          CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}\n\n      - name: Deploy\n        run: npx wrangler deploy\n        env:\n          CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}\n          CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}\n\n",[187,1460,1461,1467,1473,1481,1487,1497,1501,1511,1519,1525,1533,1537,1547,1555,1561,1569,1577,1581,1591,1599,1603,1613,1621,1625,1636,1645,1651,1659,1669,1673,1683,1691,1697,1705],{"__ignoreMap":197},[201,1462,1463,1465],{"class":203,"line":204},[201,1464,566],{"class":495},[201,1466,516],{"class":207},[201,1468,1469,1471],{"class":203,"line":211},[201,1470,574],{"class":495},[201,1472,516],{"class":207},[201,1474,1475,1477,1479],{"class":203,"line":229},[201,1476,582],{"class":495},[201,1478,190],{"class":207},[201,1480,587],{"class":246},[201,1482,1483,1485],{"class":203,"line":287},[201,1484,593],{"class":495},[201,1486,516],{"class":207},[201,1488,1489,1491,1493,1495],{"class":203,"line":308},[201,1490,601],{"class":207},[201,1492,604],{"class":495},[201,1494,190],{"class":207},[201,1496,609],{"class":246},[201,1498,1499],{"class":203,"line":329},[201,1500,507],{"emptyLinePlaceholder":506},[201,1502,1503,1505,1507,1509],{"class":203,"line":350},[201,1504,601],{"class":207},[201,1506,622],{"class":495},[201,1508,190],{"class":207},[201,1510,627],{"class":246},[201,1512,1513,1515,1517],{"class":203,"line":370},[201,1514,633],{"class":495},[201,1516,190],{"class":207},[201,1518,638],{"class":246},[201,1520,1521,1523],{"class":203,"line":376},[201,1522,644],{"class":495},[201,1524,516],{"class":207},[201,1526,1527,1529,1531],{"class":203,"line":571},[201,1528,652],{"class":495},[201,1530,190],{"class":207},[201,1532,658],{"class":657},[201,1534,1535],{"class":203,"line":579},[201,1536,507],{"emptyLinePlaceholder":506},[201,1538,1539,1541,1543,1545],{"class":203,"line":590},[201,1540,601],{"class":207},[201,1542,622],{"class":495},[201,1544,190],{"class":207},[201,1546,675],{"class":246},[201,1548,1549,1551,1553],{"class":203,"line":598},[201,1550,633],{"class":495},[201,1552,190],{"class":207},[201,1554,685],{"class":246},[201,1556,1557,1559],{"class":203,"line":612},[201,1558,644],{"class":495},[201,1560,516],{"class":207},[201,1562,1563,1565,1567],{"class":203,"line":617},[201,1564,698],{"class":495},[201,1566,190],{"class":207},[201,1568,703],{"class":657},[201,1570,1571,1573,1575],{"class":203,"line":630},[201,1572,709],{"class":495},[201,1574,190],{"class":207},[201,1576,714],{"class":246},[201,1578,1579],{"class":203,"line":641},[201,1580,507],{"emptyLinePlaceholder":506},[201,1582,1583,1585,1587,1589],{"class":203,"line":649},[201,1584,601],{"class":207},[201,1586,622],{"class":495},[201,1588,190],{"class":207},[201,1590,731],{"class":246},[201,1592,1593,1595,1597],{"class":203,"line":661},[201,1594,737],{"class":495},[201,1596,190],{"class":207},[201,1598,742],{"class":246},[201,1600,1601],{"class":203,"line":666},[201,1602,507],{"emptyLinePlaceholder":506},[201,1604,1605,1607,1609,1611],{"class":203,"line":678},[201,1606,601],{"class":207},[201,1608,622],{"class":495},[201,1610,190],{"class":207},[201,1612,759],{"class":246},[201,1614,1615,1617,1619],{"class":203,"line":688},[201,1616,737],{"class":495},[201,1618,190],{"class":207},[201,1620,769],{"class":246},[201,1622,1623],{"class":203,"line":695},[201,1624,507],{"emptyLinePlaceholder":506},[201,1626,1627,1629,1631,1633],{"class":203,"line":706},[201,1628,601],{"class":207},[201,1630,622],{"class":495},[201,1632,190],{"class":207},[201,1634,1635],{"class":246}," Apply D1 Migrations\n",[201,1637,1638,1640,1642],{"class":203,"line":717},[201,1639,737],{"class":495},[201,1641,190],{"class":207},[201,1643,1644],{"class":246}," npx wrangler d1 migrations apply DB --remote --config .output/server/wrangler.json\n",[201,1646,1647,1649],{"class":203,"line":722},[201,1648,775],{"class":495},[201,1650,516],{"class":207},[201,1652,1653,1655,1657],{"class":203,"line":734},[201,1654,828],{"class":495},[201,1656,190],{"class":207},[201,1658,833],{"class":246},[201,1660,1661,1664,1666],{"class":203,"line":745},[201,1662,1663],{"class":495},"          CLOUDFLARE_ACCOUNT_ID",[201,1665,190],{"class":207},[201,1667,1668],{"class":246}," ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}\n",[201,1670,1671],{"class":203,"line":750},[201,1672,507],{"emptyLinePlaceholder":506},[201,1674,1675,1677,1679,1681],{"class":203,"line":762},[201,1676,601],{"class":207},[201,1678,622],{"class":495},[201,1680,190],{"class":207},[201,1682,805],{"class":246},[201,1684,1685,1687,1689],{"class":203,"line":772},[201,1686,737],{"class":495},[201,1688,190],{"class":207},[201,1690,815],{"class":246},[201,1692,1693,1695],{"class":203,"line":780},[201,1694,775],{"class":495},[201,1696,516],{"class":207},[201,1698,1699,1701,1703],{"class":203,"line":791},[201,1700,828],{"class":495},[201,1702,190],{"class":207},[201,1704,833],{"class":246},[201,1706,1707,1709,1711],{"class":203,"line":796},[201,1708,1663],{"class":495},[201,1710,190],{"class":207},[201,1712,1668],{"class":246},[144,1714,1715],{},[391,1716,1717,1718],{},"Option B: Using ",[187,1719,1720],{},"nuxt db migrate",[144,1722,1723],{},"If you have the D1 HTTP credentials configured, you can use the Nuxt CLI to apply migrations:",[192,1725,1727],{"className":485,"code":1726,"filename":487,"language":488,"meta":197,"style":197},"- name: Apply D1 Migrations\n  run: npx nuxt db migrate\n  env:\n    NUXT_HUB_CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}\n    NUXT_HUB_CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}\n    NUXT_HUB_CLOUDFLARE_DATABASE_ID: ${{ secrets.CLOUDFLARE_DATABASE_ID }}\n",[187,1728,1729,1740,1750,1757,1766,1775],{"__ignoreMap":197},[201,1730,1731,1734,1736,1738],{"class":203,"line":204},[201,1732,1733],{"class":207},"-",[201,1735,622],{"class":495},[201,1737,190],{"class":207},[201,1739,1635],{"class":246},[201,1741,1742,1745,1747],{"class":203,"line":211},[201,1743,1744],{"class":495},"  run",[201,1746,190],{"class":207},[201,1748,1749],{"class":246}," npx nuxt db migrate\n",[201,1751,1752,1755],{"class":203,"line":229},[201,1753,1754],{"class":495},"  env",[201,1756,516],{"class":207},[201,1758,1759,1762,1764],{"class":203,"line":287},[201,1760,1761],{"class":495},"    NUXT_HUB_CLOUDFLARE_ACCOUNT_ID",[201,1763,190],{"class":207},[201,1765,1668],{"class":246},[201,1767,1768,1771,1773],{"class":203,"line":308},[201,1769,1770],{"class":495},"    NUXT_HUB_CLOUDFLARE_API_TOKEN",[201,1772,190],{"class":207},[201,1774,833],{"class":246},[201,1776,1777,1780,1782],{"class":203,"line":329},[201,1778,1779],{"class":495},"    NUXT_HUB_CLOUDFLARE_DATABASE_ID",[201,1781,190],{"class":207},[201,1783,1784],{"class":246}," ${{ secrets.CLOUDFLARE_DATABASE_ID }}\n",[435,1786,1787,1788,1790,1791,1794,1795,1798],{},"This uses the D1 HTTP API to apply migrations remotely. Make sure your ",[187,1789,428],{}," has ",[187,1792,1793],{},"driver: 'd1'"," or ",[187,1796,1797],{},"driver: 'd1-http'"," configured.",[148,1800,1802],{"id":1801},"postgresql-mysql-cicd","PostgreSQL / MySQL CI/CD",[144,1804,1805],{},"PostgreSQL and MySQL migrations can run at build time because the database is reachable via a connection string.",[192,1807,1809],{"className":485,"code":1808,"filename":487,"language":488,"meta":197,"style":197},"- name: Build with migrations\n  run: pnpm build\n  env:\n    DATABASE_URL: ${{ secrets.DATABASE_URL }}\n",[187,1810,1811,1822,1830,1836],{"__ignoreMap":197},[201,1812,1813,1815,1817,1819],{"class":203,"line":204},[201,1814,1733],{"class":207},[201,1816,622],{"class":495},[201,1818,190],{"class":207},[201,1820,1821],{"class":246}," Build with migrations\n",[201,1823,1824,1826,1828],{"class":203,"line":211},[201,1825,1744],{"class":495},[201,1827,190],{"class":207},[201,1829,769],{"class":246},[201,1831,1832,1834],{"class":203,"line":229},[201,1833,1754],{"class":495},[201,1835,516],{"class":207},[201,1837,1838,1841,1843],{"class":203,"line":287},[201,1839,1840],{"class":495},"    DATABASE_URL",[201,1842,190],{"class":207},[201,1844,1845],{"class":246}," ${{ secrets.DATABASE_URL }}\n",[423,1847,1848,1849,421],{},"Build-time migrations are enabled by default. NuxtHub automatically applies them during ",[187,1850,1851],{},"nuxt build",[153,1853,1855],{"id":1854},"running-migrations-in-a-dedicated-job","Running Migrations in a Dedicated Job",[144,1857,1858],{},"For more control over the migration process, you can run migrations in a separate job:",[192,1860,1862],{"className":485,"code":1861,"filename":487,"language":488,"meta":197,"style":197},"jobs:\n  migrate:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n      - uses: pnpm/action-setup@v6\n      - uses: actions/setup-node@v6\n        with:\n          node-version: 22\n          cache: pnpm\n      - run: pnpm install\n      - name: Run migrations\n        run: npx nuxt db migrate\n        env:\n          DATABASE_URL: ${{ secrets.DATABASE_URL }}\n\n  deploy:\n    needs: migrate\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      # ... build and deploy steps\n",[187,1863,1864,1870,1877,1885,1891,1902,1912,1923,1929,1937,1945,1956,1967,1975,1981,1990,1994,2000,2010,2018,2024,2034],{"__ignoreMap":197},[201,1865,1866,1868],{"class":203,"line":204},[201,1867,566],{"class":495},[201,1869,516],{"class":207},[201,1871,1872,1875],{"class":203,"line":211},[201,1873,1874],{"class":495},"  migrate",[201,1876,516],{"class":207},[201,1878,1879,1881,1883],{"class":203,"line":229},[201,1880,582],{"class":495},[201,1882,190],{"class":207},[201,1884,587],{"class":246},[201,1886,1887,1889],{"class":203,"line":287},[201,1888,593],{"class":495},[201,1890,516],{"class":207},[201,1892,1893,1895,1897,1899],{"class":203,"line":308},[201,1894,601],{"class":207},[201,1896,604],{"class":495},[201,1898,190],{"class":207},[201,1900,1901],{"class":246}," actions/checkout@v6\n",[201,1903,1904,1906,1908,1910],{"class":203,"line":329},[201,1905,601],{"class":207},[201,1907,604],{"class":495},[201,1909,190],{"class":207},[201,1911,638],{"class":246},[201,1913,1914,1916,1918,1920],{"class":203,"line":350},[201,1915,601],{"class":207},[201,1917,604],{"class":495},[201,1919,190],{"class":207},[201,1921,1922],{"class":246}," actions/setup-node@v6\n",[201,1924,1925,1927],{"class":203,"line":370},[201,1926,644],{"class":495},[201,1928,516],{"class":207},[201,1930,1931,1933,1935],{"class":203,"line":376},[201,1932,698],{"class":495},[201,1934,190],{"class":207},[201,1936,703],{"class":657},[201,1938,1939,1941,1943],{"class":203,"line":571},[201,1940,709],{"class":495},[201,1942,190],{"class":207},[201,1944,714],{"class":246},[201,1946,1947,1949,1952,1954],{"class":203,"line":579},[201,1948,601],{"class":207},[201,1950,1951],{"class":495}," run",[201,1953,190],{"class":207},[201,1955,742],{"class":246},[201,1957,1958,1960,1962,1964],{"class":203,"line":590},[201,1959,601],{"class":207},[201,1961,622],{"class":495},[201,1963,190],{"class":207},[201,1965,1966],{"class":246}," Run migrations\n",[201,1968,1969,1971,1973],{"class":203,"line":598},[201,1970,737],{"class":495},[201,1972,190],{"class":207},[201,1974,1749],{"class":246},[201,1976,1977,1979],{"class":203,"line":612},[201,1978,775],{"class":495},[201,1980,516],{"class":207},[201,1982,1983,1986,1988],{"class":203,"line":617},[201,1984,1985],{"class":495},"          DATABASE_URL",[201,1987,190],{"class":207},[201,1989,1845],{"class":246},[201,1991,1992],{"class":203,"line":630},[201,1993,507],{"emptyLinePlaceholder":506},[201,1995,1996,1998],{"class":203,"line":641},[201,1997,574],{"class":495},[201,1999,516],{"class":207},[201,2001,2002,2005,2007],{"class":203,"line":649},[201,2003,2004],{"class":495},"    needs",[201,2006,190],{"class":207},[201,2008,2009],{"class":246}," migrate\n",[201,2011,2012,2014,2016],{"class":203,"line":661},[201,2013,582],{"class":495},[201,2015,190],{"class":207},[201,2017,587],{"class":246},[201,2019,2020,2022],{"class":203,"line":666},[201,2021,593],{"class":495},[201,2023,516],{"class":207},[201,2025,2026,2028,2030,2032],{"class":203,"line":678},[201,2027,601],{"class":207},[201,2029,604],{"class":495},[201,2031,190],{"class":207},[201,2033,609],{"class":246},[201,2035,2036],{"class":203,"line":688},[201,2037,2038],{"class":923},"      # ... build and deploy steps\n",[148,2040,2042],{"id":2041},"vercel-deployment","Vercel Deployment",[144,2044,2045],{},"Vercel handles CI/CD automatically when you connect your repository.",[153,2047,40],{"id":2048},"setup",[169,2050,2051,2059,2065],{},[172,2052,2053,2054],{},"Import your project in the ",[161,2055,2058],{"href":2056,"rel":2057},"https://vercel.com/new",[165],"Vercel dashboard",[172,2060,2061,2062],{},"Configure environment variables under ",[391,2063,2064],{},"Project Settings → Environment Variables",[172,2066,2067],{},"Vercel will deploy automatically on every push",[153,2069,2071],{"id":2070},"database-migrations","Database Migrations",[144,2073,2074],{},"For Vercel deployments with PostgreSQL or MySQL, migrations run during the build process because Vercel's build environment has network access:",[192,2076,2078],{"className":1023,"code":2077,"filename":428,"language":1025,"meta":197,"style":197},"export default defineNuxtConfig({\n  hub: {\n    db: {\n      dialect: 'postgresql',\n      // Migrations run during build since Vercel's build environment has network access\n    }\n  }\n})\n",[187,2079,2080,2092,2100,2108,2123,2128,2132,2136],{"__ignoreMap":197},[201,2081,2082,2084,2086,2088,2090],{"class":203,"line":204},[201,2083,1033],{"class":1032},[201,2085,1036],{"class":1032},[201,2087,1040],{"class":1039},[201,2089,1043],{"class":250},[201,2091,208],{"class":207},[201,2093,2094,2096,2098],{"class":203,"line":211},[201,2095,1050],{"class":495},[201,2097,190],{"class":207},[201,2099,226],{"class":207},[201,2101,2102,2104,2106],{"class":203,"line":229},[201,2103,1059],{"class":495},[201,2105,190],{"class":207},[201,2107,226],{"class":207},[201,2109,2110,2112,2114,2116,2119,2121],{"class":203,"line":287},[201,2111,1068],{"class":495},[201,2113,190],{"class":207},[201,2115,954],{"class":207},[201,2117,2118],{"class":246},"postgresql",[201,2120,960],{"class":207},[201,2122,284],{"class":207},[201,2124,2125],{"class":203,"line":308},[201,2126,2127],{"class":923},"      // Migrations run during build since Vercel's build environment has network access\n",[201,2129,2130],{"class":203,"line":329},[201,2131,1135],{"class":207},[201,2133,2134],{"class":203,"line":350},[201,2135,373],{"class":207},[201,2137,2138,2140],{"class":203,"line":370},[201,2139,1144],{"class":207},[201,2141,1147],{"class":250},[2143,2144,2146],"callout",{"to":2145},"https://vercel.com/docs/deployments/git","Learn more about Vercel Git integrations in the Vercel documentation.",[148,2148,2150],{"id":2149},"environment-specific-secrets","Environment-Specific Secrets",[153,2152,479],{"id":2153},"github-actions-1",[144,2155,2156,2157,190],{},"Store your secrets in ",[391,2158,2159],{},"Repository Settings → Secrets and variables → Actions",[2161,2162,2163,2176],"table",{},[2164,2165,2166],"thead",{},[2167,2168,2169,2173],"tr",{},[2170,2171,2172],"th",{},"Secret",[2170,2174,2175],{},"Description",[2177,2178,2179,2190,2200,2210],"tbody",{},[2167,2180,2181,2187],{},[2182,2183,2184],"td",{},[187,2185,2186],{},"CLOUDFLARE_API_TOKEN",[2182,2188,2189],{},"Cloudflare API token with Workers, D1, KV, and R2 permissions",[2167,2191,2192,2197],{},[2182,2193,2194],{},[187,2195,2196],{},"CLOUDFLARE_ACCOUNT_ID",[2182,2198,2199],{},"Your Cloudflare account ID",[2167,2201,2202,2207],{},[2182,2203,2204],{},[187,2205,2206],{},"CLOUDFLARE_DATABASE_ID",[2182,2208,2209],{},"The D1 database ID",[2167,2211,2212,2217],{},[2182,2213,2214],{},[187,2215,2216],{},"DATABASE_URL",[2182,2218,2219],{},"PostgreSQL or MySQL connection string",[153,2221,2223],{"id":2222},"per-environment-secrets","Per-Environment Secrets",[144,2225,2226],{},"Use GitHub Environments to separate production and staging secrets:",[192,2228,2230],{"className":485,"code":2229,"filename":487,"language":488,"meta":197,"style":197},"jobs:\n  deploy-production:\n    environment: production\n    # This job uses secrets from the production environment\n\n  deploy-preview:\n    environment: preview\n    # This job uses secrets from the preview environment\n",[187,2231,2232,2238,2245,2255,2260,2264,2271,2280],{"__ignoreMap":197},[201,2233,2234,2236],{"class":203,"line":204},[201,2235,566],{"class":495},[201,2237,516],{"class":207},[201,2239,2240,2243],{"class":203,"line":211},[201,2241,2242],{"class":495},"  deploy-production",[201,2244,516],{"class":207},[201,2246,2247,2250,2252],{"class":203,"line":229},[201,2248,2249],{"class":495},"    environment",[201,2251,190],{"class":207},[201,2253,2254],{"class":246}," production\n",[201,2256,2257],{"class":203,"line":287},[201,2258,2259],{"class":923},"    # This job uses secrets from the production environment\n",[201,2261,2262],{"class":203,"line":308},[201,2263,507],{"emptyLinePlaceholder":506},[201,2265,2266,2269],{"class":203,"line":329},[201,2267,2268],{"class":495},"  deploy-preview",[201,2270,516],{"class":207},[201,2272,2273,2275,2277],{"class":203,"line":350},[201,2274,2249],{"class":495},[201,2276,190],{"class":207},[201,2278,2279],{"class":246}," preview\n",[201,2281,2282],{"class":203,"line":370},[201,2283,2284],{"class":923},"    # This job uses secrets from the preview environment\n",[2143,2286,2288],{"to":2287},"https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment","Learn more about GitHub Environments in the GitHub documentation.",[2290,2291,2292],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}",{"title":197,"searchDepth":211,"depth":211,"links":2294},[2295,2299,2303,2306,2310],{"id":150,"depth":211,"text":151,"children":2296},[2297,2298],{"id":155,"depth":229,"text":156},{"id":478,"depth":229,"text":479},{"id":836,"depth":211,"text":837,"children":2300},[2301,2302],{"id":844,"depth":229,"text":845},{"id":862,"depth":229,"text":863},{"id":1801,"depth":211,"text":1802,"children":2304},[2305],{"id":1854,"depth":229,"text":1855},{"id":2041,"depth":211,"text":2042,"children":2307},[2308,2309],{"id":2048,"depth":229,"text":40},{"id":2070,"depth":229,"text":2071},{"id":2149,"depth":211,"text":2150,"children":2311},[2312,2313],{"id":2153,"depth":229,"text":479},{"id":2222,"depth":229,"text":2223},"Set up continuous integration and deployment for your NuxtHub application with proper database migration handling.","md",null,{},{"title":110},{"title":139,"description":2314},"yvXoMeUaTKlQ4FYvtjoJcvqN4LunSU-hyDSTtlRWR1o",[2322,2324],{"title":106,"path":107,"stem":108,"description":2323,"children":-1},"Build real-time experiences with NuxtHub.",{"title":120,"path":121,"stem":122,"description":2325,"children":-1},"Reference for all environment variables used by NuxtHub for database, blob storage, KV, cache, and deployment configuration.",1786489392689]