Executando verificação de segurança...
5

🚀 Arquitetura Monolítica Escalável: Do Desenvolvimento Local ao Docker Swarm em Produção

Esse é meu primeiro post na plataforma e o primeiro a um bom tempo no geral. É um desafio compartilhar isso porque nunca parece estar bom o bastante, mas diz o ditado: "quem não é visto, não é lembrado".

A API em questão ainda está em desenvolvimento, e o aprendizado desse post só foi possível porque graças a um outro post no LinkedIn, onde uma pessoa se propôs a financiar uma VPS para o projeto.

Acessar repositório aqui

💡 O Desafio

Há alguns meses, me deparei com um desafio interessante: como fazer deploy da minha primeira API completa em uma VPS de forma profissional, sem complicar demais as coisas?

Desenvolvi um sistema para gerenciar discursantes da igreja usando Node.js + TypeScript + PostgreSQL, mas quando chegou a hora de colocar em produção, me vi diante de uma pergunta: "Como vou orquestrar tudo?"

🏗️ Por que um Monólito?

Bom, eu comecei simples e direto ao ponto. Minha API tem:

  • Controllers para gerenciar requisições
  • Services para lógica de negócio
  • Models para acesso a dados
  • Validações robustas com Zod
  • Autenticação JWT completa

A separação de responsabilidades estava clara, mas tudo em um só projeto. Por que quebrar algo que já funcionava bem?

📦 Containerização Eficiente

Optei por usar Docker multi-stage para builds otimizados:

# Stage 1: Builder
FROM node:22-alpine AS builder
RUN npm ci --include=dev
RUN npm run build

# Stage 2: Production  
FROM node:22-alpine AS production
COPY --from=builder /app/dist /app/dist
COPY --from=builder /app/node_modules /app/node_modules

Resultado: Imagem final de apenas ~275MB, sem dependências de desenvolvimento!

🐳 Orquestração com Docker Swarm

E aqui entra o swarm! Como eu queria fazer algo próximo do utilizado no mercado, mas sem aumentar a curva de aprendizado usando ferramentas como K8S, descobri que o Swarm poderia ser uma opção para essa pequena demanda.

Então usei Docker Swarm para orquestrar meus containers (DB, API e Nginx):

services:
  api-production:
    image: speakers-report-api:1.0.0
    deploy:
      replicas: 1
      resources:
        limits:
          cpus: "1.0"
          memory: 2GB
      restart_policy:
        condition: on-failure
        max_attempts: 3

Alguns benefícios que o Docker Compose não poderia oferecer em produção:
Resiliência automática - se a API cair, reinicia sozinha
Escalabilidade horizontal - posso aumentar replicas facilmente
Load balancing nativo do Swarm
Rolling updates sem downtime

Dessa forma comecei a me expor nesse mundo DevOps, de maneira amadora, mas achei interessante e "fácil", afinal foi só ativar o swarm que é um recurso nativo do Docker.

🌐 Nginx como Reverse Proxy

Para SSL e roteamento, configurei o Nginx como reverse proxy. Aqui apanhei bastante, mas como precisava fazer um redirecionamento de forma mais alinhada às práticas do mercado, optei por encarar o desafio e francamente, preciso estudar mais essa parte.

location /api/ {
  proxy_pass http://api-production:3000/api/;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

Vantagens:
🔐 SSL/TLS com Let's Encrypt já com renovação automática dos certificados
🚀 Headers de segurança customizados
📊 Logs centralizados de acesso
🌐 Redirecionamento HTTP → HTTPS

🗄️ Banco Containerizado com Persistência

O PostgreSQL também foi containerizado com volumes persistentes no swarm:

volumes:
  - speakers-report-pg-data-prod:/var/lib/postgresql/data

Nessa etapa o que me chamou atenção foi a possibilidade de usar as secrets do swarm - uma forma de definir credenciais sem usar variáveis de ambiente, garantindo maior segurança em produção. Acabei usando até mesmo no serviço da API e gostei bastante.

Pontos importantes:
💾 Dados persistem mesmo se o container cair
🔄 Backups facilitados - só copiar o volume
🚀 Deploy independente - posso atualizar a API sem mexer no banco
📈 Monitoramento isolado - métricas específicas do banco
🔑 Secrets do Swarm - ótimo recurso para definir credenciais de forma segura

🎯 Vantagens da Arquitetura Monolítica Containerizada

Escalabilidade Horizontal

  • Posso rodar múltiplas instâncias da mesma API
  • Load balancer nativo do Swarm distribui a carga
  • Zero downtime durante deploys

Separação de Infraestrutura

  • Cada componente em seu container isolado
  • Recursos dedicados para cada serviço
  • Falhas isoladas - se a API cair, o banco continua

Deploy Independente

  • Atualizo a API sem derrubar o banco
  • Rollback rápido se algo der errado
  • Blue-green deployment possível no futuro

🧠 Aprendizados Principais

  1. Comece simples - monólito bem estruturado é melhor que microserviços mal planejados
  2. Containerize tudo - facilita deploy, monitoramento e manutenção
  3. Use orquestração - Docker Swarm é simples e poderoso
  4. Pense em persistência - volumes são essenciais para dados
  5. Reverse proxy é vida - Nginx simplifica muito a configuração

🤔 E você?

Qual arquitetura você está usando em seus projetos?

Já tentou Docker Swarm ou prefere Kubernetes? Como faz deploy das suas APIs em produção?

Compartilha aí nos comentários! 👇


#NodeJS #TypeScript #Docker #DevOps #Backend #API #PostgreSQL #Nginx #DockerSwarm #ArquiteturaDeSoftware

💡 Dica: Às vezes a solução mais simples é a mais elegante. Monólito + containers pode ser o sweet spot para muitos projetos!

Carregando publicação patrocinada...