@application-kit/bootstrap
v0.2.3
Published
Бутстрап процессов NestJS: web на Fastify с периметром (доверенные прокси по хопам, request-id в каждом ответе, cookie, ValidationPipe с плоским списком ошибок, graceful shutdown) и CLI на nestjs-console с логгером pino
Maintainers
Readme
@application-kit/bootstrap
Бутстрап процессов NestJS: web на Fastify с периметром и CLI на nestjs-console. Состав модулей, Swagger, метрики, порт и число прокси перед приложением знает приложение: пакет собирает процесс из его корневого модуля и опций.
Установка
yarn add @application-kit/bootstrapPeer-зависимости — @nestjs/common, @nestjs/core, nestjs-pino; остальные optional и нужны только своему входу.
@application-kit/observability пакет приносит сам. Логгер обоих входов — nestjs-pino: его LoggerModule обязан быть
в графе корневого модуля.
Входы
| Вход | Для чего | Тянет |
|------|----------|-------|
| @application-kit/bootstrap/web | createFastifyApplication — web-процесс на Fastify | @nestjs/platform-fastify, @fastify/cookie, class-validator, class-transformer, @opentelemetry/api |
| @application-kit/bootstrap/cli | cliBootstrap — CLI-процесс | nestjs-console |
Корневого входа нет: web-процессу nestjs-console не нужен, CLI — Fastify.
Web
import { createFastifyApplication } from '@application-kit/bootstrap/web'
const app = await createFastifyApplication(AppModule, {
configure: (app) => {
setupMetricsHooks(app)
},
trustProxyHops: 2,
})
await app.listen(port, '0.0.0.0')Периметр, который ставит пакет, по порядку:
- Fastify-адаптер:
genReqId—x-request-idот прокси либо свой UUID (fastifyRequestIdиз@application-kit/observability/logging); доверенные прокси — первыеtrustProxyHopsпрыжков справа вX-Forwarded-For, так что адрес, подсунутый клиентом слева,request.ipне подменяет. @fastify/cookieс опциямиcookie.- Хук
onRequest: заголовокx-request-idна каждый ответ, включая 404 и ошибки парсинга тела. configure(app)— настройка продукта.LoggerErrorInterceptorи логгерnestjs-pinoдля Nest;uncaughtException— в тот же лог.- Shutdown hooks: по SIGTERM/SIGINT провайдеры закрываются, HTTP-сервер дожидается открытых соединений.
- Глобальный
ValidationPipeсtransform: true: невалидный DTO — статусvalidationErrorStatusи тело{ statusCode, validationErrors: [{ property, constraints }] }, вложенное поле — путёмparent.child.
| Опция | По умолчанию | |
|-------|--------------|---|
| trustProxyHops | 0 | сколько прокси перед приложением доверенные; 0 — только сокет |
| validationErrorStatus | 422 | статус ответа на невалидный DTO |
| cookie | {} | опции @fastify/cookie; false — плагин не регистрируется |
| configure | — | (app) => void, зовётся после хука request-id, до интерцептора и пайпа |
CLI
import { cliBootstrap } from '@application-kit/bootstrap/cli'
void cliBootstrap(CliModule)Команда берётся из process.argv, после неё приложение закрывается. Упавшая команда — запись уровня error с
context: 'Console process failed.' и код выхода 1: cron и джоба кластера видят провал только по коду. Корневой модуль
импортирует ConsoleModule из nestjs-console.
