#!/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 "$@"