Deploy em Produção
Guia completo para deploy do sistema em ambiente de produção.
Pré-requisitos
Infraestrutura
- Servidor Linux (Ubuntu 22.04 LTS recomendado)
- Docker 20.10+ e Docker Compose 2.0+
- Domínio configurado com DNS
- Certificado SSL (Let's Encrypt recomendado)
- Banco PostgreSQL (RDS ou dedicado)
- Redis (ElastiCache ou dedicado)
Requisitos de Hardware
| Componente | Mínimo | Recomendado |
|---|---|---|
| CPU | 2 cores | 4+ cores |
| RAM | 4 GB | 8+ GB |
| Disco | 50 GB SSD | 100+ GB SSD |
| Rede | 100 Mbps | 1 Gbps |
Preparação do Servidor
1. Atualização do Sistema
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl git htop
2. Instalação do Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
newgrp docker
3. Configuração de Firewall
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
Deploy do Backend
1. Clone do Repositório
cd /opt
sudo git clone https://github.com/Tav-Web/portal-talentos.git
cd portal-talentos
sudo chown -R $USER:$USER .
2. Configuração de Variáveis
cp backend/configs/env/.env.prod.example backend/configs/env/.env
nano backend/configs/env/.env
Variáveis obrigatórias para produção:
DEBUG=False
SECRET_KEY=sua-chave-super-secreta-64-chars
ALLOWED_HOSTS=seu-dominio.com.br,www.seu-dominio.com.br
DB_HOST=seu-host-postgresql
DB_NAME=portal_talentos
DB_USER=portal_user
DB_PASSWORD=senha-segura
REDIS_HOST=seu-host-redis
REDIS_PORT=6379
FRONTEND_URL=https://seu-dominio.com.br
CORS_ALLOWED_ORIGINS=https://seu-dominio.com.br
SECURE_SSL_REDIRECT=True
SESSION_COOKIE_SECURE=True
CSRF_COOKIE_SECURE=True
3. Build e Deploy
docker-compose -f docker-compose.prod.yml build
docker-compose -f docker-compose.prod.yml run --rm backend python manage.py migrate
docker-compose -f docker-compose.prod.yml run --rm backend python manage.py collectstatic --noinput
docker-compose -f docker-compose.prod.yml run --rm backend python manage.py createsuperuser
docker-compose -f docker-compose.prod.yml up -d
4. Verificação
docker-compose -f docker-compose.prod.yml ps
curl -I http://localhost:8080/api/v1/health/
Configuração do Nginx
1. Instalação
sudo apt install nginx -y
2. Configuração SSL com Let's Encrypt
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d seu-dominio.com.br -d www.seu-dominio.com.br
3. Configuração do Site
# /etc/nginx/sites-available/portal-talentos
server {
listen 80;
server_name seu-dominio.com.br www.seu-dominio.com.br;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name seu-dominio.com.br www.seu-dominio.com.br;
ssl_certificate /etc/letsencrypt/live/seu-dominio.com.br/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/seu-dominio.com.br/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Strict-Transport-Security "max-age=31536000" always;
location /api/ {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
}
location /admin/ {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /static/ {
alias /opt/portal-talentos/backend/staticfiles/;
expires 30d;
add_header Cache-Control "public, immutable";
}
location /media/ {
alias /opt/portal-talentos/backend/media/;
expires 7d;
}
location / {
root /opt/portal-talentos/frontend/dist;
try_files $uri $uri/ /index.html;
expires 1d;
}
client_max_body_size 50M;
}
4. Ativação
sudo ln -s /etc/nginx/sites-available/portal-talentos /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
Deploy do Frontend
1. Build de Produção
cd frontend
cp .env.example .env.production
cat > .env.production << EOF
VITE_API_URL=https://seu-dominio.com.br
VITE_API_BASE_URL=https://seu-dominio.com.br/api/v1
VITE_APP_ENV=production
EOF
npm install
npm run build
2. Deploy dos Arquivos
Os arquivos de build estarão em frontend/dist/ e serão servidos pelo Nginx.
Systemd Services
Backend Service
# /etc/systemd/system/portal-talentos.service
[Unit]
Description=Portal Talentos Backend
Requires=docker.service
After=docker.service
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/portal-talentos
ExecStart=/usr/bin/docker-compose -f docker-compose.prod.yml up -d
ExecStop=/usr/bin/docker-compose -f docker-compose.prod.yml down
TimeoutStartSec=0
[Install]
WantedBy=multi-user.target
Ativação
sudo systemctl daemon-reload
sudo systemctl enable portal-talentos
sudo systemctl start portal-talentos
Monitoramento
Health Check Automático
# /opt/portal-talentos/scripts/health-check.sh
#!/bin/bash
HEALTH_URL="https://seu-dominio.com.br/api/v1/health/"
LOG_FILE="/var/log/portal-talentos/health.log"
response=$(curl -s -o /dev/null -w "%{http_code}" $HEALTH_URL)
if [ "$response" != "200" ]; then
echo "$(date) - Health check failed: $response" >> $LOG_FILE
# Reiniciar serviço
cd /opt/portal-talentos && docker-compose -f docker-compose.prod.yml restart backend
fi
Cron Job
# crontab -e
*/5 * * * * /opt/portal-talentos/scripts/health-check.sh
Backup Automático
# /opt/portal-talentos/scripts/backup.sh
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backups/portal-talentos"
S3_BUCKET="s3://seu-bucket/backups"
mkdir -p $BACKUP_DIR
# Backup do banco
docker-compose -f docker-compose.prod.yml exec -T postgres pg_dump -U portal_user portal_talentos | gzip > $BACKUP_DIR/db_$DATE.sql.gz
# Backup de media
tar -czf $BACKUP_DIR/media_$DATE.tar.gz /opt/portal-talentos/backend/media
# Upload para S3
aws s3 cp $BACKUP_DIR/db_$DATE.sql.gz $S3_BUCKET/
aws s3 cp $BACKUP_DIR/media_$DATE.tar.gz $S3_BUCKET/
# Limpeza local (manter últimos 7 dias)
find $BACKUP_DIR -mtime +7 -delete
Checklist de Deploy
Pré-Deploy
- Backup do banco de dados atual
- Testes passando em staging
- Variáveis de ambiente configuradas
- Certificados SSL válidos
- DNS configurado
Deploy
- Build das imagens Docker
- Migrations executadas
- Arquivos estáticos coletados
- Serviços iniciados
- Nginx configurado
Pós-Deploy
- Health check passando
- Funcionalidades críticas testadas
- Logs sem erros
- Monitoramento ativo
- Backup verificado
Importante
Sempre faça backup completo antes de qualquer deploy em produção. Mantenha um plano de rollback pronto.
Zero Downtime
Para deploys sem downtime, considere usar blue-green deployment ou rolling updates com Docker Swarm/Kubernetes.