Este guia detalha como executar o DigiVerse usando Docker, permitindo que frontend e backend rodem de forma independente.
- Visão Geral
- Pré-requisitos
- Configuração Inicial
- Comandos Docker
- Cenários de Uso
- Arquitetura Docker
- Troubleshooting
- Produção
A infraestrutura Docker do DigiVerse consiste em 4 serviços:
| Serviço | Descrição | Porta | Container Name |
|---|---|---|---|
| web | Frontend React com Nginx | 80 | digiverse_web |
| backend | API Fastify | 3000 | digiverse_backend |
| postgres | Banco de dados PostgreSQL | 5432 | digiverse_postgres |
| redis | Cache Redis | 6379 | digiverse_redis |
- ✅ Frontend Independente: Frontend pode rodar mesmo com backend em manutenção
- ✅ Multi-stage Builds: Builds otimizados para produção
- ✅ Health Checks: Monitoramento automático de saúde dos serviços
- ✅ Volumes Persistentes: Dados do PostgreSQL e Redis preservados
- ✅ Network Isolation: Serviços em rede isolada
- ✅ Auto-restart: Reinício automático em caso de falha
- Docker >= 20.10
- Docker Compose >= 2.0
- Mínimo 2GB RAM disponível
- Mínimo 5GB espaço em disco
# Linux (Ubuntu/Debian)
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# Verificar instalação
docker --version
docker-compose --version# Copiar arquivo de exemplo
cp .env.example .env
# Editar variáveis (use seu editor preferido)
nano .envVariáveis importantes:
# Database
DB_USER=postgres
DB_PASSWORD=senha-segura-aqui
DB_NAME=digimon_db
# JWT (MUDE ISSO EM PRODUÇÃO!)
JWT_SECRET=sua-chave-super-secreta-com-pelo-menos-32-caracteres
# Frontend
WEB_PORT=80
VITE_API_URL=http://localhost:3000
# Backend
PORT=3000# 1. Build das imagens
pnpm docker:build
# 2. Iniciar todos os serviços
pnpm docker:up
# 3. Verificar logs
pnpm docker:logsAguarde os serviços iniciarem (aproximadamente 1-2 minutos na primeira vez).
- Frontend: http://localhost:80
- Backend API: http://localhost:3000
- Swagger Docs: http://localhost:3000/docs
# Build de todas as imagens
pnpm docker:build
# Iniciar todos os serviços em background
pnpm docker:up
# Parar todos os serviços
pnpm docker:down
# Ver logs de todos os serviços
pnpm docker:logs
# Rebuild completo (para mudanças no código)
pnpm docker:rebuild
# Limpar tudo (CUIDADO: apaga volumes/dados)
pnpm docker:clean# Build apenas do frontend
pnpm docker:web:build
# Iniciar apenas o frontend (requer backend rodando)
pnpm docker:web:up
# Parar apenas o frontend
pnpm docker:web:down
# Ver logs do frontend
pnpm docker:web:logs# Build apenas do backend
docker-compose build backend
# Iniciar backend + infraestrutura (postgres + redis)
docker-compose up -d backend
# Parar backend
docker-compose stop backend
# Ver logs do backend
docker-compose logs -f backend# Listar containers rodando
docker ps
# Ver todos os containers (incluindo parados)
docker ps -a
# Executar comandos dentro de um container
docker exec -it digiverse_backend sh
docker exec -it digiverse_web sh
# Ver logs de um container específico
docker logs digiverse_web
docker logs digiverse_backend
docker logs digiverse_postgres
# Reiniciar um serviço específico
docker restart digiverse_web
# Ver uso de recursos
docker stats
# Inspecionar saúde dos serviços
docker inspect --format='{{json .State.Health}}' digiverse_web | jqIdeal para testar o ambiente de produção localmente.
# 1. Iniciar tudo
pnpm docker:up
# 2. Ver logs em tempo real
pnpm docker:logs
# 3. Fazer mudanças no código
# (edite os arquivos normalmente)
# 4. Rebuild e reiniciar
pnpm docker:rebuildFrontend rodando enquanto desenvolve o backend sem Docker.
# 1. Iniciar apenas infraestrutura (postgres + redis)
docker-compose up -d postgres redis
# 2. Iniciar backend em modo dev (local)
pnpm backend:dev
# 3. Build e iniciar frontend no Docker
pnpm docker:web:build
pnpm docker:web:up
# Frontend estará em http://localhost:80
# Backend em http://localhost:3000Manter frontend online enquanto atualiza o backend.
# 1. Parar apenas o backend
docker-compose stop backend
# 2. Frontend continua acessível em http://localhost:80
# (mostrará erros de conexão com API, mas interface funciona)
# 3. Fazer manutenção no backend...
# 4. Rebuild e reiniciar backend
docker-compose build backend
docker-compose up -d backend
# 5. Frontend volta a funcionar normalmente# 1. Subir tudo
pnpm docker:up
# 2. Aguardar health checks
sleep 30
# 3. Rodar testes contra containers
pnpm backend:test
# 4. Limpar ambiente
pnpm docker:down# 1. Clonar repositório no servidor
git clone https://github.com/CAFernandes/API-REST-Digimon.git
cd API-REST-Digimon
# 2. Configurar variáveis de produção
cp .env.example .env
nano .env # Configurar com valores de produção
# 3. Build e iniciar
pnpm docker:build
pnpm docker:up
# 4. Verificar saúde
docker ps
pnpm docker:logsStage 1: Builder
- Base:
node:18-alpine - Instala pnpm
- Copia dependências e código fonte
- Executa build do Vite
- Gera arquivos estáticos em
/dist
Stage 2: Production
- Base:
nginx:1.25-alpine - Copia arquivos buildados do Stage 1
- Configuração customizada do Nginx
- Expõe porta 80
- Health check em
/health
Otimizações:
- Multi-stage build reduz tamanho final (~150MB vs ~800MB)
- Apenas arquivos necessários na imagem final
- Gzip compression habilitado
- Cache de assets estáticos
Stage 1: Builder
- Compila TypeScript para JavaScript
- Gera Prisma Client
Stage 2: Production
- Runtime mínimo (Alpine)
- Executa migrations automaticamente
- Seeds do banco se necessário
- Health check em
/health
┌────────────────────────────────────────────┐
│ digiverse_network (bridge) │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ web │ │ backend │ │ postgres │ │
│ │ :80 │←→│ :3000 │←→│ :5432 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ ↓ │
│ ┌──────────┐ │
│ │ redis │ │
│ │ :6379 │ │
│ └──────────┘ │
└────────────────────────────────────────────┘
Comunicação:
web→backend: Requisições HTTP para APIbackend→postgres: Queries via Prismabackend→redis: Cache (opcional)
# Listar volumes
docker volume ls
# Inspecionar volume
docker volume inspect digiverse_postgres_data
# Backup do banco de dados
docker exec digiverse_postgres pg_dump -U postgres digiverse_db > backup.sql
# Restaurar backup
docker exec -i digiverse_postgres psql -U postgres digiverse_db < backup.sql# 1. Verificar se container está rodando
docker ps | grep digiverse_web
# 2. Verificar logs
docker logs digiverse_web
# 3. Verificar health check
docker inspect --format='{{json .State.Health}}' digiverse_web
# 4. Acessar container
docker exec -it digiverse_web sh
ls -la /usr/share/nginx/html # Verificar arquivos buildados
# 5. Rebuild
pnpm docker:web:build
docker-compose up -d web --force-recreate# 1. Verificar se postgres está saudável
docker inspect --format='{{json .State.Health}}' digiverse_postgres
# 2. Verificar conectividade
docker exec digiverse_backend ping postgres
# 3. Verificar variáveis de ambiente
docker exec digiverse_backend env | grep DB_
# 4. Verificar migrations
docker exec digiverse_backend npx prisma migrate statusVerifique se VITE_API_URL no .env aponta para o backend correto:
# Desenvolvimento local
VITE_API_URL=http://localhost:3000
# Produção
VITE_API_URL=https://api.seu-dominio.comRebuild o frontend após alterar:
pnpm docker:web:build
pnpm docker:web:up# Ver uso de recursos
docker stats
# Limitar memória no docker-compose.yml
services:
web:
deploy:
resources:
limits:
memory: 256M
backend:
deploy:
resources:
limits:
memory: 512M# Verificar processo usando porta 80
sudo lsof -i :80
sudo lsof -i :3000
# Alterar portas no .env
WEB_PORT=8080
PORT=3001
# Reiniciar
pnpm docker:down
pnpm docker:up- Alterar
JWT_SECRETpara valor seguro (32+ caracteres) - Alterar
DB_PASSWORDpara senha forte - Configurar
REDIS_PASSWORD - Atualizar
VITE_API_URLpara URL de produção - Configurar SSL/TLS (HTTPS)
- Configurar firewall (apenas portas 80/443)
- Configurar backup automático do PostgreSQL
- Configurar monitoramento (logs, métricas)
- Testar disaster recovery
Adicione um reverse proxy (Nginx ou Traefik) na frente:
# docker-compose.prod.yml
services:
nginx-proxy:
image: nginxproxy/nginx-proxy
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- ./certs:/etc/nginx/certs
web:
environment:
VIRTUAL_HOST: seu-dominio.com
LETSENCRYPT_HOST: seu-dominio.com# Criar script de backup
cat > backup.sh << 'EOF'
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
docker exec digiverse_postgres pg_dump -U postgres digimon_db > backup_$DATE.sql
gzip backup_$DATE.sql
# Upload para S3, Google Cloud Storage, etc.
EOF
chmod +x backup.sh
# Agendar com cron (backup diário às 2am)
crontab -e
# Adicionar:
0 2 * * * /path/to/backup.shConsidere adicionar:
- Prometheus + Grafana: Métricas
- Loki: Agregação de logs
- Sentry: Error tracking
- Uptime Robot: Monitoramento de uptime
- Docker Documentation
- Docker Compose Documentation
- Nginx Documentation
- PostgreSQL Docker
- Redis Docker
🐳 DigiVerse - Containerized Digital Monsters Universe