@crossdelta/infrastructure

中文文档
0.19.0发布于 2026/10/25MITTypeScriptESM + CJS近 30 天下载 4405

npm version License: MIT

中文使用文档
文档目录10 节
  1. 何时使用
  2. 当不使用时
  3. 安装
  4. 包括什么
  5. 快速启动
  6. 服务配置
  7. 共享集群( 多层)
  8. 生成- env CLI
  9. 限制
  10. 许可证

@ crossdelta/ 基础设施

npm version License: MIT

对向 DigitalOcean Kubernetes (DOKS) (英语)。您将每项服务描述为一个打入的配置对象,软件包生成部署、服务、入侵、秘密、健康探测器和滚动更新策略.

为在DOKS上运行TypeScript微服务的团队所建,有NATS JetStream,GHCR和Pulumi. 如果这是你的堆栈, 这可以节省真正的锅炉板。 如果不是,你可能更好 与平地普鲁米或赫尔姆.

何时使用

  • 您将多种类型脚本服务部署到一个 数字海洋 Kubernetes集群
  • 你用这个 普鲁米 (不是Terraform,不是仅Helm)用于基础设施
  • 您需要每个服务一个配置对象, 而不是 K8s 资源声明的 ~ 150行
  • 你需要NATS JetStream,NGINX入侵,cert-manager, 或者凯迪作为反向代理

当不使用时

  • AWS/GCP/祖尔:只有DOKS被执行. EKS/AKS/GKE不支持.
  • 平地或平地螺旋桨:这是只用普鲁米.
  • 非倾向设置:软件包为您作出选择(Helm图表版本,部署策略,DO特定说明). 需要完全控制时,直接使用普鲁米.
  • 单一服务项目: 管理费对于一项服务不值得.

安装

npm install @crossdelta/infrastructure @pulumi/pulumi @pulumi/kubernetes
# For DOKS cluster creation:
npm install @pulumi/digitalocean
# For NATS stream deployment (optional):
npm install @crossdelta/cloudevents

包括什么

