@di-framework/tenant-cli

中文文档
6.0.30发布于 2026/11/07(MIT OR Apache-2.0)TypeScriptES Module构建来源已验证近 30 天下载 3671

飞行员租户CLI:只与租户控制员的OpenAPI合同进行交谈,并持有身份服务员证书;从未与Kubernetes.

中文使用文档
文档目录9 节
  1. 合同是共享的
  2. 使用客户端
  3. 测试固定装置
  4. 书记官处
  5. 工作量的参考文献
  6. 图标
  7. 登录
  8. 主计长 CA
  9. 飞行员还没有做的

@di-framework/tenant-cli (英语)

租户CLI的飞行员 从来不说Kubernetes。 它每个账户有一个证书,一个 身份服务证或房客 API 密钥,每个动作都是给房客控制器的呼叫 OpenAPI合约. Kubeconfigs只存在于控制器内. 削减标准和 命令集是平台问题#40;其原型始于 ../tenant-auth。 。 。 .

合同是共享的

api/v1/openapi.yaml 承诺和生成,从未编辑:

src/api/contracts/*-v1.codegen.ts   manifests (operations, paths, schemas)
src/api/schemas.ts                  JSON schemas published under components.schemas
src/api/handlers.ts                 the server side; every operation answers 501 in the pilot
src/api/generated/**                @di-framework/codegen output: typed routes and validators
api/v1/openapi.yaml                 emitted from the generated @Endpoint metadata
src/client/schema.d.ts              openapi-typescript output
src/client/index.ts                 the typed client; its paths are checked against `paths`
src/client/sse.ts                   the one hand-written transport: text/event-stream framing
bun run generate        # di-framework generate, then the document, then the client types
bun test                # includes a drift check: the committed document must match the manifests

显示在文档和表格中 paths; 客户端路径 合同中不再提及的事项 tsc这就是整个漂移的故事.

流动业务logs)是SSE:每个 log 事件 data 是一个 LogEvent 作为JSON,和 end 关闭溪流。 操作描述中的 spec 名称; 框架本身为 src/client/sse.ts。 。 。 . logs 需求 env (单位:千美元)prod 或者说 staging如合同所述: 控制器回答400没有它,而流只有环境的行(平台#106).

使用客户端

@di-framework/tenant-cli/client 是已公布的条目: 键入 /v1 客户端 (单位:千美元)createClient, (中文(简体) ), ControllerError, (中文(简体) ), events,以及请求/答复类型。 舰船编成 (单位:千美元)dist,与 .d.ts因此消费者不需要 .ts 导入支持。 软件包还安装 di-tenant 命令,它需要 Bun(它的 shebang 是 bun) (中文(简体) ).

这个 ./src/api/* 导出是控制方合同(处理器、路线、计划、验证器和 生成的路径)。 它作为TypeScript源在下面 src/api,因此导入它需要运行时间 装入 .ts (本)与 experimentalDecorators 在消费者中启用 tsconfig.json· ; ../tenant-auth 在此寄存器内使用 。 测试固定装置发布 作为 ./testing,而不是从 tests/。 。 。 .

import { createClient } from '@di-framework/tenant-cli/client';

const info = await createClient({ baseUrl: 'https://controller.example' }).authInfo();

api/v1/openapi.yaml 船舶作为合同. bun run build 生产 dist。 。 。 .

测试固定装置

@di-framework/tenant-cli/testing 出口 deployBundle(overrides?): 完整、有效 DeployBundle 正如CLI所做的, 每一次通话都新鲜。 租户控制员的部署测试和 部署合同的其他消费者 进口它 所以双方同意形状。 把它绑起来 同版本为 ./client。这是一个单独的条目,所以测试代码不要 ./client,它已经 没有运行时间依赖.

import { deployBundle } from '@di-framework/tenant-cli/testing';

const bundle = deployBundle({ env: 'staging' });

书记官处

每个租户在其命名空间(平台#83,决定 平台#52. 没有任何内容是刻制的:您凭自己的身份登录到登记册。 用你们的 身份服务器访问符或一个 dik_ API 密钥作为 Basic 密码( 用户名被忽略) . 登记员问房客控制员 GET /v1/auth/whoami 呼叫者是谁:开发者可能 推和拉,一个取景器可能只能拉.

GET /v1/deploy/registry (查看器或开发器)返回 RegistryInfo: 登记册 url (单位:千美元) 来源: 方案 + 主机 [: port], 无路径, 可选 repositoryPrefix, (中文(简体) ), auth (单位:千美元)basic-identity(中文(简体) ) 和一个固定的 username 提示( e)token) (中文(简体) ). 租户控制员从 TENANT_CONTROLLER_REGISTRY_URL (单位:千美元){tenant} 由租户取代),平台设置 时 tenantAuth.registry 配置存在; 否则端点会回答 503 no registry is configured for this tenant。虽然一个登记册已经配置,但没有服务(a) 它回答503 the tenant registry is not available; see the Tenant's TenantAuthReady condition。来源必须是: https://; 平面 http:// 实值 仅接受回回转( e)localhost, (中文(简体) ), 127.0.0.0/8, (中文(简体) ), [::1])和集群内主机(*.svc, (中文(简体) ), *.svc.cluster.local) (中文(简体) ).

di-tenant registry 打印 URL 、 登录主机 和 推出 前缀 . di-tenant registry login 登录已登录的证书( 身份标志是) 首先被刷新,因此存储的复制品会获得其整个寿命;它从不打印出符号或密钥:

di-tenant registry                       # url, login host, push prefix
di-tenant registry login                 # checks GET <url>/v2/, then writes the Docker config
di-tenant registry login --with podman   # or docker / oras: the password goes to its stdin
di-tenant registry logout                # undoes the last registry login, no controller call

在发送任何证书之前,至少严格检查返回的控制器的 URL 作为控制器自己的规则: https: 来源(没有用户信息、路径、查询或碎片),或 http: 仅用于回转和 *.svc 编号 : *.svc.cluster.local 师曰. 除此之外,东道主必须 成为字母、数字和连字符标签的 DNS 名称( 无) _,没有后继点),IPv4地址,或 括号中的 IPv6 地址, 因此这里拒绝控制器接受的几个名称 。 这个 /v2/ 检查 不遵循重定向.

无 --with, (中文(简体) ), registry login 存储 token:<credential> 用于东道方的 auths 输入 Docker 配置( T)--config <file>,则 $DOCKER_CONFIG/config.json,则 ~/.docker/config.json),保留所有其他条目,并带有模式 0600并读取 该文件; pockman 读取 --authfile 或者说 REGISTRY_AUTH_FILE。如果文件名称为 credsStore 或者说 credHelpers 输入主机, docker 咨询帮助者,所以使用 --with docker与 --with,工具运行 login --username=token --password-stdin [--plain-http | --tls-verify=false] -- <host> (单位:千美元) plain-HTTP 开关,用于 Oras 或 pockman 上 http: 仅来自来源).

registry login 记录主机和它用账户存储登录的位置,加上 (原始内容存档于2019-09-21) (英语). Sha256 of the Docker config enter. 仅由主机和租户键入 共享一(127.0.0.1:<port>),所以只当该条目仍然匹配时,登录才会删除该条目 指纹; 如果另一个账户 registry login 或属于自己的 docker login 换了 条目带有警告.

  • registry logout 在没有控制器调用的情况下删除已记录的登录, 因此它可在 登录已过期 。 对a --with 登录它运行 <tool> logout -- <host>,删除 不管那个工具对宿主有什么影响.
  • registry logout --host <host> [--config <file> | --with <tool>] 删除此条目 不论它持有什么,都保留.
  • logout 删除已记录的 Docker 配置条目( 相同的指纹规则),因为它持有 相同标志或密钥。 它从不运行 <tool> logout (单位:千美元) --with 登录, 因为不能是 选中; 它打印要运行的命令 .
  • 通过 Docker 证书助手存储的登录( S)credsStore)为取取之助.

通过手,登录与东道主 url,而不是完整的 URL,然后推到 <host>/<repositoryPrefix>/<name>:<tag>数字 :

oras login <host>
docker login <host>
oras push <host>/<repositoryPrefix>/<name>:<tag> ...

一个 http: 源表示平原 HTTP( 仅潜回或集群内): 通过 oras --plain-http 或者说 wash --insecure该平台通过网关为HTTPS的登记册服务,因为 密码是身份证明 它的证书是房客控制器的,所以相信 租户的CA( ConfigMap) tenant-controller-ca就像你为控制器所做的. di-tenant 本身 使用与登录一起存储的 CA(参见 主计长 CA用于 /v2/ 检查; 推力工具需要他们自己的信任 比如说 oras --ca-file, (中文(简体) ), /etc/docker/certs.d/<host>/ca.crt,或 ~/.config/containers/certs.d/<host>/ca.crt 给保镖的.

身份访问符过期,所以存储 docker login 停止工作; a dik_ API密钥 CI.

工作量的参考文献

推向登记处的公共来源(url 上表),但请在 在您所部署的工作量中, 组内牵引主机: 租户主机从 tenant-registry.di-runtime-<tenant>.svc (无端口),带有由平台管理的牵引证书,而非 从公共来源,这是主机无法使用的网关或端口前端地址。 两者 名称服务于同一寄存器 :

oras push registry.acme.localhost:28180/web:1.0.0 ...            # push (your credential)
# workload component image:
tenant-registry.di-runtime-acme.svc/web@sha256:<digest>           # pull (the tenant's hosts)

/v1/deploy 财务报告和审定财务报表 /v1/deploy/preview 拒绝 (422其组件或服务图像的捆绑 命名公共来源和问题 detail 提供组内引用来取而代之.

图标

login --controller <url> [--account <tenant>] [--api-key <key>] [--ca-file <pem> | --no-ca] [--no-browser]
logout | whoami
deploy preview|apply --env <prod|staging> --bundle <file>
logs --service <name> --env <env> [--deployment <id>] [--follow] [--since <dur>] [--tail <n>]
services create <keyvalue|messaging|blobstore|postgres|egress> --name <name> --env <env> [--class] [--storage] [--memory] [--cpu] [--deletion-policy] [--destination]
services delete --name <name> --env <env>
deployments list|stats --env <env> [--service <name>]
deployments rollback --service <name> --env <env> [--to <id>]
deployments remove --service <name> --env <env>
secrets|vars list|set|update|unset <name> --env <env> [--from-file <path|->]
registry [info] | registry login [--config <file> | --with <docker|podman|oras>]
registry logout [--host <host>] [--config <file> | --with <docker|podman|oras>]
proxy --service <name> --env <env> [--port <n>]
init [name] [--dir <path>] [--name <name>] [--force]

共享旗帜 : --env, (中文(简体) ), --json, (中文(简体) ), --account (或 DI_TENANT_ACCOUNT,或磁盘上唯一的登录). 没有象征性的辩论。 秘密和 var 值来自 --from-file 或 stdin( 单数) (-因此他们 远离空壳历史. secrets unset 在部署的工作量注入时失败 机密性; vars unset 成功但打印 warning: … 指定输入的已部署工作量 (原始内容存档于2018-10-21). the env's vars (platform#100). deployments remove 删除服务的工作量、约束和 在那个洞穴里部署历史; services delete 以 409 失败, 而任何部署都会绑定 服务,不管它是什么 --deletion-policy,仅决定平台是否保存数据 (平台#98). init 写入最小的 二框架种子, 并创建没有平台 资源.

登录

login --controller <url> 询问控制器的一次公开操作( o)GET /v1/auth/info用于 然后运行 RFC 8252 流量: a 自由端口的回回收听器是重定向URI,浏览器在发行者处的符号,以及 代码与 PKCE 验证器和 client_id 只是,没有秘密。 身份服务器必须 注册该客户端( e)AUTH_CLI_CLIENT_ID; 任何端口的回路方向匹配). 标志是 存储于 $DI_FRAMEWORK_HOME/credentials.json 与发行人和客户端 id; 在一个 在下一个命令之前刷新过期分钟 logout 撤销刷新符号 : 并告诉控制器. --api-key 跳过浏览器; --no-browser 打印 URL 而不是打开它.

主计长 CA

租户控制员向TLS提供租户自己CA(ConfigMap)的证明 tenant-controller-ca键 ca.crt) (中文(简体) ). login --ca-file <ca.crt> 相信它,在公众之上 根,用于每次呼叫控制器和登记册检查。 CA 和 证书为 controller.certificateAuthorityData (Base64 PEM,控制台写作), 所以以后的命令不需要旗帜, 和以后 login 到同一控制器 URL 保存它。 之后 CA 旋转, 重新登录新的 --ca-file,或与 --no-ca 将存储的 CA 和 依赖系统根或 NODE_EXTRA_CA_CERTS. 身份签发者的电话不使用. NODE_EXTRA_CA_CERTS=<ca.crt> 仍在全过程工作。 不被信任的证书链 失败 tls: 错误指定两个选项; 过期或被撤销的证书没有 得到这个提示.

飞行员还没有做的

  • 构建组件并制作捆绑: deploy 发送捆绑文件 。 CLI 边 生产它的建筑与 cli-plugin-platform 而这是下一步.
  • 控制器 : ../tenant-auth 服务 services create 财务报告和审定财务报表 services proxy; 操作它 尚未执行答复501。 控制器会增加合同背后的终点,从 src/api/generated。 。 。 .
  • 这个 proxy 会话 URL 是一个 HTTP 传递通过控制器在文档外服务( )/v1/services/<service>/proxy/<session>/...; WebSocket 尚未支持。 会话 URL 取自到的呼叫器主机( 控制器没有配置公共 URL ) ; 传递通道使用 60 s 闲置超时, 保持相对 Location 在会话 URL 下重定向,并将每个请求标为外部 X-Forwarded-* 因此,工作量控制路径保持关闭。 它发出 Host: <service>-<env> (会话地洞),主机部署道设置为: config.host 在捆绑上 wasi:http 主机接口; 捆绑必须离开 config.host 写出或设定到这个值.

版本与发布记录

@di-framework/tenant-cli 共发布 23 个版本,首次发布于 2026/10/10;过去 12 个月发布了 23 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
6.0.30latest2026/11/075 天前
6.0.292026/11/066 天前
6.0.282026/11/039 天前
6.0.272026/11/0111 天前
6.0.262026/10/3012 天前
6.0.252026/10/3013 天前

关于 @di-framework/tenant-cli 的常见问题

@di-framework/tenant-cli 是什么?

飞行员租户CLI:只与租户控制员的OpenAPI合同进行交谈,并持有身份服务员证书;从未与Kubernetes.

如何安装 @di-framework/tenant-cli?

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

@di-framework/tenant-cli 支持 TypeScript 吗?

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

@di-framework/tenant-cli 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@di-framework/tenant-cli 可以商用吗?

@di-framework/tenant-cli 使用 (MIT OR Apache-2.0) 许可。可在 MIT、Apache-2.0 中任选其一遵守。选择 MIT 时,宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@di-framework/tenant-cli 的下载量有多少?

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

@di-framework/tenant-cli 还在维护吗?

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