feat(cli): provision the site on the control-plane during migration (D7) - #551
Open
JonasJesus42 wants to merge 1 commit into
Open
JonasJesus42 wants to merge 1 commit into
JonasJesus42 wants to merge 1 commit into
Conversation
A migrated site came out undeployable: the pipeline had to be wired by hand, one Cloudflare dashboard click per worker (D6.3), and nothing gave the site the KV namespace fast-deploy needs. D7 (this commit, superseding D6.3) moves deploy to our own pipeline, and the migration now calls its front door. `provisionSite` posts SITE_CREATE to the control-plane's MCP endpoint and writes the KV namespace id it returns into the scaffolded wrangler.jsonc. SITE_CREATE is idempotent and create-if-absent at every step: admin `sites` row, org ownership, the site's OWN `deco-kv-<site>` namespace, the production environment, and the Deco CR that makes it deploy. The site's own namespace is the point, not a detail: `index:live` is one key per namespace, so two sites sharing one clobber each other's live pointer. And our builder seeds `decofile:<sha>` before activating the new version, which is the guarantee that makes stubbing `blocks.gen` out of the server bundle safe — a site on CF Workers Builds can never take that memory win. Inert without `DECO_CONTROL_PLANE_TOKEN` + `DECO_ORG`: prints the equivalent call and continues, like `provisionAnalytics`. A migration must not fail because an operator ran it without a token, and the id is not load-bearing anyway — the builder re-forces it from `CF_KV_NAMESPACE_ID` on every build. `setKvNamespaceIdInJsonc` edits the config as text rather than parse-and-restringify, because the scaffolded wrangler.jsonc carries the comments explaining why each binding exists. Also hardens `provisionAnalytics`, which interpolated `package.json`'s name straight into SQL sent to the Supabase Management API. That API takes no bind parameters, so the honest fix is to refuse anything that is not a plain site slug. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problema
Um site migrado saía não-deployável. A pipeline era wiring manual, um clique no dashboard da Cloudflare por worker (D6.3), e nada dava ao site o namespace de KV que o fast-deploy precisa.
D7 — deploy passa para o control-plane
Registro D7 (neste PR, em
MIGRATION_TOOLING_PLAN.md+ a regra always-loaded) — é o "follow-up D-record once shipped" que o D6.3 prometeu. O Cloudflare Workers Builds sai; entradecocms/control-plane(SITE_CREATE→ repo, adminsites, org ownership, KV/R2/D1 próprios do site, env de produção, Deco CR) + operator +cfworkers-builder.Três coisas que o CF Builds estruturalmente não dava:
index:liveé uma chave por namespace — dois sites dividindo um se atropelam.ensureSiteKvNamespacecriadeco-kv-<site>e o builder re-força o id doDECO_KVa partir deCF_KV_NAMESPACE_IDa cada build, então repo de tenant não consegue bindar KV de outro site.decofile:<sha>antes dowrangler deploye viraindex:livedepois — código novo nunca lê conteúdo velho. Essa ordem é exatamente o que torna seguro stubar oblocks.gendo bundle servidor (feat(tanstack): stub blocks.gen by default when the pipeline seeds KV #549), o corte de memória. Site no CF Builds nunca consegue esse ganho.routes/account_idcontrolados pelo tenant.Inalterado do D6.3: storefront continua sem
deploy.yml/preview.yml/sync-secrets.ymlscaffoldados — a pipeline é do control-plane, não do repo do site.Mudanças
provisionSitenomigrate.ts, logo após o bootstrap:tools/call SITE_CREATEno/mcp, grava okvNamespaceIdretornado nowrangler.jsonc. Inerte semDECO_CONTROL_PLANE_TOKEN+DECO_ORG— imprime a chamada equivalente e segue, mesmo padrão doprovisionAnalytics. Migração não pode falhar porque alguém rodou sem token, e o id nem é load-bearing (o builder re-força a cada build).setKvNamespaceIdInJsoncemlib/wrangler-config.ts, ao lado do leitor. Edita como texto em vez de parse-and-restringify, porque owrangler.jsoncscaffoldado carrega os comentários explicando por que cada binding existe.provisionAnalyticsinterpolavapackage.json.namedireto numa string SQL enviada à Supabase Management API. Essa API não aceita bind parameters, então a correção honesta é recusar o que não for um slug de site.--helpdocumenta as env vars novas.Testes
5 casos para
setKvNamespaceIdInJsonc: escreve o id preservando comentários, não encosta em outro binding, aceitabinding/idem qualquer ordem e entrada semid, e devolve a fonte intacta quando o binding não existe (não é erro — o builder re-força mesmo assim).Pilha: #548 → #549 (+ infra#333) → #550 → este.
🤖 Generated with Claude Code
Summary by cubic
Migrated sites previously required manual Cloudflare wiring and lacked the KV namespace required for fast deploys. Migration now calls the control plane’s
SITE_CREATEtool to provision deployment resources and writes the site’s KV namespace ID towrangler.jsonc; storefront repos still receive no deploy workflow scaffolding.DECO_CONTROL_PLANE_TOKENandDECO_ORG; without them, migration prints an equivalentcurlcommand and continues.Written for commit d0a651c. Summary will update on new commits.