Configurando Docker e Nginx para Apps Web com HTTPS

Quando falamos em publicar aplicações web modernas, o trio Docker + Nginx + HTTPS é praticamente indispensável. Este artigo mostra o passo a passo para criar um ambiente profissional de deploy usando containers Docker, proxy reverso com Nginx e certificado SSL gratuito com Certbot (Let's Encrypt).

1. Estrutura básica de pastas

Vamos supor que você tenha uma API Node.js e um front-end React. Crie esta estrutura:

/meu_projeto
├── api/
│   ├── Dockerfile
│   ├── package.json
│   └── server.js
├── web/
│   ├── Dockerfile
│   ├── package.json
│   └── build/
├── nginx/
│   ├── nginx.conf
│   └── Dockerfile
└── docker-compose.yml

Cada serviço (API, front e Nginx) ficará em um container isolado. Isso facilita o deploy, atualização e rollback de forma segura.

2. Dockerfile da API (Node.js)

# api/Dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]

Essa imagem cria um container leve, baseado em Node.js Alpine, e expõe a porta 3000 da API.

3. Dockerfile do Frontend (React)

# web/Dockerfile
FROM node:20-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

FROM nginx:stable-alpine
COPY --from=build /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

O primeiro estágio compila o app React e o segundo o serve via Nginx dentro do container.

4. Configurando o Nginx reverso

O Nginx fará o redirecionamento do tráfego externo (HTTP/HTTPS) para os serviços internos.

# nginx/nginx.conf
server {
  listen 80;
  server_name exemplo.com www.exemplo.com;

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

  location / {
    proxy_pass http://web:80;
  }
}

Aqui, o Nginx redireciona as rotas /api para o backend Node e o restante para o front-end React.

5. Docker Compose completo

# docker-compose.yml
version: '3.9'
services:
  api:
    build: ./api
    container_name: api_app
    restart: always

  web:
    build: ./web
    container_name: web_app
    restart: always

  nginx:
    build: ./nginx
    container_name: nginx_proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./certbot/conf:/etc/letsencrypt
      - ./certbot/www:/var/www/certbot
    depends_on:
      - api
      - web

Esse arquivo orquestra os três containers, mapeando as portas 80 e 443 para acesso externo.

6. Ativando HTTPS com Certbot

O Certbot é a ferramenta oficial do Let's Encrypt. Para gerar certificados SSL gratuitos, execute:

docker run -it --rm \
  -v certbot/conf:/etc/letsencrypt \
  -v certbot/www:/var/www/certbot \
  certbot/certbot certonly \
  --webroot -w /var/www/certbot \
  -d exemplo.com -d www.exemplo.com

Depois disso, atualize o arquivo nginx.conf com os caminhos dos certificados e reinicie os containers.

7. Boas práticas e dicas

Conclusão

Usar Docker e Nginx juntos é o padrão moderno de deploy. Com HTTPS via Let's Encrypt, seu site ganha segurança, SEO e credibilidade. Essa configuração pode ser facilmente expandida para suportar múltiplos domínios e APIs em escala de produção.