共享 NestJS 集装箱基线
@appneurox/service-runtime 是目录服务寄存器的常见 HTTP 基础。 它在端口启动一个节点 24 进程 8080;在部署容器中作为非根本用户运行。 主机边缘终止了HTTPS. 本套件不执行目录业务,代理现有后端,提供数据库,或索赔提供者准备状态.
标注部署的公众反应 runtime: "BOILERPLATE", (中文(简体) ), businessImplementation: "not_implemented",以及 businessReady: false。 。 。 . /health/ready 仅计量HTTP靴子和排出状态. /health/business 返回时 501 (简体中文). 能力元数据总是有作用 implementation: "not_implemented",即使所提供的文件要求不同的状态.
独立条目
在远程跑道上构建和测试, 不安装本地多克或依赖性 :
npm ci --ignore-scripts
npm test
SERVICE_NAME=example-service SERVICE_CAPABILITY_LABEL="Example capability" node dist/main.js
npm ci 使用已执行的锁文件。 不在仓库文件、 CI 输出、 图像或能力元数据中发布证书 。 运行时间证书属于平台机密. 软件包是私有的,每个服务库都有销售商 .platform/nestjs/。 。 。 .
远程安装/构建此包后仓库根引用 :
node .platform/nestjs/dist/main.js
设置
| 设置 | 默认和验证 |
|---|---|
SERVICE_NAME | 所需的小写 kebab sult, 例如 example-service |
SERVICE_CAPABILITY_LABEL | 显示标签; 默认服务名称 |
CATALOG_SLUG | 带有后缀的服务名称 -service 删除 |
SERVICE_VERSION | 0.1.0-boilerplate |
BUILD_SHA | unknown; 否则为 7-64 十进制字符 |
NODE_ENV | production; 还接受 development, (中文(简体) ), test |
PORT, (中文(简体) ), HOST | 8080, (中文(简体) ), 0.0.0.0; 明确的回放/ IPv6 绑定地址也被接受 |
MAX_BODY_BYTES | 65536; 范围 1024-1048576; 压缩 JSON 被拒绝 |
REQUEST_TIMEOUT_MS | 15000; 范围 1000-60000; 边框头和套接字不活动 |
SHUTDOWN_TIMEOUT_MS | 20000; 范围 1000-60000 |
LOG_LEVEL | info· ; debug, (中文(简体) ), warn, (中文(简体) ), error, (中文(简体) ), silent 也接受了 |
CORS_ORIGINS | 空; 否则以逗号分隔的 HTTPS 来源, 没有通配符或证书 |
EXISTING_BACKEND_URL | 仅可选 HTTPS 引用, 不使用用户信息、 查询或片段 |
SERVICE_METADATA_FILE | 可选的 UTF-8 JSON 文件,最多64 KiB |
SERVICE_CAPABILITIES_JSON | 替代内置元数据 JSON; 与文件相互排斥 |
元数据文件格式,仅包含公共产品信息:
{
"capabilities": [
{ "id": "example-operation", "name": "Example operation", "description": "Planned business capability." }
]
}
在没有文件或内部JSON的情况下,软件包将一个待发能力从 CATALOG_SLUG 财务报告和审定财务报表 SERVICE_CAPABILITY_LABEL。最大500个容量条目;重复ID和无效名称失败启动。 设置无效报告设置名称, 从未提供值 .
终点
| 路径 | 含义 |
|---|---|
/ | 服务身份和明确的锅炉板披露 |
/version | 版本/构建身份和待定业务地位 |
/health/live | 进程可以回答 HTTP |
/health/ready | HTTP 运行时间初始化且不耗用, 200/503 |
/health/business | 未执行的业务能力,501 |
/v1/capabilities | 计划能力和共同基线元数据 |
所有其他已注册控制器都需要经过核实的认证,除非有明确说明 @Public()。未注册的路径返回一个正常的404。 基准从未将任何共享的令牌,租户头,已解码的JWT或前端会话解释为已核实的身份.
扩展服务
import { bootstrapService, RequireScopes, RequireTenant } from '@appneurox/service-runtime';
import type { AuthVerifier } from '@appneurox/service-runtime';
import { RecordsModule } from './records/records.module';
// Implement this port using the actual identity authority. Verify signature,
// issuer, audience and expiry; resolve membership/scopes. Invalid token -> null.
// Provider/authority outage -> throw. No reference verifier is fabricated here.
declare const verifier: AuthVerifier;
void bootstrapService({ imports: [RecordsModule], authVerifier: verifier });
使用 @RequireTenant() 财务报告和审定财务报表 @RequireScopes('records:read') 在保护路线. X-Tenant-ID 是不可信的选择,直到警卫确认 成为经核实的校长的成员 tenantIds;没有租户头创建权威。 拥有一名租户的校长可以隐含地选择;多个租户要求选择租户需要的路线。 范围完全匹配,没有自动通配符升级. 核查人私下收到原始无记名标志,不得登录. 受保护的路线在无证书的情况下返回401条,在未配置核查者的情况下返回503条,在成员/范围不匹配的情况下返回403条.
CurrentPrincipal, (中文(简体) ), CurrentTenant, (中文(简体) ), requestContext,以及 SERVICE_CONFIG 为业务代码导出。 将每个寄存器查询/写入给经认证的租户;这项HTTP合同不能取代数据库隔离或资源授权。 业务单元必须分别实施其真正的依赖性探测、OpenAPI合同、存储/迁移、交易/能力、供应商集成、授权、遥测和功能测试。 在采用共同代码的同时保留已有的业务后端;这个软件包是一个启动器,而不是自动迁移.
createServiceApplication() 初始化不听或信号处理器进行测试/嵌入. bootstrapService() 听,处理SIGTERM/SIGINT,关闭前排出标记,关闭后强制退出. 它回来了 { app, config, shutdown };方案关闭是一能的。 使用 handleSignals: false 当主机拥有生命周期处理.
严格的DTO验证使用类验证元数据:未知属性和隐性强制被拒绝,验证值被排除在响应之外. 在语法检查后传播请求/关系ID;重复的安全头被拒绝. 日志包括方法,路由模板,持续时间,状态和ID,不包括原始的URL,信头,正文和查询. 安全头,被禁用的代理头信任,JSON限制和通用例外适用于每个控制器. 在边缘和(或)一个真正的共享商店应用认证-意识率限制;这个起动器并不假装内置计数器是全舰队的配额.
核查
npm test 编译 TypeScript 然后运行节点测试跑道. 测试内容包括元数据诚实、配置限制、编辑、公共卫生语义、认证默认拒绝、租户/镜像、请求-本地上下文、DTO拒绝、变形/大小过大/压缩JSON、重复头、安全头、CORS和无秘密例外/日志。 对这支车队的远程CI跑手有意进行依赖性安装和可执行测试.