337 lines
10 KiB
Bash
337 lines
10 KiB
Bash
#!/bin/bash
|
|
|
|
# BCards Cleanup Script
|
|
# Limpeza de containers antigos e recursos não utilizados
|
|
|
|
set -e
|
|
|
|
# Configurações
|
|
SERVER_IPS=("129.153.123.92" "129.146.116.218")
|
|
SSH_USER="ubuntu"
|
|
SERVICE_NAME="bcards-app"
|
|
|
|
# Cores para output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m'
|
|
|
|
log() {
|
|
echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')] $1${NC}"
|
|
}
|
|
|
|
error() {
|
|
echo -e "${RED}[ERROR] $1${NC}"
|
|
exit 1
|
|
}
|
|
|
|
warn() {
|
|
echo -e "${YELLOW}[WARNING] $1${NC}"
|
|
}
|
|
|
|
info() {
|
|
echo -e "${BLUE}[INFO] $1${NC}"
|
|
}
|
|
|
|
success() {
|
|
echo -e "${GREEN}[SUCCESS] $1${NC}"
|
|
}
|
|
|
|
# Função para executar comando em servidor remoto
|
|
run_remote() {
|
|
local server_ip=$1
|
|
local command=$2
|
|
ssh -o StrictHostKeyChecking=no ${SSH_USER}@${server_ip} "$command"
|
|
}
|
|
|
|
# Função para executar comando apenas no manager
|
|
run_manager() {
|
|
local command=$1
|
|
run_remote ${SERVER_IPS[0]} "$command"
|
|
}
|
|
|
|
# Verificar conectividade
|
|
check_connectivity() {
|
|
log "Verificando conectividade com servidores..."
|
|
|
|
for server_ip in "${SERVER_IPS[@]}"; do
|
|
if ! ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no ${SSH_USER}@${server_ip} "echo 'ok'" >/dev/null 2>&1; then
|
|
error "Não foi possível conectar ao servidor $server_ip"
|
|
fi
|
|
info "✓ Conectado: $server_ip"
|
|
done
|
|
}
|
|
|
|
# Mostrar uso atual de espaço
|
|
show_disk_usage() {
|
|
log "Verificando uso atual de disco..."
|
|
|
|
for server_ip in "${SERVER_IPS[@]}"; do
|
|
info "Servidor $server_ip:"
|
|
run_remote $server_ip "
|
|
echo ' Espaço total em disco:'
|
|
df -h / | tail -1 | awk '{print \" Total: \" \$2 \", Usado: \" \$3 \", Livre: \" \$4 \", Uso: \" \$5}'
|
|
echo ' Espaço usado pelo Docker:'
|
|
sudo docker system df 2>/dev/null || echo ' Docker não disponível'
|
|
"
|
|
done
|
|
echo ""
|
|
}
|
|
|
|
# Listar containers e imagens antes da limpeza
|
|
show_before_cleanup() {
|
|
log "Status antes da limpeza..."
|
|
|
|
for server_ip in "${SERVER_IPS[@]}"; do
|
|
info "Servidor $server_ip:"
|
|
echo " Containers:"
|
|
run_remote $server_ip "sudo docker ps -a --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.CreatedAt}}'" || true
|
|
echo " Imagens:"
|
|
run_remote $server_ip "sudo docker images --format 'table {{.Repository}}\t{{.Tag}}\t{{.Size}}\t{{.CreatedAt}}'" | head -10 || true
|
|
echo ""
|
|
done
|
|
}
|
|
|
|
# Parar serviços específicos (se solicitado)
|
|
stop_services() {
|
|
if [[ "$1" == "--stop-services" ]]; then
|
|
log "Parando serviços BCards..."
|
|
|
|
if run_manager "sudo docker service ls --filter name=${SERVICE_NAME}" | grep -q "${SERVICE_NAME}"; then
|
|
run_manager "sudo docker service rm ${SERVICE_NAME}_app-server1 ${SERVICE_NAME}_app-server2" || true
|
|
info "Serviços BCards parados"
|
|
|
|
# Aguardar containers pararem
|
|
sleep 10
|
|
else
|
|
info "Nenhum serviço BCards encontrado"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# Limpeza de containers parados
|
|
cleanup_containers() {
|
|
log "Limpando containers parados..."
|
|
|
|
for server_ip in "${SERVER_IPS[@]}"; do
|
|
info "Limpando containers no servidor $server_ip..."
|
|
|
|
# Remover containers parados
|
|
local stopped_containers=$(run_remote $server_ip "sudo docker ps -aq --filter 'status=exited'")
|
|
if [ -n "$stopped_containers" ]; then
|
|
run_remote $server_ip "sudo docker rm \$(sudo docker ps -aq --filter 'status=exited')" || true
|
|
success " ✓ Containers parados removidos"
|
|
else
|
|
info " Nenhum container parado encontrado"
|
|
fi
|
|
|
|
# Remover containers órfãos
|
|
run_remote $server_ip "sudo docker container prune -f" || true
|
|
done
|
|
}
|
|
|
|
# Limpeza de imagens não utilizadas
|
|
cleanup_images() {
|
|
log "Limpando imagens não utilizadas..."
|
|
|
|
local keep_latest=${1:-true}
|
|
|
|
for server_ip in "${SERVER_IPS[@]}"; do
|
|
info "Limpando imagens no servidor $server_ip..."
|
|
|
|
if [[ "$keep_latest" == "true" ]]; then
|
|
# Remover apenas imagens dangling (sem tag)
|
|
run_remote $server_ip "sudo docker image prune -f" || true
|
|
success " ✓ Imagens dangling removidas"
|
|
else
|
|
# Remover todas as imagens não utilizadas
|
|
run_remote $server_ip "sudo docker image prune -af" || true
|
|
success " ✓ Todas as imagens não utilizadas removidas"
|
|
fi
|
|
done
|
|
}
|
|
|
|
# Limpeza de volumes não utilizados
|
|
cleanup_volumes() {
|
|
log "Limpando volumes não utilizados..."
|
|
|
|
for server_ip in "${SERVER_IPS[@]}"; do
|
|
info "Limpando volumes no servidor $server_ip..."
|
|
|
|
local unused_volumes=$(run_remote $server_ip "sudo docker volume ls -qf dangling=true")
|
|
if [ -n "$unused_volumes" ]; then
|
|
run_remote $server_ip "sudo docker volume prune -f" || true
|
|
success " ✓ Volumes não utilizados removidos"
|
|
else
|
|
info " Nenhum volume não utilizado encontrado"
|
|
fi
|
|
done
|
|
}
|
|
|
|
# Limpeza de redes não utilizadas
|
|
cleanup_networks() {
|
|
log "Limpando redes não utilizadas..."
|
|
|
|
for server_ip in "${SERVER_IPS[@]}"; do
|
|
info "Limpando redes no servidor $server_ip..."
|
|
|
|
run_remote $server_ip "sudo docker network prune -f" || true
|
|
success " ✓ Redes não utilizadas removidas"
|
|
done
|
|
}
|
|
|
|
# Limpeza de build cache
|
|
cleanup_build_cache() {
|
|
log "Limpando build cache..."
|
|
|
|
for server_ip in "${SERVER_IPS[@]}"; do
|
|
info "Limpando build cache no servidor $server_ip..."
|
|
|
|
run_remote $server_ip "sudo docker builder prune -f" || true
|
|
success " ✓ Build cache limpo"
|
|
done
|
|
}
|
|
|
|
# Limpeza de logs antigos
|
|
cleanup_logs() {
|
|
log "Limpando logs antigos..."
|
|
|
|
for server_ip in "${SERVER_IPS[@]}"; do
|
|
info "Limpando logs no servidor $server_ip..."
|
|
|
|
# Limpar logs do Docker (mais de 7 dias)
|
|
run_remote $server_ip "
|
|
sudo find /var/lib/docker/containers/ -name '*.log' -type f -mtime +7 -delete 2>/dev/null || true
|
|
sudo find /var/log/bcards/ -name '*.log' -type f -mtime +30 -delete 2>/dev/null || true
|
|
sudo journalctl --vacuum-time=7d 2>/dev/null || true
|
|
"
|
|
success " ✓ Logs antigos removidos"
|
|
done
|
|
}
|
|
|
|
# Limpeza do sistema operacional
|
|
cleanup_system() {
|
|
if [[ "$1" == "--system" ]]; then
|
|
log "Limpando sistema operacional..."
|
|
|
|
for server_ip in "${SERVER_IPS[@]}"; do
|
|
info "Limpando sistema no servidor $server_ip..."
|
|
|
|
run_remote $server_ip "
|
|
sudo apt-get autoremove -y 2>/dev/null || true
|
|
sudo apt-get autoclean 2>/dev/null || true
|
|
sudo apt-get clean 2>/dev/null || true
|
|
"
|
|
success " ✓ Sistema limpo"
|
|
done
|
|
fi
|
|
}
|
|
|
|
# Limpeza completa do Docker
|
|
full_docker_cleanup() {
|
|
if [[ "$1" == "--full" ]]; then
|
|
warn "ATENÇÃO: Limpeza completa irá remover TUDO (containers, imagens, volumes, redes)"
|
|
read -p "Tem certeza? Digite 'yes' para continuar: " confirm
|
|
|
|
if [[ "$confirm" == "yes" ]]; then
|
|
log "Executando limpeza completa do Docker..."
|
|
|
|
for server_ip in "${SERVER_IPS[@]}"; do
|
|
info "Limpeza completa no servidor $server_ip..."
|
|
|
|
run_remote $server_ip "
|
|
sudo docker system prune -af --volumes
|
|
"
|
|
success " ✓ Limpeza completa executada"
|
|
done
|
|
else
|
|
info "Limpeza completa cancelada"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# Mostrar estatísticas após limpeza
|
|
show_after_cleanup() {
|
|
log "Status após limpeza..."
|
|
|
|
for server_ip in "${SERVER_IPS[@]}"; do
|
|
info "Servidor $server_ip:"
|
|
echo " Espaço em disco:"
|
|
run_remote $server_ip "df -h / | tail -1 | awk '{print \" Total: \" \$2 \", Usado: \" \$3 \", Livre: \" \$4 \", Uso: \" \$5}'"
|
|
|
|
echo " Docker:"
|
|
run_remote $server_ip "sudo docker system df 2>/dev/null || echo ' Docker não disponível'"
|
|
|
|
echo " Containers ativos:"
|
|
local active_containers=$(run_remote $server_ip "sudo docker ps -q | wc -l")
|
|
echo " $active_containers containers rodando"
|
|
|
|
echo " Imagens:"
|
|
local images_count=$(run_remote $server_ip "sudo docker images -q | wc -l")
|
|
echo " $images_count imagens armazenadas"
|
|
echo ""
|
|
done
|
|
}
|
|
|
|
# Função principal
|
|
main() {
|
|
log "Iniciando limpeza da infraestrutura BCards..."
|
|
|
|
check_connectivity
|
|
show_disk_usage
|
|
show_before_cleanup
|
|
|
|
stop_services "$@"
|
|
cleanup_containers
|
|
cleanup_images "$2"
|
|
cleanup_volumes
|
|
cleanup_networks
|
|
cleanup_build_cache
|
|
cleanup_logs
|
|
cleanup_system "$@"
|
|
full_docker_cleanup "$@"
|
|
|
|
show_after_cleanup
|
|
|
|
success "Limpeza concluída!"
|
|
}
|
|
|
|
# Função de ajuda
|
|
show_help() {
|
|
echo "BCards Cleanup Script"
|
|
echo ""
|
|
echo "Usage: $0 [OPTIONS]"
|
|
echo ""
|
|
echo "OPTIONS:"
|
|
echo " --stop-services Para os serviços BCards antes da limpeza"
|
|
echo " --system Inclui limpeza do sistema operacional (apt clean, etc)"
|
|
echo " --full Limpeza completa (REMOVE TUDO - containers, imagens, volumes)"
|
|
echo " --keep-all-images Mantém todas as imagens (remove apenas dangling)"
|
|
echo " --help Mostra esta ajuda"
|
|
echo ""
|
|
echo "Operações de limpeza:"
|
|
echo "- Remove containers parados"
|
|
echo "- Remove imagens não utilizadas"
|
|
echo "- Remove volumes órfãos"
|
|
echo "- Remove redes não utilizadas"
|
|
echo "- Limpa build cache do Docker"
|
|
echo "- Remove logs antigos"
|
|
echo ""
|
|
echo "Examples:"
|
|
echo " $0 # Limpeza básica"
|
|
echo " $0 --stop-services # Para serviços e limpa"
|
|
echo " $0 --system # Inclui limpeza do sistema"
|
|
echo " $0 --full # Limpeza completa (cuidado!)"
|
|
echo ""
|
|
echo "Servers: ${SERVER_IPS[*]}"
|
|
}
|
|
|
|
# Parse argumentos
|
|
if [[ "$1" == "--help" || "$1" == "-h" ]]; then
|
|
show_help
|
|
exit 0
|
|
fi
|
|
|
|
# Executar função principal
|
|
main "$@" |