Checklist de Produção para Express
Práticas técnicas para manter aplicações Express estáveis, seguras e observáveis em produção. Impressões de quem vive o deploy com foco em desempenho e consistência.
1. Preparação do Ambiente
- Defina a versão do Node.js com LTS e utilize um gerenciador (nvm, volta, orquestrador) para garantir consistência entre ambientes.
- Use npm ci (ou yarn install –frozen-lockfile) para reproduzir exatamente as dependências a partir do lockfile no ambiente de produção.
- Adote práticas 12-factor: todas as configurações críticas via variáveis de ambiente. Evite embutir segredos no código.
- Escolha um gerenciador de processos (PM2 ou systemd) para manter a aplicação rodando, com estratégias de reload sem downtime.
- Prefira configurar TLS/HTTPS na frente (Nginx ou Traefik) para terminação de TLS e distribuição de tráfego seguro.
- Defina timeouts adequados para o servidor HTTP (keep-alive, timeout de leitura/escrita) para evitar esgotamento de recursos.
Dicas rápidas: configure “ecosystem.config.js” (ou serviço systemd) com variáveis de produção, quantidade de workers e estratégias de reload.
2. Configuração do Express para Produção
- Confição de proxy: app.set(‘trust proxy’, 1) quando atrás de um proxy reverso para calcular corretamente cookies seguros.
- Segurança por padrão: inclua Helmet com políticas sensatas (exemplo de CSP simples, X-Content-Type-Options, HSTS quando TLS ativo).
- Desempenho: habilite compressão (compression) e proteja contra ataques de envio de parâmetros duplicados com hpp (HTTP Parameter Pollution).
- Controle de tráfego: imponha rate limiting para evitar abusos por origem. Normalize headers com middleware adequado.
- Payloads: limite de tamanho para JSON e body-urlencoded (por ex., 1mb) para evitar DoS por cargas grandes.
- Tratamento de erros: não exponha stack traces em produção; normalize mensagens de erro para consumo por clientes.
- Static assets: sirva conteúdos estáticos via CDN ou proxy reverso; mantenha o Express focado em API/serviços dinâmicos.
3. Observabilidade e Logs
- Logs estruturados: utilize um logger centralizado (ex.: pino, bunyan) com níveis e correlação de traços.
- Acesso: registre requests com formato consistente (morgan ou customizado) para facilitar busca em logs.
- Métricas: exponha métricas básicas (requisições por rota, latência, erros) via /metrics com Prometheus/OpenMetrics.
- Saída de erros: em produção, registre apenas mensagens relevantes; inclua um identificador de correlação para rastrear falhas entre componentes.
- Rotação de logs: configure rotação de logs para evitar uso excessivo de disco; combine com políticas de arquivamento.
Exemplo: exposição de métricas simples com prom-client pode ser suficiente para começar a observar saúde e performance da API.
4. Segurança, Performance e Deploy
- Headers de segurança: uso de Helmet com políticas ajustadas (CSP simples, X-Frame-Options, X-Content-Type-Options).
- Validação de entrada: valide entradas e parâmetros de rota com Joi/Cest ou Celebrate para evitar falhas de validação.
- Auditoria de dependências: execute npm audit e mantenha dependências atuais; confirme que o lockfile está atualizado no CI.
- Deploys com rollback: mantenha estratégias simples de rollback (releases canary/blue-green) para reduzir downtime.
- Assinatura de artefatos: valide artefatos de build (checksum) antes de rodar em produção.
- Backups/recovery: tenha backups de dados críticos e rotas de restauração bem documentadas.
Observação: manter a infraestrutura estável requer disciplina em cada deploy, incluindo validação de configuração e monitoramento pós-release.
Exemplo de configuração produtiva (Express)
// app.js - produção
const express = require('express');
const helmet = require('helmet');
const compression = require('compression');
const rateLimit = require('express-rate-limit');
const hpp = require('hpp');
const morgan = require('morgan');
const cors = require('cors');
const app = express();
// Confiança no proxy reverso (quando atrás de Nginx/Traefik)
app.set('trust proxy', 1);
// Segurança
app.use(helmet({
contentSecurityPolicy: {
useDefaults: true,
directives: {
"default-src": ["'self'"],
"script-src": ["'self'"]
}
}
}));
// Proteção de parâmetros
app.use(hpp());
// Desempenho
app.use(compression());
// Logs de acesso
app.use(morgan('combined', {
skip: function (req, res) { return res.statusCode < 400; },
// Exemplo simples; substitua por logger estruturado em produção
stream: process.stdout
}));
// Limite de taxa
const limiter = rateLimit({
windowMs: 15 * 60 * 1000,
max: 100,
standardHeaders: true,
legacyHeaders: false,
});
app.use(limiter);
// Payloads
app.use(express.json({ limit: '1mb' }));
app.use(express.urlencoded({ extended: true, limit: '1mb' }));
// CORS (ajuste conforme o domínio de uso)
app.use(cors({
origin: ['https://dominio-do-app.com'],
methods: ['GET','POST','PUT','DELETE'],
credentials: true
}));
// Rotas
app.get('/', (req, res) => res.json({ ok: true }));
// Tratamento de erro
app.use((err, req, res, next) => {
// logging do erro
res.status(500).json({ message: 'Operação falhou' });
});
module.exports = app;
Exemplo de configuração de deploy (PM2)
// ecosystem.config.js
module.exports = {
apps: [
{
name: 'my-express-api',
script: './dist/index.js',
instances: 'max',
exec_mode: 'cluster',
env: {
NODE_ENV: 'production',
PORT: 3000,
LOG_LEVEL: 'info'
},
env_production: {
NODE_ENV: 'production',
PORT: 3000,
LOG_LEVEL: 'info'
}
}
]
};
Gostou deste checklist?
Para ampliar o seu conhecimento, confira outros conteúdos no Yurideveloper com foco em Node.js, Express e práticas de deploy. Você encontra guias sobre integração de logs, observabilidade, segurança de APIs e estratégias de deploy robustas para produção.
Sou Apaixonado pela programação e estou trilhando o caminho de ter cada diz mais conhecimento e trazer toda minha experiência vinda do Design para a programação resultando em layouts incríveis e idéias inovadoras! Conecte-se Comigo!