📚 Série: Infraestrutura & Deploy → Docker Tutorial | Flask Python | Cloudflare Pages
O que é Servidor VPS?
VPS (Virtual Private Server) é um servidor virtual com recursos dedicados (CPU, RAM, disco) que você controla 100%. Roda Ubuntu/Linux, permite instalar qualquer software (Docker, Node.js, Python) e hospedar aplicações 24/7. Custa R$ 30-150/mês vs servidores físicos R$ 5.000+.
Diferente de hospedagem compartilhada (cPanel), VPS dá acesso root completo via SSH.
Uso principal: Hospedar Evolution API, chatbots, APIs, bancos de dados, workers.
VPS vs outras opções: quando usar cada
| Tipo | Custo/mês | Uso ideal | Controle |
|---|---|---|---|
| Hospedagem compartilhada | R$ 15-50 | Sites WordPress simples | ❌ Baixo |
| VPS | R$ 30-150 | Apps Node/Python, APIs, bots | ✅ Total |
| Cloud (AWS/GCP) | R$ 100+ | Apps enterprise, escala | ✅ Total |
| Serverless | Pague por uso | Functions esporádicas | 🟡 Médio |
| Servidor físico | R$ 5.000+ | Dados sensíveis on-premise | ✅ Total |
Escolha VPS quando:
- ✅ Precisa instalar software customizado
- ✅ Apps Node.js/Python/Docker
- ✅ Tráfego previsível (<100k req/dia)
- ✅ Orçamento R$ 50-200/mês
- ✅ Quer controle total (root)
Melhores providers 2026 (testados)
1. Contabo 🥇 Melhor custo/benefício
Plano Cloud VPS 1:
- CPU: 4 vCores
- RAM: 8GB
- Disco: 200GB NVMe SSD
- Transfer: Ilimitado
- Preço: €4.50/mês (~R$ 27/mês)
- Datacenter: EUA, Europa
- Uptime: 99.9% (testado 6 meses)
Vantagens:
- ✅ Preço imbatível (2-3x mais barato que concorrentes)
- ✅ Specs generosas (8GB por R$ 27!)
- ✅ Largura banda ilimitada
- ✅ Snapshots grátis (backups)
Desvantagens:
- ⚠️ Suporte técnico lento (24-48h resposta)
- ⚠️ Interface antiga (funcional mas não bonita)
Site: contabo.com/vps
2. DigitalOcean 🥈 Melhor para iniciantes
Plano Droplet Basic:
- CPU: 2 vCores
- RAM: 4GB
- Disco: 80GB SSD
- Transfer: 4TB/mês
- Preço: $24/mês (~R$ 140/mês)
- Datacenter: 15 localizações
Vantagens:
- ✅ Interface moderna (melhor UX)
- ✅ Documentação excelente (tutoriais passo-a-passo)
- ✅ Marketplace (instala apps 1-click: Docker, WordPress, N8N)
- ✅ API robusta (automação)
Desvantagens:
- ⚠️ Mais caro (5x que Contabo no mesmo spec)
- ⚠️ Extras caros (backups +20%, snapshots pagos)
Site: digitalocean.com Crédito grátis: $200 (60 dias teste)
3. Vultr 🥉 Melhor rede Brasil
Plano Cloud Compute:
- CPU: 2 vCores
- RAM: 4GB
- Disco: 80GB SSD
- Transfer: 3TB/mês
- Preço: $18/mês (~R$ 105/mês)
- Datacenter: São Paulo, BR ← Menor latência
Vantagens:
- ✅ Datacenter em SP (15ms latência)
- ✅ Bom custo/benefício (entre Contabo e DO)
- ✅ Deploy rápido (55 segundos)
Desvantagens:
- ⚠️ Suporte médio
- ⚠️ Interface ok (não é DO)
Site: vultr.com
4. Linode (Akamai) - Melhor performance
Plano Shared:
- CPU: 2 vCores
- RAM: 4GB
- Disco: 80GB SSD
- Transfer: 4TB/mês
- Preço: $24/mês (~R$ 140/mês)
- Datacenter: 11 localizações (USA, Europa)
Vantagens:
- ✅ Akamai CDN incluído
- ✅ Performance CPU/rede excepcional
- ✅ Backups incluídos (alguns planos)
Site: linode.com
Recomendação por perfil:
| Perfil | Provider | Motivo |
|---|---|---|
| Budget (<R$ 50/mês) | Contabo | 8GB por R$ 27 |
| Iniciante | DigitalOcean | Docs + interface |
| Brasil (latência) | Vultr São Paulo | Datacenter BR |
| Performance | Linode | Akamai + specs |
| Enterprise | AWS/GCP | Escala + SLA |
Setup completo passo a passo (Ubuntu 22.04)
Passo 1: Criar VPS
Exemplo: DigitalOcean
# Acesse: cloud.digitalocean.com/droplets/new
# Escolhas:
- Image: Ubuntu 22.04 LTS
- Plan: Basic ($24/mês - 4GB RAM)
- Datacenter: San Francisco 3 (ou Vultr SP se Brasil)
- Auth: SSH keys (criar novo ou upload existente)
- Hostname: meu-vps-producao
# Create Droplet (55 segundos)
# IP público gerado: 143.198.45.123
Passo 2: Acesso SSH inicial
# Conectar primeira vez (usa chave SSH)
ssh root@143.198.45.123
# Ou com senha (se configurou):
ssh root@143.198.45.123
# Digitar senha quando solicitado
# Primeira coisa: atualizar sistema
apt update && apt upgrade -y
# Configurar timezone (importante para logs)
timedatectl set-timezone America/Sao_Paulo
Passo 3: Criar usuário não-root (segurança)
# Criar usuário deploy (exemplo)
adduser deploy
# Adicionar ao grupo sudo
usermod -aG sudo deploy
# Copiar chaves SSH para novo usuário
rsync --archive --chown=deploy:deploy ~/.ssh /home/deploy
# Testar acesso (em nova janela terminal):
ssh deploy@143.198.45.123
# Se funcionar, desabilitar root login:
nano /etc/ssh/sshd_config
# Alterar:
PermitRootLogin no
PasswordAuthentication no # Força uso de SSH keys
# Restart SSH:
systemctl restart sshd
Passo 4: Firewall básico (UFW)
# Instalar e habilitar
ufw enable
# Permitir SSH (CRÍTICO! Senão perde acesso)
ufw allow 22/tcp
# Permitir HTTP/HTTPS
ufw allow 80/tcp
ufw allow 443/tcp
# Verificar status
ufw status
# Output esperado:
# 22/tcp ALLOW Anywhere
# 80/tcp ALLOW Anywhere
# 443/tcp ALLOW Anywhere
Passo 5: Instalar Docker + Docker Compose
# Remover versões antigas (se houver)
sudo apt remove docker docker-engine docker.io containerd runc
# Instalar dependências
sudo apt install apt-transport-https ca-certificates curl software-properties-common -y
# Adicionar repositório Docker oficial
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Instalar Docker
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y
# Adicionar usuário ao grupo docker (não precisa sudo)
sudo usermod -aG docker ${USER}
# Relogar para aplicar
exit
ssh deploy@143.198.45.123
# Testar
docker --version
docker compose version
# Deve mostrar:
# Docker version 24.0.7
# Docker Compose version v2.23.0
Passo 6: Instalar Nginx (reverse proxy)
# Instalar
sudo apt install nginx -y
# Habilitar e iniciar
sudo systemctl enable nginx
sudo systemctl start nginx
# Testar
curl localhost
# Deve mostrar HTML "Welcome to nginx"
# Configurar domínio (exemplo: api.seusite.com)
sudo nano /etc/nginx/sites-available/api.seusite.com
# Conteúdo:
server {
listen 80;
server_name api.seusite.com;
location / {
proxy_pass http://localhost:3000; # App Node.js na porta 3000
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
# Ativar configuração
sudo ln -s /etc/nginx/sites-available/api.seusite.com /etc/nginx/sites-enabled/
# Testar configuração
sudo nginx -t
# Reload
sudo systemctl reload nginx
Passo 7: SSL automático (Certbot)
# Instalar Certbot
sudo apt install certbot python3-certbot-nginx -y
# Gerar certificado SSL (automático)
sudo certbot --nginx -d api.seusite.com
# Responder prompts:
# Email: seu@email.com
# Agree Terms: Yes
# Share email: No
# Redirect HTTP → HTTPS: Yes (recomendado)
# Certbot configura Nginx automaticamente!
# Renovação automática (certbot faz sozinho a cada 60 dias)
# Testar renovação:
sudo certbot renew --dry-run
# Se OK, certificado renova automaticamente
Caso Real: E-commerce migrou e economizou R$ 340/mês
Empresa: Loja online de eletrônicos (médio porte, 50k visitas/mês)
Situação anterior:
- Hospedagem Hostgator “Pro” Business: R$ 189/mês
- CDN Cloudflare Pro: R$ 150/mês
- Banco MySQL remoto (ClearDB): R$ 90/mês
- Total: R$ 429/mês
Limitações:
- CPU throttling (lentidão em picos)
- Sem acesso SSH (não instala Node.js)
- Não roda workers/queue processing
- Backups manuais (esqueciam)
Solução:
- VPS Contabo Cloud VPS 2: 8 vCPU, 12GB RAM, 400GB SSD
- Custo: €7/mês (R$ 42/mês)
- Setup realizado:
- Docker + Docker Compose
- Nginx (reverse proxy)
- PostgreSQL (container)
- Redis (cache + queue)
- Node.js API (PM2)
- Backups automáticos S3 (Wasabi R$ 20/mês)
Resultados (3 meses):
- ✅ Custo: R$ 429 → R$ 62/mês (-86%)
- ✅ Performance: TTFB 800ms → 180ms
- ✅ Uptime: 99.3% → 99.95%
- ✅ Controle: Zero → 100% (acesso root)
- ✅ Economia/ano: R$ 4.404
Migração: 1 final de semana (sexta → domingo) Downtime: 45 minutos (troca DNS)
Gerenciamento e manutenção
Monitoramento básico (free)
Uptime Robot (grátis, 50 monitors):
# Monitorar:
- https://api.seusite.com (HTTP check a cada 5 min)
- Porta 22 (SSH check)
- Porta 5432 (PostgreSQL check)
# Notificações:
- Email: seu@email.com
- Telegram: @seunome_bot
- Slack: #alertas
# Site: uptimerobot.com
Netdata (dashboard tempo real):
# Instalar (1 linha)
bash <(curl -Ss https://my-netdata.io/kickstart.sh)
# Acesse: http://SEU_IP:19999
# Visualiza:
- CPU/RAM/Disk uso (tempo real)
- Network traffic
- Processes rodando
- Docker containers
# Alertas Slack:
# Configurar: /etc/netdata/health_alarm_notify.conf
Backups automáticos
Script simples (cron diário):
# Criar script
nano /home/deploy/backup.sh
# Conteúdo:
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/home/deploy/backups"
mkdir -p $BACKUP_DIR
# Backup PostgreSQL
docker exec postgres pg_dumpall -U postgres | gzip > $BACKUP_DIR/db_$DATE.sql.gz
# Backup arquivos aplicação
tar -czf $BACKUP_DIR/app_$DATE.tar.gz /home/deploy/app
# Upload S3 (AWS CLI ou rclone)
rclone copy $BACKUP_DIR remote:backups/
# Deletar backups >7 dias
find $BACKUP_DIR -type f -mtime +7 -delete
# Dar permissão
chmod +x /home/deploy/backup.sh
# Agendar cron (todo dia 3am)
crontab -e
# Adicionar linha:
0 3 * * * /home/deploy/backup.sh >> /var/log/backup.log 2>&1
Atualizações de segurança
# Automatizar updates (unattended-upgrades)
sudo apt install unattended-upgrades -y
# Configurar
sudo dpkg-reconfigure --priority=low unattended-upgrades
# Verificar config
cat /etc/apt/apt.conf.d/50unattended-upgrades
# Resultado:
# - Security updates: automático
# - Kernel updates: automático (requer reboot manual)
# - App updates: manual
Segurança essencial (checklist)
1. SSH hardening
# Alterar porta SSH (dificulta bots)
sudo nano /etc/ssh/sshd_config
# Mudar:
Port 2222 # Ao invés de 22
# Desabilitar senha (só SSH keys)
PasswordAuthentication no
# Desabilitar root
PermitRootLogin no
# Restart
sudo systemctl restart sshd
# Conectar nova porta:
ssh -p 2222 deploy@SEU_IP
2. Fail2Ban (bloqueia brute force)
# Instalar
sudo apt install fail2ban -y
# Configurar
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
# Ajustar:
[sshd]
enabled = true
port = 2222 # Sua porta SSH
maxretry = 3 # 3 tentativas falhas = ban
bantime = 3600 # Ban por 1h
# Iniciar
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
# Ver bans atuais:
sudo fail2ban-client status sshd
3. Firewall avançado (UFW rules)
# Regras específicas por app
# Permitir apenas IPs conhecidos no SSH
sudo ufw delete allow 2222
sudo ufw allow from SEU_IP_CASA to any port 2222
# Rate limit (previne DDoS simples)
sudo ufw limit 80/tcp
sudo ufw limit 443/tcp
# Bloquear países (geoip)
# Requer: xtables-addons-common
# Verificar regras
sudo ufw status numbered
Deploy de aplicações (exemplos práticos)
Node.js API com PM2
# Clonar repositório
cd /home/deploy
git clone https://github.com/seu-usuario/api.git
cd api
# Instalar dependências
npm install --production
# Variáveis ambiente
nano .env
# DATABASE_URL=postgresql://...
# PORT=3000
# Instalar PM2 (process manager)
npm install -g pm2
# Iniciar app
pm2 start npm --name "api" -- start
# Auto-restart no boot
pm2 startup
pm2 save
# Comandos úteis:
pm2 list # Ver apps rodando
pm2 logs api # Ver logs
pm2 restart api # Restart
pm2 stop api # Parar
pm2 delete api # Remover
Docker Compose (múltiplos serviços)
# docker-compose.yml
version: '3.8'
services:
# Banco PostgreSQL
postgres:
image: postgres:15-alpine
environment:
POSTGRES_PASSWORD: senha_segura_aqui
POSTGRES_DB: producao
volumes:
- postgres_data:/var/lib/postgresql/data
restart: always
# Redis (cache)
redis:
image: redis:7-alpine
restart: always
# App Node.js
app:
image: node:18-alpine
working_dir: /app
volumes:
- ./:/app
command: npm start
environment:
DATABASE_URL: postgresql://postgres:senha@postgres:5432/producao
REDIS_URL: redis://redis:6379
ports:
- "3000:3000"
depends_on:
- postgres
- redis
restart: always
volumes:
postgres_data:
# Iniciar tudo:
# docker compose up -d
# Ver logs:
# docker compose logs -f app
# Parar tudo:
# docker compose down
Troubleshooting comum
Problema 1: Sem espaço em disco
# Ver uso
df -h
# Ver maiores pastas
du -sh /* | sort -h
# Limpar logs antigos
sudo journalctl --vacuum-time=7d
# Limpar Docker images não usadas
docker system prune -a
# Limpar APT cache
sudo apt clean
sudo apt autoclean
Problema 2: Alto uso CPU/RAM
# Ver processos pesados
htop # Instalar: apt install htop
# Ou comando básico:
top
# Ver Docker containers uso
docker stats
# Restart container específico
docker restart CONTAINER_ID
Problema 3: Porta não acessível
# Ver portas abertas
sudo netstat -tulpn | grep LISTEN
# Testar porta local
curl localhost:3000
# Se funciona local mas não externo:
# 1. Verificar firewall VPS
sudo ufw status
# 2. Verificar firewall provider (DigitalOcean, Contabo)
# Acessar painel web → Networking → Firewalls
# 3. Verificar Nginx config
sudo nginx -t
Próximos passos
- Criar conta DigitalOcean - $200 crédito grátis
- Deploy com Docker - Container tudo
- Configurar CI/CD - Deploy automático
- Integrar Evolution API - WhatsApp no VPS
Sobre o autor: Felipe Zanoni é especialista em infraestrutura cloud e DevOps, com 50+ VPS configurados para empresas brasileiras.
💬 Precisa de Ajuda para Implementar?
A Agência Café Online já ajudou dezenas de empresas a implementarem soluções de automação e IA, com resultados reais e mensuráveis.
Fale comigo:
- 📱 WhatsApp: Clique aqui para conversar
- 📸 Instagram: @fe_leads
- 🌐 Site: agenciacafeonline.com.br
💡 Consultoria inicial gratuita para avaliar seu caso e propor uma solução personalizada.