Deploy de Site - Passo a Passo - Manual Técnico

Deploy de Site - Passo a Passo

📋 Checklist antes de começar

Verifique:
  • ☐ Código no GitHub (ou arquivos prontos para enviar)
  • ☐ Acesso SSH ao servidor
  • ☐ Se for usar domínio: ele já está apontando para o IP do servidor

📥 1. Clonar repositório

cd /var/www
git clone https://github.com/seu-usuario/seu-repositorio.git nome-do-site
cd nome-do-site
💡 Dica: Substitua "seu-usuario", "seu-repositorio" e "nome-do-site" pelos valores reais do seu projeto.

🐍 2. Criar ambiente virtual

sudo -u www-data python3 -m venv venv
sudo -u www-data venv/bin/pip install -r requirements.txt

🌐 3. Configurar Nginx

Opção A: Acesso via Domínio (recomendado para produção)

sudo nano /etc/nginx/sites-available/nome-do-site

Cole a configuração (APENAS HTTP - sem SSL):

server {
    listen 80;
    listen [::]:80;
    server_name seudominio.com.br www.seudominio.com.br;

    location / {
        include proxy_params;
        proxy_pass http://unix:/var/www/nome-do-site/nome-do-site.sock;
        
        # CONFIGURAÇÕES DE BUFFERS (para respostas grandes)
        proxy_buffer_size 128k;
        proxy_buffers 4 256k;
        proxy_busy_buffers_size 256k;
        
        # CONFIGURAÇÕES DE TIMEOUT (para operações demoradas)
        proxy_connect_timeout 150s;
        proxy_send_timeout 150s;
        proxy_read_timeout 300s;
        send_timeout 300s;
    }

    location /static {
        alias /var/www/nome-do-site/static;
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    location /media {
        alias /var/www/nome-do-site/media;
        expires 30d;
    }
}

Opção B: Acesso via IP (para testes, sem domínio)

⚠️ Importante: Esta opção só funciona para UM ÚNICO SITE no servidor. Se você tiver mais de um site, use a Opção A com domínios diferentes.
sudo nano /etc/nginx/sites-available/nome-do-site

Cole a configuração:

server {
    listen 80;
    listen [::]:80;
    server_name _;  # Aceita qualquer domínio/IP

    location / {
        include proxy_params;
        proxy_pass http://unix:/var/www/nome-do-site/nome-do-site.sock;
        
        proxy_buffer_size 128k;
        proxy_buffers 4 256k;
        proxy_busy_buffers_size 256k;
        proxy_connect_timeout 150s;
        proxy_send_timeout 150s;
        proxy_read_timeout 300s;
        send_timeout 300s;
    }

    location /static {
        alias /var/www/nome-do-site/static;
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    location /media {
        alias /var/www/nome-do-site/media;
        expires 30d;
    }
}

Ativar o site:

sudo ln -s /etc/nginx/sites-available/nome-do-site /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
📌 Importante:
  • A configuração acima é SOMENTE HTTP (porta 80)
  • O SSL será adicionado automaticamente pelo Certbot no passo 6
  • Não configure SSL manualmente!

⚙️ 4. Iniciar Gunicorn

Para Flask:

cd /var/www/nome-do-site
sudo -u www-data venv/bin/gunicorn --workers 3 --bind unix:/var/www/nome-do-site/nome-do-site.sock app:app --daemon

Para Django:

cd /var/www/nome-do-site
sudo -u www-data venv/bin/gunicorn --workers 3 --bind unix:/var/www/nome-do-site/nome-do-site.sock seu_projeto.wsgi:application --daemon
📌 Explicação:
  • --workers 3 - Número de processos (ajuste conforme sua RAM)
  • --bind unix:...sock - Socket de comunicação com Nginx
  • app:app - Para Flask (arquivo app.py com variável app)
  • --daemon - Roda em background

🔍 5. Testar o site

Se usou domínio (Opção A):

curl -I http://seudominio.com.br

Se usou IP (Opção B):

curl -I http://167.86.116.215

Deve retornar HTTP/1.1 200 OK ou 302 FOUND. Se funcionar, o site está no ar via HTTP!

🔐 6. Configurar SSL (somente se tiver domínio)

⚠️ Importante: Antes de executar o Certbot:
  • Aguarde o DNS propagar (pode levar de 5 a 30 minutos)
  • Verifique com: dig seudominio.com.br
  • O domínio deve retornar o IP do servidor: 167.86.116.215
sudo certbot --nginx -d seudominio.com.br -d www.seudominio.com.br

Durante a instalação, o Certbot vai perguntar:

Testar HTTPS:

curl -I https://seudominio.com.br

🔄 7. Configurar inicialização automática (reboot)

Para o Gunicorn iniciar automaticamente quando o servidor reiniciar:

sudo crontab -e

Adicionar a linha (substitua nome-do-site):

@reboot sleep 30 && cd /var/www/nome-do-site && sudo -u www-data venv/bin/gunicorn --workers 3 --bind unix:/var/www/nome-do-site/nome-do-site.sock app:app --daemon
💡 Para múltiplos sites: Adicione uma linha para cada site, com sleep diferente:
@reboot sleep 30 && cd /var/www/site1 && ...
@reboot sleep 45 && cd /var/www/site2 && ...
@reboot sleep 60 && cd /var/www/site3 && ...

✅ 8. Verificar se tudo funcionou

🔍 Comandos de verificação:

ps aux | grep gunicorn | grep nome-do-site - Ver processos Gunicorn
ls -la /var/www/nome-do-site/nome-do-site.sock - Verificar socket
curl -I http://seudominio.com.br - Testar HTTP (deve redirecionar para HTTPS)
curl -I https://seudominio.com.br - Testar HTTPS (deve dar 200)
sudo certbot certificates - Ver certificados ativos

📌 Vários sites no mesmo servidor

Como organizar:
  • Cada site tem sua própria pasta: /var/www/site1, /var/www/site2, etc
  • Cada site tem seu próprio socket: site1.sock, site2.sock
  • Cada site tem seu arquivo no Nginx: /etc/nginx/sites-available/site1, /etc/nginx/sites-available/site2
  • O Nginx identifica qual site atender pelo domínio informado na requisição
  • Todos compartilham o mesmo IP, mas portas diferentes (80 para HTTP, 443 para HTTPS)
  • O Certbot gerencia os certificados individualmente para cada domínio

📋 Exemplo de configuração para 3 sites:

Site 1: meusite1.com.br

server {
    listen 80;
    listen [::]:80;
    server_name meusite1.com.br www.meusite1.com.br;

    location / {
        include proxy_params;
        proxy_pass http://unix:/var/www/site1/site1.sock;
        proxy_read_timeout 300s;
    }

    location /static {
        alias /var/www/site1/static;
        expires 30d;
    }
}

Site 2: meusite2.com.br

server {
    listen 80;
    listen [::]:80;
    server_name meusite2.com.br www.meusite2.com.br;

    location / {
        include proxy_params;
        proxy_pass http://unix:/var/www/site2/site2.sock;
        proxy_read_timeout 300s;
    }

    location /static {
        alias /var/www/site2/static;
        expires 30d;
    }
}

Site 3: meusite3.com.br

server {
    listen 80;
    listen [::]:80;
    server_name meusite3.com.br www.meusite3.com.br;

    location / {
        include proxy_params;
        proxy_pass http://unix:/var/www/site3/site3.sock;
        proxy_read_timeout 300s;
    }

    location /static {
        alias /var/www/site3/static;
        expires 30d;
    }
}
⚠️ Importante: Se você tiver MAIS DE UM SITE usando server_name _;, apenas o PRIMEIRO carregado pelo Nginx vai funcionar. Os outros ficarão inacessíveis. Sempre use domínios diferentes para cada site!
🎯 Resumo do fluxo de deploy:
  1. ✅ Configurar DNS do domínio (apontar para 167.86.116.215)
  2. ✅ Clonar código e criar ambiente virtual
  3. ✅ Criar configuração Nginx (APENAS HTTP)
  4. ✅ Iniciar Gunicorn e testar HTTP
  5. ✅ Rodar Certbot para adicionar SSL
  6. ✅ Adicionar ao crontab para iniciar automaticamente
  7. ✅ Verificar com os comandos de teste

Manual Técnico - Última atualização: Março 2026