Pular para o conteúdo principal

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

ComponenteMínimoRecomendado
CPU2 cores4+ cores
RAM4 GB8+ GB
Disco50 GB SSD100+ GB SSD
Rede100 Mbps1 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.