Skip to content

Comandos úteis

Veja também

Deploy em produção ​

ts
const app = createApp({
  logger: consoleLogger({ format: 'json' }), // uma linha JSON por evento, com redact
  trustProxy: 1, // atrás de 1 proxy/load balancer
  allowedHosts: ['api.exemplo.com'],
  securityHeaders: { strictTransportSecurity: true }, // HSTS: só com HTTPS na frente
  shutdown: { drainDelayMs: 5_000, timeoutMs: 10_000 },
})
  .use(rateLimit({ max: 100, windowMs: 60_000 }))
  .mount(UserRoutes)
  .health({ checks: { db: () => db.ping() } });

await app.listen({ port: Number(process.env.PORT ?? 3000), host: '0.0.0.0' });

Checklist:

ItemComo
Escutar fora do containerhost: '0.0.0.0' (o padrão é 127.0.0.1), porta por PORT
TLSNo proxy ou load balancer (recomendado), ou listen({ tls })
Proxy à frentetrustProxy com o número exato de proxies; nunca true se o app for acessível direto
DomíniosallowedHosts com os domínios servidos
HSTSsecurityHeaders: { strictTransportSecurity: true }, só quando todo acesso for HTTPS
LogsconsoleLogger({ format: 'json' }) ou pino; campos sensíveis já mascarados
Healthchecks/livez (liveness) e /readyz (readiness) com app.health()
EncerramentoSIGTERM já tratado; drainDelayMs maior que o intervalo da sonda de readiness
Rate limit com várias instânciasRateLimitStore compartilhado (Redis), porque o padrão é em memória por processo
Autenticação por cookiecsrf() ativo
Documentação da APIopenapi({ guards }), ou gerar só o arquivo com openapiDocument()
ProcessoRode node dist/server.js direto (não via npm start), para o SIGTERM chegar ao Node; em container, --init ou tini como PID 1

Licença ISC.