Introdução: por que TypeScript e Kubernetes são a dupla ideal
\nO desenvolvimento web moderno exige não apenas código de qualidade, mas também uma infraestrutura confiável. TypeScript, como uma camada de tipagem estática sobre JavaScript, permite criar aplicações de servidor escaláveis com o mínimo de erros em tempo de compilação. Kubernetes (K8s) é o padrão de facto para orquestração de contêineres, fornecendo implantação, escalonamento e gerenciamento automáticos de aplicações.
\nNeste guia, vamos abordar na prática como construir uma aplicação TypeScript simples (Express API), empacotá-la em uma imagem Docker e implantá-la em um cluster Kubernetes. Você receberá comandos prontos, arquivos de configuração e explicação de cada etapa. O material é voltado para desenvolvedores que já conhecem os fundamentos do TypeScript e desejam aprender processos de devops.
\nAo final do artigo, você será capaz de implantar projetos TypeScript em ambiente de produção usando Kubernetes.
\n\n1. Preparando a aplicação TypeScript para conteinerização
\n1.1. Criando um servidor Express básico em TypeScript
\nPara demonstração, criaremos uma API mínima em TypeScript. Certifique-se de ter Node.js e npm instalados.
\nmkdir ts-k8s-app\ncd ts-k8s-app\nnpm init -y\nnpm install express\nnpm install -D typescript @types/node @types/express ts-node nodemon\nCrie o tsconfig.json:
{\n "compilerOptions": {\n "target": "ES2020",\n "module": "commonjs",\n "outDir": "./dist",\n "rootDir": "./src",\n "strict": true,\n "esModuleInterop": true\n },\n "include": ["src/**/*"]\n}\nAgora vamos escrever o servidor. Crie o arquivo src/index.ts:
import express, { Request, Response } from 'express';\n\nconst app = express();\nconst PORT = process.env.PORT || 3000;\n\napp.get('/health', (_req: Request, res: Response) => {\n res.json({ status: 'ok', timestamp: new Date().toISOString() });\n});\n\napp.get('/', (_req: Request, res: Response) => {\n res.send('Hello from TypeScript on Kubernetes!');\n});\n\napp.listen(PORT, () => {\n console.log(`Server running on port ${PORT}`);\n});\nAdicione scripts ao package.json:
"scripts": {\n "build": "tsc",\n "start": "node dist/index.js",\n "dev": "nodemon src/index.ts"\n}\nVerifique a compilação: npm run build && npm start. O servidor deve iniciar na porta 3000.
1.2. Otimização para produção
\nPara produção, é importante minimizar o tamanho da imagem. Adicione o .dockerignore:
node_modules\ndist\n.git\n*.md\n.env\nCertifique-se de que todas as dependências estejam listadas em dependencies (não em devDependencies), se forem necessárias em tempo de execução.
2. Construindo a imagem Docker para a aplicação TypeScript
\n2.1. Escrevendo o Dockerfile
\nUsaremos compilação em múltiplos estágios (multi-stage build) para reduzir o tamanho da imagem final.
\n# Stage 1: Build\nFROM node:18-alpine AS builder\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci --only=production\nCOPY . .\nRUN npm run build\n\n# Stage 2: Production\nFROM node:18-alpine\nWORKDIR /app\nCOPY --from=builder /app/dist ./dist\nCOPY --from=builder /app/node_modules ./node_modules\nCOPY --from=builder /app/package.json ./\nEXPOSE 3000\nCMD ["node", "dist/index.js"]\nPontos-chave:
\n- \n
npm ci— instalação rápida e determinística de dependências. \n - A segunda camada contém apenas o JS compilado e os módulos necessários. \n
- A imagem base
node:18-alpinepesa apenas ~120 MB. \n
2.2. Construindo e verificando a imagem
\ndocker build -t ts-k8s-app:latest .\ndocker run -p 3000:3000 ts-k8s-app:latest\nAcesse http://localhost:3000/health — você deve ver uma resposta JSON. Se em