Servidor VPS: Guia Completo 2026

📚 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

TipoCusto/mêsUso idealControle
Hospedagem compartilhadaR$ 15-50Sites WordPress simples❌ Baixo
VPSR$ 30-150Apps Node/Python, APIs, bots✅ Total
Cloud (AWS/GCP)R$ 100+Apps enterprise, escala✅ Total
ServerlessPague por usoFunctions esporádicas🟡 Médio
Servidor físicoR$ 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:

PerfilProviderMotivo
Budget (<R$ 50/mês)Contabo8GB por R$ 27
InicianteDigitalOceanDocs + interface
Brasil (latência)Vultr São PauloDatacenter BR
PerformanceLinodeAkamai + specs
EnterpriseAWS/GCPEscala + 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

  1. Criar conta DigitalOcean - $200 crédito grátis
  2. Deploy com Docker - Container tudo
  3. Configurar CI/CD - Deploy automático
  4. 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:

💡 Consultoria inicial gratuita para avaliar seu caso e propor uma solução personalizada.