Deploy de Site - Passo a Passo
📑 Índice Rápido
📋 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 Nginxapp: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:
- 📧 E-mail: Digite seu e-mail para notificações
- 📜 Termos de serviço: Digite
Apara aceitar - 📢 Compartilhar e-mail: Digite
N(recomendado) - 🔄 Redirecionar HTTP para HTTPS: Digite
2(recomendado)
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 Gunicornls -la /var/www/nome-do-site/nome-do-site.sock - Verificar socketcurl -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:
- ✅ Configurar DNS do domínio (apontar para 167.86.116.215)
- ✅ Clonar código e criar ambiente virtual
- ✅ Criar configuração Nginx (APENAS HTTP)
- ✅ Iniciar Gunicorn e testar HTTP
- ✅ Rodar Certbot para adicionar SSL
- ✅ Adicionar ao crontab para iniciar automaticamente
- ✅ Verificar com os comandos de teste
Manual Técnico - Última atualização: Março 2026