Alchemy 2.0.0-beta.60 版本解析:Docker Provider、AWS Lambda MicroVMs 与 Cloudflare RSC/Vite 全栈更新
Alchemy 2.0.0-beta.60 版本解析Docker Provider、AWS Lambda MicroVMs 与 Cloudflare RSC/Vite 全栈更新【免费下载链接】t3code项目地址: https://gitcode.com/GitHub_Trending/t3/t3codeAlchemyInfrastructure-as-Effects基于 Effect 的云基础设施框架于 2026-07-06 发布 2.0.0-beta.60。本版以基础设施即 Effect 程序为统一主线新增 Docker 资源族、AWS Lambda 快照启动 MicroVMs、Workers for Platforms 动态分发、Vite 管线上的 React Server Components、异步 Workers 上的类式 Workflows并修复了 Cloudflare Containers 冷启动可靠性问题且本版无任何破坏性变更。读完本文你将掌握这些新资源的声明式用法、源码级默认行为以及如何从 v2.0.0-beta.59 平滑升级。本仓库中的关联源码位于 packages/alchemy/src完整变更清单见 CHANGELOG.md。Docker Provider把本地容器编排搬进 Stackalchemy/Docker将Image、RemoteImage、Container、Volume、Network引入为 Stack 资源对应 Docker 资源目录。它们驱动dockerCLI 的当前上下文——无论是 Docker Desktop、远程/SSH 上下文还是 CI 守护进程——并与你的云资源生活在同一个 Stack 里实现本地基础设施与云端资源同一套 Effect 程序、同一套声明与销毁流程。典型用法声明一个 Postgres 容器及其网络、卷、镜像依赖const image yield* Docker.RemoteImage(postgres-image, { name: postgres, tag: 18-alpine, }); const network yield* Docker.Network(app-network); const data yield* Docker.Volume(postgres-data); const postgres yield* Docker.Container(postgres, { image, environment: { POSTGRES_PASSWORD: password }, // Redacted-safe ports: [{ external: 15432, internal: 5432 }], volumes: [{ hostPath: data.name, containerPath: /var/lib/postgresql/data }], networks: [{ name: network.name, aliases: [postgres] }], start: true, });结合源码看三个关键设计点密钥走进程环境而非 CLI在 Container.ts 中environment被定义为Recordstring, string | Redacted.Redactedstring支持Config.redacted(POSTGRES_PASSWORD)读取的 Redacted 值见第 160-162 行注释示例第 587-592 行的渲染逻辑会识别Redacted.isRedacted(value)并只取明文值注入容器环境绝不让密钥出现在命令行参数或日志中。拉取的 tag 被固定pinned重新部署时若镜像 digest/tag 未变则视为 no-op避免每次 deploy 都触发无意义重建。栈外容器遵循标准采纳adoption规则源码 Container.ts 表明在没有既有状态时只采纳带有 alchemy 品牌标记的容器其余外部容器视为外来资源需要通过--adopt显式采纳保证不会误接管手工创建的容器。资源族还包含 Dockerfile.ts构建上下文与 Dockerfile 生成、Context.tsdocker 上下文选择、Registry.ts、Swarm.ts 与 Service.ts 等为本地开发与 CI 提供了完整的声明式容器层。AWS Lambda MicroVMs快照启动的微型虚拟机AWS.Lambda.MicrovmImage是全新的 Platform用于部署快照启动snapshot-booted的 MicroVMs对应 AWS/Lambda/MicrovmImage.ts 及同目录下MicrovmProvider.ts、MicrovmBundle.ts、MicrovmBinding.ts等一整套实现文件。VM 内的服务可以用 TypeScript 编写alchemy 负责打包、生成 Dockerfile 并在服务端构建快照也支持自带 Dockerfile 或直接上传预构建产物对应源码中main与codeArtifact两种模式的 prop 定义。Effect 原生写法以main: import.meta.filename声明入口并在Effect.gen中返回带类型的 RPC 服务export class Sandbox extends AWS.Lambda.MicrovmImage Sandbox, { hello: (message: string) Effect.Effectstring } ()(Sandbox) {} export default Sandbox.make( { main: import.meta.filename, buildRole }, Effect.gen(function* () { return { hello: (message) Effect.succeed(hello, ${message}!), fetch: Effect.gen(function* () { /* raw HTTP route */ }), }; }), );要点拆解每项实例操作都是最小权限的Binding.ServiceRunMicrovm、GetMicrovm、suspend/resume/terminate、认证令牌、镜像构建等操作见 AWS/Lambda 目录下的GetMicrovm.ts、SuspendMicrovm.ts、ResumeMicrovm.ts、CreateAuthToken.ts、GetMicrovmImageBuild.ts等都封装为独立 Service并带 least-privilege IAM 作用域。例如 MicrovmImage.ts 中的buildRolePolicyStatements只为构建角色授予从 Assets 桶读取代码工件 向 CloudWatch 写构建日志两类最小权限。类型化 RPCconnectMicrovm返回带完整类型签名的客户端运行期直接调用 VM 内方法const sandbox yield* AWS.Lambda.connectMicrovm(Sandbox, { endpoint, authToken }); const reply yield* sandbox.hello(world);跨云调用从Cloudflare.Worker绑定 MicroVM 操作时alchemy 会自动铸造 IAM 用户 assume-role Role让 Worker 在运行期驱动 AWS MicroVMs实现 Cloudflare Worker ↔ AWS 计算资源的跨云编排。冷启动基准官方对 MicroVMs 与 Cloudflare Containers 做了 700 次隔离冷启动对比MicroVMs 无论镜像内装什么都在 2–4.5 秒内启动完成完整数据见website/src/content/docs/blog下的 MicroVM 冷启动基准文章。Workers for Platforms动态分发命名空间通过新的namespace属性可以把用户 Worker部署进dispatch namespace并在运行期动态路由到它们对应 Cloudflare/WorkersForPlatforms 下的DispatchNamespace.ts、Get.ts、GetBinding.ts且无需新增重复的资源类型const ns yield* Cloudflare.WorkersForPlatforms.DispatchNamespace(Customers, {}); const userWorker yield* Cloudflare.Worker(CustomerA, { namespace: ns.name, script: export default { fetch() { return new Response(hi) } }, });平台侧 Worker 的绑定有两种方式Effect 原生yield出绑定即得到类型化客户端对应 Get.ts 中通过dispatch_namespace绑定在请求期查找分发的实现// Effect-native — yield the binding, get a typed client const dispatch yield* Cloudflare.WorkersForPlatforms.Get(namespace); const userWorker yield* dispatch.get(customer-a);异步 WorkerDispatchNamespace本身是合法的env绑定直接注入异步 Worker 的环境变量// async — DispatchNamespace is a valid env binding const platform Cloudflare.Worker(Platform, { main: ./handler.ts, env: { DISPATCH: namespace }, }); // handler.ts: env.DISPATCH.get(customer-a).fetch(request)React Server Components on ViteCloudflare.Vite源码见 Cloudflare/Website/Vite.ts现在支持产出多个 server environment的构建——最典型的就是 RSC。viteEnvironments用于选择哪个 environment 生成被部署的 Worker 入口以及哪些附加 server environment 随其一起打包const app yield* Cloudflare.Vite(ReactRouterRSC, { compatibility: { flags: [nodejs_compat] }, viteEnvironments: { entry: rsc, children: [ssr] }, });从源码文档注释Vite.ts 第 80-110 行可以确认以下行为默认值单一 environment 的 SSR 构建无需任何配置默认即为{ entry: ssr, children: [] }client environment 恒定始终作为静态资源部署不需要也不应该显式声明自定义入口当 Worker 需要导出框架 fetch handler 之外的内容如 Durable Object 类、附加 handler时用main指向自己的包装模块再重新导出扩展项main的优先级高于 Vite 配置中的 entry开发服务器重启指纹同一 PR 将原先的 dev-server 重启指纹替换为精确的结构签名structural signature配置变更不再可能被静默遗漏。Workflows 绑定到异步 Workers类式class-basedCloudflare Workflows 现在可以通过env绑定到异步非 EffectWorker 上与类式 Durable Objects 的绑定方式保持一致对应 Cloudflare/Workflows 下的Workflow.ts、WorkflowBridge.tsexport const AsyncWorker Cloudflare.Worker(Async, { main: ./src/worker.ts, env: { MY_WORKFLOW: Cloudflare.Workflow{ value: string }(MyWorkflow, { className: MyWorkflow, }), }, }); export type Env Cloudflare.InferEnvtypeof AsyncWorker; // env.MY_WORKFLOW is the native Workflow{ value: string }你的WorkflowEntrypoint类保持为纯cloudflare:workers代码alchemy 只负责预置 workflow 资源并生成绑定WorkflowBridge.ts 中的桥接层会在 Worker 运行时把绑定接入实例跨脚本引用与异步 DO 相同通过scriptName指定类型层面Cloudflare.InferEnvtypeof AsyncWorker能直接推出env.MY_WORKFLOW为原生Workflow{ value: string }类型无需手写接口。Containers启动变快、保持在线此前经 alchemy 部署的 Cloudflare Containers 明显差于 wrangler 部署同一镜像的表现——在 100 并发冷启动下只有约 2/100 成功。本版定位并修复了两个根因对应 Cloudflare/Containers/ContainerProvider.ts对齐 wrangler 的默认值maxInstances此前默认为1导致所有 Durable Object 在单个容器槽位里被串行化。现在当未设置自定义限制时默认maxInstances: 20、支持 scale-from-zero、instanceType: lite。源码 ContainerProvider.ts 第 228-233 行 明确注明了旧值 1 的问题与props.maxInstances ?? 20的新默认ContainerApplication.ts 第 109-112 行 则定义了instanceType默认litedev是 wrangler 已废弃的同义别名。修复就绪探针readiness probing此前探针没有 per-probe 超时未监听的端口可能挂起数分钟现在轮询循环与cloudflare/containers完全一致。修复后结果100/100 冷启动成功与 wrangler 持平。此外停止或崩溃的容器会在下一次请求时透明重启而崩溃循环crash-looping的容器会快速失败不再耗尽就绪预算对应 Containers 目录下的恢复逻辑实现。生产配置时建议显式声明maxInstances与instanceType例如// instanceType: stack.stage prod ? standard-1 : dev,此示例出自 Container.ts 第 412 行 的文档注释。Effectful ComputeECS 与 EC2 端到端可用ServerHost{ fetch }模式现在可以在AWS.ECS.Task上端到端工作容器入口打包一个 Bun HTTP 服务器把每个 chunk 都打进镜像并按任务声明的架构构建——这由一个真实部署 Fargate 服务并挂载 ALB 的 smoke test 验证对应 AWS/ECS 目录与 examples/aws-ecs。托管的AWS.EC2.Instance以相同方式提供 HTTP 服务并附带一个可自愈重启的 systemd 单元能自动恢复瞬时启动故障对应 AWS/EC2。新增的AWS.EC2.KeyPair资源值得单独说明源码见 AWS/EC2/KeyPair.tsconst keyPair yield* AWS.EC2.KeyPair(DeployKey, { keyType: ed25519 }); // keyPair.keyName - AWS.EC2.Instance({ keyName }) // keyPair.privateKey - Redactedstring支持rsa | ed25519两种keyType第 20 行生成的私钥只捕获一次为Redacted.Redactedstring密钥第 74 行后续访问永远以 Redacted 形式出现避免明文泄漏若在 AWS 侧已有密钥对importKeyMaterial场景AWS 只存储公钥、不返回私钥此时privateKey为 undefined第 46 行注释代码需做可选处理。文档站点整体重构本版把官网文档重组为按提供商分栏的水平标签页结构——Core · CLI · Cloudflare · AWS · PlanetScale · Neon · More ▾新增/重写约 100 个页面CoreInfrastructure as Code、Infrastructure as Effects、APIs、Environments、State Store、Project structure、TestingCLI全部命令得到文档化包括首次出现的alchemy unsafe nuke与资源采纳adopt流程文档Cloudflare / AWS 分栏环境搭建、五部分教程、按角色Compute、Frontend、APIs、Data、Messaging、AI 等分组的 block 页面与指南所有页面均对照源码、测试与 fixtures 编写每个被移动的 URL 都做 301 跳转保证旧链接不失效。本版其他值得关注的变更--yes完全非交互alchemy deploy --yes现在自动接受 Cloudflare state store 升级与部署提示不再在非 TTY 环境下挂起CI 无需任何 workaround部分 state-store 部署可被检测并恢复store 健康检查现在验证真实 store 是否在提供服务而非仅仅存在 pre-create 的 stubCommand.Build的 memo 键包含 command env两个仅在环境变量如分阶段的EXPO_PUBLIC_*、API id上有差异的StaticSite构建不再复用彼此的产物retain 资源正确报告为retaineddestroy 不再把RemovalPolicy: retain的资源列为已删除CLI 支持 Windowsstack 入口通过file://URL 加载见 Cli 目录 相关实现栈外创建的 Durable Object 类可干净采纳类迁移会回退到匹配观测到的绑定采纳 wrangler/dashboard 创建的 Worker 时复用其 DO 类而非重建失败Access Application 在状态丢失后可恢复read回退到域名扫描并将接管操作放在--adopt之后而不是盲目创建带新aud的重复应用连接池化来源pooled originNeonProject/Branch与 PlanetScalePostgresRole现在暴露pooledOriginPlanetScale 分支副本意图持久化使replicas: 0可收敛AWS 环境认证修复登录期间向 STS 提供Region并打破了账户 ID 查询中的Region/AWSEnvironment层循环依赖。下一步行动指南升级到 v2.0.0-beta.60 后建议按以下路径验证新能力若需要本地数据库/中间件用Docker.Container把服务编排纳入 Stack验证密钥走 Redacted 环境变量、tag 固定、--adopt采纳外部容器在 Cloudflare 侧验证Cloudflare.Vite的 RSC 多环境构建与WorkersForPlatforms.DispatchNamespace动态分发检查 Containers 资源的新默认值maxInstances: 20、instanceType: lite、scale-from-zero确认无需手工改动即可获得与 wrangler 一致的冷启动表现在 AWS 侧体验AWS.Lambda.MicrovmImage、AWS.EC2.KeyPair与 ECS/EC2 的ServerHost{ fetch }端到端部署。完整逐项变更可对照仓库内 CHANGELOG.md v2.0.0-beta.60 章节可运行示例位于 examples含 aws-lambda、aws-ecs、cloudflare-website-vite、cloudflare-worker、cloudflare-planetscale-postgres-drizzle 等官方教程与各提供商文档见 website 内容目录。从 v2.0.0-beta.59 升级本版无需处理破坏性变更。【免费下载链接】t3code项目地址: https://gitcode.com/GitHub_Trending/t3/t3code创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →