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
- Use restart: always para garantir alta disponibilidade.
- Automatize a renovação do certificado com cron jobs no host.
- Adicione cabeçalhos de segurança no Nginx (HSTS, X-Frame-Options, etc.).
- Monitore logs dos containers com
docker logs -f nome_container
.
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.