ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

celld deploy命令深度解析:Wrangler配置如何变成bucket中的部署对象

celld deploy命令深度解析:Wrangler配置如何变成bucket中的部署对象 celld deploy命令深度解析Wrangler配置如何变成bucket中的部署对象【免费下载链接】celldself-hosted, distributed Durable Objects项目地址: https://gitcode.com/GitHub_Trending/ce/celldcelld 是一个自托管的分布式 Durable Objects 运行时而celld deploy是它的部署命令读取你的Wrangler 配置用 esbuild 打包 Worker 代码然后把产物写进你自己拥有的bucketS3 兼容存储或 GCS。整个过程没有控制台、没有 API 服务——bucket 里的几个 JSON 对象就是完整的部署。本文带你完整走一遍这条流水线从wrangler.jsonc到deploy/current.json指针看懂每个部署对象是怎么来的。一、celld deploy 的完整流水线5 步概览一条命令背后celld deploy内部依次做了 5 件事定位配置在工作目录找wrangler.jsonc或wrangler.json白名单校验只接受它建模过的配置键遇到不认识的键直接报错esbuild 打包把入口文件打成 ESM bundlewasm 文件拆成兄弟模块计算版本对所有模块内容做 SHA-256得到一个 16 位十六进制版本号按顺序写 bucket先静态资源正文再模块再assets.json、manifest.json最后原子更新指针核心逻辑都在 crates/celld/deploy.rsbucket 中对象的契约定义在 crates/celld/protocol.rs。二、第一步定位并校验 Wrangler 配置白名单机制celld deploy .的位置参数既可以是项目目录也可以是配置文件本身都不传时默认当前目录。它按顺序寻找wrangler.jsonc和wrangler.json找不到但存在wrangler.toml时会明确报错——TOML 格式不被支持需要转成 JSONC。接下来是 celld 的设计亮点配置键白名单。目前只支持这些键$schema / name / main / compatibility_date / compatibility_flags durable_objects / migrations / assets / services / vars / no_bundle任何其他键比如routes、queues、kv_namespaces都会让部署直接失败并列出 offending 键而不是静默丢弃。源码注释写得很直白拒绝是兼容性安全的猜测才会在激活阶段产生令人困惑的失败。同理assets段、migrations段也各自有严格的键校验。 一个真实示例examples/counter/wrangler.jsonc 里就是namemaindurable_objects.bindings三个键这是典型的最小 Durable Objects 项目。三、第二步esbuild 打包——谁负责把代码变成 bundlecelld 不内置打包器而是调用你PATH上的 esbuild可用环境变量CELLD_ESBUILD指定路径。它的调用参数很有讲究--formatesm --platformbrowser --targetes2024--conditionsworkerd,worker,browser模拟 Workers 运行时的模块解析条件--external:node:*node 内置模块保持外部引用运行时由 celld 自带的nodejs_compat子集提供--loader:.wasmcopy每个 wasm 导入被解析后拷贝为独立文件成为部署里的兄弟模块入口main字段会被归一成项目相对路径——因为 esbuild 会把这个路径打进 bundle如果依赖你当时在哪个目录执行命令同一份源码就会哈希出两个不同版本。如果你的项目已经用 Vite 打包过把配置写成no_bundle: truecelld 会原样上传入口文件绝不再跑一遍 esbuild二次打包正是毁掉 Vite 产物的元凶。四、第三步版本怎么算内容寻址的确定性版本这是理解Wrangler 配置如何变成部署对象的关键。celld 把排序后的模块名模块字节 序列化的元数据 静态资源索引一起喂给 SHA-256取前 16 位十六进制作为版本号version sha256(排序的modules metadata_json assets_index)[:16]这带来一个很实用的性质代码和配置完全一致时重复部署得到同一个版本号指向同一个对象前缀不会产生垃圾对象改一行代码则版本号必变。部署对象因此是内容寻址的、不可变的。版本算出后所有对象都落在前缀deploy/script_name/version/下——script_name 就来自配置里的name字段。五、第四步按顺序写入 bucket——谁先谁后有讲究写入顺序在 crates/celld/deploy.rs 的write()函数里被严格固定目的是保证任何时刻的读者都看不到指针指向了不完整的部署顺序对象 key内容1deploy-blobs/assets/sha256/xx/sha256静态资源正文全 fleet 共享、按内容去重16 路并发上传2deploy/script/version/module各 JS/wasm 模块3deploy/script/version/assets.json静态资源索引路径 → sha256/大小/Content-Type4deploy/script/version/manifest.json部署清单其中第 1 步有个小细节上传前先head检查该 key 是否已存在且元数据中的 sha256 一致一致就跳过——同一张图被多个项目引用时整个 fleet 只存一份。manifest.json是节点真正读取的部署说明书结构见 crates/celld/protocol.rs版本、script_name、主模块、Durable Object 类列表、SQLite 类列表、每个模块的大小与内容哈希、资源引用以及required_features如assets-v1、wasm-v1。这个特性清单让老版本节点能在加载前就拒绝它跑不动的部署而不是跑到一半才失败。六、关键机制current.json 指针与 compare-and-swap最后两步是整个部署的开关写的是两个指针deploy/script_name/current.json ← 具名指针先写 deploy/current.json ← 全 fleet 指针后写指针是个DeployPointer对象versionprefixrollout.percentdeploy 命令固定 100%。它们通过compare-and-swap更新先head拿当前 etag再带 etag 条件写。这意味着两个终端同时celld deploy时必有一个输家而不会出现丢失写入——输家会收到 lost a race 错误提示重新执行部署即可。想只打包不落桶用--dry-run它会完成打包并打印版本号但不写任何对象适合 CI 里做预检。七、节点如何加载部署对象部署成功后已有节点并不会自动切换——celld 在节点启动时加载最新部署所以命令行会明确提示Nodes load a deployment at startup; restart them to serve this version. 节点启动时的读取路径crates/celld/fleet.rs是deploy/current.json → 解析指针 → 读 prefix/manifest.json → 校验 required_features → 拉取全部模块 → 构建 Worker配合编排工具systemd / K8s 的滚动更新逐台重启节点即可完成版本切换celld 本身不提供 rollout 命令。八、常见问题速查FAQQ支持哪些存储--bucket支持s3://含 R2、MinIO、Tigris 等任何 S3 兼容服务和gs://前缀。gs://走 Cloud Storage XML API此时--endpoint会被拒绝、--region被忽略。Q静态资源有上限吗有硬性限制最多 20,000 个文件、总大小 1 GiB、单文件 25 MiB_headers/_redirects指令文件限 100 KiB。资源树里不允许符号链接.assetsignore不支持遇到会直接报错。Q想配路由routes怎么办celld deploy不支持路由——celld 本身不做路由路由请用你前面的负载均衡器解决或者用 Wrangler 部署到 Cloudflare。Q部署输出了什么命令结束时会打印上传体积含 gzip 后大小、静态资源统计、绑定表env.COUNTER (Counter)→ Durable Object (SQLite) 这类 Wrangler 风格的展示以及打包耗时——方便你确认部署内容和预期一致。小结celld deploy把部署还原成了一件朴素的事把 Wrangler 配置翻译成一组不可变对象再原子地移动两个指针。没有控制面、没有账号体系bucket 里的manifest.json就是合同current.json就是开关——这也是自托管 Durable Objects 能如此轻量运转的根基。【免费下载链接】celldself-hosted, distributed Durable Objects项目地址: https://gitcode.com/GitHub_Trending/ce/celld创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表