模块它会做什么
组createDOKSCluster(), (中文(简体) ), createVPC(), (中文(简体) ), createK8sProviderFromKubeconfig()
工作量deployK8sService(), (中文(简体) ), deployK8sServices(), (中文(简体) ), createNamespace(), (中文(简体) ), createImagePullSecret()
NGINX侵略deployNginxIngress() 通过Helm(图 v4.11.3)
证书管理器deployCertManager() 通过Helm(图v1.16.2)
海军deployNats() 通过Helm(图v1.2.6), buildNatsUrl()
凯蒂deployCaddy(), (中文(简体) ), generateCaddyfile() 使用点播 TLS 的反向代理
流线collectStreamDefinitions(), (中文(简体) ), deployStreams(), (中文(简体) ), materializeStreams() (NATS喷气相机)
服务发现discoverServiceConfigs() 自动发现配置 infra/services/*.ts
本地开发generateComposeYaml(), k3d 集群脚本
国 际generate-env 生成 .env.local 从 Pulumi 配置 + 服务发现

快速启动

一个 index.ts 提供集群、运行时间组件和所有服务:

import {
  createDOKSCluster,
  createVPC,
  createNamespace,
  deployRuntime,
  deployK8sServices,
  discoverServiceConfigs,
} from '@crossdelta/infrastructure'

const vpc = createVPC({ name: 'my-vpc', region: 'fra1' })
const { provider } = createDOKSCluster({
  name: 'my-cluster',
  vpcUuid: vpc.id,
  nodePool: { name: 'default', size: 's-4vcpu-8gb', nodeCount: 1 },
})
createNamespace(provider, 'my-namespace')

const runtime = deployRuntime(provider, 'my-namespace', {
  nats: { enabled: true, config: { replicas: 1, jetstream: { enabled: true } } },
  ingress: { enabled: true },
  certManager: { enabled: true, config: { email: '[email protected]' } },
})

const configs = discoverServiceConfigs('services')
deployK8sServices(provider, 'my-namespace', configs)

服务配置

每个文件在 infra/services/ 导出一个配置对象。 软件包从中获取所有 K8s 资源 :

import { ports, type K8sServiceConfig } from '@crossdelta/infrastructure'

const config: K8sServiceConfig = {
  name: 'my-service',
  ports: ports().http(4000).public().build(),
  healthCheck: { httpPath: '/health' },
  ingress: { path: '/api', host: 'example.com' },
  env: { DATABASE_URL: dbUrl },
  secrets: { API_KEY: apiKey },
  resources: {
    requests: { cpu: '50m', memory: '64Mi' },
    limits: { cpu: '200m', memory: '256Mi' },
  },
}

export default config

见 K8sServiceConfig 所有字段:复制品、卷、策略、容器Env、标签、说明、服务Type等.

从 replicas: 2 向上服务还获得地形分布限制(每个节点一个吊舱, ScheduleAnyway)和一项可能中断的预算(maxUnavailable: 1) (中文(简体) ). 在两个复制品下面也没有创造出来,因为一个复制品上的 " PodDisruption " 预算会阻碍每个节点的排出。 设定 highAvailability: false 以选择一个多replica服务,例如当其吊舱共享ReadWriteOnce卷时.

共享集群( 多层)

Pin 数字海洋资源名称 clusterName编号 :vpcName 用于在 Pulumi 堆栈上共享一个集群:

// Stage stack owns the cluster
const { provider, kubeconfig } = createDOKSCluster({
  name: 'my-cluster',
  clusterName: 'my-cluster',
  vpcUuid: vpc.id,
  nodePool: { name: 'default', size: 's-4vcpu-8gb', nodeCount: 1 },
})
export const clusterKubeconfig = kubeconfig

// Production stack references stage
const stageStack = new StackReference('org/project/stage')
const provider = createK8sProviderFromKubeconfig(
  'production',
  stageStack.getOutput('clusterKubeconfig'),
)

生成- env CLI

生成 .env.local 从普鲁米的秘密和发现的服务配置:

npx generate-env              # defaults to stage stack
npx generate-env --stack=production
npx generate-env --no-pulumi  # skip Pulumi, only service discovery

限制

  • 仅限DOKS. 没有实施其他云提供者.
  • Helm图表版本被固定. NGINX v 4.11.3, cert-manager v 1.16.2, NATS v1.2.6. 尚未覆盖选项 .
  • 服务发现假定一项公约: infra/services/*.ts 文件为 export default config。 。 。 .
  • @crossdelta/cloudevents 是一个很难依赖的 即使你不使用NATS流 https://github.com/orderboss/platform/issues/TBD 互联网档案馆的存檔,存档日期2013-12-02。 。 。 .
  • Caddy 部署使用再创建策略 (RWO PVC与滚动更新不相容).

许可证

麻省理工学院 横跨德尔塔

版本与发布记录

@crossdelta/infrastructure 共发布 92 个版本,首次发布于 2025/12/01;过去 12 个月发布了 92 个版本。

版本发布日期距今
0.19.0latest2026/10/2516 天前
0.18.12026/10/1724 天前
0.18.02026/10/1526 天前
0.17.02026/10/1527 天前
0.16.02026/09/221 个月前
0.15.42026/09/131 个月前

关于 @crossdelta/infrastructure 的常见问题

如何安装 @crossdelta/infrastructure?

在项目目录运行 npm install @crossdelta/infrastructure,或使用 pnpm add / yarn add / bun add。它还提供命令行工具 generate-env,可以用 npx generate-env 直接运行。

@crossdelta/infrastructure 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@crossdelta/infrastructure 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@crossdelta/infrastructure 可以商用吗?

@crossdelta/infrastructure 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@crossdelta/infrastructure 的下载量有多少?

根据 npm 官方下载统计,@crossdelta/infrastructure 在 2026/10/11 – 2026/11/09 这 30 天内被下载 4,405 次,日均约 147 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@crossdelta/infrastructure 还在维护吗?

最新版本 0.19.0 发布于 2026/10/25(16 天前);至今共发布 92 个版本,其中过去 12 个月发布了 92 个;首次发布于 2025/12/01。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。