Disco cheio na VPS: como identificar e liberar espaço

Quando o disco da VPS chega a 100%, containers Docker param de escrever logs e travam, bancos de dados recusam escritas e o sistema pode ficar inacessível. A causa mais comum em VPS com Docker são imagens e volumes não utilizados, docker system prune resolve em segundos. Veja como diagnosticar e liberar espaço rapidamente.

Diagnóstico: encontrar o que está ocupando espaço

Antes de deletar qualquer coisa, identifique os maiores consumidores de disco:

bash
# Verificar espaço total e disponível
df -h /

# Encontrar os diretórios mais pesados (nível 1)
du -sh /* 2>/dev/null | sort -rh | head -15

# Aprofundar no diretório mais pesado (ex: /var)
du -sh /var/* 2>/dev/null | sort -rh | head -10

# Encontrar arquivos maiores que 500 MB
find / -xdev -size +500M -type f 2>/dev/null \
  | xargs ls -lh 2>/dev/null | sort -k5 -rh

# Disco ocupado por Docker (imagens, containers, volumes)
docker system df

Limpeza do Docker (maior ganho)

Em VPS com Docker, imagens antigas, containers parados e volumes órfãos são o principal gargalo. Libere tudo de uma vez:

bash
# Ver o que será removido antes de remover
docker system df -v

# Remover imagens sem uso, containers parados e cache de build
docker system prune -f
# Output: "Total reclaimed space: X.X GB"

# Remover também volumes não utilizados (CUIDADO: verifique antes)
docker system prune -af --volumes

# Remover apenas imagens antigas (não as atuais)
docker image prune -f

# Remover apenas containers parados
docker container prune -f

# Remover imagens de um repositório específico
docker images | grep "nome_da_imagem" | awk '{print $3}' | xargs docker rmi

Limpar logs do sistema

Logs do journald e de aplicações podem crescer indefinidamente sem rotação configurada:

bash
# Ver tamanho total dos logs do journald
journalctl --disk-usage

# Manter apenas os últimos 7 dias de log
sudo journalctl --vacuum-time=7d

# Manter máximo de 500 MB de logs
sudo journalctl --vacuum-size=500M

# Configurar limite permanente no journald
sudo nano /etc/systemd/journald.conf
# Adicionar/descomentar:
# SystemMaxUse=500M
# MaxRetentionSec=7day
sudo systemctl restart systemd-journald

# Limpar logs de aplicações em /var/log
sudo find /var/log -name "*.gz" -mtime +30 -delete
sudo find /var/log -name "*.log.*" -mtime +30 -delete

Limpar cache de pacotes e arquivos temporários

O cache do APT e arquivos temporários acumulam com o tempo:

bash
# Cache do APT (pacotes baixados mas não mais necessários)
sudo apt autoremove -y        # remover pacotes órfãos
sudo apt autoclean            # remover pacotes baixados desnecessários
sudo apt clean                # limpar todo o cache de pacotes
du -sh /var/cache/apt/archives/

# Arquivos temporários
sudo rm -rf /tmp/* /var/tmp/*

# Thumbnails e cache de usuário
rm -rf ~/.cache/thumbnails/*
du -sh ~/.cache/

# Logs de crash do sistema
sudo rm -rf /var/crash/*

# Cores de dump
sudo sysctl -w kernel.core_pattern=/dev/null

Configurar logrotate para logs de containers

Logs de containers Docker crescem indefinidamente por padrão. Configure rotação para evitar disco cheio no futuro:

bash
# Configurar log driver do Docker globalmente
sudo nano /etc/docker/daemon.json

# Adicionar configuração de log:
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

# Reiniciar Docker para aplicar
sudo systemctl restart docker

# Por container (no docker-compose.yml):
services:
  meu_app:
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

Não quer configurar manualmente?

Implante o VPS em menos de 5 minutos com a Runstack. Infraestrutura da OPEN Datacenter, com servidores em São Paulo.

Perguntas frequentes

Processos que ainda estão rodando mantêm file handles abertos em arquivos deletados, o espaço não é liberado até o processo fechar o arquivo ou ser reiniciado. Identifique com: lsof | grep deleted. Reinicie o processo ou serviço para liberar o espaço.

No painel da Runstack: VPS → Storage → Expand. Após expandir o volume no painel, ainda é necessário expandir a partição no Linux: growpart /dev/sda 1 && resize2fs /dev/sda1. A operação é sem downtime para a partição raiz em kernels modernos.

Sim. No crontab: echo '*/30 * * * * df / | awk 'NR==2{if(+$5>80)print "Disco: "$5}' | mail -s "ALERTA" seu@email.com' | crontab -. Ou use Netdata com alerta pré-configurado de disco. O painel Runstack também tem alertas de disco configuráveis.

Execute docker volume ls para listar todos os volumes e docker ps -a para ver containers (incluindo os parados). Volumes com "VOLUME NAME" genérico (hash) geralmente são órfãos. docker volume prune remove apenas volumes não referenciados por nenhum container (mesmo parado). Sempre faça backup antes de remover volumes de banco de dados.

Para um único app (n8n + PostgreSQL): 20 GB. Para múltiplos apps com banco e uploads: 50 GB. Com GPU e modelos de LLM (Llama 3 8B = ~5 GB): 100 GB+. Modelos maiores como Llama 3 70B requerem 40+ GB só para o modelo. Configure alertas de disco a partir de 70% de uso.