--- name: server-health description: Server health monitoring and diagnostics. Checks system resources, services status, and identifies issues. Use when user mentions "server health", "system check", "server status", "resource monitoring", "server diagnostics". author: Descomplicar® Crescimento Digital version: 2.0.0 quality_score: 75 user_invocable: true desk_task: 1484 --- # /server-health - Diagnóstico Completo de Servidor Checklist sistemático para diagnosticar problemas de performance ou auditar estado do servidor CWP. --- ## Servidor Alvo | Servidor | IP | MCP | User | |----------|-----|-----|------| | **CWP Principal** | 176.9.3.158 | ssh-unified | root | **Acesso:** ```javascript mcp__ssh-unified__ssh_execute({ server: "server", command: "" }) ``` --- ## Modos de Execução | Comando | Descrição | |---------|-----------| | `/server-health` | Diagnóstico completo (todos os checks) | | `/server-health quick` | Apenas métricas críticas (load, RAM, disco) | | `/server-health mysql` | Focus em MySQL e bases de dados | | `/server-health ssl` | Verificação de todos os certificados SSL | | `/server-health sites` | Status de todos os sites WordPress | --- ## Workflow Completo ### Passo 1: Sistema (Paralelo) **Executar em paralelo:** ```bash # Load average (3 valores: 1min, 5min, 15min) uptime # RAM e Swap free -h # Espaço em disco df -h # Top processos CPU top -bn1 | head -20 # Load numérico cat /proc/loadavg # CPU/IO statistics vmstat 1 3 # Processos específicos (Apache, MySQL, Nginx) ps aux | grep -E 'httpd|mysql|nginx' | grep -v grep ``` **Validação:** - ✅ Load 1min <2 → OK - ⚠️ Load 1min 2-5 → Warning - ❌ Load 1min >5 → Critical - ✅ RAM <70% → OK - ❌ Swap >10% → Investigar causa ### Passo 2: MySQL ```bash # Status geral MySQL mysqladmin status # Processos activos mysqladmin processlist | head -20 # Threads conectadas mysql -e "SHOW GLOBAL STATUS LIKE 'Threads%';" # Slow queries mysql -e "SHOW GLOBAL STATUS LIKE 'Slow_queries';" # Tamanho das BDs mysql -e "SELECT table_schema AS 'Database', ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'Size (MB)' FROM information_schema.TABLES GROUP BY table_schema ORDER BY SUM(data_length + index_length) DESC LIMIT 10;" # Verificar se há tabelas corrompidas mysqlcheck --all-databases --check ``` **Queries Críticas:** ```sql -- Ver queries lentas em execução SELECT id, user, host, db, command, time, state, LEFT(info, 100) as query FROM information_schema.PROCESSLIST WHERE command != 'Sleep' AND time > 5 ORDER BY time DESC; -- BDs maiores que 500MB SELECT table_schema, ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS size_mb FROM information_schema.TABLES GROUP BY table_schema HAVING size_mb > 500 ORDER BY size_mb DESC; ``` ### Passo 3: Web Servers ```bash # Status Apache systemctl status httpd --no-pager | head -15 # Status Nginx systemctl status nginx --no-pager | head -15 # Testar localhost curl -sI localhost | head -10 # Verificar GZIP curl -sI -H 'Accept-Encoding: gzip' localhost | grep -i encoding # Conexões activas netstat -an | grep :80 | wc -l netstat -an | grep :443 | wc -l # Workers Apache ps aux | grep httpd | wc -l # Virtual hosts configurados httpd -S 2>&1 | grep -E 'port|namevhost' | head -20 ``` ### Passo 4: PHP ```bash # Versão PHP php -v | head -1 # Memory limit php -i | grep memory_limit # OPcache status php -i | grep -E 'opcache.enable|opcache.memory_consumption' # Processos PHP-FPM ps aux | grep php-fpm | wc -l # Configuração PHP-FPM (se existir) php-fpm -tt 2>&1 | head -30 ``` ### Passo 5: SSL/Certificados ```bash # Listar todos os certificados instalados ls -lh /root/.acme.sh/cwp_certs/ # Verificar próximas renovações (todos os domínios) for d in $(ls /root/.acme.sh/cwp_certs/); do echo "=== $d ===" grep -E 'Le_NextRenewTimeStr|Le_Alt' /root/.acme.sh/cwp_certs/$d/*.conf 2>/dev/null | head -3 done # Verificar certificados activos em Nginx for conf in /etc/nginx/vhosts/*.conf; do domain=$(basename $conf .conf) echo "=== $domain ===" grep -E 'ssl_certificate|server_name' $conf | head -3 done # Testar um domínio específico echo | openssl s_client -connect DOMINIO:443 2>/dev/null | openssl x509 -noout -dates -subject # Log de renovações recentes tail -100 /root/.acme.sh/acme.sh.log | grep -E 'Renew|error|success' ``` **Validação SSL:** - ✅ Renovação >30 dias → OK - ⚠️ Renovação 15-30 dias → Avisar - ❌ Renovação <15 dias → Urgente ### Passo 6: Segurança ```bash # Fail2ban status systemctl status fail2ban --no-pager 2>/dev/null || echo 'fail2ban não instalado' # Jails activos fail2ban-client status 2>/dev/null | head -10 # IPs banidos fail2ban-client status sshd 2>/dev/null | grep "Banned IP" # Portas abertas netstat -tlnp | grep LISTEN | head -20 # Últimos logins SSH last -10 # Tentativas SSH falhadas grep "Failed password" /var/log/secure | tail -20 # Firewall activo? systemctl status firewalld --no-pager || iptables -L -n | head -20 ``` ### Passo 7: Sites WordPress ```bash # Verificar todos os sites WordPress for dir in /home/*/public_html; do if [ -f "$dir/wp-config.php" ]; then domain=$(basename $(dirname $dir)) echo "=== $domain ===" # Versão WordPress grep "wp_version = " $dir/wp-includes/version.php | head -1 # Tamanho wp-content du -sh $dir/wp-content # Plugins activos (via BD se possível) # Testar acesso HTTP curl -sI "http://$domain" | head -3 fi done # Script de verificação completo /root/scripts/check-wp-sites.sh 2>/dev/null || echo "Script não existe" ``` --- ## Template de Output ```markdown # 🔍 Server Health Report - YYYY-MM-DD HH:MM ## ⚡ Resumo Executivo | Métrica | Valor | Status | Limite | |---------|-------|--------|--------| | Load (1m) | X.XX | ✅/⚠️/❌ | <2 | | RAM Usada | XX% | ✅/⚠️/❌ | <70% | | Swap Usado | XX% | ✅/⚠️/❌ | <10% | | Disco / | XX% | ✅/⚠️/❌ | <70% | | MySQL Threads | XX | ✅/⚠️/❌ | <50 | | Slow Queries | XX | ✅/⚠️/❌ | <10 | | Sites WP OK | XX/YY | ✅/⚠️/❌ | 100% | | SSL Expiring | XX | ✅/⚠️/❌ | 0 | **Health Score:** XX/100 --- ## 🚨 Alertas Críticos > [!danger] CRÍTICO > - Load >5 há 10 minutos (possível loop infinito) > - Swap 45% usado (memória insuficiente) > [!warning] ATENÇÃO > - 3 sites WordPress com erros HTTP 500 > - Certificado SSL solarfv360.pt expira em 12 dias --- ## 📊 Detalhes ### Sistema ``` Uptime: 45 days, 12:34 Load Average: 2.15, 1.89, 1.56 RAM: 12.5 GB / 16 GB (78%) ⚠️ Swap: 1.2 GB / 4 GB (30%) ❌ Disco /: 85 GB / 200 GB (42%) ✅ ``` **Top Processos CPU:** ``` PID USER %CPU %MEM COMMAND 1234 mysql 45.2 12.3 mysqld 5678 apache 8.5 2.1 httpd ``` ### MySQL **Status:** - Uptime: 1,234,567 seconds - Threads conectadas: 23 / 151 ✅ - Slow queries: 145 (total) ⚠️ - Queries/segundo: ~150 **BDs Grandes (>500MB):** | Base de Dados | Tamanho | |---------------|---------| | ealmeida_desk24 | 1,234 MB | | carstuff_prod | 856 MB | **Queries Lentas Activas:** ``` id: 12345 | user: wp_user | time: 45s query: SELECT * FROM wp_posts WHERE... ``` ### Web **Apache:** ✅ Activo (145 workers) **Nginx:** ✅ Activo (proxy reverso) **Conexões:** - HTTP (80): 23 conexões - HTTPS (443): 67 conexões **GZIP:** ✅ Activo ### PHP **Versão:** PHP 8.1.27 **Memory Limit:** 256M **OPcache:** ✅ Activo (128MB) **PHP-FPM Workers:** 12 ### SSL **Certificados Instalados:** 34 **Renovações Próximas (<30 dias):** | Domínio | Expira em | Status | |---------|-----------|--------| | solarfv360.pt | 12 dias | ⚠️ Renovar | | emanuelalmeida.pt | 28 dias | ⚠️ Avisar | **Problemas:** - ❌ certificado_antigo.pt - Expirado há 5 dias ### Segurança **Fail2ban:** ✅ Activo **Jails:** sshd, apache-auth, nginx-limit **IPs Banidos:** 45 (último: 123.45.67.89) **Portas Abertas:** - 22 (SSH) ✅ - 80 (HTTP) ✅ - 443 (HTTPS) ✅ - 3306 (MySQL) ⚠️ Público (deveria ser localhost only) **Últimas Tentativas SSH Falhadas:** ``` 2026-02-03 10:15 - Invalid user admin from 192.168.1.100 2026-02-03 09:45 - Failed password for root from 45.67.89.10 ``` ### Sites WordPress **Total:** 15 sites **OK:** 12 (80%) ✅ **Erros:** 3 (20%) ❌ **Sites com Erro:** | Domínio | Erro | Acção | |---------|------|-------| | site-antigo.pt | HTTP 500 | Verificar error_log | | teste.descomplicar.pt | HTTP 404 | Site desactivado? | --- ## 📋 Recomendações Prioritárias ### 🔴 URGENTE (Hoje) 1. ⚠️ Reduzir uso de Swap (45%) - Investigar processos 2. ❌ Renovar SSL solarfv360.pt (12 dias restantes) 3. ❌ Corrigir sites com HTTP 500 (3 sites) ### 🟡 IMPORTANTE (Esta Semana) 4. ⚠️ Optimizar queries lentas MySQL (145 total) 5. ⚠️ Limpar BDs grandes (ealmeida_desk24 1.2GB) 6. ⚠️ Fechar porta MySQL 3306 ao público ### 🟢 MELHORIAS (Mês) 7. ✅ Configurar alertas automáticos para Swap >20% 8. ✅ Criar backup automático de certificados SSL 9. ✅ Actualizar PHP para 8.2 (actualmente 8.1) --- ## 🔧 Troubleshooting Sugerido ### Swap Alto (>30%) ```bash # Ver o que está a usar memória ps aux --sort=-%mem | head -10 # Limpar swap (CUIDADO!) swapoff -a && swapon -a ``` ### Load Alto (>5) ```bash # Ver processos por CPU ps aux --sort=-%cpu | head -10 # Ver I/O wait iostat -x 1 5 # Identificar processo problemático top -bn1 | head -20 ``` ### MySQL Lento ```bash # Ver queries activas mysqladmin processlist # Ver slow query log tail -50 /var/log/mysql/slow.log # Optimizar tabelas mysqlcheck --optimize --all-databases ``` ### Sites WordPress com Erro ```bash # Ver error log tail -100 /home/USER/logs/error.log # Verificar permissões ls -lh /home/USER/public_html/wp-content # Corrigir permissões chown -R USER:USER /home/USER/public_html/wp-content ``` --- *Gerado via /server-health v2.0 | Descomplicar®* ``` **Instruções de Implementação:** 1. Executar comandos em paralelo quando possível (mcp__ssh-unified__ssh_execute) 2. Calcular health score: (checks OK / total checks) × 100 3. Gerar alertas baseados em thresholds 4. Agrupar recomendações por urgência 5. Incluir troubleshooting específico para cada problema detectado --- ## Thresholds de Alertas | Métrica | ✅ OK | ⚠️ Warning | ❌ Critical | |---------|-------|------------|-------------| | **Load (1m)** | <2 | 2-5 | >5 | | **RAM** | <70% | 70-85% | >85% | | **Swap** | <10% | 10-30% | >30% | | **Disco** | <70% | 70-85% | >85% | | **MySQL Threads** | <50 | 50-100 | >100 | | **Slow Queries** | 0 | 1-10 | >10 | | **Sites WP OK** | 100% | 90-99% | <90% | | **SSL Expiring** | >30d | 15-30d | <15d | --- ## Comandos SSH Específicos ### Verificação Rápida (Quick Mode) ```bash # Uma linha com todas as métricas críticas echo "=== QUICK HEALTH ===" && \ uptime && \ free -h | grep Mem && \ df -h | grep -E '^/dev/vda|Filesystem' && \ mysqladmin status 2>&1 | head -1 && \ systemctl is-active httpd nginx mysql ``` ### MySQL Deep Dive ```bash # Optimizar todas as BDs mysqlcheck --optimize --all-databases # Limpar logs binários antigos (>7 dias) mysql -e "PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);" # Verificar fragmentação de tabelas mysql -e "SELECT table_schema, table_name, ROUND(data_length/1024/1024,2) as data_mb, ROUND(data_free/1024/1024,2) as free_mb FROM information_schema.TABLES WHERE data_free > 0 ORDER BY data_free DESC LIMIT 10;" ``` ### Limpeza de Cache/Temp ```bash # Limpar cache WordPress (todos os sites) find /home/*/public_html/wp-content/cache -type f -delete # Limpar sessions PHP antigas find /var/lib/php/session -type f -mtime +7 -delete # Limpar logs Apache/Nginx >30 dias find /home/*/logs -name "*.log" -mtime +30 -delete ``` --- ## Integração com MCPs ```javascript // Executar diagnóstico completo async function serverHealthCheck() { // 1. Sistema (paralelo) const systemChecks = await Promise.all([ mcp__ssh-unified__ssh_execute({server: "server", command: "uptime"}), mcp__ssh-unified__ssh_execute({server: "server", command: "free -h"}), mcp__ssh-unified__ssh_execute({server: "server", command: "df -h"}), mcp__ssh-unified__ssh_execute({server: "server", command: "top -bn1 | head -20"}) ]); // 2. MySQL const mysqlStatus = await mcp__ssh-unified__ssh_execute({ server: "server", command: "mysqladmin status && mysql -e \"SHOW GLOBAL STATUS LIKE 'Threads%';\"" }); // 3. SSL const sslCheck = await mcp__ssh-unified__ssh_execute({ server: "server", command: "for d in $(ls /root/.acme.sh/cwp_certs/); do echo \"=== $d ===\"; grep Le_NextRenewTimeStr /root/.acme.sh/cwp_certs/$d/*.conf 2>/dev/null; done" }); // Processar e gerar report return processHealthData(systemChecks, mysqlStatus, sslCheck); } ``` --- ## Anti-Patterns | Anti-Pattern | Problema | Solução Correcta | |--------------|----------|------------------| | Assumir SSH como root | Pode falhar | Verificar permissões primeiro | | Executar comandos sequenciais | Lento | Paralelo quando possível | | Ignorar exit codes | Falhas silenciosas | Validar cada comando | | Não limpar recursos temp | Consume espaço | Limpeza em cada audit | | Não documentar problemas | Sem histórico | Gravar em Desk/Obsidian | --- ## Checklist de Execução - [ ] SSH conecta (testar `whoami`) - [ ] Todas as métricas recolhidas (sistema, mysql, web, ssl) - [ ] Thresholds aplicados (calcular status) - [ ] Health score calculado - [ ] Alertas gerados (crítico/warning) - [ ] Recomendações priorizadas - [ ] Troubleshooting incluído - [ ] Report formatado (Markdown) - [ ] Opcional: Gravar em Desk ou Obsidian --- ## Datasets Dify (Consulta Obrigatória) Antes de executar diagnóstico complexo ou para troubleshooting específico: | Dataset | ID | Uso | |---------|----|----| | **TI (Tecnologia da Informação)** | `7f63ec0c-6321-488c-b107-980140199850` | Diagnósticos gerais | | **Linux** | `bde4eddd-4618-402c-8bfb-bb947ed9219d` | Comandos específicos | | **CWP Centos Web Panel** | `b2a4d2c5-fe55-412c-bc28-74dbd611905d` | Configurações CWP | **Consultar quando:** - Problema não coberto por este guia - Optimização específica de serviço - Troubleshooting de erro desconhecido - Configuração avançada CWP/MySQL/Nginx ```javascript // Exemplo: pesquisar optimização MySQL mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments({ dataset_id: "7f63ec0c-6321-488c-b107-980140199850", query: "mysql slow query optimization innodb tuning", top_k: 3 }) ``` --- ## Changelog ### v2.0.0 (2026-02-03) - **ENHANCED:** Workflows detalhados para cada passo - Modos de execução (quick, mysql, ssl, sites) - Template de output completo com troubleshooting - Thresholds documentados - Comandos SSH específicos - Health score calculation - Integração MCPs documentada - Anti-patterns identificados - Checklist de execução ### v1.0.0 (2026-01-30) - Versão inicial - Diagnóstico: Sistema, MySQL, Web, PHP, SSL, Segurança - Thresholds definidos - Output template markdown --- **Versão:** 2.0.0 | **Autor:** Descomplicar® **Última actualização:** 2026-02-03 (Workflows completos + Troubleshooting) --- ## Quando NÃO Usar - Para tarefas fora do domínio de especialização desta skill - Quando outra skill mais específica está disponível - Para operações que requerem aprovação manual obrigatória - Quando os requisitos não estão claramente definidos ## Exemplos de Uso ### Exemplo 1: Caso Básico ``` User: [requisição simples relacionada com server-health] Skill: [execução directa com validação] Output: [resultado conciso e accionável] ``` ### Exemplo 2: Caso Complexo ``` User: [requisição multi-passo ou complexa] Skill: 1. Análise dos requisitos 2. Planeamento da abordagem 3. Execução faseada 4. Validação contínua Output: [resultado detalhado com próximos passos] ``` ### Exemplo 3: Caso com Dependências ``` User: [requisição que depende de outros sistemas] Skill: 1. Verificar dependências disponíveis 2. Coordenar com skills/MCPs necessários 3. Executar workflow integrado Output: [resultado completo com referências] ```