374 lines
11 KiB
Bash
374 lines
11 KiB
Bash
#!/bin/bash
|
|
|
|
# BCards Connectivity Test Script
|
|
# Testa conectividade e saúde dos serviços
|
|
|
|
set -e
|
|
|
|
# Configurações
|
|
SERVER_IPS=("141.148.162.114" "129.146.116.218")
|
|
SSH_USER="ubuntu"
|
|
DOMAIN="bcards.site"
|
|
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}"
|
|
}
|
|
|
|
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 ConnectTimeout=10 -o StrictHostKeyChecking=no ${SSH_USER}@${server_ip} "$command" 2>/dev/null
|
|
}
|
|
|
|
# Teste de conectividade SSH
|
|
test_ssh_connectivity() {
|
|
log "Testando conectividade SSH..."
|
|
|
|
local passed=0
|
|
local total=${#SERVER_IPS[@]}
|
|
|
|
for server_ip in "${SERVER_IPS[@]}"; do
|
|
if run_remote $server_ip "echo 'SSH OK'" >/dev/null 2>&1; then
|
|
success "✓ SSH conectado: $server_ip"
|
|
((passed++))
|
|
else
|
|
error "✗ SSH falhou: $server_ip"
|
|
fi
|
|
done
|
|
|
|
echo ""
|
|
info "SSH Connectivity: $passed/$total servidores"
|
|
}
|
|
|
|
# Teste de status do Docker
|
|
test_docker_status() {
|
|
log "Testando status do Docker..."
|
|
|
|
local passed=0
|
|
local total=${#SERVER_IPS[@]}
|
|
|
|
for server_ip in "${SERVER_IPS[@]}"; do
|
|
if run_remote $server_ip "sudo docker info" >/dev/null 2>&1; then
|
|
success "✓ Docker ativo: $server_ip"
|
|
((passed++))
|
|
else
|
|
error "✗ Docker inativo: $server_ip"
|
|
fi
|
|
done
|
|
|
|
echo ""
|
|
info "Docker Status: $passed/$total servidores"
|
|
}
|
|
|
|
# Teste de status do Docker Swarm
|
|
test_swarm_status() {
|
|
log "Testando status do Docker Swarm..."
|
|
|
|
local manager_ip=${SERVER_IPS[0]}
|
|
|
|
if run_remote $manager_ip "sudo docker node ls" >/dev/null 2>&1; then
|
|
success "✓ Docker Swarm ativo"
|
|
|
|
# Mostrar status dos nodes
|
|
info "Status dos nodes:"
|
|
run_remote $manager_ip "sudo docker node ls" || true
|
|
else
|
|
error "✗ Docker Swarm inativo"
|
|
fi
|
|
|
|
echo ""
|
|
}
|
|
|
|
# Teste de serviços Docker
|
|
test_docker_services() {
|
|
log "Testando serviços Docker..."
|
|
|
|
local manager_ip=${SERVER_IPS[0]}
|
|
|
|
if run_remote $manager_ip "sudo docker service ls" >/dev/null 2>&1; then
|
|
info "Serviços ativos:"
|
|
run_remote $manager_ip "sudo docker service ls" || true
|
|
|
|
# Verificar serviços específicos do BCards
|
|
if run_remote $manager_ip "sudo docker service ls --filter name=${SERVICE_NAME}" | grep -q "${SERVICE_NAME}"; then
|
|
success "✓ Serviços BCards encontrados"
|
|
|
|
# Status detalhado dos serviços BCards
|
|
info "Status detalhado dos serviços BCards:"
|
|
run_remote $manager_ip "sudo docker service ps ${SERVICE_NAME}_app-server1 --no-trunc" || true
|
|
run_remote $manager_ip "sudo docker service ps ${SERVICE_NAME}_app-server2 --no-trunc" || true
|
|
else
|
|
warn "Serviços BCards não encontrados"
|
|
fi
|
|
else
|
|
error "✗ Falha ao listar serviços Docker"
|
|
fi
|
|
|
|
echo ""
|
|
}
|
|
|
|
# Teste de health checks internos
|
|
test_internal_health() {
|
|
log "Testando health checks internos..."
|
|
|
|
for server_ip in "${SERVER_IPS[@]}"; do
|
|
info "Testando servidor $server_ip..."
|
|
|
|
# Verificar se há containers rodando
|
|
local containers=$(run_remote $server_ip "sudo docker ps --filter status=running --format '{{.Names}}'" | wc -l)
|
|
info " Containers rodando: $containers"
|
|
|
|
# Teste de conectividade de rede interna
|
|
if run_remote $server_ip "sudo docker network ls | grep bcards" >/dev/null 2>&1; then
|
|
success " ✓ Rede bcards-network existe"
|
|
else
|
|
warn " ✗ Rede bcards-network não encontrada"
|
|
fi
|
|
done
|
|
|
|
echo ""
|
|
}
|
|
|
|
# Teste de conectividade externa HTTP/HTTPS
|
|
test_external_connectivity() {
|
|
log "Testando conectividade externa..."
|
|
|
|
# Teste HTTP
|
|
info "Testando HTTP..."
|
|
if curl -f -s --max-time 10 "http://$DOMAIN/nginx-health" >/dev/null 2>&1; then
|
|
success "✓ HTTP funcionando (http://$DOMAIN)"
|
|
else
|
|
error "✗ HTTP falhou (http://$DOMAIN)"
|
|
fi
|
|
|
|
# Teste HTTPS
|
|
info "Testando HTTPS..."
|
|
if curl -f -s --max-time 10 "https://$DOMAIN/nginx-health" >/dev/null 2>&1; then
|
|
success "✓ HTTPS funcionando (https://$DOMAIN)"
|
|
else
|
|
warn "✗ HTTPS falhou (https://$DOMAIN)"
|
|
fi
|
|
|
|
# Teste health check da aplicação
|
|
info "Testando health check da aplicação..."
|
|
if curl -f -s --max-time 10 "http://$DOMAIN/health" >/dev/null 2>&1; then
|
|
success "✓ Health check da aplicação passou"
|
|
else
|
|
error "✗ Health check da aplicação falhou"
|
|
fi
|
|
|
|
echo ""
|
|
}
|
|
|
|
# Teste de load balancing
|
|
test_load_balancing() {
|
|
log "Testando load balancing..."
|
|
|
|
local servers_found=()
|
|
|
|
for i in {1..10}; do
|
|
local response=$(curl -s --max-time 5 "http://$DOMAIN/server-info" 2>/dev/null | jq -r '.ServerName' 2>/dev/null || echo "Error")
|
|
|
|
if [[ "$response" != "Error" && "$response" != "null" ]]; then
|
|
servers_found+=("$response")
|
|
fi
|
|
|
|
sleep 0.5
|
|
done
|
|
|
|
if [ ${#servers_found[@]} -gt 0 ]; then
|
|
local unique_servers=$(printf '%s\n' "${servers_found[@]}" | sort -u | wc -l)
|
|
|
|
info "Servidores detectados em 10 requests:"
|
|
printf '%s\n' "${servers_found[@]}" | sort | uniq -c
|
|
|
|
if [ $unique_servers -gt 1 ]; then
|
|
success "✓ Load balancing funcionando ($unique_servers servidores diferentes)"
|
|
else
|
|
warn "Load balancing pode não estar funcionando (apenas 1 servidor detectado)"
|
|
fi
|
|
else
|
|
error "✗ Falha ao testar load balancing"
|
|
fi
|
|
|
|
echo ""
|
|
}
|
|
|
|
# Teste de DNS
|
|
test_dns_resolution() {
|
|
log "Testando resolução DNS..."
|
|
|
|
if nslookup $DOMAIN >/dev/null 2>&1; then
|
|
local ip=$(nslookup $DOMAIN | grep -A1 "Name:" | tail -1 | awk '{print $2}')
|
|
success "✓ DNS funcionando: $DOMAIN -> $ip"
|
|
else
|
|
error "✗ Falha na resolução DNS para $DOMAIN"
|
|
fi
|
|
|
|
echo ""
|
|
}
|
|
|
|
# Teste de certificado SSL
|
|
test_ssl_certificate() {
|
|
log "Testando certificado SSL..."
|
|
|
|
if command -v openssl >/dev/null 2>&1; then
|
|
local ssl_info=$(echo | timeout 10 openssl s_client -servername $DOMAIN -connect $DOMAIN:443 2>/dev/null | openssl x509 -noout -dates 2>/dev/null)
|
|
|
|
if [ $? -eq 0 ]; then
|
|
success "✓ Certificado SSL válido"
|
|
info "Informações do certificado:"
|
|
echo "$ssl_info" | sed 's/^/ /'
|
|
else
|
|
warn "Certificado SSL não encontrado ou inválido"
|
|
fi
|
|
else
|
|
warn "OpenSSL não disponível para teste de certificado"
|
|
fi
|
|
|
|
echo ""
|
|
}
|
|
|
|
# Mostrar métricas de performance
|
|
show_performance_metrics() {
|
|
log "Coletando métricas de performance..."
|
|
|
|
for server_ip in "${SERVER_IPS[@]}"; do
|
|
info "Métricas do servidor $server_ip:"
|
|
|
|
# CPU e Memória
|
|
local cpu_mem=$(run_remote $server_ip "top -bn1 | grep 'Cpu(s)' | awk '{print \$2}' | awk -F'%' '{print \$1}'; free -m | awk 'NR==2{printf \"%.1f%%\", \$3*100/\$2}'")
|
|
info " CPU/Memória: $cpu_mem"
|
|
|
|
# Disk usage
|
|
local disk=$(run_remote $server_ip "df -h / | awk 'NR==2 {print \$5}'")
|
|
info " Uso do disco: $disk"
|
|
|
|
# Docker stats
|
|
local docker_containers=$(run_remote $server_ip "sudo docker ps --format 'table {{.Names}}\t{{.Status}}' | tail -n +2 | wc -l")
|
|
info " Containers Docker ativos: $docker_containers"
|
|
done
|
|
|
|
echo ""
|
|
}
|
|
|
|
# Gerar relatório detalhado
|
|
generate_report() {
|
|
local timestamp=$(date +'%Y-%m-%d %H:%M:%S')
|
|
local report_file="connectivity-report-$(date +'%Y%m%d_%H%M%S').txt"
|
|
|
|
log "Gerando relatório detalhado..."
|
|
|
|
{
|
|
echo "BCards Infrastructure Connectivity Report"
|
|
echo "Generated: $timestamp"
|
|
echo "========================================"
|
|
echo ""
|
|
|
|
echo "Infrastructure Overview:"
|
|
echo "- Domain: $DOMAIN"
|
|
echo "- Servers: ${SERVER_IPS[*]}"
|
|
echo "- Service: $SERVICE_NAME"
|
|
echo ""
|
|
|
|
echo "Test Results Summary:"
|
|
echo "- SSH Connectivity: $(test_ssh_connectivity 2>&1 | grep -c "SSH OK")/${#SERVER_IPS[@]} servers"
|
|
echo "- Docker Status: $(test_docker_status 2>&1 | grep -c "Docker ativo")/${#SERVER_IPS[@]} servers"
|
|
echo "- External HTTP: $(curl -f -s "http://$DOMAIN/nginx-health" >/dev/null 2>&1 && echo "PASS" || echo "FAIL")"
|
|
echo "- External HTTPS: $(curl -f -s "https://$DOMAIN/nginx-health" >/dev/null 2>&1 && echo "PASS" || echo "FAIL")"
|
|
echo "- App Health Check: $(curl -f -s "http://$DOMAIN/health" >/dev/null 2>&1 && echo "PASS" || echo "FAIL")"
|
|
|
|
} > $report_file
|
|
|
|
info "Relatório salvo em: $report_file"
|
|
}
|
|
|
|
# Função principal
|
|
main() {
|
|
log "Iniciando testes de conectividade BCards..."
|
|
echo ""
|
|
|
|
test_ssh_connectivity
|
|
test_docker_status
|
|
test_swarm_status
|
|
test_docker_services
|
|
test_internal_health
|
|
test_dns_resolution
|
|
test_external_connectivity
|
|
test_load_balancing
|
|
test_ssl_certificate
|
|
show_performance_metrics
|
|
|
|
if [[ "$1" == "--report" ]]; then
|
|
generate_report
|
|
fi
|
|
|
|
log "Testes de conectividade concluídos!"
|
|
}
|
|
|
|
# Função de ajuda
|
|
show_help() {
|
|
echo "BCards Connectivity Test Script"
|
|
echo ""
|
|
echo "Usage: $0 [OPTIONS]"
|
|
echo ""
|
|
echo "OPTIONS:"
|
|
echo " --report Gera relatório detalhado em arquivo"
|
|
echo " --help Mostra esta ajuda"
|
|
echo ""
|
|
echo "Este script testa:"
|
|
echo "- Conectividade SSH com os servidores"
|
|
echo "- Status do Docker e Docker Swarm"
|
|
echo "- Saúde dos serviços em execução"
|
|
echo "- Conectividade HTTP/HTTPS externa"
|
|
echo "- Funcionamento do load balancing"
|
|
echo "- Resolução DNS e certificados SSL"
|
|
echo "- Métricas de performance dos servidores"
|
|
echo ""
|
|
echo "Servers: ${SERVER_IPS[*]}"
|
|
echo "Domain: $DOMAIN"
|
|
}
|
|
|
|
# Parse argumentos
|
|
if [[ "$1" == "--help" || "$1" == "-h" ]]; then
|
|
show_help
|
|
exit 0
|
|
fi
|
|
|
|
# Verificar dependências
|
|
if ! command -v curl >/dev/null 2>&1; then
|
|
error "curl não está instalado"
|
|
exit 1
|
|
fi
|
|
|
|
if ! command -v jq >/dev/null 2>&1; then
|
|
warn "jq não está instalado - alguns testes serão limitados"
|
|
fi
|
|
|
|
# Executar função principal
|
|
main "$@" |