# @di-framework/tenant-cli 中文文档

规范地址：https://npmcn.com/package/%40di-framework/tenant-cli/

版本：6\.0\.30
npm 元数据更新时间：2026-11-06T22:52:02.250Z
中文译文更新时间：2026-11-12T06:27:47.764Z
软件包许可：\(MIT OR Apache-2\.0\)

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40di-framework/tenant-cli
原文对照：https://npmcn.com/package/%40di-framework/tenant-cli/?lang=original
项目主页：https://github.com/di-framework/platform
源码仓库：https://github.com/di-framework/platform

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：256 kB，53 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- 运行依赖：2 个
- 首次发布：2026-10-09T18:01:33.969Z
- 最新版本发布：2026-11-06T22:52:01.927Z
- 近 30 天下载量：3671（2026-10-12 至 2026-11-10，npm 官方下载统计）
- 已发布版本数：23（近 12 个月 23 个）

## 中文简介

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

## 安装

```sh
npm install @di-framework/tenant-cli
```

也可以使用：`pnpm add @di-framework/tenant-cli`、`yarn add @di-framework/tenant-cli`、`bun add @di-framework/tenant-cli`

## README

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

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

## 合同是共享的

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

```text
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
```

```sh
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/`。 。 。 .

```ts
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`,它已经 没有运行时间依赖.

```ts
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` 登录已登录的证书( 身份标志是) 首先被刷新,因此存储的复制品会获得其整个寿命;它从不打印出符号或密钥:

```text
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>`数字 :

```text
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](https://npmcn.com/package/%40di-framework/tenant-cli/#readme-controller-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` (无端口),带有由平台管理的牵引证书,而非 从公共来源,这是主机无法使用的网关或端口前端地址。 两者 名称服务于同一寄存器 :

```text
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` 提供组内引用来取而代之.

## 图标

```text
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 是什么？

飞行员租户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 和提交记录判断。

